= pTeX での \kanjiskip, \xkanjiskip の扱い = == 前提 == [資料-TeXにおける段落/ボックスの内部表現] をお読み下さい. §xxx とあるのは,pTeX のソース(同ページの付録を参照)でのセクション番号です. == \kanjiskip について == 作成中 == \xkanjiskip について == * 和欧文間空白 \xkanjiskip は,段落の行分割処理の前や,hbox の寸法決定の前に glue として挿入される. * 挿入処理自体は,adjust_hlist なる procedure (§1451--1464) に,段落/hbox の中身を表すリストを 渡すことにより行われる. * primitive \noautoxspacing で「\xkanjiskip を自動挿入しない」ことが行えるが,それは実際には 挿入する \xkanjiskip の値を 0 にしているだけ(glue として挿入はされる)である. 以下,adjust_hlist の中身を概説する.斜体英小文字でノードを表す. * '''基本形:2つの char_node(文字)が連続している時'''[[br]] 両者の文字コードの値から 2つのノード間に\xkanjiskip を挿入するかを判断し,挿入することになれば挿入する. * '''hbox ''p'' の周囲''' * 垂直ボックス (vbox) や,異なる組方向のボックスの周囲には \xkanjiskip は入らない. * \raise/\lower によって縦にシフトされている hbox の周囲にも入らない. * まず,関数 check_box (§1450) を用いて,「''p''の最初のchar ''pf''」「''p''の最後のchar ''pl''」を取得する. * 最初/最後が char_node でなければ,null 値になる. * この2つは,縦シフト量が 0 であるような hbox について再帰的に探索が進む.つまり, {{{ \hbox{\hbox{あい}う\hbox{えお}} → pf = 「あ」, pl = 「お」 \hbox{\raise2pt\hbox{あい}う\vbox{えお}} → pf = null, pl = null }}} * ''p'' の前に \xkanjiskip が入るかどうかは,''pf'' の前に入るかどうかで決定. * ''p'' の後に \xkanjiskip が入るかどうかは,''pl'' の後に入るかどうかで決定. * '''数式境界 math_node ''p'' の周囲'''[[br]] * ''p'' が数式開始を示す math_node のとき: ''p'' の後には入らない.''p''の前に入るかどうかは,数字 0 の前に入るかどうかで決定される. * ''p'' が数式終了を示す math_node のとき: ''p'' の前には入らない.''p''の後に入るかどうかは,数字 0 の後に入るかどうかで決定される. 例: {{{ (あ) $ ... $ (.) → (あ) (\xkanjiskip) $ ... $ (.) }}} * '''合字 math_node ''p'' の周囲'''[[br]] * ''p'' の前に入るかどうかは,''p''を構成している元の文字列の先頭文字に関して判定. * ''p'' の後に入るかどうかは,''p''を構成している元の文字列の末尾文字に関して判定. * 例えば,{{{\xspcode`\f=0}}} (文字「f」の前後には \xkanjiskip は入らない)の元では, {{{ (あ) (ligature fi) (い) → (あ) (ligature fi) (\xkanjiskip) (い) }}} * '''penalty, displacement node ''p'' 周り''': * 挿入判定に関しては透過.ただし,次回の挿入判定において, 挿入がおこる場所は今問題にしている penalty (or disp) の直後に変更される. [[br]]例: {{{ (A) (\penalty 100) (あ) →(A) (\penalty 100) (\xkanjiskip) (あ) (あ) (\penalty 100) (\penalty 20) (\hbox{a}) → (あ) (\penalty 100) (\penalty 20) (\xkanjiskip) (\hbox{a}) }}} * 禁則ペナルティ等のため,和文 char_node が ''p'' の前後にある場合は, 暗黙に挿入される \kanjiskip がこの場合では挿入されないので,ここで \kanjiskip の明示的な挿入を行う. [[br]]例: {{{ (あ) (\penalty 20) (い) →(あ) (\penalty 20) (\kanjiskip) (い) }}} * '''kern ''p''の周囲''':問題にしている kern の subtype により異なる. * 明示的な {{{\kern}}} 由来:この ''p'' の周囲には \xkanjiskip は入らない. * イタリック補正由来:挿入判定に関しては透過.挿入がおこる場所は ''p'' の直後となる. * アクセント由来:アクセント部を表すノード列は無視される(詳細な説明は書きかけ). * '''rule(黒箱),discretionary,glue の周囲''':これらの ''p'' の周囲には \xkanjiskip は入らない. * '''mark, insertion, adjust, whatsit''':挿入判定に関しては透過.挿入がおこる場所は 問題とする場所の直後となる.