Show page source of 資料-pTeXでのkanjiskip,xkanjiskipの扱い #68756

= 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''':挿入判定に関しては透過.挿入がおこる場所は 問題とする場所の直後となる.