Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[upTeX] 文字コードの上限値 #160

Closed
aminophen opened this issue Sep 2, 2023 · 3 comments
Closed

[upTeX] 文字コードの上限値 #160

aminophen opened this issue Sep 2, 2023 · 3 comments
Labels

Comments

@aminophen
Copy link
Member

aminophen commented Sep 2, 2023

現在の upTeX の実装では is_char_kanji が「0 以上の整数かどうか」になっており,そのため文字コードとして TeX が許す最大整数 ("7FFFFFFF) まで可能となっています(Bad character code エラーを発しないし,\char や \chardef に指定できる)。一方で,文字トークンや文字ノードとして可能なのは 24bit 整数値 ("FFFFFF) までの仕様と理解しています。

さて,文字ノード生成時には charcode + kcatcode * max_cjk_val という計算が行われます。この時,文字コード (charcode) が 24bit を超える場合に kcatcode の位まではみ出してしまっています。極端な場合で,足し算が 2^32 を超えることもあり,それは例えば \lastnodechar で不可解な返り値となります。なお,文字トークン生成にはこの問題がなさそうです(0x1000000 以上の文字トークン生成が起こりうるのは \Uchar / \Ucharcat だけで,これは print_kanji に投げられ,そちらで mod max_cjk_val されています)。

これを回避する方法として,2 通り考えられます。

  • 有効な文字コードの範囲を「0 以上」から「0 以上 2^24 未満」に制限する。
  • 有効な文字コードの範囲はそのまま,ノード生成時に mod max_cjk_val する。

前者は,文字コードの有効範囲が減るので「大きな整数値を定義する」時に \chardef を使う技(ptex-guide-en に記載)が封じられますが,仕様としてはシンプルです。後者の場合は「大きな整数値を定義する」技は従来通り使えます。


前者は,kanji.c の is_char_kanji を修正し,和文文字トークン判定 check_kanji を調整すればよさそうだと @h-kitagawa さんが Gist にコメントくださっています。

 boolean check_kanji (integer c)
 {
     if (c >= CS_TOKEN_FLAG) return false;
     else if (!(XXHi(c)>=KCAT_KANJI && XXHi(c)<=KCAT_HANGUL)) return false;
-    else return is_char_kanji(c);
+    else return is_char_kanji(c & CJK_TOKEN_FLAG);
 }
...
 boolean is_char_kanji(integer c)
 {
     if (is_internalUPTEX()) 
-        return (c >= 0);
+        return ((c >= 0)&&(c<CJK_CHAR_LIMIT));

後者は uptex-m.ch で mod max_cjk_val を仕込めば実現できます。

'uptex-code1' ブランチ#159 の修正への追加という形にしています。


@t-tk さん,ご意見をいただきたいです。

なお,0x110000 以上 0x1000000 未満の文字コード(OTF パッケージで利用)は影響を受けません。OTF パッケージについては 別の場所 で不具合報告をしております。

@t-tk
Copy link
Collaborator

t-tk commented Sep 3, 2023

0x11 0000 以上 0x100 0000 未満の文字コード(OTF パッケージで利用)はそのまま続けたいです。
将来IVSの内部コード用に使いたいと思っていた範囲は、0x40 0000~0xEF 0000 の範囲に収まるはずです。
[upTeX+dvipdfmx] 異体字セレクタ、Unicode合成文字 #46

なので、私の予定の範囲では

  • 有効な文字コードの範囲を「0 以上」から「0 以上 2^24 未満」に制限する。

でよいです。

「大きな整数値を定義する」時に \chardef を使う技 は、よく分からないのですが
文字コードの範囲「0 以上 2^24 未満」の場合でも 0xFF FFFF の範囲までは定義できるのでしょうか。
大きな整数値を定義する用途がよく分からないです。

私としては「0 以上 2^24 未満」でよいと思います。

@aminophen
Copy link
Member Author

有効な文字コードの範囲を「0 以上」から「0 以上 2^24 未満」に制限する。

了解です。 09d471c でそのようにしました。

「大きな整数値を定義する」時に \chardef を使う技

https://zrbabbler.hatenablog.com/entry/20110410/1302457062 のように e-TeX がない時代に 256 個しかない貴重なレジスタを消費しないように使われていた技です。e-TeX ではレジスタが沢山あり,さらに e-(u)pTeX では \omathchardef も同じ目的で使えるので,支障はないです。

文字コードの範囲「0 以上 2^24 未満」の場合でも 0xFF FFFF の範囲までは定義できるのでしょうか。

はい,定義できます。

aminophen added a commit to texjporg/ptex-manual that referenced this issue Sep 3, 2023
aminophen added a commit that referenced this issue Sep 3, 2023
@aminophen
Copy link
Member Author

r68155 で入れました。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

2 participants