OSDN Git Service

Fixed ticket #25935
[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 \beginsection 予備知識
27
28 説明に入る前に,段落やhboxの中身は,\TeX の内部ではnode達による
29 リストとして表現されていることに注意する.nodeの種類については,
30 \IT{The\ Lua\TeX\ Reference}の第8章を参照して欲しい.代表的なものを挙げると,
31
32 \item \IT{glyph\_node}: 文字(合字も含む)を表現する.和文処理グルーを挿入する際には,
33 既に各\IT{glyph\_node}が欧文文字のものか和文文字のものか区別がついている.また,
34 しばしば\IT{glyph\_node}~$p$と,それの表す文字の文字コード$p.\mibox{char}$とを同一視する.
35 \item \IT{glue\_node}: glueを表す.
36 \item \IT{kern\_node}: kernを表す.各|kern_node|には|subtype|という値があり,
37 次の3種類を区別できるようになっている.
38 \itemitem 0: 欧文用TFM由来
39 \itemitem 1: 明示的な|\kern|か,イタリック補正 (|\/|) によるもの
40 \itemitem 2: |\accent|による非数式アクセント用文字の左右位置調整のためのもの
41 \item \IT{penalty\_node}: penaltyを表す.
42 \item \IT{hlist\_node}: hbox(水平ボックス)を表す.
43 \enditem
44
45
46 \item 次のように,nodeがどのように連続しているかを表すことにする.
47 $$
48 \node{a}\node{b}_{\rm I}\node{c}
49 $$
50 右下についている添字は,Lua\TeX-jaにおいてそのnodeの役割を区別するためにつけられた
51 値(jtypeと呼ぼう)であり,次のようになっている.
52 $$
53 \vbox{\halign{#:\ \hfil&#\hfil\quad&#:\ \hfil&#\hfil\cr
54 I&イタリック補正由来のkern&
55 T&|\[x]kanjiskip|に置換されうるkern\cr
56 J&JFM由来のglue/kern&
57 K&禁則処理用penalty\cr
58 E&「行末」との間に入るkern&
59 KS&|\kanjiskip|用glue\cr
60 XS&|\xkanjiskip|用glue\cr
61 }}
62 $$
63 \item {\sf jaxspmode}のようなサンセリフ体で,|\ltjsetparameter|で設定可能なパラメタ値を表す.
64 \item タイプライタ体の|\kanjiskip|, |\xkanjiskip|は,それぞれ「和文間空白」「和欧文間空白」の意味で
65 抽象的に用いている.
66 \item nil値は$\emptyset$と書く.
67 \enditem
68
69 \beginsection JFM由来グルーの挿入 ({\tt luatexja-jfmglue.lua})
70
71 JFM由来グルーの処理は,「連続する2つのnodeの間に何を入れるか」という単位で行われる.
72 そのため,
73 \item node生成を伴わないもの(グループ境界,|\relax|等)は全て無視される.
74 \item 一方,node生成を伴うものは全て「透過しない」.
75 例えば,次のソースにおいて,閉じ括弧と開き括弧の間に入る物は,
76 左と右とで異なる:
77 \begintt
78 )(  )\hbox{}(
79 \endtt
80 \item 「現在位置でのJFM由来グルーの挿入抑制」を行う|\inhibitglue|は,内部では専用のwhatsit node 
81 ($\hbox{\tt subtype}=44$, \setbox0=\hbox{|user_id|}$\copy0=30111$)を作ること
82 によって実装している.これらのnodeは,「現在位置で挿入しない」というフラグを立てるためだけ
83 に存在するものであって,挿入処理中に全て削除される.
84 \enditem
85 以下,$q$, $p$を連続するnodeとする.
86
87 \beginparagraph 2つの和文文字の間
88
89 この場合,グルー挿入に関係する量は次の通りである.これら3つの量の値によって,
90 $q$と$p$の間に何が挿入されるかが決定される.これらの記号は他の場合にも用いる.
91 \item $g$: JFMで指定された,$q$と$p$の間に入るglue/kern.
92 JFMで規定されていないときは$\emptyset$と書こう.
93 両ノードで使われているJFMが異なる時の$g$の決定方法は,後に記述する.
94 \item $w$: JFMで指定された,「$q$の直後で改行が行われた場合,
95 $q$と行末の間に入るカーン量」の値.
96
97 また,$g-w$で,$g$の自然長を$w$だけ減算したglue/kernを表すことにする($g$がglueならばこのnodeはglue,$g$がkernならばkern).
98
99 \item $P$: $q$に対する行末禁則用ペナルティ (post-break penalty) と,
100 $p$に対する行頭禁則用ペナルティ (pre-break penalty) との和.どちらも
101 設定されていないときは0となる.
102 \enditem
103 なお,間に|\inhibitglue|による指定があった場合,$g=\emptyset$, $w=0$として処理される.
104
105 設計方針としては,
106 \item JFM由来で入るものがkernの場合,この場所では行分割は許さない.
107 \item そうでない場合,(penaltyの値$P$があるが)この場所での行分割は可能である.
108 \enditem
109 である.さて,次が実際の場合わけである:
110
111 \enum $w\neq 0$, $g=\emptyset$のとき
112 $$\ncount=0
113 \node{q}
114 \node{\nk w}_{\rm E}
115 \node{\np P}_{\rm K}
116 \node{\nk{-w}}_{\rm T}
117 \node{p}
118 $$
119 この$\node{\nk{-w}}_{\rm T}$は,
120 「$q$と$p$の間で行分割されないときは間に何のglue/kernもないように見える」ために
121 挿入されたものである.次のステップで|\[x]kanjiskip|の挿入が行われる時に,このnodeは
122 |\[x]kanjiskip|用のglueに置換される.
123
124 \enum $w\neq 0$, $g\neq\emptyset$のとき:
125 $$\ncount=0
126 \node{q}
127 \node{\nk w}_{\rm E}
128 \node{\np P}_{\rm K}
129 \node{g-w}_{\rm J}
130 \node{p}
131 $$
132
133 \enum $w=0$, $g$: kernのとき
134 $$\ncount=0
135 \node{q}
136 \node{g}_{\rm J}
137 \node{p}
138 $$
139
140 \enum $w=0$, $g$: glueのとき
141 $$\ncount=0
142 \node{q}
143 \node{\np P}_{\rm K}
144 \node{g}_{\rm J}
145 \node{p}
146 $$
147
148 \enum $w=0$, $g=\emptyset$, $P\neq 0$のとき
149 $$\ncount=0
150 \node{q}
151 \node{\np P}_{\rm K}
152 \node{p}
153 $$
154
155 \enum $w=0$, $g=\emptyset$, $P=0$のとき
156 $$\ncount=0
157 \node{q}
158 \node{p}
159 $$
160 \enditem
161
162 なお,両ノードで使われているJFMが異なる時の$g$の決定方法であるが,
163 \enum $g_{\rm L}$を,$q$に使用されているJFMにおける,「$q$と文字|'diffmet'|」の間に
164 入るglue/kernの値とする.
165 \enum $g_{\rm R}$を,$p$に使用されているJFMにおける,「文字|'diffmet'|と$p$」の間に
166 入るglue/kernの値とする.
167 \enum 両方から,実際に入る$g$の値を計算する.
168 \itemitem $g_L$, $g_R$の少なくとも片方が$\emptyset$のときは,$\emptyset$でない方を
169 そのまま採用する.
170 \itemitem 両方とも$\emptyset$でない場合は,|differentjfm|の値にそって$g$の値を計算する.
171 \enditem
172
173 \beginparagraph 和文文字と(和文文字,kern以外のnode)の間
174
175 「和文文字の間」の場合に対して,以下が異なる:
176 \item $g$は,$q$に使用されているJFMにおける,「$q$と文字|'jcharbdd'|」の間に
177 入るglue/kernの値である.
178 \item $p$が{\bf penaltyでない場合}は,いつもこの位置で行分割できるようにするため,
179 case~6 ($w$, $P=0$, $g=\emptyset$) の場合にも,$q$と$p$の間には
180 0という値のpenaltyが入る.即ち,次のようになる.
181 $$\ncount=0
182 \node{q}
183 \node{\np 0}_{\rm K}
184 \node{p}
185 $$
186 \enditem
187
188 \beginparagraph (和文文字,kern以外のnode)と和文文字の間
189
190 この場合も,基本的には「和文文字の間」と似ているが,以下が異なる:
191 \item $g$は,$p$のJFMにおける,「文字|'jcharbdd'|と$p$」の間に
192 入るglue/kernの値である.
193 \item 常に$w=0$である.
194 \item いつもこの位置で行分割できるようにするため,
195 case~6 ($w$, $P=0$, $g=\emptyset$) の場合にも,$q$と$p$の間には
196 0という値のpenaltyが入る.
197 \enditem
198
199 即ち,次の3通りになる.
200 \enum $g$: kernのとき
201 $$\ncount=0
202 \node{q}
203 \node{g}_{\rm J}
204 \node{p}
205 $$
206
207 \enum $g$: glueのとき
208 $$\ncount=0
209 \node{q}
210 \node{\np P}_{\rm K}
211 \node{g}_{\rm J}
212 \node{p}
213 $$
214
215 \enum $g=\emptyset$のとき
216 $$\ncount=0
217 \node{q}
218 \node{\np P}_{\rm K}
219 \node{p}
220 $$
221 \enditem
222
223 \beginparagraph 和文文字とkernの間,kernと和文文字の間
224
225 和文文字の後にkernが続いた場合,あるいはkernの後に和文文字が続いた場合,
226 この間で行分割はできないものとしている.そのため,
227 以下の3ケースに限られる:
228 \enum $g$: kernのとき
229 $$\ncount=0
230 \node{q}
231 \node{g}_{\rm J}
232 \node{p}
233 $$
234
235 \enum $g$: glueのとき
236 $$\ncount=0
237 \node{q}
238 \node{\np 10000}_{\rm K}
239 \node{g}_{\rm J}
240 \node{p}
241 $$
242
243 \enum $g=\emptyset$のとき
244 $$\ncount=0
245 \node{q}
246 \node{p}
247 $$
248 \enditem
249
250 なお,ここでの$g$は,
251 \item $q$がkernだった場合は,
252 $p$のJFMにおける,「|'jcharbdd'|と$p$」の間に
253 入るglue/kernの値.
254 \item $p$がkernだった場合は,
255 $q$のJFMにおける,「$q$と|'jcharbdd'|」の間に
256 入るglue/kernの値.
257 \enditem
258
259 \beginparagraph 要検討の箇所
260
261 私が推測するに,欧文では,
262 \item 単語内ではフォントは変わらない;
263 \item 単語内では,明示的に/ハイフネーションにより挿入されたdiscretionary break以外では
264 行分割がおきない;
265 \enditem
266 という事情があるため,TFM由来のkernや合字処理は(nodeを生成しないもの以外は)
267 何も透過しないという状態になっているものと思われます.
268
269 そのため,JFMグルー等の仕様を考える場合,欧文でいう「単語」に対応するようなものは
270 何か,というのを考える必要があります.現実装では,素直に欧文の合字処理と同様のものであると考え,
271 透過するnodeはない,という仕様にしています.
272 しかし,|\[x]kanjiskip|の処理と共通にしてしまうというのも
273 考え方によってはありかもしれません.
274
275 \bigskip
276 \item {\bf イタリック補正のkernの周囲}
277
278 例えば,|jfm-ujis.lua|では,|'jcharbdd'|は文字クラス
279 0であるため,今の実装では,\hfil\break
280 「|)\/(|」という入力からは,次のnodeの並びを得る:
281 \setbox1=\hbox{|\/|}%
282 $$
283 \vbox{\halign{$#$\hfil&$#$\hfil&$#$\hfil&$#$\hfil&$#$\hfil\cr
284 \node{\hbox{)}}&\ncount=1
285 \node{\np 10000}_{\rm K}&\ncount=1
286 \node{\ng 0.5\z_{-0.5}}_{\rm J}\cr&\ncount=1
287 \node{\nk \copy1}&\ncount=1
288 \node{\np 10000}_{\rm K}&\ncount=1
289 \node{\ng 0.5\z_{-0.5}}_{\rm J}&\ncount=1
290 \node{\hbox{(}}\cr
291 }}
292 $$
293 一方,イタリック補正をJFM由来グルーが透過するとしたならば,当然
294 $$
295 \node{\hbox{)}}
296 \node{\nk \copy1}
297 \node{\ng 0.5\z_{-0.5}}
298 \node{\hbox{(}}
299 $$
300 となる(実際の組版イメージでは,
301 「{\tenmini 斜め)}\hbox{}(」「{\tenmini 斜め)}(」).どちらにするか?
302
303
304
305 \item {\bf penaltyの周囲}
306
307 これも,例えば次の設定の下では,「|)\penalty1701(|」からは以下を得る:
308 \itemitem 「)」と行末の間に$-0.5\z$だけkernを入れる.
309 \itemitem 「)」「(」の行頭/行末禁則用penaltyの値はどれも1000.
310 $$
311 \vbox{\halign{$#$\hfil&$#$\hfil&$#$\hfil&$#$\hfil&$#$\hfil\cr
312 \node{\hbox{)}}&\ncount=1
313 \node{\nk {-0.5}\z}_{\rm E}&\ncount=1
314 \node{\np 1000}_{\rm K}&\ncount=1
315 \node{\ng 1\z_{-0.5}}_{\rm J}\cr
316 &\ncount=1\node{\np 1701}&\ncount=1
317 \node{\np 1000}_{\rm K}&\ncount=1
318 \node{\ng 0.5\z_{-0.5}}_{\rm J}&\ncount=1
319 \node{\hbox{(}}\cr}}
320 $$
321 \leftskip2\zw
322 例えばpenaltyを合算することとした場合,上の入力例では本来「)」「(」の間に
323 1701のpenaltyがあるのだから,
324 $$
325 \vbox{\halign{$#$\hfil&$#$\hfil&$#$\hfil&$#$\hfil&$#$\hfil&$#$\hfil\cr
326 \node{\hbox{)}}&\ncount=1
327 \node{\nk {-0.5}\z}_{\rm E}&\ncount=1
328 \node{\np 3701}_{\rm K}&\ncount=1
329 \node{\ng 0.5\z_{-0.5}}_{\rm J}&\ncount=1
330 \node{\hbox{(}}\cr
331 \node{\hbox{)}}&\ncount=1
332 \node{\nk {-0.5}\z}_{\rm E}&\ncount=1
333 \node{\np 3701}_{\rm K}&\ncount=1
334 \node{\ng 1\z_{-0.5}}_{\rm J}&\ncount=1
335 \node{\ng 0.5\z_{-0.5}}_{\rm J}&\ncount=1
336 \node{\hbox{(}}\cr
337 }}
338 $$
339 のどちらか(上はpenaltyを透過する場合,下は透過しない場合)にするのが
340 良いと思われます.
341
342
343 \item {\bf discretionary breakの取り扱い}
344
345 discretionary break (\IT{disc\_node})は,行分割時の行末の内容<pre>,
346 行頭の内容<post>,それに行分割しないときの内容<no_break>の3つをリストの形で
347 持っている.|linebreak.w|を見る限り,Lua\TeX でも<pre>, <post>, <no_break>の
348 中身にはglueやpenaltyを許容していないようだ.
349
350 現行の実装では,<pre>, <post>, <no_break>のどれも,和文フォントへの置換の
351 段階からして行われていない(だから中身は全部欧文扱いとなる).
352 {\small 単純にサボっていました|^^;|}
353 <pre>, <post>, <no_break>の中身にglueやpenaltyが許容されないことから,
354 これらに対する和文用処理の方法として,次の2種類が挙げられる.
355 私は前者で良いのではないかと思っているのだが…….
356 \itemitem (現行のまま)discretionary breakの中身に和文文字はないものと想定する.
357 例えば<pre>の中身に和文文字を入れたい場合は,<pre>の中身全体を
358 必ずhboxで括ることとする.
359 \itemitem 「glueを挿入」を全部「自然長だけを取り出したkernを挿入」に置き換え,
360 普段の和文処理グルー挿入処理を流用する.
361
362
363 \item {\bf 数式の取り扱い}
364
365 まだ数式中に和文文字が(hboxでカプセル化されることなく)出現することは想定していない.
366 実用的にはそれでも十分だと思うが,もしp\TeX のように単に
367 \begintt
368 $aあa$
369 \endtt
370 などと書いても和文文字が
371 出力されるようにするとなれば,「数式リストから変換されてできた水平リストでは,
372 和文処理グルーの挿入処理を無効とする」ようにしないといけないだろう.
373
374 \enditem
375
376 \beginsection {\tt \char"5C[x]kanjiskip}の挿入%"
377
378 現実装の|\[x]kanjiskip|の挿入の方針として,
379 \item JFMグルーが挿入されていないところに「標準の空き量」として挿入する.
380 \item 実際の段落/hboxの内容に即して,組版イメージの見た目に関係のないところは透過する.
381 \enditem
382
383 \beginparagraph 処理の概要
384
385 |\[x]kanjiskip|挿入処理では,次の3つのnodeを用いている.
386 $$\ncount=0
387 \node{\IT{nr}}\longrightarrow\cdots
388 \node{\IT{nq}}\longrightarrow\cdots
389 \node{\IT{np}}
390 $$
391 \item \IT{nr}と\IT{np}の間に|\[x]kanjiskip|を挿入しようとする.
392 \item 実際にnodeの形で挿入しようとする場所は$\it nq$の直後である.
393 \item \IT{nr}, \IT{nq}は異なるnodeとは限らない.
394 \item {\bf \IT{np}はリストの先頭から末尾までループで渡る.}その過程で
395 \IT{nr}, \IT{nq}を適宜更新し,実際のnode挿入処理を行っている.
396 \item 厳密には,コード中では\IT{nr}という変数は使っていない.代わりに使われているのは,
397 \itemitem $\mibox{insert\_skip}\in \{\mibox{no\_skip}, 
398   \mibox{after\_schar}, \mibox{after\_wchar}\}$: 
399 「node \IT{nr}」の種類を表す:
400 \itemT \IT{no\_skip}: 「node \IT{nr}」の後ろ(\IT{nr}と\IT{np}の間)に
401 |\[x]kanjiskip|が入ることはない.
402 \itemT \IT{after\_schar}: 「node \IT{nr}」を,欧文文字(の入った\IT{glyph\_node})であり,
403 かつ{\sf alxspmode}パラメータの指定により「\IT{nr}の後ろに|\xkanjiskip|の挿入を許可する」ようなものとみなす.
404 \itemT \IT{after\_wchar}: 「node \IT{nr}」を和文文字(の入った\IT{glyph\_node})とみなす.
405 \itemitem \IT{nrc}: 「node \IT{nr}の文字コード」を表す.
406 \itemitem \IT{nrf\/}: 「\IT{nr}のフォント」を表す.
407 \itemitem $\mibox{nr\_spc}[1]$: 「node \IT{nr}」における
408 {\sf autospacing}(|\kanjiskip|の自動挿入を行うか否か)の設定値.
409 \itemitem $\mibox{nr\_spc}[2]$: 「node \IT{nr}」における
410 {\sf autoxspacing}(|\xkanjiskip|の自動挿入を行うか否か)の設定値.
411
412 \medskip\leftskip=2\zw\noindent
413 \IT{nrc}, \IT{nrf}の値は,$\mibox{insert\_skip}=\mibox{after\_wchar}$のときのみ用いられる.
414 $\mibox{insert\_skip}=\mibox{no\_skip}$のときには,それだけで情報は十分であるから,
415 \IT{nr\_spc}, \IT{nq}の値も用いられない.
416 \enditem
417
418 ループの中で,以下の場合には\IT{nr}は変化せず,$\IT{nq}\leftarrow \IT{np}$となる.
419 つまり,これらのnodeに対して|\[x]kanjiskip|は透過する:
420 \item \IT{np}がpenaltyの場合
421 \item \IT{np}が$\hbox{\tt subtype}=0$のkern(TFM由来)の場合.
422 \item \IT{np}が$\hbox{\tt subtype}=1$のkern(つまり,明示的kernかイタリック補正由来)であって,jtypeが
423 $$
424 \hbox{I (イタリック補正),E(行末との間),T(一時的)}
425 $$
426 であった場合.後者2つはJFMグルーの挿入で入るものなので,
427 ユーザは「イタリック補正は透過」と考えればよい.
428
429 \item \IT{np}がinsertion, mark, |\vadjust|, whatsitのnodeである場合.
430 これらは水平リストからは消え去る運命にある.
431 \enditem
432
433
434 \beginparagraph \IT{np}が文字 (\IT{glyph\_node}) の場合
435
436 この場合がやはり一番基本となる.
437 \enum $\mibox{insert\_skip}=\mibox{after\_schar}$, \IT{np}: 和文文字の場合
438
439 前に書いたように,「node \IT{nr}」は(直後に|\xkanjiskip|の挿入が許可されている)欧文文字と
440 みなされている.
441 そのため,「node \IT{nr}」と\IT{np}の間に|\xkanjiskip|の入る条件は以下である.
442 \itemitem 文字\IT{np}に対する{\sf jaxspmode}パラメータの指定において
443 「直前への|\xkanjiskip|の挿入が許可」されている.
444 \itemitem 「node \IT{nr}における」{\sf autoxspacing}パラメタの値 ($\mibox{nr\_spc}[2]$) か,
445 \IT{np}における{\sf autoxspacing}の値の少なくとも一方が真である.
446
447 \medskip\leftskip=2\zw\noindent
448 まず,実際に入る|\xkanjiskip|の量$g$を次の方法で決定する:
449 \itemitem {\sf xkanjiskip}パラメータの自然長が|\maxdimen|でない場合,
450 {\sf xkanjiskip}パラメータの値をそのまま採用する.
451 \itemitem {\sf xkanjiskip}パラメータの自然長が|\maxdimen|の場合は,
452 \IT{np}で使われているJFMに設定されている|\xkanjiskip|の量を用いる.
453 \itemitem 上の2つのどれでもない場合,fallbackとして0を用いる.
454
455 {\bf 要検討}:既にJFMグルー挿入処理で和欧文間の行分割は可能としているので
456 0を挿入する意味はない?
457
458 \medskip\leftskip=2\zw\noindent
459 次にこのようにして決定された$g$を実際に挿入する:
460 \itemitem ほとんどの場合,$g$の値をもつglueを\IT{nq}の直後に挿入する.
461 $$\ncount=0
462 \node{\mibox{nr}}\longrightarrow\cdots
463 \node{\mibox{nq}}\node{\ng g}_{\rm XS}\longrightarrow\cdots
464 \node{\mibox{np}}
465 $$
466 \itemitem \IT{np}の直前が${\rm jtype}={\rm T}$なnodeの場合,そのnodeに
467 $g$の分だけ自然長/伸び/縮み量を加算する.
468 $$\ncount=0
469 \vbox{\halign{$#$\hfil\cr
470 \node{\mibox{nr}}\longrightarrow\cdots
471 \node{\mibox{nq}}\longrightarrow\cdots
472 \node{\ng h}_{\rm T}
473 \node{\mibox{np}}\cr
474 \hfil\Downarrow\cr
475 \vadjust{\bigskip}
476 \node{\mibox{nr}}\longrightarrow\cdots
477 \node{\mibox{nq}}\longrightarrow\cdots
478 \node{\ng g+h}_{\rm XS}
479 \node{\mibox{np}}\cr
480 \node{\mibox{nr}}\longrightarrow\cdots
481 \node{\mibox{nq}}\longrightarrow\cdots
482 \node{\nk k}_{\rm T}
483 \node{\mibox{np}}\cr
484 \hfil\Downarrow\cr
485 \node{\mibox{nr}}\longrightarrow\cdots
486 \node{\mibox{nq}}\longrightarrow\cdots
487 \node{\ng g+k}_{\rm XS}
488 \node{\mibox{np}}\cr
489 }}
490 $$
491
492 \medskip\leftskip=2\zw\noindent
493 最後に,次のループに移るために,次の処理を行う:
494 \itemitem 
495 $\mibox{nq}\leftarrow \mibox{np}$, 
496 $\mibox{nr\_spcの設定}$, 
497 $\mibox{nrf}\leftarrow \mibox{np}.\mibox{font}$, 
498 $\mibox{nrc}\leftarrow \mibox{np}.\mibox{char}$
499 \itemitem $\mibox{np}\leftarrow \mibox{next\/}(\mibox{np})$
500 \itemitem $\mibox{insert\_skip}\leftarrow \mibox{after\_wchar}$
501
502 \enum $\mibox{insert\_skip}=\mibox{after\_wchar}$, \IT{np}: 欧文文字の場合
503
504 前に書いたように,「node \IT{nr}」は和文文字とみなされている.
505 そのため,「node \IT{nr}」と\IT{np}の間に|\xkanjiskip|の挿入が起こるための条件は
506 次の3条件が満たされていることである:
507 \itemitem \IT{nrc}番の和文文字に対する{\sf jaxspmode}パラメータの設定で,
508 「直後への|\xkanjiskip|挿入」が許可されている.
509 \itemitem \IT{np}の文字{\small(もし\IT{np}が合字であれば,合字の構成要素の最初の文字)}%
510 に対する{\sf alxspmode}パラメータの設定で,
511 「直前への|\xkanjiskip|挿入」が許可されている.
512 \itemitem \IT{nr}における{\sf autoxspacing}パラメタの値 ($\mibox{nr\_spc}[2]$) か,
513 「node \IT{nr}」における{\sf autoxspacing}の値の少なくとも一方が真である.
514
515 \medskip\leftskip=2\zw\noindent
516 この後,実際に|\xkanjiskip|の量を計算し,nodeの形で実際に挿入するところは,
517 量の決定のところで\IT{np}の代わりに\IT{nrf}を用いる以外は同じである.
518 最後の,次のループに移るための処理では,次が行われる.
519 \itemitem 
520 $\mibox{nq}\leftarrow \mibox{np}$, 
521 $\mibox{nrc}\leftarrow \mibox{np}.\mibox{char}$, 
522 $\mibox{nr\_spcの設定}$
523 \itemitem $\mibox{np}\leftarrow \mibox{next\/}(\mibox{np})$
524 \itemitem \IT{insert\_skip}の設定.
525
526 $\mibox{insert\_skip}\leftarrow \mibox{after\_schar}$となるのは,
527 \IT{np}の文字{\small(もし\IT{np}が合字であれば,合字の構成要素の末尾の文字)}%
528 における{\sf alxspmode}パラメータの設定で,
529 「直後への|\xkanjiskip|挿入」が許可されている場合である.
530 そうでないときは,$\mibox{insert\_skip}\leftarrow \mibox{no\_skip}$となる.
531
532 \enum $\mibox{insert\_skip}=\mibox{after\_wchar}$, \IT{np}: 和文文字の場合
533
534 この場合は|\xkanjiskip|の代わりに|\kanjiskip|を挿入することとなる.
535 {\sf jaxspmode}, {\sf alxspmode}のように「直前/直後への|\kanjiskip|挿入許可の制御」
536 を行うパラメータは存在しない.「{\sf autospacing}で自動挿入が禁止される」とマニュアルでは言っているが,
537 それは{\bf 挿入する|\kanjiskip|の量を一時的に0にしているだけで,
538 「node \IT{nr}」と\IT{np}の間には
539 常に|\kanjiskip|が入ることには変わりはない}ことに注意.
540
541 \medskip
542 実際に入る|\kanjiskip|の量$g$は次の方法で決定される:
543 \itemitem \IT{nr}における{\sf autospacing}の値 ($\mibox{nr\_spc}[1]$) か,
544 \IT{np}における{\sf autospacing}の値が共に偽なら,$g=0$.
545 \itemitem {\sf kanjiskip}パラメータの自然長が|\maxdimen|でない場合,
546 {\sf kanjiskip}パラメータの値をそのまま採用する.
547 \itemitem {\sf xkanjiskip}パラメータの自然長が|\maxdimen|の場合は,
548 \IT{np}で使われているJFMに設定されている|\kanjiskip|の量を用いる:
549 \itemT 「node \IT{nr}」で使用されているJFMと,\IT{np}で使用されているJFMそれぞれに
550 |\kanjiskip|の値が設定されている場合,…….
551
552 \itemitem 上の3つのどれでもない場合,fallbackとして0を用いる.
553
554 \enditem
555
556 \medskip
557 $g$を実際に挿入するところは,今の場合も1.の場合と変わらない.
558 次のループに移るために\IT{nq}等の設定処理も,1.と同じである.
559
560 \beginparagraph \IT{np}がhboxの場合
561
562 |\[x]kanjiskip|は,垂直変位が0である(即ち,|\raise|, |\lower|により上下に移動されていない)
563 hboxの境界を跨ぐ.
564
565 \enum hbox内の「最初のnode」\IT{first\_char}と「最後のnode」\IT{last\_char}を探索する.
566 この探索は,次を透過する:
567 \itemitem 垂直変位が0であるhboxの境界(但し,空hboxは透過しない).
568 \itemitem insertion, mark, |\vadjust|, whatsit, penalty用のnode.
569 \itemitem 「最初のnode」「最後のnode」それぞれにいえることだが,文字 (\IT{glyph\_node}) でない場合は
570 \IT{first\_char},~\IT{last\_char}はそれぞれ$\emptyset$となる.
571
572 \medskip\leftskip=2\zw\noindent
573 前者の具体例として,例えば,次の入力を考える.
574 \begintt
575 あ\hbox{a}い\hbox{\hbox{}b\hbox{}}う\hbox{}cえ\hbox{\hbox{d}}お
576 \endtt
577 すると,
578 $$
579 \vbox{\halign{#の間のhbox\hfil\quad $\longrightarrow$\quad
580 &$\mibox{first\_char}=\hbox{#}$,\ \hfil
581 &$\mibox{last\_char}=\hbox{#}$\hfil\cr
582 1.\ 「あ」「い」&「a」&「a」\cr
583 2.\ 「い」「う」&$\emptyset$&$\emptyset$\cr
584 3.\ 「う」「c」&$\emptyset$&$\emptyset$\cr
585 4.\ 「え」「お」&「d」&「d」\cr
586 }}
587 $$%$
588 となる.
589
590 \enum \IT{np}の前に|\[x]kanjiskip|を挿入するか否か,あるいは実際に挿入する量の決定は,
591 \IT{first\_char}に対しての処理をそのまま適用する.つまり,上の例では
592 \itemitem 「あ」と「a」の間に|\xkanjiskip|が挿入されることから,「あ」とhbox 1.の間には|\xkanjiskip|が挿入される.
593 \itemitem 「い」とhbox 2.の間には|\xkanjiskip|が挿入されない.
594
595 \enum 同様に,\IT{np}の後ろに|\[x]kanjiskip|を挿入するか否かは,
596 文字\IT{last\_char}の後ろに対してどうなるかの値を用いる.上の例では,
597 \itemitem 「a」と「い」の間に|\xkanjiskip|が挿入されることから,hbox 1.と「い」の間には|\xkanjiskip|が挿入される.
598 \itemitem hbox 2.と「う」の間には|\xkanjiskip|が挿入されない.
599 \medskip\leftskip=2\zw\noindent
600 次のループに進むための設定も,node~\IT{last\_char}における値をもとに行う.
601 \enditem
602
603 以上より,項目1.で与えられた入力では,次の出力が得られる:
604 $$
605 \hbox{あ\hbox{a}い\hbox{\hbox{}b\hbox{}}う\hbox{}cえ\hbox{\hbox{d}}お}
606 $$
607 {\bf 要検討:}空のhboxは跨がないようにしているのは,次の2つを使い分けられるようにするため:
608 \item JFMグルー挿入の抑止:|\inhibitglue|
609 \item 全ての和文処理グルー挿入の抑止:
610 |\inhibitglue\hbox{}\inhibitglue|
611 \enditem
612
613 なお,\IT{np}の垂直変位が0でない場合は,\IT{np}の前後への|\[x]kanjiskip|の挿入は行われない
614 (即ち,$\mibox{insert\_skip}\leftarrow\mibox{no\_skip}$となる).
615
616
617 \beginparagraph \IT{np}がkernの場合
618
619 前に書いたように,|subtype|が0のkern(TFM由来)や,|subtype|が1であってもjtypeがI, E,~Tのkernは
620 挿入処理を透過してしまうので,今問題にしているのはそうでない場合である.
621
622 \item $\hbox{\tt subtype}=1$の場合.
623
624 挿入処理で透過されないのは
625 jtypeがない(明示的kern)か,jtypeがJ(JFM由来グルー)という2つの場合であるが,
626 いずれの場合も,\IT{np}の周囲には|\[x]kanjiskip|の挿入は行われない.そのため,次ループのために
627 行われる処理は,$\mibox{insert\_skip}\leftarrow\mibox{no\_skip}$, 
628 $\mibox{np}\leftarrow\mibox{next}(\mibox{np})$だけである.
629
630 \item $\hbox{\tt subtype}=2$(|\accent|由来)の場合.
631
632 \IT{np}はリストの先頭から走査されていることから,\IT{np}に続くnodeの並びは
633 $$\ncount=0
634 \node{\mibox{np}=\nk\!\!}
635 \node{\hbox{アクセント文字}}
636 \node{\nk\!\!}
637 \node{\hbox{アクセントのつく文字}}
638 $$
639 となっている.p\TeX-3.2と同様に,Lua\TeX-jaでは|\[x]kanjiskip|挿入処理で
640 アクセント文字は無視することにしている.そのため,
641 \IT{nq}は変化せず,次回のループで処理対象となる\IT{np}は
642 $\mibox{np}\leftarrow 
643 \mibox{next\/}(\mibox{next\/}(\mibox{next\/}(\mibox{np})))$となる.
644 \enditem
645
646 \beginparagraph \IT{np}が数式境界 (\IT{math\_node})の場合
647
648 数式境界は,便宜的に「文字コードが$-1$である文字」とみなして内部で処理している.
649
650 \beginparagraph その他の場合
651
652 以上に出てきていないnode(vbox, rule, discretionary break, glue, margin\_kern)の
653 周囲には|\[x]kanjiskip|の挿入は行われない.
654
655 \beginsection JFM由来グルーとの関係の例
656
657 最後に,今まで説明した,JFM由来グルーと|\[x]kanjiskip|の処理によって,実際にどのようにnodeの
658 並びが変わるかをいくつかの例で示す.上付きで$*$がついているnodeは,値が0だと挿入されないことを示す.
659
660
661 \item {\bf 例1: 2つの連続する和文文字の間}
662 \setbox1=\hbox{|\kanjiskip|}
663 $$\ncount=0
664 \vbox{\halign{$#$\hfil\cr
665 \node{\hbox{和文文字}}\node{\hbox{和文文字}}
666 \cr
667 \hfil\Downarrow\cr
668 \vadjust{\bigskip}
669 \node{\hbox{和文文字}}
670 \node{\nk w}_{\rm E}^*
671 \node{\np P}^*\longrightarrow
672 \left\{\vcenter{%
673 \halign{$#$\hfil\cr
674 \ncount=0\node{{\rm glue/kern}\ g+w}_{\rm J}\cr
675 \ncount=0\node{\copy1+w}_{\rm KS}\cr
676 }}\right\}
677 \node{\hbox{和文文字}}\cr
678 }}
679 $$
680
681 \item {\bf 例2: 和文文字と欧文文字の間}
682 \setbox1=\hbox{|\xkanjiskip|}
683 $$\ncount=0
684 \vbox{\halign{$#$\hfil\cr
685 \node{\hbox{和文文字}}\node{\hbox{欧文文字}}
686 \cr
687 \hfil\Downarrow\cr
688 \vadjust{\bigskip}
689 \node{\hbox{和文文字}}
690 \node{\nk w}_{\rm E}^*
691 \node{\np P}\longrightarrow
692 \left\{\vcenter{%
693 \halign{$#$\hfil\cr
694 \ncount=0\node{{\rm glue/kern}\ g+w}_{\rm J}\cr
695 \ncount=0\node{\copy1+w}_{\rm XS}\cr
696 }}\right\}^*
697 \node{\hbox{欧文文字}}\cr
698 }}
699 $$
700 ここで,上の2つの例に出てきた記号の意味は次の通り:
701 \itemitem $w$: 前側の和文文字と行末の間に入るkern量.
702 \itemitem $g$: 2つの文字の間に入るglue/kern(JFM由来).
703 \itemitem $P$: 2つの文字の禁則用penaltyの合計値.
704
705
706 \par\vfill\eject
707 \item {\bf 例3: 2つの和文文字の間にいくつかの「無視される」node達}
708 \setbox1=\hbox{|\kanjiskip|}
709 $$\ncount=0
710 \vbox{\halign{$\relax#$\hfil&$\relax#$\hfil\cr
711 \node{\hbox{和字}\ A}&
712 \ncount=1\node{\nk i_A}_{\rm I}
713 \longrightarrow \cdots
714 \node{\np p_B}
715 \node{\hbox{和字}\ B}
716 \cr
717 \span\Downarrow\cr
718 \vadjust{\bigskip}
719 % T
720 \node{\hbox{和字}\ A}&
721 \ncount=1\node{\nk w_A}_{\rm E}^*
722 \node{\np P_A}_{\rm K}^*
723 \node{\nk {-w_A}}_{\rm T}^*
724 \node{\nk i_A}_{\rm I}
725 \longrightarrow \cdots\cr
726 &\ncount=1\node{\np p_B}
727 \node{\np P_B}^*\longrightarrow 
728 \left\{\vcenter{%
729 \halign{$#$\hfil\cr
730 \ncount=0\node{{\rm glue/kern}\ g_B}_{\rm J}\cr
731 \ncount=0\node{\copy1}_{\rm KS}\cr
732 }}\right\}
733 \node{\hbox{和字}\ B}\cr
734 \span\hbox{or}\cr
735 % T
736 \node{\hbox{和字}\ A}&
737 \ncount=1\node{\nk w_A}_{\rm E}^*
738 \node{\np P_A}_{\rm K}^*
739 \node{{\rm glue/kern}\ g_A-w_A}_{\rm J}
740 \node{\nk i_A}_{\rm I}\cr
741 &\ncount=1
742 \longrightarrow \cdots
743 \node{\np p_B}
744 \node{\np P_B}
745 \node{{\rm glue/kern}\ g_B}_{\rm J}^*
746 \node{\hbox{和字}\ B}\cr
747 }}
748 $$
749 ここで,
750 \itemitem $w_A$: 和文文字$A$と行末の間に入るkern量.
751 \itemitem $P_A$: 和文文字$A$の行末禁則用penalty.
752 \itemitem $g_A$: 和文文字$A$と|'jcharbdd'|との間に入るglue/kern.
753 \itemitem $P_B$: 和文文字$B$の行頭禁則用penalty.
754 \itemitem $g_B$: |'jcharbdd'|と和文文字$B$の間に入るglue/kern.
755 \enditem
756
757
758 \end