マクロツイーター

はてダから移行した記事の表示が崩れてますが、そのうちに直せればいいのに(えっ)

upTeX のとりとめのない話

周知の通り、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 の後はグル―が入っていない。

これも「仕様」なのであろうか……?