OSDN Git Service

5a26699a5470f81af58a9a045084541125d2376f
[luatex-ja/luatexja.git] / doc / jfmglue.tex
1 %#! time luatex jfmglue
2 \input s1sty.tex % style file
3 \newcount\ncount
4 \def\node#1{
5   \ifnum\ncount=0 \ncount=1\else\longrightarrow\fi
6   \setbox0=\hbox{\kern.5em$\mathstrut#1$\kern.5em}\dp0=0pt
7   \hbox{\vrule
8     $\vcenter{\hsize=\wd0\hrule\kern.5ex\copy0\kern.5ex\hrule}$%
9     \vrule\kern.1em}{}}
10 \def\nk{{\rm kern}\ }
11 \def\ng{{\rm glue}\ }
12 \def\np{{\rm penalty}\ }
13 \def\z{\,{\rm zw}}
14 \jfont\tenmini={file:ipam.ttf:slant=0.5;jfm=ujis} at 13\jQ
15 \def\mibox#1{\hbox{\it #1\/}}\def\IT#1{{\it #1\/}}
16 \ltjsetparameter{alxspmode={`\$,allow}}
17 \ltjsetparameter{alxspmode={`\\,allow}}
18 \ltjsetparameter{alxspmode={`\',allow}}
19
20 \centerline{\big Lua\TeX-ja 和文処理グルーについて}\bigskip
21 \centerline{\large\the\year/\the\month/\the\day}\medskip
22
23 本文書では,Lua\TeX-jaが(現時点において)和文処理に関わるglue/kernを
24 どのように挿入するかの内部処理について説明する.
25
26 \bigskip
27 {\large\bf\noindent これは仕様・内部処理の提案の1つにしかすぎません.最終的にこのようになる
28 保証はどこにもありませんし,現時点でのLuaコードが本文書に従っている保証もありません.
29 バグが混入している可能性も大きいです.}
30
31 \beginsection 予備知識
32
33 説明に入る前に,段落やhboxの中身は,\TeX の内部ではnode達による
34 リストとして表現されていることに注意する.nodeの種類については,
35 \IT{The\ Lua\TeX\ Reference}の第8章を参照して欲しい.代表的なものを挙げると,
36
37 \item \IT{glyph\_node}: 文字(合字も含む)を表現する.和文処理グルーを挿入する際には,
38 既に各\IT{glyph\_node}が欧文文字のものか和文文字のものか区別がついている.また,
39 しばしば\IT{glyph\_node}~$p$と,それの表す文字の文字コード$p.\mibox{char}$とを同一視する.
40 \item \IT{glue\_node}: glueを表す.
41 \item \IT{kern\_node}: kernを表す.各|kern_node|には|subtype|という値があり,
42 次の3種類を区別できるようになっている.
43 \itemitem 0: 欧文用TFM由来
44 \itemitem 1: 明示的な|\kern|か,イタリック補正 (|\/|) によるもの
45 \itemitem 2: |\accent|による非数式アクセント用文字の左右位置調整のためのもの
46 \item \IT{penalty\_node}: penaltyを表す.
47 \item \IT{hlist\_node}: hbox(水平ボックス)を表す.
48 \enditem
49
50
51 \item 次のように,nodeがどのように連続しているかを表すことにする.
52 $$
53 \node{a}\node{b}_{1}\node{c}
54 $$
55 下添字は,Lua\TeX-jaにおいてそのnodeの役割を区別するためにつけられた
56 値(icflagと呼ぼう)であり,次のようになっている.
57 $$
58 \vbox{\halign{#:\ \hfil&#\hfil\quad&#:\ \hfil&#\hfil\cr
59 1&イタリック補正由来のkern &
60 2&幅補正のため,hboxにカプセル化された和文文字\cr
61 3&禁則処理用penalty&
62 4&JFM由来のglue/kern\cr
63 5&「行末」との間に入るkern&
64 6&|\kanjiskip|用glue\cr
65 7&|\xkanjiskip|用glue&
66 8&既に処理対象となったnode\cr
67 15&リスト先頭/末尾に入るglue/kern/penalty\span\omit\span\cr
68 }}
69 $$
70 和文処理グルーの挿入処理に一度通されたnodeは,みなicflagが3以上となることに注意.
71
72 なお,上添字はnodeのsubtypeを表す.
73 \item {\sf jaxspmode}のようなサンセリフ体で,|\ltjsetparameter|で設定可能なパラメタ値を表す.
74 \item タイプライタ体の|\kanjiskip|, |\xkanjiskip|は,
75 それぞれ「和文間空白」「和欧文間空白」の意味で抽象的に用いている.
76 \item nil値は$\emptyset$と書く.
77 \enditem
78
79 \beginsection 方針など
80
81 本バージョンにおいては,JFM由来グルーと|\[x]kanjiskip|の挿入は同じ段階で行われる.
82 大雑把に言うと,
83 $$
84 \vbox{\hsize=0.85\hsize\bf 和文処理グルーの挿入処理では,以下は存在しないものとして扱われる:
85 \item 「文字に付属する」アクセントやイタリック補正.
86 \item 行中数式の内部.
87 \item 実際の組版中には現れないinsertion, vadjust, mark, whatsit node達.
88 \enditem}
89 $$
90
91 \beginparagraph 和文文字の「自然長」(JFMにおける{\tt width}の指定値)について
92
93 p\TeX においては,和文文字の行頭と行末に自動的にglueやkernをおくことはできなかったことから,
94 JFMにおける文字幅の意味は,
95 $$
96 \hbox{\vbox{\hsize=0.8\hsize \noindent
97 「その文字が行頭におかれるときの,版面左端の位置」を左端,\hfill\break
98 「その文字が行末におかれるときの,版面右端の位置」を右端としたときの幅}}
99 $$
100 というように,明確な意味があるものであった.例えば,乙部さんによるぶら下げ組パッケージ ({\tt burasage.lzh})
101 においては,句読点類(「|,、.。|」の4文字)の文字幅は0.0となっている.
102
103 一方,Lua\TeX-ja においては,和文文字が行末にきた場合,その文字と行末の間にkernを挿入することができる:
104 例えば,前に挙げた4文字についてぶら下げ組をしたいのであれば,
105
106 \begintt
107    [1701] = {
108       chars = { 'lineend' }
109    },
110    [42] = {
111       chars = { ',', '、', '.', '。' },
112       align = 'left', left = 0.0, down = 0.0,
113       width = 0.5, height = 0.88, depth = 0.12, italic=0.0,
114       kern = { [1701] = -0.5, ...}
115    }, ...
116 \endtt
117 のように,「文字|'lineend'|との間に負のkernをおく」ように指定すればよい.
118 そのため,p\TeX と比較すると,JFMにおける|width|の指定値に絶対的な意味はあまりないことになる.
119 {\small 行頭にもkern をおけるようにするかどうかは検討中である.}
120
121
122 \beginparagraph グルーの挿入単位「塊」
123
124 和文処理グルーの挿入処理は,
125 ごく大雑把にいうと,「連続する2つのnodeの間に何を挿入するか」の繰り返しである.
126 実際の挿入処理は,「隣り合った2つの『塊』\IT{Nq}, \IT{Np}の間に何を入れるか」を
127 単位として行われる.
128
129 \medskip\noindent{\bf 定義}\quad
130 「{\bf 塊}」(\IT{Nn}などで表す)とは,次の4つのいずれかの条件を満たすnode(達のリスト)
131 のことである:
132 \enum icflagが3以上15未満であるnode達の連続からなるリスト.
133
134 このようなnode達は,既に組み上がったhboxを|\unpackage|により解体したときに発生する.
135 一度和文処理グルーの挿入処理が行われているため,二重の処理を防ぐためにこうして1つの塊を構成させている.
136
137 なお,icflagが15であるnodeは,処理中に発見されしだい削除される
138 (hboxの先頭や末尾に挿入されたglue/kern/penaltyであるので,
139 本来の「段落/hboxの中身に適宜グルーを挿入する」という目的を考えると存在すべきでない).
140 \enum 数式開始を表す\IT{math\_node}から始まる文中数式を表すnodeのリスト:
141 $$
142  \node{\hbox{数式境界(開始)}}
143  \longrightarrow\hbox{(この間,行中数式が続く)}
144  \node{\hbox{数式境界(終了)}}
145 $$
146 \enum \IT{glyph\_node}~$p$と,それと切り離すことが望ましくないと考えられるnode達:
147 $$
148  \Bigl[\node{\nk\hskip-.5em}^2
149  \node{\hbox{アクセント文字}}
150  \node{\nk\hskip-.5em}^2\Bigr]
151  \node{p}
152  \Bigl[\node{\nk\hskip-.5em}_1\Bigr]
153 $$
154 但し,これには$p$が${\rm icflag}=2$のhboxである場合も含む.%
155 {\small ←この場合の処理は実はおこらない?}
156 \enum {\bf 以下のどれにもあてはまらない}node~$p$:
157 \itemitem 組版結果からは消えてしまう,\IT{ins\_node}, 
158 \IT{mark\_node}, \IT{adjust\_node}, \IT{whatsit\_node}.
159 \itemitem penalty(←但し,挿入処理の過程で値が変更されることはある)
160
161 \enditem
162
163 \medskip\noindent{\bf 記号}\quad
164 \IT{Bp}で,塊\IT{Nq}と塊\IT{Np}の間にある\IT{penalty\_node}達の配列を表す.
165
166
167 \beginsection 挿入処理の大枠
168
169 \beginparagraph 「塊」の保持するデータ
170
171 「塊」\IT{Np}は,内部では少なくとも次の要素を持ったテーブルとして表される:
172
173 \item \IT{.first}: \IT{Np}の先頭のnode.
174 \item \IT{.nuc}: \IT{Np}の「核」となるnode.
175 \itemitem 1., 2.によるものである場合,$\mibox{Np.nuc}=\mibox{Np.first}$.
176 \item \IT{.last}: \IT{Np}の最後のnode.
177 \item \IT{.id}: \IT{Np}の種類を表す値.
178 \itemitem 1.によるものである場合,\IT{id\_pbox}(Pseudo BOXのつもり).
179 \itemitem 3.によるものであり,$p$が和文文字だった場合,\IT{id\_jglyph}.
180 \itemitem 4.によるものであり,$p$が垂直変位がnon-zeroなhbox,
181 あるいはvbox, ruleだった場合,\IT{id\_box\_like}.
182 \itemitem それ以外の場合,node~$p$の種別を表す数値$p.\mibox{id}$そのもの.
183 (数値そのものだと使い勝手が悪いので,\IT{id\_glyph}, \IT{id\_glue}, \IT{id\_kern}などと
184 別名を定義している)
185 \enditem
186
187 \medskip\noindent{\bf 定義}\quad
188 「\IT{Np}の中身の先頭」を意味する$\mibox{head}(\mibox{Np})$は,以下で定義される:
189
190 \noindent{\small (説明の都合上作った記法で,Luaソース中にはこのような書き方はない)}
191
192 \item \IT{Np.id}が\IT{id\_hlist}の場合:後に述べる{\tt check\_box}関数を用いて,
193 hbox~\IT{Np.nuc}中の「最初のnode」「最後のnode」を求める.
194 \item \IT{Np.id}が\IT{id\_pbox}の場合:\IT{id\_hlist}の場合とほぼ同様.
195 \item $\mibox{Np}.\mibox{id}=\mibox{id\_glyph}$(欧文文字)の場合:
196 \itemitem \IT{glyph\_node}~\IT{Np.nuc}が単一の文字を格納している(合字でない)場合は,\IT{Np.nuc}自身.
197 \itemitem そうでない場合は,合字の構成要素の先頭→構成要素の先頭→……
198 と再帰的に探索し,最後にたどり着いた\IT{glyph\_node}.
199 \item $\mibox{Np}.\mibox{id}=\mibox{id\_disc}$ (discretionary break) の場合:
200 \IT{disc\_node}は,
201 \item $\mibox{Np}.\mibox{id}=\mibox{id\_jglyph}$(和文文字)の場合:\IT{Np.nuc}自身.
202 \item $\mibox{Np}.\mibox{id}=\mibox{id\_math}$(数式境界)の場合:
203 「文字コード$-1$の欧文文字」を仮想的に考え,それを$\mibox{head}(\mibox{Np})$とする.
204 \item それ以外の場合:未定義.敢えて書けば$\mibox{head}(\mibox{Np}):=\emptyset$.
205 \enditem
206
207 \noindent 同様にして,「\IT{Np}の中身の先頭」を意味する$\mibox{last}(\mibox{Np})$も定義され,
208 「\IT{Np}は,先頭が$\mibox{head}(\mibox{Np})$,
209 末尾が$\mibox{tail}(\mibox{Np})$であるような単語」のように
210 考えることができる.
211
212 \medskip\noindent{\bf 定義}\quad
213 「\IT{glyph\_node}~$h$の情報を算出する」とは,
214 $h\neq\emptyset$の時に,テーブル\IT{Np}に
215 以下のような要素を追加することである:
216
217 \item \IT{.pre}: $h$の文字コードに対する{\sf prebreakpenalty}パラメタの値
218 \item \IT{.post}: $h$の文字コードに対する{\sf postbreakpenalty}パラメタの値
219 \item \IT{.xspc\_before}, \IT{.xspc\_after}: $h$の前後に|\xkanjiskip|が挿入可能であるかの
220 指定値(パラメタ{\sf jaxspmode}, {\sf alxspmode}由来)
221 \item \IT{.auto\_xspc}: $h$での{\sf autoxspacing}パラメタの値
222 \enditem
223
224 $h$が和文文字を格納している場合は,さらに次の要素の追加作業も含む:
225
226 \item \IT{.size}: $h$で使われている和文フォントのフォントサイズ.
227 \item \IT{.met}, \IT{.var}: 使われているJFMの情報.
228 \item \IT{.auto\_kspc}: {\sf autospacing}パラメタの値.
229 \enditem
230
231 \beginparagraph 全体図
232
233 \enum 変数類の初期化
234 \itemitem 処理対象が段落の中身(後で行分割される)の場合:$\mibox{mode}\leftarrow\top$
235 \itemT \IT{lp}(node走査用カーソル)の初期位置は,
236 リスト先頭部にある|\parindent|由来のhboxや
237 local paragraph($\Omega$由来)等の情報を格納するwhatsit nodeたちが終わった所
238 (つまり,段落本来の先頭部分)となる.
239 \itemT \IT{last}(リスト末尾のnode)も,リストの最後部に挿入される|\parfillskip|由来のglue%
240 を指す.
241 \itemitem 
242 処理対象がhboxの中身の場合:$\mibox{mode}\leftarrow\bot$
243 \itemT \IT{lp}はリスト先頭.
244 \itemT 番人として,リスト末尾にkernを挿入.\IT{last}はこのkernとなる.
245
246 \enum 先頭が\IT{lp}以降にある塊で,一番早いものを\IT{Np}にセットする.
247 \itemitem 作業の途中で$\mibox{lp}=\mibox{last}$となったら,処理対象のリストに塊はないので,8.へ.
248 \itemitem そうでなければ,$\mibox{head}(\mibox{Np})$の情報を算出しておく.
249 \itemitem 本段階終了後,\IT{lp}は\IT{Np.last}の次のnodeとなる.
250
251
252 \enum ({\tt handle\_list\_head}) 
253 リストに最初に出てくる塊\IT{Np}が求まったので,リスト「先頭」とこの塊との間に和文処理グルーを挿入.
254
255 \enum 今の塊\IT{Np}と,その次の塊の間に入る和文処理グルーを求めるため,
256 一旦$\mibox{Nq}\leftarrow \mibox{Np}$として待避させ,次の塊\IT{Np}を探索する.
257 \itemitem 作業の途中で$\mibox{lp}=\mibox{last}$となったら,\IT{Nq}がリスト中最後の塊であるので,
258 7.へ.
259 \itemitem そうでなければ,$\mibox{head}(\mibox{Np})$の情報を算出しておく.
260 \itemitem 本段階終了後,\IT{lp}は\IT{Np.last}の次のnodeとなる.
261
262 \enum \IT{Nq}と\IT{Np}の間に和文処理グルーを挿入する.\IT{Np.id}による場合分けを行う.
263 「main loop その\nobreak1,~2」を参照のこと.
264
265 \enum \IT{Np}が単一の文字ではない{\small (合字など)}可能性がある以下の場合において,
266 $\mibox{tail}(\mibox{Np})$の情報を算出する.終わったら,再びループに入るため,4.へ.
267
268
269 \itemitem \IT{id\_glyph}(欧文文字)のとき
270 \itemitem \IT{id\_disc} (discretionary break) のとき
271 \itemitem \IT{id\_hlist}のとき
272 \itemitem \IT{id\_pbox}のとき
273
274 \enum ({\tt handle\_list\_tail}) 
275 リストの最後にある塊\IT{Nq}が求まったので,この塊とリスト「末尾」の間に和文処理グルーを挿入.
276
277 \enum $\mibox{mode}=\bot$の場合,番人となるkernを1.において挿入したので,その番人を削除する.
278
279 \enditem
280
281 \beginsection リスト先頭・末尾の処理と「boxの内容」
282
283 \beginparagraph リスト先頭の処理 ({\tt handle\_list\_head})
284
285 次の場合に,
286 \IT{Np}で使われているのと同じJFMを使った「文字コードが{\tt 'boxbdd'}の文字」と
287 \IT{Np}との間に入るglue/kernを,\IT{Np.first}の直前に挿入する:
288 \item $\mibox{Np.id}=\mibox{id\_jglyph}$(和文文字)
289 \item $\mibox{Np.id}=\mibox{id\_pbox}$であり,$\mibox{head}(\mibox{Np})$が和文文字であるとき.
290 \enditem
291 $$
292 \vcenter{\halign{$\mibox{mode}=#$:\qquad\hfil&$#$\hfil\cr
293 \bot&\node{\kern-1em}\,\hbox{(リスト先頭)}\longrightarrow\cdots\node{g}_{15}
294 \node{\mibox{Np}}\cr
295 \top&\node{\hbox{{\tt\char92 parindent}由来hbox}}\longrightarrow\cdots
296 \Bigl[\node{\np 10000}_{15}\Bigr]\node{g}_{15}\node{\mibox{Np}}\cr
297 }}
298 $$
299 ここで,$g$がglueかつ$\mibox{mode}=\top$かつ$\#\mibox{Bp}=0$のときのみ,|\parindent|由来のhboxの直後で改行されることを防ぐために
300 $g$の直前にpenaltyを挿入する.{\small 
301 ($\#\mibox{Bp}$が1以上の場合は,|\parindent|と\IT{Np}の間にある
302 penaltyのため,\IT{Np}の直前での改行が起こり得る状態となっているので,
303 特にそれを抑制することもしない)\inhibitglue}.
304
305
306 \beginparagraph リスト末尾の処理 ({\tt handle\_list\_tail})
307
308 この場合,\IT{mode}の値により処理が全く異なる.
309
310 \noindent{\bf A: \IT{mode}が偽である場合.}
311
312 この場合はリストはhboxの中身だから,行分割はおこり得ない.
313 リスト先頭の処理と同様に,
314 次の場合に
315 \IT{Nq}と「文字コードが{\tt 'boxbdd'}の文字」と
316 の間に入るglue/kernを,\IT{Nq.last}の直後に挿入する:
317 \item $\mibox{Nq.id}=\mibox{id\_jglyph}$(和文文字)
318 \item $\mibox{Nq.id}=\mibox{id\_pbox}$であり,$\mibox{tail}(\mibox{Nq})$が和文文字であるとき.
319 \enditem
320 $$
321 \node{\mibox{Nq}}\node{g}_{15}\longrightarrow\cdots\node{\nk\hbox{(番人)}}
322 $$
323 上の番人は,次のstepで除去されるのだった.
324
325 \medskip
326 \noindent{\bf B: \IT{mode}が真である場合.}
327
328 この場合,段落の末尾には常に|\penalty 10000|と|\parfillskip|由来のグルーが存在する.
329 そのため,上のように「文字コードが{\tt 'boxbdd'}の文字」との空白を考えるのではなく,
330 まず,\IT{Nq}が行末にきたときに行末との間に入る空白$w$を代わりに挿入する.
331 \item $\mibox{Nq.id}=\mibox{id\_jglyph}$(和文文字)
332 \item $\mibox{Nq.id}=\mibox{id\_pbox}$であり,$\mibox{tail}(\mibox{Nq})$が和文文字であるとき.
333 \enditem
334 $$
335 \node{\mibox{Nq}}\node{\nk w}_{15}\node{\np10000}\longrightarrow\cdots
336 \node{\ng (\hbox{\tt\char92 parfillskip})}
337 $$
338 次に,|\jcharwidowpenalty|の挿入処理を行う→省略.
339
340 \beginparagraph box内の「最初/最後の文字」の検索 ({\tt check\_box})
341
342 「hboxの中の文字と外の文字の間に」|\kanjiskip|, |\xkanjiskip|の挿入を行えるようにするため,
343 {\tt check\_box}関数ではhbox内の「最初のnode」「最後のnode」の検索を行う.
344
345 \item 以下のnodeは検索から除外される:
346 \itemitem 組版結果からは消えてしまう,\IT{ins\_node}, 
347 \IT{mark\_node}, \IT{adjust\_node}, \IT{whatsit\_node}, penalty.
348 \itemitem (box中身の先頭/末尾に入っている)icflagが7のglue/kern/penalty.
349 \itemitem アクセント部とイタリック補正.
350 \item \IT{hlist\_node}~$q$に出会ったら,$q$の垂直変位量が0である限り,検索は$q$の内部も進む.以下同文.
351 \item 検索して得られた「最初のnode」「最後のnode」がそれぞれ\IT{glyph\_node}でなければ,
352 実際には$\emptyset$を返す.
353 \enditem
354
355 \beginsection main loop その1: $\mibox{head}(\mibox{Np})$が和文文字の場合
356
357 これは,次の3つの場合でおこる:
358 \item \IT{Np.id}が\IT{id\_jglyph}の場合(本当に和文文字)
359 \item \IT{Np.id}が\IT{id\_pbox}で,$\mibox{head}(\mibox{Np})$が和文文字の場合
360 \item \IT{Np.id}が\IT{id\_hlist}で,$\mibox{head}(\mibox{Np})$が和文文字の場合
361 \enditem
362 前2つの場合は,$\mibox{head}(\mibox{Np})$は処理対象のリスト中に現れる本当の\IT{glyph\_node}である.
363 一方,最後の場合では,$\mibox{head}(\mibox{Np})$はリスト中にあるhboxの中身(の最初)に出現する\IT{glyph\_node}である.
364
365 そのため,挿入される和文処理グルーの種類については,前2つと最後の場合とで扱いを異なったものとしている:
366 $$
367 \vbox{\hsize=0.85\hsize\bf 
368 hboxの外側の文字と内側の文字の間の空白では,|\kanjiskip|, |\xkanjiskip|の量の計算では両方の文字の情報を使うが,
369 JFM由来のグルーでは内側の文字の情報は使われない.}
370 $$
371
372
373 \beginparagraph 挿入されるglue/kernの種類
374
375 \setbox1=\hbox{hp}\setbox2=\hbox to 0.4pt{\vrule height\dimexpr \ht1+0.25em\relax depth \dimexpr \dp1+0.25em\relax}
376 $$\def\:{\hskip0.5em}\lineskiplimit=\maxdimen\lineskip=0pt
377 \vcenter{\halign{\hfil\IT{#}\hfil\hskip1em\copy2%
378 \:&\:\hfil\IT{#}\hfil\:&\:\hfil\IT{#}\hfil\:&\:\hfil\IT{#}\hfil\:&\:\hfil\IT{#}\hfil%
379 \:&\:\hfil\IT{#}\hfil\:&\:\hfil\IT{#}\hfil\:&\:\hfil\IT{#}\hfil\:&\:\hfil\IT{#}\hfil\cr
380 \IT{Nq}→&id\_jglyph&&&id\_hlist 非文字\cr
381 \IT{Np}↓&id\_pbox 和&id\_hlist 和&$\mibox{head}(\mibox{Nq})$\rm: 欧文&id\_box\_like&id\_glue&id\_kern\cr
382 \noalign{\vskip.25em\hrule\vskip.25em}
383 id\_jglyph&\rm E${}+{}$(M→K)&{\rm $\rm O_A$→$\rm K$}&{\rm $\rm O_A$→X}&$\rm O_A^*$&$\rm O_A$&$\rm O_A^+$\cr
384 id\_pbox 和&\rm E${}+{}$(M→K)&{\rm $\rm O_A$→$\rm K$}&{\rm $\rm O_A$→X}&$\rm O_A^*$&$\rm O_A$&$\rm O_A^+$\cr
385 id\_hlist 和&\rm E${}+{}$($\rm O_B$→$\rm K$)&{\rm K}${}^+$&{\rm X}${}^+$&---&---&---\cr
386 }}$$
387 挿入されるglue/kernの種別を表にすると上のようになる.最後の1つ以外は,挿入される位置は\IT{Np.first}の直前であり,
388 以降「右側の空白」と呼ぶ.
389 \item M: \IT{Nq}と\IT{Np}の間に入るJFM由来のglue/kern.
390 \IT{Nq}, \IT{Np}の間で|\inhibitglue|を発行した場合は抑止される.
391 \itemitem 両方の塊で使われているJFMが(サイズもこめて)等しかったら量の決定は容易い.
392 \itemitem そうでなければ,まず
393 $$
394 \vcenter{\halign{\hfil$#:={}$&(\inhibitglue#\inhibitglue)\cr
395 gb&\IT{Nq}と「文字コードが|'diffmet'|の文字」との間に入るglue/kern.\cr
396 ga&「文字コードが|'diffmet'|の文字」と\IT{Np}との間に入るglue/kern.\cr
397 }}
398 $$
399 として2つの量を計算.少なくとも片方が$\emptyset$の場合は,もう片方の値を用いる.
400 そうでなければ,両者の値から自然長,伸び量,縮み量ごとに計算
401 (方法として,平均,和,大きい方,小さい方)を行い,それによって得られたglue/kernを採用する.
402 \item K: |\kanjiskip|を表すglueを挿入($\emptyset$にはならない).
403 \itemitem 両方の塊において「|\kanjiskip|の自動挿入が無効」
404  ($\mibox{Nq.auto\_kspc}\vee \mibox{Np.auto\_kspc}=\bot$) ならば,長さ0のglueを挿入する.
405 \itemitem {\sf kanjiskip}パラメタの自然長が$\hbox{\tt\char92maxdimen}=(2^{30}-1)\,{\rm sp}$であれば,
406 JFMに指定されている|\kanjiskip|の量を用いる.\IT{Nq}, \IT{Np}で使われているJFMが異なった時の処理は,
407 Mの場合と同じである.
408 \itemitem 上のどれにも当てはまらなければ,{\sf kanjiskip}パラメタで表される量のglueを挿入する.
409 \item X: |\xkanjiskip|を表すglueを挿入($\emptyset$にはならない).
410 \itemitem 両方の塊において「|\xkanjiskip|の自動挿入が無効」
411  ($\mibox{Nq.auto\_xspc}\vee \mibox{Np.auto\_xspc}=\bot$) ならば,長さ0のglueを挿入する.
412 \itemitem \mibox{Nq}内の文字が「直後への|\xkanjiskip|挿入が無効」という指定
413 ($\hbox{\sf alxspmode}\ge 2$)であるか,
414 \mibox{Np}内の文字が「直前への|\xkanjiskip|挿入が無効」という指定
415 ($\hbox{\sf jaxspmode}\ge 2$)であるならば,長さ0のglueを挿入する.
416 \itemitem {\sf xkanjiskip}パラメタの自然長が|\maxdimen|であれば,
417 JFMに指定されている|\xkanjiskip|の量を用いる.
418 \itemitem 上のどれにも当てはまらなければ,{\sf xkanjiskip}パラメタで表される量のglueを挿入する.
419 \item $\rm O_B$: \IT{Nq}と「文字コードが|'jcharbdd'|の文字」との間に入るglue.
420 Mのバリエーションと考えればよく,同じように|\inhibitglue|の指定で抑止される.
421 \item $\rm O_A$: 「文字コードが|'jcharbdd'|の文字」と\IT{Np}との間に入るglue.
422 Mのバリエーションと考えればよく,同じように|\inhibitglue|の指定で抑止される.
423 \item E: \IT{Nq}が行末にきたとき,\IT{Nq}と行末の間に入る空白 (kern).挿入位置は\IT{Nq.last}の直後.
424 \itemitem JFMでは「文字コード|'lineend'|の文字」との間に入るkern量として設定できる.
425 \itemitem 右側の空白がkernであるときは挿入されない.
426 \itemitem この種のkernが挿入される時,右側の空白は自然長がEの分だけ引かれる.
427 \enditem
428
429 あと,注として,
430
431 \item 「→」は,左側の種類(例えばM)のglue/kernは$\emptyset$であった場合,右側の種類(例えばK)のglueを挿入することを示す.
432 \item ${}^*$, ${}^+$は,penalty処理時のバリエーションを表す.次の節では,上添字なしの場合のpenaltyの処理について述べる.
433 \enditem
434
435 \beginparagraph penaltyまわりの処理
436
437 隣り合った塊\IT{Nq}, \IT{Np}の間には,集合\IT{Bp}で表される0個以上のpenaltyがあるのだった:
438 $$
439 \node{\mibox{Nq}}
440 \Bigl[\node{\hbox{E}}_4\Bigr]
441 \longrightarrow\cdots 
442 \hbox{(penaltyある可能性あり)}\cdots
443 \Bigl[\node{\hbox{M, K, X他}}_{3,\,5,\,6}\Bigr]
444 \node{\mibox{Np}}
445 $$
446 このような状況下で,禁則処理に関係するpenaltyの挿入処理は,原則として(上ほど優先度高):
447 \item $\#\mibox{Bp}\ge 1$の場合,{\bf 全ての}\IT{Bp}の元$p$~(penalty)に対して,
448 $$p.\mibox{penalty}\mathrel{+}=\mibox{Nq.post}+\mibox{Np.pre}.$$
449 \itemitem 
450 全ての\IT{Bp}の元に対して行うのは,実際にはどのpenaltyの位置で行分割が行われるかわからないからである.
451 \itemitem $\mibox{Nq.id}=\mibox{id\_hlist}$の場合には,\IT{Nq.post}は0と扱われる.
452 $\mibox{Np.id}=\mibox{id\_hlist}$の場合も同様.
453
454 \item $\#\mibox{Bp}=0$かつ$\mibox{Nq.post}+\mibox{Np.pre}=:a\neq 0$,
455 さらに「右側の空白がkernでない」場合:
456 $p.\mibox{penalty}=a$であるpenalty~$p$を作成し,
457 それを(M, K他のglue挿入前に)\IT{Np.first}の直前に挿入する.
458 つまり,この場合,
459 $$
460 \longrightarrow\cdots\longrightarrow\node{\np a}
461 \Bigl[\node{\hbox{M, K, X他}}_{3,\,5,\,6}\Bigr]
462 \node{\mibox{Np}}
463 $$
464 となる.
465 \item $\#\mibox{Bp}=0$かつ${\rm E}\neq 0$(かつ右側の空白がglue)の場合:同様に新たなpenaltyを作る.\hfil\break
466 (Eの位置で改行可能にしたいので)
467 \item つまり,$\#\mibox{Bp}=0$であったとき,新たなpenaltyを作らないのは,
468 ${\rm E}=0$かつ$a=0$の場合に限る.
469 \enditem
470
471 なお,penalty値の計算では,$+10000$は正の無限大,$-10000$は負の無限大として扱っている.
472 そのため,通常の加減算で絶対値が10000を越えたら,その分はカットしている.
473 あと,$(10000)+(-10000)=0$としている.また,\IT{Nq.post}, \IT{Np.pre}が$\emptyset$の場合は,
474 それぞれ0として扱う.
475
476 \medskip\noindent{\bf バリエーションについて}\quad
477 前節の表に出てきた${}^*$, ${}^+$では,上の原則から以下の点が変更されている.
478 変更点は,いずれも$\#\mibox{Bp}=0$の場合に関するところのみである:
479
480 \item ${}^*$: \IT{Nq}と\IT{Np}の間での行分割を常に可能とするため,
481 右側の空白($\rm O_A$)が$\emptyset$の場合であっても新たなpenaltyを作る.
482
483 \item ${}^+$: このとき,\IT{Nq}と\IT{Np}の間での行分割は元々不可能である.
484 Lua\TeX-ja では,そのような場合を「わざわざ行分割可能に」することはしない.そのため,
485 \itemitem 右側の空白がglueの場合は,値が10000のpenaltyを作成する.
486 \itemitem 右側の空白が$\emptyset$かkernの場合は,新たにpenaltyを作ることはしない.
487 \enditem
488
489 \beginparagraph いくつかの例:未完
490
491 \beginsection main loop その2: その他の場合
492
493 \setbox1=\hbox{hp}\setbox2=\hbox to 0.4pt{\vrule height\dimexpr \ht1+0.25em\relax depth \dimexpr \dp1+0.25em\relax}
494 $$\def\:{\hskip0.5em}\lineskiplimit=\maxdimen\lineskip=0pt
495 \vcenter{\halign{\hfil\IT{#}\hfil\hskip1em\copy2%
496 \:&\:\hfil\IT{#}\hfil\:&\:\hfil\IT{#}\hfil\:&\:\hfil\IT{#}\hfil\:&\:\hfil\IT{#}\hfil%
497 \:&\:\hfil\IT{#}\hfil\:&\:\hfil\IT{#}\hfil\:&\:\hfil\IT{#}\hfil\:&\:\hfil\IT{#}\hfil\cr
498 \IT{Np}→&&id\_hlist 非文字\cr
499 \IT{Nq}↓&$\mibox{head}(\mibox{Nq})$\rm: 欧文&id\_box\_like&id\_glue&id\_kern\cr
500 \noalign{\vskip.25em\hrule\vskip.25em}
501 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
502 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
503 id\_hlist 和&\rm X${}^+$&---&---&---\cr
504 他&---&---&---&---\cr
505 }}$$
506
507 \end