-%#! time luatex jfmglue
-\input s1sty.tex % style file
-\newcount\ncount
-\def\node#1{
- \ifnum\ncount=0 \ncount=1\else\longrightarrow\fi
- \setbox0=\hbox{\kern.5em$\mathstrut#1$\kern.5em}\dp0=0pt
- \hbox{\vrule
- $\vcenter{\hsize=\wd0\hrule\kern.5ex\copy0\kern.5ex\hrule}$%
- \vrule\kern.1em}{}}
-\def\nk{{\rm kern}\ }
-\def\ng{{\rm glue}\ }
-\def\np{{\rm penalty}\ }
-\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
-
-本文書では,Lua\TeX-jaが(現時点において)和文処理に関わるglue/kernを
-どのように挿入するかの内部処理について説明する.
-
-\bigskip
-{\large\bf\noindent これは仕様・内部処理の提案の1つにしかすぎません.最終的にこのようになる
-保証はどこにもありませんし,現時点でのLuaコードが本文書に従っている保証もありません.
-バグが混入している可能性も大きいです.}
-
-\beginsection 予備知識
-
-説明に入る前に,段落やhboxの中身は,\TeX の内部ではnode達による
-リストとして表現されていることに注意する.nodeの種類については,
-\IT{The\ Lua\TeX\ Reference}の第8章を参照して欲しい.代表的なものを挙げると,
-
-\item \IT{glyph\_node}: 文字(合字も含む)を表現する.和文処理グルーを挿入する際には,
-既に各\IT{glyph\_node}が欧文文字のものか和文文字のものか区別がついている.また,
-しばしば\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: |\accent|による非数式アクセント用文字の左右位置調整のためのもの
-\item \IT{penalty\_node}: penaltyを表す.
-\item \IT{hlist\_node}: hbox(水平ボックス)を表す.
-\enditem
-
-
-\item 次のように,nodeがどのように連続しているかを表すことにする.
-$$
-\node{a}\node{b}_{1}\node{c}
-$$
-下添字は,Lua\TeX-jaにおいてそのnodeの役割を区別するためにつけられた
-値(icflagと呼ぼう)であり,次のようになっている.
-$$
-\vbox{\halign{#:\ \hfil&#\hfil\quad&#:\ \hfil&#\hfil\cr
-1&イタリック補正由来のkern &
-2&幅補正のため,hboxにカプセル化された和文文字\cr
-3&禁則処理用penalty&
-4&JFM由来のglue/kern\cr
-5&「行末」との間に入るkern&
-6&|\kanjiskip|用glue\cr
-7&|\xkanjiskip|用glue&
-8&既に処理対象となったnode\cr
-15&リスト先頭/末尾に入るglue/kern/penalty\span\omit\span\cr
-}}
-$$
-和文処理グルーの挿入処理に一度通されたnodeは,みなicflagが3以上となることに注意.
-
-なお,上添字はnodeのsubtypeを表す.
-\item {\sf jaxspmode}のようなサンセリフ体で,|\ltjsetparameter|で設定可能なパラメタ値を表す.
-\item タイプライタ体の|\kanjiskip|, |\xkanjiskip|は,
-それぞれ「和文間空白」「和欧文間空白」の意味で抽象的に用いている.
-\item nil値は$\emptyset$と書く.
-\enditem
-
-\beginsection 方針など
-
-本バージョンにおいては,JFM由来グルーと|\[x]kanjiskip|の挿入は同じ段階で行われる.
-大雑把に言うと,
-$$
-\vbox{\hsize=0.85\hsize\bf 和文処理グルーの挿入処理では,以下は存在しないものとして扱われる:
-\item 「文字に付属する」アクセントやイタリック補正.
-\item 行中数式の内部.
-\item 実際の組版中には現れないinsertion, vadjust, mark, whatsit node達.
-\enditem}
-$$
-
-\beginparagraph 和文文字の「自然長」(JFMにおける{\tt width}の指定値)について
-
-p\TeX においては,和文文字の行頭と行末に自動的にglueやkernをおくことはできなかったことから,
-JFMにおける文字幅の意味は,
-$$
-\hbox{\vbox{\hsize=0.8\hsize \noindent
-「その文字が行頭におかれるときの,版面左端の位置」を左端,\hfill\break
-「その文字が行末におかれるときの,版面右端の位置」を右端としたときの幅}}
-$$
-というように,明確な意味があるものであった.例えば,乙部さんによるぶら下げ組パッケージ ({\tt burasage.lzh})
-においては,句読点類(「|,、.。|」の4文字)の文字幅は0.0となっている.
-
-一方,Lua\TeX-ja においては,和文文字が行末にきた場合,その文字と行末の間にkernを挿入することができる:
-例えば,前に挙げた4文字についてぶら下げ組をしたいのであれば,
-
-\begintt
- [1701] = {
- chars = { 'lineend' }
- },
- [42] = {
- chars = { ',', '、', '.', '。' },
- align = 'left', left = 0.0, down = 0.0,
- width = 0.5, height = 0.88, depth = 0.12, italic=0.0,
- kern = { [1701] = -0.5, ...}
- }, ...
-\endtt
-のように,「文字|'lineend'|との間に負のkernをおく」ように指定すればよい.
-そのため,p\TeX と比較すると,JFMにおける|width|の指定値に絶対的な意味はあまりないことになる.
-{\small 行頭にもkern をおけるようにするかどうかは検討中である.}
-
-
-\beginparagraph グルーの挿入単位「塊」
-
-和文処理グルーの挿入処理は,
-ごく大雑把にいうと,「連続する2つのnodeの間に何を挿入するか」の繰り返しである.
-実際の挿入処理は,「隣り合った2つの『塊』\IT{Nq}, \IT{Np}の間に何を入れるか」を
-単位として行われる.
-
-\medskip\noindent{\bf 定義}\quad
-「{\bf 塊}」(\IT{Nn}などで表す)とは,次の4つのいずれかの条件を満たすnode(達のリスト)
-のことである:
-\enum icflagが3以上15未満であるnode達の連続からなるリスト.
-
-このようなnode達は,既に組み上がったhboxを|\unpackage|により解体したときに発生する.
-一度和文処理グルーの挿入処理が行われているため,二重の処理を防ぐためにこうして1つの塊を構成させている.
-
-なお,icflagが15であるnodeは,処理中に発見されしだい削除される
-(hboxの先頭や末尾に挿入されたglue/kern/penaltyであるので,
-本来の「段落/hboxの中身に適宜グルーを挿入する」という目的を考えると存在すべきでない).
-\enum 数式開始を表す\IT{math\_node}から始まる文中数式を表すnodeのリスト:
-$$
- \node{\hbox{数式境界(開始)}}
- \longrightarrow\hbox{(この間,行中数式が続く)}
- \node{\hbox{数式境界(終了)}}
-$$
-\enum \IT{glyph\_node}~$p$と,それと切り離すことが望ましくないと考えられるnode達:
-$$
- \Bigl[\node{\nk\hskip-.5em}^2
- \node{\hbox{アクセント文字}}
- \node{\nk\hskip-.5em}^2\Bigr]
- \node{p}
- \Bigl[\node{\nk\hskip-.5em}_1\Bigr]
-$$
-但し,これには$p$が${\rm icflag}=2$のhboxである場合も含む.%
-{\small ←この場合の処理は実はおこらない?}
-\enum {\bf 以下のどれにもあてはまらない}node~$p$:
-\itemitem 組版結果からは消えてしまう,\IT{ins\_node},
-\IT{mark\_node}, \IT{adjust\_node}, \IT{whatsit\_node}.
-\itemitem penalty(←但し,挿入処理の過程で値が変更されることはある)
-
-\enditem
-
-\medskip\noindent{\bf 記号}\quad
-\IT{Bp}で,塊\IT{Nq}と塊\IT{Np}の間にある\IT{penalty\_node}達の配列を表す.
-
-
-\beginsection 挿入処理の大枠
-
-\beginparagraph 「塊」の保持するデータ
-
-「塊」\IT{Np}は,内部では少なくとも次の要素を持ったテーブルとして表される:
-
-\item \IT{.first}: \IT{Np}の先頭のnode.
-\item \IT{.nuc}: \IT{Np}の「核」となるnode.
-\itemitem 1., 2.によるものである場合,$\mibox{Np.nuc}=\mibox{Np.first}$.
-\item \IT{.last}: \IT{Np}の最後のnode.
-\item \IT{.id}: \IT{Np}の種類を表す値.
-\itemitem 1.によるものである場合,\IT{id\_pbox}(Pseudo BOXのつもり).
-\itemitem 3.によるものであり,$p$が和文文字だった場合,\IT{id\_jglyph}.
-\itemitem 4.によるものであり,$p$が垂直変位がnon-zeroなhbox,
-あるいはvbox, ruleだった場合,\IT{id\_box\_like}.
-\itemitem それ以外の場合,node~$p$の種別を表す数値$p.\mibox{id}$そのもの.
-(数値そのものだと使い勝手が悪いので,\IT{id\_glyph}, \IT{id\_glue}, \IT{id\_kern}などと
-別名を定義している)
-\enditem
-
-\medskip\noindent{\bf 定義}\quad
-「\IT{Np}の中身の先頭」を意味する$\mibox{head}(\mibox{Np})$は,以下で定義される:
-
-\noindent{\small (説明の都合上作った記法で,Luaソース中にはこのような書き方はない)}
-
-\item \IT{Np.id}が\IT{id\_hlist}の場合:後に述べる{\tt check\_box}関数を用いて,
-hbox~\IT{Np.nuc}中の「最初のnode」「最後のnode」を求める.
-\item \IT{Np.id}が\IT{id\_pbox}の場合:\IT{id\_hlist}の場合とほぼ同様.
-\item $\mibox{Np}.\mibox{id}=\mibox{id\_glyph}$(欧文文字)の場合:
-\itemitem \IT{glyph\_node}~\IT{Np.nuc}が単一の文字を格納している(合字でない)場合は,\IT{Np.nuc}自身.
-\itemitem そうでない場合は,合字の構成要素の先頭→構成要素の先頭→……
-と再帰的に探索し,最後にたどり着いた\IT{glyph\_node}.
-\item $\mibox{Np}.\mibox{id}=\mibox{id\_disc}$ (discretionary break) の場合:
-\IT{disc\_node}は,
-\item $\mibox{Np}.\mibox{id}=\mibox{id\_jglyph}$(和文文字)の場合:\IT{Np.nuc}自身.
-\item $\mibox{Np}.\mibox{id}=\mibox{id\_math}$(数式境界)の場合:
-「文字コード$-1$の欧文文字」を仮想的に考え,それを$\mibox{head}(\mibox{Np})$とする.
-\item それ以外の場合:未定義.敢えて書けば$\mibox{head}(\mibox{Np}):=\emptyset$.
-\enditem
-
-\noindent 同様にして,「\IT{Np}の中身の先頭」を意味する$\mibox{last}(\mibox{Np})$も定義され,
-「\IT{Np}は,先頭が$\mibox{head}(\mibox{Np})$,
-末尾が$\mibox{tail}(\mibox{Np})$であるような単語」のように
-考えることができる.
-
-\medskip\noindent{\bf 定義}\quad
-「\IT{glyph\_node}~$h$の情報を算出する」とは,
-$h\neq\emptyset$の時に,テーブル\IT{Np}に
-以下のような要素を追加することである:
-
-\item \IT{.pre}: $h$の文字コードに対する{\sf prebreakpenalty}パラメタの値
-\item \IT{.post}: $h$の文字コードに対する{\sf postbreakpenalty}パラメタの値
-\item \IT{.xspc\_before}, \IT{.xspc\_after}: $h$の前後に|\xkanjiskip|が挿入可能であるかの
-指定値(パラメタ{\sf jaxspmode}, {\sf alxspmode}由来)
-\item \IT{.auto\_xspc}: $h$での{\sf autoxspacing}パラメタの値
-\enditem
-
-$h$が和文文字を格納している場合は,さらに次の要素の追加作業も含む:
-
-\item \IT{.size}: $h$で使われている和文フォントのフォントサイズ.
-\item \IT{.met}, \IT{.var}: 使われているJFMの情報.
-\item \IT{.auto\_kspc}: {\sf autospacing}パラメタの値.
-\enditem
-
-\beginparagraph 全体図
-
-\enum 変数類の初期化
-\itemitem 処理対象が段落の中身(後で行分割される)の場合:$\mibox{mode}\leftarrow\top$
-\itemT \IT{lp}(node走査用カーソル)の初期位置は,
-リスト先頭部にある|\parindent|由来のhboxや
-local paragraph($\Omega$由来)等の情報を格納するwhatsit nodeたちが終わった所
-(つまり,段落本来の先頭部分)となる.
-\itemT \IT{last}(リスト末尾のnode)も,リストの最後部に挿入される|\parfillskip|由来のglue%
-を指す.
-\itemitem
-処理対象がhboxの中身の場合:$\mibox{mode}\leftarrow\bot$
-\itemT \IT{lp}はリスト先頭.
-\itemT 番人として,リスト末尾にkernを挿入.\IT{last}はこのkernとなる.
-
-\enum 先頭が\IT{lp}以降にある塊で,一番早いものを\IT{Np}にセットする.
-\itemitem 作業の途中で$\mibox{lp}=\mibox{last}$となったら,処理対象のリストに塊はないので,8.へ.
-\itemitem そうでなければ,$\mibox{head}(\mibox{Np})$の情報を算出しておく.
-\itemitem 本段階終了後,\IT{lp}は\IT{Np.last}の次のnodeとなる.
-
-
-\enum ({\tt handle\_list\_head})
-リストに最初に出てくる塊\IT{Np}が求まったので,リスト「先頭」とこの塊との間に和文処理グルーを挿入.
-
-\enum 今の塊\IT{Np}と,その次の塊の間に入る和文処理グルーを求めるため,
-一旦$\mibox{Nq}\leftarrow \mibox{Np}$として待避させ,次の塊\IT{Np}を探索する.
-\itemitem 作業の途中で$\mibox{lp}=\mibox{last}$となったら,\IT{Nq}がリスト中最後の塊であるので,
-7.へ.
-\itemitem そうでなければ,$\mibox{head}(\mibox{Np})$の情報を算出しておく.
-\itemitem 本段階終了後,\IT{lp}は\IT{Np.last}の次のnodeとなる.
-
-\enum \IT{Nq}と\IT{Np}の間に和文処理グルーを挿入する.\IT{Np.id}による場合分けを行う.
-「main loop その\nobreak1,~2」を参照のこと.
-
-\enum \IT{Np}が単一の文字ではない{\small (合字など)}可能性がある以下の場合において,
-$\mibox{tail}(\mibox{Np})$の情報を算出する.終わったら,再びループに入るため,4.へ.
-
-
-\itemitem \IT{id\_glyph}(欧文文字)のとき
-\itemitem \IT{id\_disc} (discretionary break) のとき
-\itemitem \IT{id\_hlist}のとき
-\itemitem \IT{id\_pbox}のとき
-
-\enum ({\tt handle\_list\_tail})
-リストの最後にある塊\IT{Nq}が求まったので,この塊とリスト「末尾」の間に和文処理グルーを挿入.
-
-\enum $\mibox{mode}=\bot$の場合,番人となるkernを1.において挿入したので,その番人を削除する.
-
-\enditem
-
-\beginsection リスト先頭・末尾の処理と「boxの内容」
-
-\beginparagraph リスト先頭の処理 ({\tt handle\_list\_head})
-
-次の場合に,
-\IT{Np}で使われているのと同じJFMを使った「文字コードが{\tt 'boxbdd'}の文字」と
-\IT{Np}との間に入るglue/kernを,\IT{Np.first}の直前に挿入する:
-\item $\mibox{Np.id}=\mibox{id\_jglyph}$(和文文字)
-\item $\mibox{Np.id}=\mibox{id\_pbox}$であり,$\mibox{head}(\mibox{Np})$が和文文字であるとき.
-\enditem
-$$
-\vcenter{\halign{$\mibox{mode}=#$:\qquad\hfil&$#$\hfil\cr
-\bot&\node{\kern-1em}\,\hbox{(リスト先頭)}\longrightarrow\cdots\node{g}_{15}
-\node{\mibox{Np}}\cr
-\top&\node{\hbox{{\tt\char92 parindent}由来hbox}}\longrightarrow\cdots
-\Bigl[\node{\np 10000}_{15}\Bigr]\node{g}_{15}\node{\mibox{Np}}\cr
-}}
-$$
-ここで,$g$がglueかつ$\mibox{mode}=\top$かつ$\#\mibox{Bp}=0$のときのみ,|\parindent|由来のhboxの直後で改行されることを防ぐために
-$g$の直前にpenaltyを挿入する.{\small
-($\#\mibox{Bp}$が1以上の場合は,|\parindent|と\IT{Np}の間にある
-penaltyのため,\IT{Np}の直前での改行が起こり得る状態となっているので,
-特にそれを抑制することもしない)\inhibitglue}.
-
-
-\beginparagraph リスト末尾の処理 ({\tt handle\_list\_tail})
-
-この場合,\IT{mode}の値により処理が全く異なる.
-
-\noindent{\bf A: \IT{mode}が偽である場合.}
-
-この場合はリストはhboxの中身だから,行分割はおこり得ない.
-リスト先頭の処理と同様に,
-次の場合に
-\IT{Nq}と「文字コードが{\tt 'boxbdd'}の文字」と
-の間に入るglue/kernを,\IT{Nq.last}の直後に挿入する:
-\item $\mibox{Nq.id}=\mibox{id\_jglyph}$(和文文字)
-\item $\mibox{Nq.id}=\mibox{id\_pbox}$であり,$\mibox{tail}(\mibox{Nq})$が和文文字であるとき.
-\enditem
-$$
-\node{\mibox{Nq}}\node{g}_{15}\longrightarrow\cdots\node{\nk\hbox{(番人)}}
-$$
-上の番人は,次のstepで除去されるのだった.
-
-\medskip
-\noindent{\bf B: \IT{mode}が真である場合.}
-
-この場合,段落の末尾には常に|\penalty 10000|と|\parfillskip|由来のグルーが存在する.
-そのため,上のように「文字コードが{\tt 'boxbdd'}の文字」との空白を考えるのではなく,
-まず,\IT{Nq}が行末にきたときに行末との間に入る空白$w$を代わりに挿入する.
-\item $\mibox{Nq.id}=\mibox{id\_jglyph}$(和文文字)
-\item $\mibox{Nq.id}=\mibox{id\_pbox}$であり,$\mibox{tail}(\mibox{Nq})$が和文文字であるとき.
-\enditem
-$$
-\node{\mibox{Nq}}\node{\nk w}_{15}\node{\np10000}\longrightarrow\cdots
-\node{\ng (\hbox{\tt\char92 parfillskip})}
-$$
-次に,|\jcharwidowpenalty|の挿入処理を行う→省略.
-
-\beginparagraph box内の「最初/最後の文字」の検索 ({\tt check\_box})
-
-「hboxの中の文字と外の文字の間に」|\kanjiskip|, |\xkanjiskip|の挿入を行えるようにするため,
-{\tt check\_box}関数ではhbox内の「最初のnode」「最後のnode」の検索を行う.
-
-\item 以下のnodeは検索から除外される:
-\itemitem 組版結果からは消えてしまう,\IT{ins\_node},
-\IT{mark\_node}, \IT{adjust\_node}, \IT{whatsit\_node}, penalty.
-\itemitem (box中身の先頭/末尾に入っている)icflagが7のglue/kern/penalty.
-\itemitem アクセント部とイタリック補正.
-\item \IT{hlist\_node}~$q$に出会ったら,$q$の垂直変位量が0である限り,検索は$q$の内部も進む.以下同文.
-\item 検索して得られた「最初のnode」「最後のnode」がそれぞれ\IT{glyph\_node}でなければ,
-実際には$\emptyset$を返す.
-\enditem
-
-\vfill\eject
-\beginsection main loop
-
-\beginparagraph 一覧表
-
-\IT{Nq}, \IT{Np}の種類別に挿入されるglue/kernの種別を表にすると次のようになる.
-
-\def\;{\hskip0.25em}\ltjsetparameter{jacharrange={+1}}
-\def\gkf#1#2#3#4#5{$\vcenter{\small\rm\halign{\hbox to 1em{\hss##\hss}\;\vrule&%
-\hbox to 3em{\hss##\hss}&\vrule\;\hbox to 1em{\hss##\hss}\cr
-#1\mathstrut&\omit\hfil #2\span\omit\cr\noalign{\hrule}#3\strut\cr}}$}
-\setbox1=\hbox{\gkf{E}{M→K}{○}{nor}{○}}
-\setbox2=\hbox to 0.4pt{\vrule height\dimexpr \ht1+0.5em\relax depth \dimexpr \dp1\relax}
-$$\def\:{\hskip0.5em}\lineskiplimit=\maxdimen\lineskip=0pt
-\vcenter{\halign{\hfil#\hfil\hskip1em\copy2%
-\:&\:\hfil#\hfil\:&\:\hfil#\hfil\:&\:\hfil#\hfil\:&\:\hfil#\hfil%
-\:&\:\hfil#\hfil\:&\:\hfil#\hfil\:&\:\hfil#\hfil\:&\:\hfil#\hfil\cr
-\raise0.5em\hbox{$\vcenter{\hbox{\IT{Nq}→}\smallskip\hbox{\IT{Np}↓}}$}%
-&和文1&和文2&欧文&箱&id\_glue&id\_kern\cr
-\noalign{\hrule}
-和文1&
-\gkf{E}{M→K}{○}{nor}{○}&
-\gkf{}{$\rm O_A$→K}{×}{nor}{○}&
-\gkf{}{$\rm O_A$→X}{○}{nor}{○}&
-\gkf{}{$\rm O_A$}{---}{all}{○}&
-\gkf{}{$\rm O_A$}{---}{nor}{○}&
-\gkf{}{$\rm O_A$}{---}{sup}{○}\cr
-和文2&
-\gkf{E}{$\rm O_B$→K}{○}{nor}{×}&
-\gkf{}{K}{×}{sup}{×}&
-\gkf{}{X}{○}{sup}{×}\cr
-欧文&
-\gkf{E}{$\rm O_B$→X}{○}{nor}{○}&
-\gkf{}{X}{○}{sup}{×}\cr
-箱&\gkf{E}{$\rm O_B$}{○}{alw}{---}\cr
-\IT{id\_glue}&\gkf{E}{$\rm O_B$}{○}{nor}{---}\cr
-\IT{id\_kern}&\gkf{E}{$\rm O_B$}{○}{sup}{---}\cr
-}}$$
-
-\item {\bf 項目名}\quad 表1行目の\IT{Nq}の種類について説明する.\IT{Np}についても同様.
-\itemitem 「和文1」:リスト中に直接出現している和文文字.
-\itemT $\mibox{Nq.id}=\mibox{id\_jglyph}$であったとき.
-\itemT $\mibox{Nq.id}=\mibox{id\_pbox}$かつ$\mibox{last}(\mibox{Nq})$が和文文字であったとき.
-\itemitem 「和文2」:リスト内にあるhboxの中身として出現した和文文字.すなわち,
-$\mibox{Nq.id}=\mibox{id\_hlist}$かつ
-$\mibox{last}(\mibox{Nq})$が和文文字であったとき.
-\itemitem 「欧文」:$\mibox{last}(\mibox{Nq})$が欧文文字であったとき.即ち,
-\itemT リスト中に直接出現しているとき($\mibox{Nq.id}=\mibox{id\_jglyph}$ or~%
-$\mibox{Nq.id}=\mibox{id\_pbox}$かつ$\mibox{last}(\mibox{Nq})$が欧文文字).
-\itemT $\mibox{Nq.id}=\mibox{id\_hlist}$かつ
-$\mibox{last}(\mibox{Nq})$が欧文文字であったとき.
-\itemT $\mibox{Nq.id}=\mibox{id\_math}$であったとき.
-\itemitem 「箱」:前後に和文処理グルーが挿入されない用なbox状のnode.
-\itemT $\mibox{Nq.id}=\mibox{id\_list}$かつ
-$\mibox{last}(\mibox{Nq})$が文字でなかった(未定義)だったとき.
-\itemT $\mibox{Nq.id}=\mibox{id\_box\_like}$のとき.
-\itemitem 「\IT{id\_glue}」:そのまま,$\mibox{Nq.id}=\mibox{id\_glue}$であったとき.
-\itemitem 「\IT{id\_kern}」:そのまま,$\mibox{Nq.id}=\mibox{id\_kern}$であったとき.
-
-\item 表中の各セルは,それぞれ次のような内容を表している:
-$$\vcenter{\rm\halign{\hbox to 3em{\hss#\hss}\;\vrule&%
-\hbox to 3.5em{\hss#\hss}&\vrule\;\hbox to 3em{\hss#\hss}\cr
-左空白\mathstrut&\omit\hfil 右空白\span\omit\cr\noalign{\hrule}L&P取扱\strut&R\cr}}$$
-
-\itemitem 「左空白」:\IT{Nq}の直後に挿入される空白の種類.空欄は,何も入らないことを表す.
-\itemitem 「右空白」:\IT{Np}の直前に挿入される空白の種類.
-
-なお,「A→B」は,まずAの種類のglue/kernを調べ,それが未定義ならば,
-Bの種類のglue/kernを採用することを示している.このとき,矢印の右側に入る空白%
-(K, X)はいつでも定義されていることに注意.
-
-\itemitem 「P取扱」:\IT{Nq}と\IT{Np}の間に入る禁則用ペナルティの取扱の方法を表す.
-\IT{Nq}と\IT{Np}の間で常に行分割を許すかに伴い,
-{\bf nor}mal, {\bf alw}ays, {\bf sup}pressの3種類がある.
-\itemitem 「L」「R」:禁則用ペナルティの挿入処理において,
-\IT{Nq.post}~(L)や\IT{Np.pre}~(R)の値を実際に活用するかどうかを示す.値は次の3種類:
-$$
-\hbox{○(利用する),×(利用せず,0として扱う),---(未定義のため0扱い)}$$
-\enditem
-
-
-\beginparagraph 挿入されるglue/kernの種類
-
-前節の表にある空白の種類についての解説を行う.
-
-\item E: \IT{Nq}が行末にきたとき,
-\IT{Nq}と行末の間に入る空白 (kern).挿入位置は\IT{Nq.last}の直後.
-\itemitem JFMでは「文字コード|'lineend'|の文字」との間に入るkern量として設定できる.
-\itemitem 右空白がkernであるときは挿入されない.
-\itemitem この種類のkernが挿入される時,右空白は自然長がEの分だけ引かれる.
-
-
-\item M: \IT{Nq}と\IT{Np}の間に入るJFM由来のglue/kern.
-\itemitem \IT{Nq}, \IT{Np}の間で|\inhibitglue|を発行した場合,挿入は抑止される.
-\itemitem 両方の塊で使われているJFMが(サイズもこめて)等しい場合は,両者で使われている
-JFMの情報をそのまま利用できるので,量の決定は容易い.
-\itemitem そうでなければ,まず
-$$
-\vcenter{\halign{\hfil$#:={}$&(\inhibitglue#\inhibitglue)\cr
-gb&\IT{Nq}と「文字コードが|'diffmet'|の文字」との間に入るglue/kern\cr
-ga&「文字コードが|'diffmet'|の文字」と\IT{Np}との間に入るglue/kern\cr
-}}
-$$
-として2つの量を計算.少なくとも片方が未定義の場合は,もう片方の値を用いる.
-そうでなければ,両者の値から自然長,伸び量,縮み量ごとに計算
-(方法として,平均,和,大きい方,小さい方)を行い,それによって得られたglue/kernを採用する.
-\item K: |\kanjiskip|を表すglueを挿入($\emptyset$にはならない).
-\itemitem 両方の塊において「|\kanjiskip|の自動挿入が無効」
- ($\mibox{Nq.auto\_kspc}\vee \mibox{Np.auto\_kspc}=\bot$) ならば,長さ0のglueを挿入する.
-\itemitem {\sf kanjiskip}パラメタの自然長が$\hbox{\tt\char92maxdimen}=(2^{30}-1)\,{\rm sp}$で
-あれば,
-JFMに指定されている|\kanjiskip|の量を用いる.\IT{Nq}, \IT{Np}で使われているJFMが異なった時の処理は,
-Mの場合と同じである.
-\itemitem 上のどれにも当てはまらなければ,{\sf kanjiskip}パラメタで表される量のglueを挿入する.
-\item X: |\xkanjiskip|を表すglueを挿入($\emptyset$にはならない).
-\itemitem 次のいずれかの場合には,|\xkanjiskip|は長さ0のglueとなる:
-\itemT 両方の塊において,「|\xkanjiskip|の自動挿入が無効」という指定
-($\mibox{Nq}.\mibox{auto\_xspc}\vee \mibox{Np}.\mibox{auto\_xspc}=\bot$)
-がされていた場合.
-\itemT \IT{Nq}内の文字について「直後への|\xkanjiskip|挿入が無効」であった場合,即ち
-$\hbox{\sf alxspmode}\ge 2$(欧文)か$\hbox{\sf jaxspmode}\equiv0\pmod2$(和文).
-\itemT \IT{Np}内の文字について「直前への|\xkanjiskip|挿入が無効」であった場合,即ち
-$\hbox{\sf alxspmode}\equiv0\pmod2$(欧文)か$\hbox{\sf jaxspmode}\ge2$(和文).
-\itemitem {\sf xkanjiskip}パラメタの自然長が|\maxdimen|であれば,
-$\mibox{last}(\mibox{Nq})$, $\mibox{head}(\mibox{Np})$の片方が和文文字であるので,
-そこで使われているJFMで指定されている|\xkanjiskip|の量を用いる
-(JFMで指定されていなければ長さ0のglueと見なされる).
-\itemitem 上のどれにも当てはまらなければ,{\sf xkanjiskip}パラメタで表される量のglueを挿入する.
-\item $\rm O_B$: \IT{Nq}と「文字コードが|'jcharbdd'|の文字」との間に入るglue.
-Mのバリエーションと考えればよく,同じように|\inhibitglue|の指定で抑止される.
-\item $\rm O_A$: 「文字コードが|'jcharbdd'|の文字」と\IT{Np}との間に入るglue.
-Mのバリエーションと考えればよく,同じように|\inhibitglue|の指定で抑止される.
-\enditem
-
-
-\beginparagraph penaltyまわりの処理
-
-隣り合った塊\IT{Nq}, \IT{Np}の間には,集合\IT{Bp}で表される0個以上のpenaltyがあるのだった:
-$$
-\node{\mibox{Nq}}
-\Bigl[\node{\hbox{E}}_4\Bigr]
-\longrightarrow\cdots
-\hbox{(penaltyある可能性あり)}\cdots
-\Bigl[\node{\hbox{M, K, X他}}_{3,\,5,\,6}\Bigr]
-\node{\mibox{Np}}
-$$
-禁則処理に関係するpenaltyの挿入処理は,以下に述べるところ部分は共通の動作である.
-
-\medskip
-$\#\mibox{Bp}\ge 1$の場合には,{\bf 全ての}\IT{Bp}の元$p$~(penalty)に対して次を行う:
-$$p.\mibox{penalty}\mathrel{+}=a,\qquad a:=\mibox{Nq.post}+\mibox{Np.pre}.$$
-\item
-全ての\IT{Bp}の元に対して行うのは,
-実際にはどのpenaltyの位置で行分割が行われるかがわからないからである.
-\item 数ページ前の表で,左下が「×」 or 「---」となっていた場合は,上の計算式において
-\IT{Nq.post}は0と扱われる.右下が「×」 or 「---」なら,\IT{Np.pre}が0と扱われる.
-\item penalty値の計算では,$+10000$は正の無限大,$-10000$は負の無限大として扱っている.
-そのため,$a$の計算や$p.\mibox{penalty}$への加算代入のところでは,
-通常の加減算で絶対値が10000を越えたら分はカットし,さらに$(10000)+(-10000)=0$としている.
-\enditem
-
-$\#\mibox{Bp}=0$の場合が,penalty挿入の3種類の方法「normal」「always」「suppress」で
-異なる部分である:
-
-\item {\bf「normal」の場合:}
-次の場合に,$p.\mibox{penalty}=a$であるpenalty~$p$を作成し,
-それを(M, K他のglue挿入前に)\IT{Np.first}の直前に挿入する:
-$$
-\hbox{左空白(E)が存在しているか,$a\neq 0$かつ右空白がkernである.}
-$$
-\item {\bf「always」の場合:}
-この場合は,\IT{Nq}, \IT{Np}の間で常に行分割可能にしたいので,挿入する条件は以下のようになる:
-$$
-\hbox{左空白(E)が存在しているか,右空白がglueでない(つまり,kernか未定義のとき).}
-$$
-
-\item {\bf「suppress」の場合:}このとき,\IT{Nq}と\IT{Np}の間での行分割は元々不可能である.
-Lua\TeX-ja では,そのような場合を「わざわざ行分割可能に」することはしない.
-つまり,右空白がglueであるとき,その直前に|\penalty 10000|を挿入する.
-\enditem
-
-\beginparagraph いくつかの例:未完
-
-\beginsection main loop その2: その他の場合
-
-\setbox1=\hbox{hp}\setbox2=\hbox to 0.4pt{\vrule height\dimexpr \ht1+0.25em\relax depth \dimexpr \dp1+0.25em\relax}
-$$\def\:{\hskip0.5em}\lineskiplimit=\maxdimen\lineskip=0pt
-\vcenter{\halign{\hfil\IT{#}\hfil\hskip1em\copy2%
-\:&\:\hfil\IT{#}\hfil\:&\:\hfil\IT{#}\hfil\:&\:\hfil\IT{#}\hfil\:&\:\hfil\IT{#}\hfil%
-\:&\:\hfil\IT{#}\hfil\:&\:\hfil\IT{#}\hfil\:&\:\hfil\IT{#}\hfil\:&\:\hfil\IT{#}\hfil\cr
-\IT{Np}→&&id\_hlist 非文字\cr
-\IT{Nq}↓&$\mibox{head}(\mibox{Nq})$\rm: 欧文&id\_box\_like&id\_glue&id\_kern\cr
-\noalign{\vskip.25em\hrule\vskip.25em}
-id\_jglyph&\rm E${}+{}$({\rm $\rm O_B$→X})&\rm E${}+\rm O_B^*$&\rm E${}+\rm O_B$&\rm E${}+\rm O_B^+$\cr
-id\_pbox 和&\rm E${}+{}$({\rm $\rm O_B$→X})&\rm E${}+\rm O_B^*$&\rm E${}+\rm O_B$&\rm E${}+\rm O_B^+$\cr
-id\_hlist 和&\rm X${}^+$&---&---&---\cr
-他&---&---&---&---\cr
-}}$$
-
-\end