texjporg / tex-jp-build

Minimum source repository to build Japanese TeX processing tools
23 stars 6 forks source link

[npTeX] 欧文トークンに似せたCJKトークン #150

Open t-tk opened 1 year ago

t-tk commented 1 year ago

upTeXにcatcodeが15以下でかつCJKのトークンを追加で導入しよう、という提案です。 [upTeX] JIS-encoded TFM https://github.com/texjporg/tex-jp-build/issues/149 とは別に扱った方がよさそうなので issue を立てます。

背景はこちら。 https://github.com/texjporg/tex-jp-build/issues/149#issuecomment-1279731866

現状の LaTeX3 では regression test(大量に用意されたテストファイル入力 .lvt に対するログ .tlg を比較)の仕組みが (u)pTeX に対しては機能していません。

pTeX では高位ビットが現れるテストファイルの入力中断処理が仕込まれている upTeX では regression-test.cfg で最初から \disablecjktoken している その理由は恐らく

(u)pTeX が「和文(CJK)文字トークン」という独特の物が存在し,また文字コードが中途半端に 0--255 ではないこと(e.g.「あ」できるのに「\catcodeあ」できない) が理解されないためだと思われます。和文(CJK)文字トークンの catcode が 16〜18(19) であることも考慮されておらず「カテゴリーコードは 16 進 1 桁」を前提にしたインタフェースが構築されています(https://github.com/h20y6m/plexpl3/issues/3)。

で、私の提案はこちら https://github.com/texjporg/tex-jp-build/issues/149#issuecomment-1279757248

思いつきですが、その対策として例えばupTeXの仕様の追加で 「catcodeが11で文字コードがある値(例えば0x2E00以上)より大きい場合は漢字トークンとみなす」 「catcodeが12で文字コードがある値より大きい場合はCJK記号トークンとみなす」 のようなものを用意し、それらに対しては 「あ」できて「\catcodeあ」できてしかもCJKトークンである という風にするのはいかがでしょうか?

で @aminophen さんのリプライ https://github.com/texjporg/tex-jp-build/issues/149#issuecomment-1279778635

この特定の値については https://github.com/texjporg/tex-jp-build/issues/135 からだと思いますが,あちらは「OFM に定義された最大の文字コード」だから良かったものの,今回のようなものには使えないように思います。(例えば 0xB7 (U+00B7) は uptex-fonts でも和文扱いを想定した中黒です)

t-tk commented 8 months ago

ありがとうございます。 そうすると、一つの案として、次のような進め方が出来るように思いました。いかがでしょうか?

  1. 「XeTeX ベースの npTeX + xdv, pdf出力」「Unicode 1 文字から 1 トークンができる」「和文JFM拡張」「欧文 Unicode OTF」で一旦作る
  2. 「XeTeX ベースの npTeX + dvi出力」「Unicode 1 文字から 1 トークンができる」「和文JFM拡張」「欧文の本文が8bit tfm」を次に作る

1は日本語 XeTeX として、XeTeX互換性が高く、海外LaTeXパッケージが通りやすいところを目指す。2はpTeXの後継として従来の日本語pLaTeX用パッケージが通りやすいことを目指す。 自動判定は、1向けには海外製は従来の延長でよくて、2向けは日本国内の作者宣伝して対応してもらう。

t-tk commented 5 months ago

upTeX の IVS関連 #45 で kcatcode周りをいじっている最中に思いついた案です。 https://github.com/texjporg/tex-jp-build/commit/92aeca952d89ae24423ef78bd3766d25cb3f483a

kcatcode latin_ucs 14番 を新設。 対象のUTF-8のマルチバイト文字列のUnicode Blockの kcatcodeがlatin_ucs 14番の時には、内部バッファ(UTF-8)からノードを生成する際に「欧文 Unicode 1 文字 」とみなして「欧文 Unicode 1 文字 1 トークン」を生成する。 そのノードは欧文のcatcode (1~15)が振られ「欧文の8bit tfm」を参照する。 今のところ文字コードの最大は 0xFF を想定だが、0x10FFFF まで拡張可能。0xFFFFまでは ofm を読めるようにすれば対応可のはず。

この状態でほぼ 「upTeX ベース、 dvi出力」「(和文・欧文どちらも) Unicode 1 文字から 1 トークンができる」「和文JFM拡張」「欧文の本文が8bit tfm」 が実現できていると思います。 あとは、和文のトークンから catcode を得ようとした場合に欧文の letter(11) や other_char(12) を返すように機能追加すれば、ほとんど npTeX でやろうとしていたことに近づいていると思います。

plain uptex入力に対し、

%#!uptex

\parindent=0pt
\font\ec=ecrm1000
\ec
\jfont\jpy=umin10
\jpy

\def\pick#1{=#1=}

%default
1 Æ \kchar"C6 \char"C6
\wlog{Æ}
\message{\expandafter\pick\string Æ}

\kcatcode"C6=15 % not_cjk: not cjk characters
2 Æ \kchar"C6 \char"C6
\wlog{Æ}
\message{\expandafter\pick\string Æ}

\kcatcode"C6=18 % other_kchar: cjk symbol codes
3 Æ \kchar"C6 \char"C6
\wlog{Æ}
\message{\expandafter\pick\string Æ}

\kcatcode"C6=14 % latin_ucs: not cjk in ucs code
4 Æ \kchar"C6 \char"C6
\wlog{Æ}
\message{\expandafter\pick\string Æ}

%default again
\kcatcode"C6=15 % not_cjk: not cjk characters
5 Æ \kchar"C6 \char"C6
\wlog{Æ}
\message{\expandafter\pick\string Æ}

\bye

logはこんなのが出ました。 Æ (U+00C6, UTF-8: 0xC3 0x86) に対し、default(kcatcode=15)では0xC3, 0x86 の 8bit 2byte 欧文扱いだが、 kcatcode=14 では 0xC6 の欧文として扱われる。

This is e-upTeX, Version 3.141592653-p4.1.1-u1.30-230214-2.6 (utf8.uptex) (TeX Live 2024) (preloaded format=euptex 2024.4.6)  6 APR 2024 21:41
entering extended mode
 restricted \write18 enabled.
 %&-line parsing enabled.
**latincat06.tex
(./latincat06.tex
^^c3^^86
 =^^c3=^^86
^^c3^^86
 =^^c3=^^86
Æ
 =Æ=
^^c6
 =^^c6=
^^c3^^86
 =^^c3=^^86 [1] )
Output written on latincat06.dvi (1 page, 412 bytes).

\kchar は常に和文(CJK)扱い、\char は常に欧文扱いになる。