\def\z{\,{\rm zw}}
\jfont\tenmini={file:ipam.ttf:slant=0.5;jfm=ujis} at 13\jQ
\def\mibox#1{\hbox{\it #1\/}}\def\IT#1{{\it #1\/}}
+\ltjsetparameter{alxspmode={`\$,allow}}
+\ltjsetparameter{alxspmode={`\\,allow}}
+\ltjsetparameter{alxspmode={`\',allow}}
\centerline{\big Lua\TeX-ja 和文処理グルーについて}\bigskip
\centerline{\large\the\year/\the\month/\the\day}\medskip
説明に入る前に,段落やhboxの中身は,\TeX の内部ではnode達による
リストとして表現されていることに注意する.nodeの種類については,
-\mibox{The\ Lua\TeX\ Reference}の第8章を参照して欲しい.代表的なものを挙げると,
+\IT{The\ Lua\TeX\ Reference}の第8章を参照して欲しい.代表的なものを挙げると,
\item \IT{glyph\_node}: 文字(合字も含む)を表現する.和文処理グルーを挿入する際には,
既に各\IT{glyph\_node}が欧文文字のものか和文文字のものか区別がついている.また,
-しばしば\IT{glyph\_node} $p$と,それの表す文字の文字コード$p.\mibox{char}$とを同一視する.
+しばしば\IT{glyph\_node}~$p$と,それの表す文字の文字コード$p.\mibox{char}$とを同一視する.
\item \IT{glue\_node}: glueを表す.
\item \IT{kern\_node}: kernを表す.各|kern_node|には|subtype|という値があり,
次の3種類を区別できるようになっている.
\itemitem 0: 欧文用TFM由来
\itemitem 1: 明示的な|\kern|か,イタリック補正 (|\/|) によるもの
-\itemitem 2: 非数式アクセント用文字の左右位置調整のためのもの
+\itemitem 2: |\accent|による非数式アクセント用文字の左右位置調整のためのもの
\item \IT{penalty\_node}: penaltyを表す.
\item \IT{hlist\_node}: hbox(水平ボックス)を表す.
\enditem
\begintt
)( )\hbox{}(
\endtt
-\item JFM由来グルーの挿入禁止を行う|\inhibitglue|は,内部では専用のnodeを作ること
-によって実装している.この|\inhibitglue|用nodeは透過する.
+\item 「現在位置でのJFM由来グルーの挿入抑制」を行う|\inhibitglue|は,内部では専用のwhatsit node
+($\hbox{\tt subtype}=44$, \setbox0=\hbox{|user_id|}$\copy0=30111$)を作ること
+によって実装している.これらのnodeは,「現在位置で挿入しない」というフラグを立てるためだけ
+に存在するものであって,挿入処理中に全て削除される.
\enditem
以下,$q$, $p$を連続するnodeとする.
-
\beginparagraph 2つの和文文字の間
この場合,グルー挿入に関係する量は次の通りである.これら3つの量の値によって,
\item $w$: JFMで指定された,「$q$の直後で改行が行われた場合,
$q$と行末の間に入るカーン量」の値.
-$g-w$で,$g$の自然長を$w$だけ減算したglue/kernを表すことにする.
+また,$g-w$で,$g$の自然長を$w$だけ減算したglue/kernを表すことにする($g$がglueならばこのnodeはglue,$g$がkernならばkern).
\item $P$: $q$に対する行末禁則用ペナルティ (post-break penalty) と,
$p$に対する行頭禁則用ペナルティ (pre-break penalty) との和.どちらも
設定されていないときは0となる.
\enditem
+なお,間に|\inhibitglue|による指定があった場合,$g=\emptyset$, $w=0$として処理される.
設計方針としては,
\item JFM由来で入るものがkernの場合,この場所では行分割は許さない.
\enditem
なお,ここでの$g$は,
-\item kernが前だった場合は,
-$q$のJFMにおける,「$q$と|'jcharbdd'|」の間に
-入るglue/kernの値.
-\item kernが後だった場合は,
+\item $p$がkernだった場合は,
$p$のJFMにおける,「|'jcharbdd'|と$p$」の間に
入るglue/kernの値.
+\item $q$がkernだった場合は,
+$q$のJFMにおける,「$q$と|'jcharbdd'|」の間に
+入るglue/kernの値.
\enditem
\beginparagraph 要検討の箇所
私が推測するに,欧文では,
-\item å\8d\98èª\9eå\86\85ã\81§ã\81¯ã\83\95ã\82©ã\83³ã\83\88ã\81¯å¤\89ã\82\8fã\82\89ã\81ªã\81\84ï¼\8e
+\item å\8d\98èª\9eå\86\85ã\81§ã\81¯ã\83\95ã\82©ã\83³ã\83\88ã\81¯å¤\89ã\82\8fã\82\89ã\81ªã\81\84ï¼\9b
\item 単語内では,明示的に/ハイフネーションにより挿入されたdiscretionary break以外では
-è¡\8cå\88\86å\89²ã\81\8cã\81\8aã\81\8dã\81ªã\81\84ï¼\8e
+è¡\8cå\88\86å\89²ã\81\8cã\81\8aã\81\8dã\81ªã\81\84ï¼\9b
\enditem
という事情があるため,TFM由来のkernや合字処理は(nodeを生成しないもの以外は)
何も透過しないという状態になっているものと思われます.
「|)\/(|」という入力からは,次のnodeの並びを得る:
\setbox1=\hbox{|\/|}%
$$
-\node{\hbox{)}}
-\node{\np 10000}_{\rm K}
-\node{\ng 0.5\z_{-0.5}}_{\rm J}
-\node{\nk \copy1}
-\node{\ng 0.5\z_{-0.5}}_{\rm J}
-\node{\hbox{(}}
+\vbox{\halign{$#$\hfil&$#$\hfil&$#$\hfil&$#$\hfil&$#$\hfil\cr
+\node{\hbox{)}}&\ncount=1
+\node{\np 10000}_{\rm K}&\ncount=1
+\node{\ng 0.5\z_{-0.5}}_{\rm J}\cr&\ncount=1
+\node{\nk \copy1}&\ncount=1
+\node{\np 10000}_{\rm K}&\ncount=1
+\node{\ng 0.5\z_{-0.5}}_{\rm J}&\ncount=1
+\node{\hbox{(}}\cr
+}}
$$
一方,イタリック補正をJFM由来グルーが透過するとしたならば,当然
$$
\item {\bf 数式の取り扱い}
-まだ数式中に和文文字が(hboxでカプセル化されることなく)出現することは想定していないが,
-数式用コードを書いた後は,「数式中は和文処理グルーの挿入処理を無効とする」ようにしないといけないだろう.
+まだ数式中に和文文字が(hboxでカプセル化されることなく)出現することは想定していない.
+実用的にはそれでも十分だと思うが,もしp\TeX のように単に
+\begintt
+$aあa$
+\endtt
+などと書いても和文文字が
+出力されるようにするとなれば,「数式リストから変換されてできた水平リストでは,
+和文処理グルーの挿入処理を無効とする」ようにしないといけないだろう.
\enditem
ループの中で,以下の場合には\IT{nr}は変化せず,$\IT{nq}\leftarrow \IT{np}$となる.
つまり,これらのnodeに対して|\[x]kanjiskip|は透過する:
\item \IT{np}がpenaltyの場合
-\item \IT{np}が|subtype|が0のkern(TFM由来)の場合.
-\item \IT{np}が|subtype|が1のkern(つまり,明示的kernかイタリック補正由来)であって,jtypeが
+\item \IT{np}が$\hbox{\tt subtype}=0$のkern(TFM由来)の場合.
+\item \IT{np}が$\hbox{\tt subtype}=1$のkern(つまり,明示的kernかイタリック補正由来)であって,jtypeが
$$
\hbox{I (イタリック補正),E(行末との間),T(一時的)}
$$
行われる処理は,$\mibox{insert\_skip}\leftarrow\mibox{no\_skip}$,
$\mibox{np}\leftarrow\mibox{next}(\mibox{np})$だけである.
-\item $\hbox{\tt subtype}=2$(アクセント由来)の場合.
+\item $\hbox{\tt subtype}=2$(|\accent|由来)の場合.
\IT{np}はリストの先頭から走査されていることから,\IT{np}に続くnodeの並びは
$$\ncount=0
最後に,今まで説明した,JFM由来グルーと|\[x]kanjiskip|の処理によって,実際にどのようにnodeの
並びが変わるかをいくつかの例で示す.上付きで$*$がついているnodeは,値が0だと挿入されないことを示す.
+
\item {\bf 例1: 2つの連続する和文文字の間}
\setbox1=\hbox{|\kanjiskip|}
$$\ncount=0
\left\{\vcenter{%
\halign{$#$\hfil\cr
\ncount=0\node{{\rm glue/kern}\ g+w}_{\rm J}\cr
-\ncount=0\node{\ng \copy1}_{\rm KS}\cr
+\ncount=0\node{\copy1+w}_{\rm KS}\cr
}}\right\}
\node{\hbox{和文文字}}\cr
}}
\left\{\vcenter{%
\halign{$#$\hfil\cr
\ncount=0\node{{\rm glue/kern}\ g+w}_{\rm J}\cr
-\ncount=0\node{\ng \copy1}_{\rm XS}\cr
+\ncount=0\node{\copy1+w}_{\rm XS}\cr
}}\right\}^*
\node{\hbox{欧文文字}}\cr
}}
$$
+ここで,上の2つの例に出てきた記号の意味は次の通り:
+\itemitem $w$: 前側の和文文字と行末の間に入るkern量.
+\itemitem $g$: 2つの文字の間に入るglue/kern(JFM由来).
+\itemitem $P$: 2つの文字の禁則用penaltyの合計値.
+
\par\vfill\eject
\item {\bf 例3: 2つの和文文字の間にいくつかの「無視される」node達}