%#! 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&#4\strut&#5\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
