Acetaminophen’s diary

化学に関すること,TeXに関すること,ゆきだるまに関すること。

新しい pLaTeX の話(2016年9月版)

今回も「コミュニティ版 pLaTeX」2016/09/03 版の紹介です。

正式なリリース告知は、TeX Forum (forum:2015) に出しました。

特に大きな変更は、脚注番号に関するものです。

f:id:acetaminophen:20160904200143p:plain

f:id:acetaminophen:20160904200130p:plain

過去3回分の記事はこちらから:

目次

 

1. 脚注番号直後の改行許可(重要:組版の改善)

脚注と本文とを対応づける番号として、本文中に置かれるのが「合印(あいじるし)」と呼ばれるものです。横組では「1)」や「*1」など数字が右肩に小さく出るあれです。

pLaTeX は昔から、合印直後で改行ができないことが問題となっていました。これは、場合によっては続く文字が版面をはみ出してしまうことになり、困ってしまいます。この問題を修正し、「合印直後が行頭禁則文字(句読点など)でない場合は改行を許容」としました。

解りやすい例として、jsarticle ではなく jarticle の例でみてみましょう:

\documentclass{jarticle}
\setlength{\textwidth}{20zw}% テキスト幅を全角20字に
\setlength{\parindent}{0zw}% 段落始めのインデントなし
\begin{document}
あいうえおかきくけこさしすせそ
たちつてとなにぬねの\par
アイウエオカキクケコサシスセソ
タチツテト\footnote{脚注です。}ナニヌネノ\par
\end{document}

この組版結果が、pLaTeX のバージョンによって次のように変わります。

まず、TeX Live 2015 最終版まで。このときは「合印前後の不自然なアキ」という別の問題(本ブログ第 1 回参照)もありましたので、下のようになります。

f:id:acetaminophen:20160902235417p:plain

TeX Live 2016 でいったん「不自然なアキ」を削除しましたので、以下のようになりました。改行が抑制されてはみ出した証拠に

Overfull \hbox (4.60829pt too wide) in paragraph at lines 11--12
[]\JY1/mc/m/n/10 アイウエオカキクケコサシスセソタチツテト[][][]ナ

という警告が出ます。

f:id:acetaminophen:20160902235446p:plain

最後に、最新版です。これは不自然なアキもなく、はみ出しもありません。

f:id:acetaminophen:20160902235457p:plain

なお、この問題に対策が施されたのは今回が初です。jsarticle などの奥村氏の jsclasses は、組版を改善するために独自パッチを多数導入してありました*1が、この件については検討漏れしていたようです。したがって、この問題が起きると困る!という場合は、最新版 pLaTeX を入手しましょう(もちろん、新しい pLaTeX を使えば自動的に jsclasses でも対策が有効になります)。

 

2. 脚注番号(合印)直前をベタ組に(重要:組版の改善)

合印についてはもう一点、「句読点や閉じ括弧」のあとに続く場合に隙間を空けずに組む(正確な用語としては「ベタ組」)ことが求められます。ところが、pLaTeX のデフォルトでは隙間が空いてしまいます。

jsclasses では昔から対策済みでしたので、jarticle で例示します。以下のソースのペアのうち、a のほうを注意してみてください。

\documentclass{jarticle}
\setlength{\textwidth}{20zw}% テキスト幅を全角20字に
\setlength{\parindent}{0zw}% 段落始めのインデントなし
\begin{document}
(1a) 偏微分広辞苑で引くと、\footnote{便秘の次に載っている。}こう書かれて\par
(1b) 偏微分広辞苑で引くと\footnote{便秘の次に載っている。}、こう書かれて\par
(2a) ここに机(またはデスク)\footnote{どちらでもよい。}がある。\par
(2b) ここに机(またはデスク\footnote{どちらでもよい。})がある。\par
\end{document}

f:id:acetaminophen:20160903003804p:plain

新しい pLaTeX の標準は、以下のようになります。

f:id:acetaminophen:20160903003816p:plain

みなさんは a と b のうち、どちらの組版流儀が好みでしょうか。私の好みは b なのですが、日本語組版処理の要件は a, b のどちらも推奨も禁止もしていませんし、どちらの流儀であっても本記事の冒頭に挙げたような映画名「君の名は。」のような固有名詞の場合、「。」直後に脚注を付けなければならない状況は生じるでしょう*2。そこで、pLaTeX としては両者に中立で、どちらでも不自然にならない組版をサポートしてあります。

 

3. 縦組で longtable が使えない問題を修正(バグ修正)

longtable パッケージという LaTeX 標準パッケージがあります。通常、表の途中で改ページすることはできませんが、longtable パッケージを読み込んで longtable 環境を用いる場合は(フロートしない代わりに)表の途中で改ページできるようになります。

ところが pLaTeX の出力ルーチン用マクロにバグ(?)があり、longtable パッケージを縦組で使うと改ページが実際に起こるときに無限ループを起こし、タイプセットが終了しないという問題がありました。これは longtable パッケージの問題ではなく pLaTeX の問題でしたので、修正しました。

縦組で使ってみるとこんな感じです(高さ=縦組における横幅を 3cm に絞っていますので、たった 5 行しか 1 ページに入らず改ページしています)。

\documentclass[a5paper]{tarticle}
\usepackage{longtable}
\setlength{\textheight}{3cm}
% ページ高さ(縦組では横幅)を小さくし、短い表で改ページを起こさせる
\begin{document}
\begin{longtable}[r]{|ccc|}
\caption{長い長い表} \\
\hline
ひらがな & カタカナ & Alphabet \\
\hline
\endhead
\hline
\endfoot&& A \\&& B \\&& C \\&& D \\&& E \\&& F \\&& G \\&& H \\
\end{longtable}
\end{document}

f:id:acetaminophen:20160903010606p:plain

なお、縦組の場合に横組に比べ、表内の各行がなんとなくピチピチというか、文字の幅ギリギリになっていることが私は気になっています(ぜひ試してみてください)。これはまた別の問題で、後述の「\strutbox の困った仕様」に由来するものです。

 

4. plext パッケージで \multicolumn のエラー解消(バグ修正)

pLaTeX に標準で付属している plext パッケージは、「横組中で部分的に縦書きする」という場合に便利な拡張機能を提供します(基本的な使い方は ZR さんの『LaTeX で「部分的な縦書き」』を参照*3)。

しかし一つ問題点があり、セルを結合するために \multicolumn を使うと

Incompatible direction list can't be unboxed.
\@arstrut ...strutbox \else \unhcopy \@arstrutbox 
                                                  \fi 
l.7 \multicolumn{3}{|c|}{セル1}
                               \\ \hline
? 

というエラーが出るケースがありました。

\documentclass{jsarticle}
\usepackage{plext}
\begin{document}
横組の中で縦組の表を書く。
% <t> というオプションで表を縦組にする(plext 拡張)
\begin{tabular}<t>[b]{|l|c|r|}
\hline
\multicolumn{3}{|c|}{セル1}\\ \hline
\multicolumn{2}{|c|}{セル2} & セル3 \\ \hline
セル4 & セル5 & セル6 \\ \hline
\end{tabular}
\end{document}

新しい plext パッケージでは、この問題を修正してあります。

上に書いたソースは従来エラーでしたが、新パッケージでは OK です。

f:id:acetaminophen:20160903012823p:plain

なお、plext パッケージにも第 1 回で紹介したのと同じ「tabular 環境、minipage 環境、\parbox 前後の不自然なアキ」という問題がありましたので、pLaTeX の修正に追随する形で、ついでに(?)今回修正しておきました。

 

5. ascmac パッケージの pdfLaTeX / XeLaTeX などへの対応(機能拡張)

これまでの ascmac パッケージは(縦組への対応などを含め)pLaTeX に特化していたため、特別なコードを書く*4などしない限り、pdfLaTeX などで用いることができませんでした。このpLaTeX に特化」というメリットは残しつつ、他の pdfLaTeX や XeLaTeX などでも「動く」ように書き直しました*5

 

6. jltxdoc クラスの \verb 前のアキ設定(組版の改善)

ライトな LaTeX ユーザにはあまり馴染みがないと思われますが、LaTeX パッケージ開発にあたり「パッケージのソースコードと説明文書を一緒のファイルに書きたい」という要求がままあります。こうした場合によく使われる「日本語用のクラスファイル」が、jltxdoc というクラスです*6

しかし実際に使ってみると、たとえば「あ\verb+\footnote+い」のように書いた場合、\verb で挟んだ命令と直前の文字が密着して不自然になっていました。ここに正しく \xkanjiskip アキが入るように修正しました。

pLaTeX 本体にも pldoc.pdf というソースコード説明書が付属していますが、これは plcore.dtx や plfonts.dtx といったソースファイルを jltxdoc クラスで組版して得られるものです。興味のある方は 2016/07/01 版と 2016/09/03 版の pldoc.pdf を入手して比べてみてください。

 

今後のテスト:支柱 (\strutbox) の挙動について

前回の記事で紹介した「アクセント文字パッチ」に加え、今回「\strutbox パッチ」を実験用コードとして作成しました。

本題に入る前に、まず LaTeX / pLaTeX の支柱の仕組みについて解説しておきます。

「支柱」というのは、幅ゼロで高さと深さだけを持つ“見えない箱”で、これを使うことで表の各段の高さを揃えたり、文字の上に付けるベクトル記号の高さを揃えたりすることができます。以下は、根号の高さを揃える例です:

\documentclass{jsarticle}
\usepackage{amsmath}
% \mathstrut という「数式用の支柱」を使う
\newcommand{\newsqrt}[2][]{\sqrt[#1]{\smash[b]{\mathstrut #2}}}
\begin{document}
根号の高さがそろわない:
\[
t=\sqrt{g}+\sqrt{h}=\sqrt[2]{g}+\sqrt[2]{h}
\]
支柱を使って根号の高さをそろえる:
\[
t=\newsqrt{g}+\newsqrt{h}=\newsqrt[2]{g}+\newsqrt[2]{h}
\]
\end{document}

f:id:acetaminophen:20160904010951p:plain

さて「支柱」はその場のフォントサイズに応じて高さや深さが適時アップデートされなければ意味がありません。そこで、LaTeX

フォントサイズを決定する時点で「\strutbox という箱」を予め組んでおき、それをコピーして持ってくる

という仕組みになっています。これは横組しか想定していませんので、横組と縦組が混在しうる pLaTeX では一種類の箱では不十分でした。そこで、pLaTeX

フォントサイズを決定する時点で「横組専用の \strutbox という箱」「縦組専用の \tstrutbox, \zstrutbox という箱」の 3 種類を準備しておき、そのうち縦横の組方向に応じて 1 つをコピーして持ってくる

という仕組みになっています。

ようやく本題である問題点について考えます。LaTeX の仕組みはシンプルで

\strut は(当然横組専用の)\strutbox を呼んでくる命令だ

という認識が成り立ちます。したがって、わざわざ \strut を使わずに自前で \strutbox を呼んでも大差ないことになります。しかし、pLaTeX

\strut は横組なら \strutbox を呼んできて、縦組なら \tstrutbox を呼んでくる命令だ

という一対二対応の状態です。ですから、pLaTeX では「\strut を使わずに自前で \strutbox を呼んでも大差ないだろう」という考えが成り立ちません。海外の LaTeX パッケージは pLaTeX についてほとんど知らないため、当然の成り行きで pLaTeX 縦組でこの問題が多数表面化します。私が把握している例をいくつか Gist に公開していますが、最も不可解な挙動になるのが「縦組での align (amsmath) 環境」でしょう。

\documentclass{tarticle}
\usepackage{amsmath}
\setlength{\parindent}{0cm}
\setlength{\textwidth}{8cm}
\begin{document}
align環境、\verb+&+が1つ %% 少し上へ
\begin{align}
a_1 &= b_1+c_1\\
a_2 &= b_2+c_2-d_2+e_2
\end{align}
align環境、\verb+&+なし %% 端に付く
\begin{align}
a_1=b_1+c_1
\end{align}
\end{document}

f:id:acetaminophen:20160904021806p:plain

そこで、私が「pLaTeX の新仕様」として提唱したいのが

フォントサイズを決定する時点で「横組専用の \ystrutbox という箱」「縦組専用の \tstrutbox, \zstrutbox という箱」の 3 種類に加え「縦横の組方向に応じて \tstrutbox または \ystrutbox を意味する \strutbox」を準備しておく

というものです。これで \strutbox\strut と同様の「縦横の分岐処理」が入りますので、「\strut の代わりに自前で \strutbox を読んでも大差ない」という状態に似せることができます。実際に、こうすることで上の「縦組と align 環境」の問題は解消します。

ただし、支柱コマンドはあちこちで呼ばれていますから、この align 環境の数式環境に限らずあちこちで高さや幅に影響を及ぼしています。しかし、私が確認した範囲内では、想定外の挙動悪化は起きていないように見えます。このコードを実験したい場合は、「exppl2e パッケージ」を利用してください(使い方は第 3 回の記事で紹介したとおりです)。この挙動変更について、ご意見等をどしどしお寄せ下さい!

追記:次のリリース (2016/11/29) に関する解説記事も出しました。

*1:たとえば「不自然なアキ」のほうは、2013年の時点で jsclasses のほうでは対処済みでしたし、後述の「ベタ組」の件も対処済みでした。

*2:ちなみに、私は「君の名は。」を8月29日に見てきました。

*3:なお、pLaTeX の標準縦組クラス(tarticle など)では何もせずとも標準で plext が読みこまれていて、たとえば連数字 \rensuji などが使われています。

*4:たとえば LuaTeX-ja は特別に ascmac にパッチすることで、どうにか ascmac を LuaLaTeX で利用できるようにしていました。

*5:ZR さんの「bxascmac パッケージ」というものもありますが、これは「pLaTeX への特化を除去する代わりに他でも動く」というものでした。今回の ascmac の機能拡張は、pLaTeX に特化したコードも残しつつ実現されていますので、興味のある方はコードを読んでみると面白いかもしれません。

*6:そのほうが、パッケージのソースに詳しいコメントを付けられますし、説明の PDF 文書とパッケージ本体を別々に管理する手間も省けます。