マクロツイーター

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

TeX の行分割の規則が和文絡みでアレな例

欧文 TeX での行分割処理において、分割可能な個所は「破棄可能物(discardable item;グル―・カーン・ペナルティの総称)」*1またはディスクレショナリ(discretionary)の位置に限られ、*2その他の位置で分割されることはない。それでは pTeX 系の和文文字がある場合はどうだろうか?

例えばソース上で「C言語」と書いた場合、各文字の間では行分割可能であることは周知の通りである。しかし、この場合の「実際の処理対象の(ノードの)リスト」は、\showbox のダンプの表現を借りれば(ただし表示されないが論理的には入っている和文グル―を「《\glue(\kanjiskip)...》」で補うことにする)以下のようになるはずである。((\tracingoutput の機能を使うと実際に「箱に入っている」様子」が見られるが、無論これは既に行分割されたあとの状態である。分割前のリストを実際に「見る」のは難しいが、ここで扱う事項に関しては、わざと(分割できない)hbox に入れて \showbox で中を見るのでも代用できる。(実際には限定水平モードでのリストの構成には少し癖がある。)))

.\OT1/cmr/m/n/10 C
.\glue(\xkanjiskip) 2.5 plus 1.49994 minus 0.59998
.\JY1/mc/m/n/10 言
《\glue(\kanjiskip) 0.0 plus 0.92473 minus 0.0924》
.\JY1/mc/m/n/10 語

なので、この場合は、破棄可能物(グル―)のある箇所だけで分割されると考えても矛盾しない。それでは次の場合はどうだろうか。

言\vrule width1zw\relax 語

この場合の「リスト」は次のようになる。そこには全くグル―が存在しない。

....\JY1/mc/m/n/10 言
....\rule(*+*)x9.24687
....\JY1/mc/m/n/10 語

では、その内部には分割可能点は存在しないか、というとそうではない。例えば、

\vbox{\hsize=1zw 言\vrule width1zw\relax 語}

のような例を試せば解るように、〈言〉と罫(rule)および罫と〈語〉の間では行分割が可能である。ここで、罫の両端にあるのが欧文文字であれば行分割可能にはならない。要するに、pTeX 系の和文文字の行分割のルールは欧文文字とは異なるのである。

和文文字(ノード)に隣接するものが破棄可能物でない場合、その間で行分割可能である。
(破棄可能物の一部のある箇所が行分割可能であるということは変わらない。)

次の様な例を考える。

C\hbox{\#}言語っ!
.\OT1/cmr/m/n/10 C
.\hbox(6.94444+1.94443)x8.33336, yoko direction
..\OT1/cmr/m/n/10 #                                  #(前はhboxで破棄可能でない)
.\JY1/mc/m/n/10 言                                   #↖〈言〉の前で分割可能
《\glue(\kanjiskip) 0.0 plus 0.92473 minus 0.0924》  #←ここで分割可能
.\JY1/mc/m/n/10 語
.\penalty 150(for kinsoku)                           #←ここで分割可能(ペナルティ150)
.\glue(\kanjiskip) 0.0 plus 0.92473 minus 0.0924     #(ここではない)
.\JY1/mc/m/n/10 っ
.\penalty 10000(for kinsoku)                         #ペナルティ10000だから分割不可
.\glue(\kanjiskip) 0.0 plus 0.92473 minus 0.0924     #(ここも違う)
.\JY1/mc/m/n/10 !

和文文字〈言〉の前が hbox であり破棄可能でないのでここで分割可能となる。*3〈言〉と〈語〉の間には \kanjiskip がありここでも分割可能。〈語〉と〈っ〉の間は「ペナルティ→グル―」の列なので、前のペナルティの箇所で(150 のペナルティ付きで)分割可能である。〈っ〉と〈!〉の間も同じパターンだが、ここで分割するとペナルティ 10000 が課される*4ので実際にはここでは分割されない。

*1:もちろん全ての破棄可能物が分割可能である訳ではない。例えば単独のカーンは分割点にならないし、値が 10000 のペナルティも分割可能でない。

*2:分綴の処理はディスクレショナリを自動挿入することで行われる。

*3:欧文文字〈C〉と hbox の間は分割不可。

*4:10000 以上のペナルティは「無限大」として扱われる。9999 なら分割される可能性がある。