周知の通り、upTeX は和文文字を Unicode で扱う。だから有効な符号値の範囲は 0〜0x10FFFF のはずである。ところが、実際の upTeX の仕様では有効な範囲は 0〜0xFFFFFF となっていて、\kchar 命令を使うことで符号値が 0x110000 以上の和文文字(のノード)を生成できる。そして、「実際に出力する」時には「内部の符号値を 0x110000 で割った余り」の符号値が使われる。つまり、\kchar"113002 の「文字」は実際には U+3002〈。〉(句点)として出力されるのであるが、内部では「別の文字」なので、\kchar"3002 に設定された \pre/postbreakpenalty は \kchar"113002 には適用されないことになっている。
% plain upTeX 文書; 文字コードはUTF-8
\showboxbreadth=100
\setbox0\hbox{あ\kchar"3002 \kchar"23002 あ\kchar"113002 \kchar"133002}
\showbox0 \bye例えば上掲の文書をコンパイルすると、\showbox の結果は以下のようになる。\kchar"3002 と \kchar"113002 はどちらも〈。〉となるが、前者の前にはペナルティが入るのに対し、後者は入らない。(\kchar"23002 と \kchar"133002 はともに U+23002〈𣀂〉となる。)
> \box0= \hbox(8.79999+1.2)x60.0, yoko direction .\tenmin あ .\penalty 10000(for kinsoku) .\glue(\kanjiskip) 0.0 plus 0.4 minus 0.4 .\tenmin 。 .\glue(refer from jfm) 5.0 .\tenmin 𣀂 .\tenmin あ .\tenmin 。 .\glue(refer from jfm) 5.0 .\tenmin 𣀂
ところで、最近気づいたのだが、仕様上の最大値 0xFFFFFF を超える値を指定してもエラーにはならないようである。例えば、次のようなソースが何事もなく処理される。
\setbox0\hbox{あ\kchar"FF3002 あ\kchar"1003002 あ\kchar"1023002}この後 \showbox0 すると以下のようになる。
> \box0= \hbox(8.79999+1.2)x60.0, yoko direction .\tenmin あ .\tenmin 。 .\glue(refer from jfm) 5.0 .\tenmin あ .\tenmin 。 .\tenmin あ .\tenmin 𣀂
よく見ると不可解である。\kchar"FF3002 が U+3002 になるのは仕様通りだが、\kchar"1003002(0x110000 で割った余りは 0x13002)も U+3002 が出力されている。(\kchar"1023002 は U+23002 となっている。)しかも、\kchar"3002 や \kchar"113002 や \kchar"FF3002 には直後にメトリックのグル―が入るのに対して \kchar"1003002 の後はグル―が入っていない。
これも「仕様」なのであろうか……?