マクロツイーター

はてダから移行した記事の表示が崩れてますが、そのうちに直せればいいのに(えっ)

行頭で括弧が揃わないって

こういうことなのかなあ。

\documentclass[a4paper]{tarticle}
\setlength{\textwidth}{10zw} % 極端に行長を小さくする
\setlength{\textheight}{200pt} % これは適当
\sloppy
\pagestyle{empty}
\begin{document}

「どうして?」

「誠に残念な事だが、ここは現実世界だ」

「それは解っている!」

\end{document}


上のようになる直接の原因は、「段落冒頭にある開き括弧の前に伸縮可能なグルーがある」ことである。(従って、上の例は縦組みであるが、横組みでも同じ現象が発生する。)つまり、禁則のために、2 番目の段落(台詞)では追い込み、3 番目では追い出しが起こっているが、これに従って、グルーが伸縮するために揃わなくなっているのである。無論これは望ましい動作ではない。

このことは、実は pTeX の仕様のより本質的な「欠点」と関連する。最初の段落は自然長で組まれているが、この場合に括弧が全角二分下がりになり、これが pTeX の既定の動作である。「要件」(2012/04/03 版)を見ると、これ自体は許容される*1ようであるが、pTeX は本来は「括弧類は半角幅とする」(そして前の文字の間に半角の空きが入る)という考え方をしていて、従って折り返しの行頭では括弧類は天ツキとなる。これは辻褄が合わない。(おまけに(LaTeX の)強制改行((改段落(空行や \par)や折り返し(自動的に入る改行)ではなく、\\ で入る改行のこと。))では二分下がりになる。)問題は、段落頭では \parindent の全角空きが入るのだが、この直後に開き括弧を書くと、行頭ではなく通常の和文文字の直後にあるような動作――つまり自然長が半角で伸縮する空き(グルー)が入る――をすることである(強制改行の後も同様)。

この pTeX の「欠点」はよく知られていて、例えば奥村氏の「新ドキュメントクラス(JS クラス)」では当該のグルーが入らないように調整されている。従って、最初に述べたような「揃わない」現象は起こり得ず、段落頭の開き括弧は全角下がり*2の位置に揃うことになる。*3ただし、この対策も完全ではなく、例えば minipage 環境では調整が働かないようである。実際にこの調整を自動で行うのには困難を伴うのであるが、それについて後述する。

手動で調整を行うのは簡単で、括弧の前に自動挿入されるグルー(メトリック由来のグルー)は \inhibitglueで消すことができるので、括弧の前にこの命令――またはその「略称」の \<――を置けばよい。もし敢えて半角の空きを残す(ただし伸縮させない)を残したいならば、これと明示的なカーンを併用すればよいわけである。

\def\HPI{\kern.5zw\<}

\<「どうして?」 % 全角下がりで揃える

\HPI「どうして?」 % 全角二分下がりで揃える

*1:3.1.5 節の b。図 3.15 の②。

*2:折り返し行頭や強制改行の行頭(これも調整が加えられている)も含めて「要件」の 3.1.5 節の a、図 3.15 の①と一致する。

*3:もちろん、JS クラスでは(ページの)縦組みはできない。