マクロツイーター

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

和文処理のグルーに関するある誤解

pTeX では和文組版に関する処理を行うために文字間にグルーを挿入している。このグルーの挿入の規則の詳細については非常に複雑で理解困難であるため、それに関する誤解をよく見かける。ここでは和文\hbox に入れる処理に関する間違いを紹介する。

次のコードは間違い(或いは極めて奇怪)である。

\hbox to 1zw{。}

\hbox に寸法に指定されているので、これを書いた人は、この箱の中に伸縮するグルーがあると想定している。((箱の中に伸縮するグルーがないと、そもそも箱の中身を「ある寸法に合わせて」組むことは不可能である。もっと自明な例でいうと、\hbox to 20pt{A} が成功するには文字〈A〉の字幅が 20pt でなければならず、もしそうであるならそもそも to 20pt を指定する意味がない。だから(欧文の場合に)こんなコードは絶対に書かれない。))つまり、箱の中において〈。〉の後にグルーがあって中身の幅を 1zw に調節することができて、ゆえに幅指定をすることで中身の幅を(伸縮無しの)1zw に固定することができる……と意図していることは容易に想像できる。

しかし実際には、この状況ではグルーの自動挿入は行われない。何故なら、pTeX の仕様では、箱の(内側の)両端に調整用のグルーが自動挿入されることは決してない。(箱の外側の端には入る可能性がある。)従って、これを実行すると次のように無残に失敗することになる。

Underfull \hbox (badness 10000) detected at line 10
\JY1/mc/m/n/10 。
 []

失敗しないためには、〈。〉の直後に入って欲しかった約物調整用のグルー((JIS メトリックの場合は \hskip0.5zw。句点の後の空白は伸縮しない。))を入れる……でもよいが、この場合は伸縮自在のグルー \hss でも同じ結果になる。

\hbox to 1zw{。\hss}

しかしよく考えてみると実現したいのは「1zw の幅に〈。〉を左寄せで入れる」ことと一致するので、実は

\makebox[1zw][l]{。}

で十分である。結局 TeX で悩む必要すらなかった訳である。