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

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

Open
t-tk opened this issue Oct 16, 2022 · 102 comments
Open

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

t-tk opened this issue Oct 16, 2022 · 102 comments

Comments

@t-tk
Copy link
Collaborator

t-tk commented Oct 16, 2022

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

背景はこちら。
#149 (comment)

現状の 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)。

で、私の提案はこちら
#149 (comment)

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

@aminophen さんのリプライ
#149 (comment)

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

@t-tk
Copy link
Collaborator Author

t-tk commented Oct 16, 2022

今回の私の提案は、「本格的に kcatcode 16以上をすべてcatcode15以下に移し替えよう」という前提ではありません。
upTeX では、0x80..0xFF の間で欧文と和文(CJK文字)を区別する必要があって、開発初期の頃からの悩みのタネでした。15以下のcatcodeで0xFF以下のcharcodeではどうしても欧文と区別がつかないので拡張する必要がありました。(U+00B7が話題になったのは時期的には後の話ですが、本質的にはupTeXの一番最初からある問題です。)
で、今回の提案は、「LaTeX3 の regression test」のような場でも(u)pTeXの立場を深く理解してもらうまでいかなくとも、せめてtest caseに混ぜてもらえる程度には欧文TeXに近づけよう、というものです。
従来のkcatcode16以上の動作は、機能として重複したままそのまま維持したいです。
私の提案の中の「特定の値」は実は0x2E00である必要はなく、0x0100以上でも0x2000でもいいです。
0x2E00の境界は、dvipsの「OFM→JFM の縦組みの読み替えをするか?」の判定に使いましたが、今回はもっと小さい値でも構いません。

「catcodeが11で文字コード 0x4E00はU+4E00で漢字の「一」でして、それをLaTeX3で処理したいです。」という風にしてそれをLaTeX3の開発チームに理解してもらえればよいです。
特定の値は0x2000でもよくて、
「catcodeが12で文字コード 0x2603はU+2603で「☃」でして、それをLaTeX3で処理したいです。」という風にしてそれをLaTeX3の開発チームに理解してもらう、という風でもいいです。
U+1FFF以下は、CJK以外の国々の言語の普通の文字(U+00B7のようなごく少数の例外を除く)が集まっていて、U+2000..206F が "General Punctuation"なので特定の値は0x2000でも妥当な感じがします。

@aminophen
Copy link
Member

issue の分割と検討をありがとうございます。

まず『LaTeX3 をサポートするうえで (u)pTeX にとって最低限必要なのは何か』を把握する必要があると思います。

  • 私としては,極端なケースでは「和文(CJK)文字トークンの廃止」すなわち \disablecjktoken 既定化まで追い込まれるかもしれないくらいの危機感を持っています。
    • 恐らく「和文(CJK)文字トークンに対しても欧文互換の \catcode を利用可能にする (kcatcode 16,17,19 に対しては 11 を返し,\kcatcode 18 に対しては 12 を返す)」程度の小改良では解決しないでしょう。
    • 前の issue [upTeX] JIS-encoded TFM #149 での「(u)pTeX の後方互換性を放棄してでも」という私の言及も,そのくらい高いレベルの危機感からの発言です。
  • 仮に和文(CJK)/欧文の区別を維持できるとして,その境界を特定の文字コード値とするのは,後々その値を変えたくなるような禍根を残さないものとしたいです。仮にごく少数の例だとしても「その文字を CJK トークン扱いさせたい状況においてそれを実現できる手段」があるのが理想です。
    • 私個人かもしれませんが,U+00B7 は滅多に使いませんが × (U+00D7, JIS 1-1-63) は日本語の文書中でよく使います。マルバツでよく使われる和文文字ですし,CJK 扱いされてほしいです。
    • まあ,和文(CJK)文字トークンにならなかったとしても,例えば newunicodechar のようなものを援用して,欧文用 \usepackage[utf8]{inputenc} の仕組みの中で \kchar で日本語ノードを生成すれば済む話なので,出力できなくて困ることはないと思いますが。

@t-tk
Copy link
Collaborator Author

t-tk commented Oct 19, 2022

今はブレインストーミング的なフェーズだと思うので、外れかもしれないことを言うかもしれません。

\disablecjktoken 既定化」とのことですが、理解出来ていません。
latexの中身について全然知らないのですが、
現状の uplatex.ltx を見ると latex.ltx, plcore.ltx, uplcore.ltx の順番に読んでいます。
冒頭で \disablecjktoken 既定でも latex.ltxplcore.ltx の間に \enablecjktoken を入れれば問題ないようにすることが出来そうに見えます。
それもダメということでしょうか?
\enablecjktoken, \disablecjktoken はあくまでupTeXエンジンの入り口でCJKトークンに変換するかしないかを決めているだけだったはずで、既にCJKトークンになったものを無効化するとかいう風にはしなかったはずです。
(u)pTeX の特徴的な仕様を考えてみます。

  1. kcatcode 16,17,18,19 を持つ。
  2. charcode 0x0100..0xFFFFFF が可能。
  3. 和文用tfm(jfm)を使うが欧文tfmとは全く別である。
  4. 和文フォントと欧文フォントは個別に管理され、カレントフォントは欧文フォントと和文フォントの組である。
  5. 和文フォントあるいは和文-欧文間に関わる組版規則がいろいろあって(u)pTeXエンジンがまかなっている。
  6. kcatcode や cjktoken 化の設定の仕様いろいろ。(ブロック毎のkcatcodeとか\enablecjktokenとか)
  7. その他。

(u)pTeX が欧文TeXからかけ離れている点はいろいろあると思いますが、LaTeX3開発で障害になるのはどれでしょうか。
kcatcode の取る値はまだupTeXと非互換になってもダメージが小さいように見えます。
charcode の範囲は luaLaTeX, XeLaTeX でも可能なのだから欧米の開発者からも理解されるような気がします。
それ以外は(u)pTeX互換から離れようとした場合にかなりダメージが大きいように思います。
(u)pTeX から離れて luaTeX-ja に完全移行という選択肢もあると思います。
kcatcodeを振る際の仕様とかは、欧文TeXと違いすぎるものの欧文TeXと関わりのある基本的機能ではないのでLaTeX3開発とは関係が薄いようにも思います。
(u)pTeX と luaTeX-ja の間になるであろう「upTeX 非互換だが LaTeX3開発に同期しやすい新CJK-TeX」の仕様とは?

ごく少数の例だとしても「その文字を CJK トークン扱いさせたい状況においてそれを実現できる手段」

現状 \kchar でどんなcharcodeでもCJKトークンになるようにしてあったような記憶があります。

仮に和文(CJK)/欧文の区別を維持できるとして,その境界を特定の文字コード値とするのは,後々その値を変えたくなるような禍根を残さないものとしたい

その閾値を決めるプリミティヴを導入すれば済む話のように思います。都合に合わせ設定し直せばよいです。
というか、そもそも、cjktoken化の範囲は現状(ブロック毎に)コントロールできるようになっているので、現状のupTeXの仕様不足という話でないように見えます。
「LaTeX3 の regression test」が \disablecjktoken になっていることも本質でないように見えます。
「LaTeX3の開発中のブランチのものが cjktoken を有効にしたとたん動かなくなる事態が起きるが、そのことに気づいてもらえない」という問題なのだ、と感じます。

@t-tk
Copy link
Collaborator Author

t-tk commented Oct 19, 2022

もう一つ。
「和文(CJK)文字トークンの廃止」でも和文の組版品質を pTeX と同等以上に、ということを目指しているのが luaTeX-ja なのだと思っていました。
luaTeX-ja のようなアプローチでは無くて、 (u)pTeX に存在する仕様でかつそれを捨ててもよくて、それでも和文の組版が維持できる、とかイメージが浮かびません。

@h20y6m
Copy link
Collaborator

h20y6m commented Oct 19, 2022

全然追いつけていないのですが

(u)pTeX が欧文TeXからかけ離れている点はいろいろあると思いますが、LaTeX3開発で障害になるのはどれでしょうか。

現状どうしたらいいのかわからないのは

でしょうか。

それから欧文については8-bitエンジンだけど和文文字トークンという異質なものが入ってくるという点でしょうか。

LaTeXでは(u)pTeXは8-bitエンジンとして扱われていて、8-bitエンジンではUTF-8でエンコードされたトークン列を前提としています。この前提のもとコードポイント単位での処理は、先頭のトークンを取得して何バイトのUTF-8バイトなのか判断してそのバイト数分のトークンを1文字として処理しています。
例えば ^^e6^^97^^a5 の場合先頭のトークンの文字コードは 0xE6 で3バイトのUTF-8バイト列なので後続の2トークンを追加で取得して3バイトを1文字として処理します。
ここで和文文字が入るとこの処理が破綻します。例えば 日本語 だと先頭のトークンの文字コードは 0x65E5 なので……となって「UTF-8の先頭バイトとして不正なのでエラー」とか「0xF0 以上なので4バイトなので追加で3トークン読んでこの場合は足りないので終端マーカーを巻き込んでよくわからないエラーがでたり無限ループしたり」とかが起こります。

あとupTeXの場合は0x80--0xFFの範囲に和文文字があるためUTF-8の2バイト以上を構成するはずの文字コードを持ったトークンがUTF-8バイト列の中に単独で現れるといったことが起こります。

@aminophen
Copy link
Member

冒頭で \disablecjktoken 既定でも latex.ltx と plcore.ltx の間に \enablecjktoken を入れれば問題ないようにすることが出来そうに見えます。それもダメということでしょうか?

latex.ltx だけを \disablecjktoken で読むだけでは足りなくて「ユーザが書く LaTeX ソースの中身に現れる和文文字トークンが悪さをする可能性がある」ということです。さらに別の問題は「ptexenc による ^^-記法 への変換」が regex の ^ による文字除外シンタックスと衝突しうるということです。

現状 \kchar でどんなcharcodeでもCJKトークンになるようにしてあったような記憶があります。

それは CJK ノードの生成であって,CJK トークンを生成しているのではありません。「CJK ノードが存在すること」は LaTeX3 と一切衝突せず,TeX 入力を解釈するうえで「CJK トークンが存在すること」が課題になっています。

@h-kitagawa
Copy link
Member

CJK トークンを生成

e-upTeX なら,\Uchar, \Ucharcat でできます:

\disablecjktoken
\expandafter\expandafter\let\expandafter\A\Uchar"3042\relax
\message{\meaning\A}
\bye

極端なことを言えば,「和文文字ノード」(aminophen さんの言葉だと「CJK ノード」)があれば,「和文文字トークン」がなくても

  • 和文フォントと欧文フォントは個別に管理され、カレントフォントは欧文フォントと和文フォントの組である。

  • 和文文字の UTF-8 バイト列,例えば ^^e3^^81^^82 から,きちんと和文文字ノード「あ」が作られる
  • 和文文字ノードについては和文の組版規則に沿って処理が行われる.
  • 必要に応じて,和文組版処理に関わる \prebreakpenalty 他のパラメータが設定できる

だけでもなんとかなりうると思います.

いくつか着地点は思いつくのですが,文章化できるほどには考えをまとめる時間がありません……(後で書きます).

@t-tk t-tk changed the title [upTeX] catcodeが15以下のCJKトークン [upTeX] 欧文トークンに似せたCJKトークン Oct 20, 2022
@t-tk
Copy link
Collaborator Author

t-tk commented Oct 20, 2022

あまりよく分かっていませんが
「一見欧文トークンに見えるもの」から「CJKノード」が生成できれば目的(LaTeX3と衝突せずCJKの組版ができる)ということでしょうか。
issueのタイトルを変更してみました。もっと適切な言い方があればどなたかお願いします。

@aminophen
Copy link
Member

「一見欧文トークンに見えるもの」から「CJKノード」が生成できれば目的(LaTeX3と衝突せずCJKの組版ができる)ということでしょうか。

端的に書いていただいてありがとうございます。私の理解と合っています。

@t-tk
Copy link
Collaborator Author

t-tk commented Oct 21, 2022

雑感です。

こういう話を聞くとCJKノードが内部バッファでもUTF-8のバイトの並びでなければならない、という状況は理解します。
upTeXの最初の頃2007年の状況では、T1 や T2A などの8bit欧文と和文の混在は想定していましたが LaTeX がこれほどまでUTF-8化することは想像できませんでした。
upTeXはpTeXの和文をUnicodeのCJKに置き換えるのが根幹にあり、CJKを内部バッファでUTF-8の並びにすることは全く頭にありませんでした。

全く別のソフトですが、Unicode化したときの内部バッファは、upbibtex, bibtexuはUTF-8, upmendexはUTF-16でして、それを採用した事情もさまざまです。
LaTeXのUTF-8化が進んだ場合、upTeXでは、CJKがUTF-32改で欧文がUTF-8の二階建て構造となり、見通しが良くない状況に陥ることは理解できます。

luaLaTeX, XeLaTeX のCJKは内部バッファでUTF-8になっているのでしょうか?

@h-kitagawa
Copy link
Member

luaLaTeX, XeLaTeX のCJKは内部バッファでUTF-8になっているのでしょうか?

LuaTeX は内部バッファが UTF-8 です (tex/textoken.c, utils/unistring.c).

XeTeX は,ビルド時に作られる xetexd.h を見ると EXTERN UnicodeScalar * buffer ; とあるので,内部バッファは Unicode 値のようです.

@t-tk
Copy link
Collaborator Author

t-tk commented Oct 22, 2022

ありがとうございます。

XeTeX は,ビルド時に作られる xetexd.h を見ると EXTERN UnicodeScalar * buffer ; とあるので,内部バッファは Unicode 値のようです.

XeLaTeXでは h20y6m/plexpl3#2 の問題は発生しないのでしょうか?

@h20y6m
Copy link
Collaborator

h20y6m commented Oct 23, 2022

極端なことを言えば,「和文文字ノード」(aminophen さんの言葉だと「CJK ノード」)があれば,「和文文字トークン」がなくても

和文文字の UTF-8 バイト列,例えば ^^e3^^81^^82 から,きちんと和文文字ノード「あ」が作られる

これは欧文文字トークンは8-bit ASCIIのまま和文文字トークンをなくしてしまうということでしょうか?
たしかに「和文文字トークン」がなくても「和文文字ノード」があれば日本語組版は可能そうではありますが……。

これだと「和文文字1文字=1トークン」の前提が使えなくなるのでつらいですね……。
jsclassesなどでやっている \futurelet で段落はじめの『「』の位置調整のようなものも簡単にはできなくなりますし。

(それに今のLaTeXは8-bitエンジンの場合0x80--0xFFの範囲の文字はカテゴリコード13になっているのでそのままではソースに「あ」とかいても展開されて「^^e3^^81^^82」というトークン列が残らないという問題も……)

個人的には(可能かどうかは置いておいて)和文文字トークンをなくすなら欧文文字トークンはUnicodeになってほしいです。

こういう話を聞くとCJKノードが内部バッファでもUTF-8のバイトの並びでなければならない、という状況は理解します。

「内部バッファ」がUTF-8かどうかというのはあまり重要ではないと思います。
それよりはTeX言語から見た「文字トークン」がどのような文字コードを持っているかだと思います。

pdfTeXでは文字トークンは0x00--0xFFの文字コードを持ちます。
現在のLaTeXはこの文字トークンがUTF-8の規則に従って並んでいる前提でUnicodeに関する処理をします。
pdfTeX自身がこれらをUTF-8として処理しているわけではないはずです。

UnicodeエンジンのXeTeXとLuaTeXの場合文字ト-クンはU+0000--U+10FFFFの文字コードを持ちます。
エンジンレベルで全てのUnicodeコードポイントがASCIIの範囲と違いがないので特別な処理は必要ありません。

upTeXの場合欧文文字トークンについてはpdfTeXと同様の処理が必要になります。
和文文字トークンについてはUnicodeの範囲の文字コードを持ちますがUnicodeエンジンとは異なる性質を持ちます。
和文と欧文で処理を切り替える必要があるので複雑になります。

XeLaTeXでは h20y6m/plexpl3#2 の問題は発生しないのでしょうか?

発生するのはupTeXのみです。

例えば文字コード0xB1をもつトークンは
pdfTeXとpTeXでは ^^b1 のみ、XeTeXとLuaTeXでは ±^^b1± は同一のトークン)のみですが、
upTeXでは ^^b1±^^b1± は異なるトークン)の2種類があり文字コードだけでは区別できません。

同じ文字コードで和文と欧文が重なっているupTeX特有の問題です。

@h-kitagawa
Copy link
Member

どうすればいいのか私の中でいまいち見えてきません.
個人的には「文字トークン自体に和文欧文と区別をつける必要は(必ずしも)ない」と思っていますが,0x80--0xFF の件を考えると悩ましいです1

以下は適当に思いついた一つの案です.

  • 全 Unicode 範囲について,個別に \catcode, \kcatcode を指定可能にする.しかし,以下の制約をかける23
    • \catcode=11 ⇒ \kcatcode≠18 (other_kchar)
    • \catcode=12 ⇒ \kcatcode≠16 (kanji), 17 (kana), 19 (hangul)
  • TeX82 で用意された \if, \ifcat などは \catcode と文字コードの値のみ見る(つまり,\kcatcode の値は見ず,欧文・和文は気にしない).
    • 文字トークンが和文か否か,和文のときの \kcatcode がいくらか,の判定については,条件文を新設する.←変更
  • 実装:トークンは “\catcode” C と文字コード X の組であって,
    • C=11, 16, 17, 19 は TeX82 由来の条件判定では同一視される.←変更
    • C=12, 18 も TeX82 由来の条件判定では同一視される.←変更
    • C≦15 and 0≦X≦0xFF のトークンは欧文文字トークンである.
    • C≦15 and C≠11, 12 and 0x100≦X のトークンは「ノードを作らない(欧文)文字トークン」である.←new
    • C>=16 and 0x80≦X のトークンは和文文字トークンである.
    • 上記以外の組み合わせ(例えば (C,X)=(11, 0x3042), (16, 0x41) など)は許容されない.

Footnotes

  1. LuaTeX では \attribute の仕組みがあり,コード範囲による和文・欧文の区別以外にも「このノードだけ欧文文字ノード」「このノードだけ和文文字ノード」が比較的楽に実現できるという事情があります.

  2. 18 (other_kchar) と 16, 17, 19 との性格の違い.

  3. \lccode等の値は 0x100 以降も許すか?

@t-tk
Copy link
Collaborator Author

t-tk commented Oct 23, 2022

JIS X 0208で和文(全角)でかつUnicodeでU+00FF以下の文字コードが欧文の0x80..0xFFの文字コードが重なっているところが課題ということですね。upTeXの最初の頃と悩みが変わっていない。
「新upTeX」(そろそろ名前を付けた方が議論しやすいように思います。何かいい名前募集中)の文字コードを

  • 欧文は 0x00..0xFF
  • 和文の Unicode (U+000000..1FFFFF) は 0x800000 のbitを立てたUTF32改 0x800000..0x9FFFFF

のようにすれば、欧文と和文の文字コードの重なりが解消され、現状の upTeXとの差分は小さくて済みます。
あるいは、U+00FF以下で欧文とJIS X 0208が重なっている8文字とU+00B7の中黒だけ例外的にUnicodeではない内部コードに移してしまう方法もあると思います。

XeTeXとLuaTeXでは ^^b1 は常に ± なのですね。
upTeXでは「欧文は pdfTeXと同じ」という仮定でしたが、その仮定をやめて、XeTeXとLuaTeXと同じように新upTeXでは「 ^^b1 は常に ± 」、0xFF以下の和文と欧文の区別は何らかの別の手段で実現する、という風な方法はないでしょうか?


JIS X 0208に加え中韓フォント対応で入れた中黒 U+00B7 も入れてリスト化しておきます。備忘録として。

区点 JIS SJIS EUC UTF8 UTF16 name
01-13 212D 814C A1AD C2B4 00B4 ´ Acute Accent
01-15 212F 814E A1AF C2A8 00A8 ¨ Diaeresis
01-62 215E 817D A1DE C2B1 00B1 ± Plus-Minus Sign
01-63 215F 817E A1DF C397 00D7 × Multiplication Sign
01-64 2160 8180 A1E0 C3B7 00F7 ÷ Division Sign
01-75 216B 818B A1EB C2B0 00B0 ° Degree Sign
01-88 2178 8198 A1F8 C2A7 00A7 § Section Sign
02-89 2279 81F7 A2F9 C2B6 00B6 Pilcrow Sign
---- C2B7 00B7 · Middle Dot

@aminophen
Copy link
Member

何かいい名前募集中

安直ですが jpTeX に一票です。

  • j は単に「日本語用」というよりは「日本語 TeX 開発コミュニティによるもの」という気持ち
  • 機能的には「e-upTeX に非互換な変更を加えたもの」になるので jeuptex だが,短くしたい
  • 既に CTAN では (e)(u)ptex の総称を jptex と呼ぶことにされていて,それを要求するパッケージが https://ctan.org/tex-archive/macros/jptex という場所に一元化されている

@t-tk
Copy link
Collaborator Author

t-tk commented Oct 23, 2022

@h-kitagawa さんの案:

  • 全 Unicode 範囲について,個別に \catcode, \kcatcode を指定可能にする.しかし,以下の制約をかける:
    • \catcode=11 ⇒ \kcatcode≠18 (other_kchar)
    • \catcode=12 ⇒ \kcatcode≠16 (kanji), 17 (kana), 19 (hangul)

を多少変更した案はどうでしょう:

  • 全 Unicode 範囲について,\kcatcode = 11,12,16,17,18,19 を指定する.しかし,\catcodeの要求があったときは機械的に 11,12に読み替える:
    • \kcatcode=11 (欧文 11と同じ), 16 (kanji), 17 (kana), 19 (hangul) ⇒ \catcode=11
    • \kcatcode=12 (欧文 12と同じ), 18 (other_kchar) ⇒ \catcode = 12

@aminophen
Copy link
Member

まだついていけてないのですが… \catcode の話「全 Unicode 範囲について,…」は,「何バイトが1個の文字トークンになるか」とも合わせて考える必要がありますよね。

  • pdfTeX では文字コードが 0x00--0xff で,1バイト=1トークン
  • XeTeX, XeLaTeX では文字コードが全 Unicode 範囲で,見た目の1文字=1トークン
  • 従来の upTeX では文字コードが全 Unicode 範囲で,「和文(CJK)扱いされるときは見た目の1文字=1トークン」「欧文扱いされるときは1バイト=1トークン」と変化する

新しい仕様では???

従来の upTeX での \kcatcode の切替に「Unicode 文字を直書きしてバッククオートで値取得」を使うと文字トークンの区切り変化に対応できず,16進数の値を指定するほうが安全でした。同様に,\prebreakpenalty 指定などで多用される「バッククオートによる文字コード取得」や LaTeX の \@tfor でも,どこまでが1文字トークンになるかが影響します。

@h-kitagawa
Copy link
Member

h-kitagawa commented Oct 23, 2022

「何バイトが1個の文字トークンになるか」

upTeX の \kcatcode=15 をここで活かすという手もありますね.
たとえば,内部バッファから U+xyzw(≧U+0080)の UTF-8 バイト列をトークン化する際に

  • \kcatcode"xyzw=15→1 バイト 1 トークン
  • \kcatcode"xyzw>=16 のとき
    • \catcode"xyzw が 11 or 12 のとき→和文文字トークン "xyzw
    • そうでないとき→(欧文)文字トークン "xyzw
  • ^^xyは引き続き欧文文字トークン "xy
  • (XeTeX とかみたいに ^^^^xyzw を入れる?)

とするとか1.ただその場合

従来の upTeX での \kcatcode の切替に「Unicode 文字を直書きしてバッククオートで値取得」を使うと文字トークンの区切り変化に対応できず

の問題は残ることになります.

「見た目 1 文字(Unicode 1 文字) = 1 トークン」がもちろんスッキリしているのですが,「実際に欧文 Unicode フォントを使うことはできない」のが新たな火種になったら困るなあ,という思いもあります.

Footnotes

  1. そうすると,\kcatcode より \tokenmode"xyzw=0(1 バイト 1 トークン), 1("xyzw という一つの(和文)文字トークン)としたほうが単純化できる?

@t-tk
Copy link
Collaborator Author

t-tk commented Oct 23, 2022

名前の案について、upTeX/upLaTeXを命名したときはあまり強く意識していなかったのですが、pTeX/pLaTeXとまとめて言いたいときに (u)pTeX/(u)pLaTeX と書けるようになっていた点は結果的に便利でした。
なので、今回も ?pTeX/?pLaTeX のような形が便利だろう、と思います。
長すぎるのも好ましくないので ? は出来れば1文字がいいです。
それと、今回の新しいものはe-TeXが必ず含まれる、でいいですよね。

jpTeX は一つの有力候補だと私も思いますが、Japan を強く連想させすぎないか、気になります。CKの人もできれば招き入れたいと思います。
ブレストを兼ねてもう少し挙げてみます。

  • jpTeX : 既に CTAN では (e)(u)ptex の総称を jptex と呼ぶ
  • vpTeX : uの次でv
  • wpTeX : world pTeX
  • apTeX : asian pTeX ⇒ pTeX-ng=Asiatic pTeX があるので没
  • ipTeX : international pTeX
  • mpTeX : multilingual pTeX
  • ypTeX : yet another pTeX

私としては、この中では apTeX が割と好みです。

@aminophen
Copy link
Member

aptex は ptex-ng の別名として既にあるんですよね…。(make すると aptex が ptex-ng のコピーとして生成する)

@aminophen
Copy link
Member

他も書いてみます。


個人的には,今回のフォーク目的が「日本で愛されてきた (u)pLaTeX の系譜を終了させないこと」だと思っているので,新たに CK の人を取り込む発想には乗りにくいです。確かに取り込めたほうがモチベーションにはなるのですが…。

@t-tk
Copy link
Collaborator Author

t-tk commented Oct 23, 2022

「日本で愛されてきた (u)pLaTeX の系譜を終了させないこと」

なるほど。それは腑に落ちます。

@h-kitagawa
Copy link
Member

CKの人もできれば招き入れたい

もちろんそれができればよいのですが,もし彼らが XeLaTeX, LuaLaTeX をすでにメインにしているのであれば,pTeX 系統に入ってくる可能性は少ないと思います.

実際の CK の状況は知らないのですが,ちょっと検索したところ

  • 中国語に使える ctex は XeLaTeX, LuaLaTeX, pdfLaTeX, upLaTeX, apLaTeX に対応.開発元が xeCJK パッケージを作っていることも考えると,XeLaTeX 推しか?
  • 韓国語だと ko.TeX のようですが,どうやら pdfLaTeX/XeLaTeX/LuaLaTeX に対応している様子?

が出てきました.

@h-kitagawa
Copy link
Member

名称すら決まっていない段階ですが,新エンジン用にディレクトリだけ作ったものをhttps://github.com/h-kitagawa/texlive-source/tree/kitagawa_zptex_concept に置きました.バイナリができることだけ確認しています.

  • 仮の名称は zptex としていますが,(XeTeX と最初の発音がダブるから)これが採用されることはないはずです^^;.
  • change file は現状だとたくさんありすぎて管理しきれないので,日本語化関連を zptex-base.ch というファイルにまとめています.XeTeX のように zptex.web としてまとめるのも一つの手?
  • 名称以外の WEB 部分は e-upTeX からいじっていません.

@aminophen
Copy link
Member

change file は現状だとたくさんありすぎて管理しきれないので,日本語化関連を zptex-base.ch というファイルにまとめています.XeTeX のように zptex.web としてまとめるのも一つの手?

そうですね,まとめる方向に +1 です。過去の #32 とも絡みますが整理したいです。

  • 新バイナリを入れる段階で素の (u)pTeX バイナリは削除し,バイナリは「eptex」「euptex」「新規」の3つのみとする。従来の (u)ptex → e(u)ptex のエイリアスとしてコマンド名を残す。
  • そのタイミングで ptexdir と uptexdir はそれぞれ eptexdir と euptexdir に統合する。

@t-tk
Copy link
Collaborator Author

t-tk commented Oct 24, 2022

名称案追加です。

  • spTeX: super pTeX, supreme pTeX

個人的には結構 +1 です。→ 過去にありました。没です。
spanish TeX で spTeX:
http://es.tldp.org/CervanTeX/CervanTeX/FAQ/FAQ-CervanTeX/FAQ-CervanTeX-10.html

中国語: ctex のチームがおそらくxeCJK & XeTeX推し
韓国語: ko.tex が pdfLaTeX/XeLaTeX/LuaLaTeX に対応
とのことですが、確かにそのように見えます。
将来CJKのチームが開発リソースをある程度でも共通化する未来は見えませんね…

@h-kitagawa
Copy link
Member

すっかりご無沙汰です.まとまって作業できる時間がやっと取れたので,ここ二週間ぐらい一から考え直しています.

@aminophen さんが以前 Slack で,「XeTeX に pTeX の和文組版を載せる」といった趣旨の発言をされていた覚えがあります.当時は私はその方針には反対だったのですが,実際にコードを書いてみたところ,悪くない気がしてきました.

  • 文字トークンは catcode (0--15) と文字コード (0--0x10FFFF) の組.文字トークンの段階では和文と欧文の区別はない.
  • eqtb テーブルでは,各文字コードごとに次の情報が保持される:
    • \catcode (0--15) など,欧文 TeX のもの
    • \cjkxcode→後述
    • \prebreakpenalty, \postbreakpenalty, \inhibitxspcode, \xspcode
  • \{enable,disable,force,current}cjktoken は不要なので未実装
  • \cjkxcode c = azyx ₂ と2進表示した際の各ビットの意味は次の通り.「全文字 \cjkxcode=0」ならばもとの XeTeX と動作は変わらないはず
    • x: \jcharwidowpenalty の挿入制御(コード中の説明は
    • y: 直後の改行により空白を挿入しないならば1
    • z: 和文文字扱い(=文字トークンからノードを生成する過程で,和文フォントを使った和文文字ノードを生成させる)ならば1
    • a: 数式中に直書きした場合でもでも和文文字扱いさせるならば1
  • \kcatcode は読み出しのみ可能.
  • OpenType フォントは欧文フォントとしてのみ扱える.別の言い方をすれば,和文フォントは従来どおり pTeX JFM のみ.

@aminophen
Copy link
Member

aminophen commented Aug 10, 2023

ご無沙汰しております。こちらも Slack で・GitHub で色々と意見だけ言っておきながらその後何も検討も動けていませんでした。もうすっかり忘れてしまったので,一から勉強し直しています。(u)pTeX 特有の重要な概念として「①和文文字トークン」「②和文文字ノード」がある中で,現在の①の挙動は expl3 とって不都合があるので,維持したい機能を残しつつ欧文文字トークンに近づけたいという話でしたね。

思いつきに過ぎなかった「XeTeX に pTeX の和文組版を載せる」を拾っていただいてありがとうございます。ざっとざっと実装を見てみましたが,整っていて綺麗だと感じました。

和文文字トークンの現在の挙動のうち,維持したいのは「(1バイト1トークンではなく)“見た目の1文字”で1トークンになる」「ノード化すると(欧文文字ノードではなく)和文文字ノードになる」ということくらい(例えば \prebreakpenalty`」=10000 のため)だと改めて思いました。実装していただいているとおり「文字トークンの段階では和文と欧文の区別はない」「\kcatcode は実質廃止・読み出しのみ可能」「代わりに \cjkxcode で諸々制御」で良いですね。禁則テーブルでなく文字ごとに設定可能(→ \prebreakpenalty\postbreakpenalty を同時に設定できる)というのも含めて良いと思います。

e-upTeX ベースと XeTeX ベースのどちらが良いかは迷います。内部コード Unicode 固定はもう確定路線とみなすと,どちらを使っても実現はできると思えてきましたが,違いは以下くらいのことでしょうか:

  • e-upTeX ベースの場合:符号位置 256 以上の欧文文字ノード生成方法の用意 [nptex] 符号位置 256 以上の欧文文字トークンのノード化 #153
  • XeTeX ベースの場合:欧文文字ノードについて 8-bit TFM (Type1) から Unicode (OpenType) への乗換による組版変化(※ inputenc UTF-8 による 8-bit TFM 利用は XeTeX/LuaTeX では使えないんでしたよね)

@aminophen
Copy link
Member

(あと,XeTeX だと dvips が使えなくなって困る人も出てくるのでしょうかね)

@h-kitagawa
Copy link
Member

  • XeTeX ベースの場合:欧文文字ノードについて 8-bit TFM (Type1) から Unicode (OpenType) への乗換による組版変化(※ inputenc UTF-8 による 8-bit TFM 利用は XeTeX/LuaTeX では使えないんでしたよね)

sty使用例 のように,一行で「8-bit TFM の状況」,つまり

  • OT1 encoding をデフォルトにする(\encodingdefault も変更の必要が?)
  • \usepackage[utf8]{inputenc} 相当のことを \DeclareUnicodeCharacter の再定義により実現する

に戻せれば良いかな.と思いました.

@h-kitagawa
Copy link
Member

XeTeX だと dvips が使えなくなって

xdv (pdf) の代わりに dvi を出力させるスイッチ -dvih-kitagawa/texlive-source@fd45512 で入れてみました.今のところは次の二点が変わるだけです:

  • 出力ファイル名の拡張子が .dvi になり,DVI ID は(pTeX 縦組のように)preamble 側は 2,postamble 側は 3 になる
  • \font では 8-bit TFM(と JFM)しか使えない

e-upTeX ベースと XeTeX ベースのどちらが良いかは迷います。内部コード Unicode 固定はもう確定路線とみなすと,どちらを使っても実現はできると思えてきましたが,違いは以下くらいのことでしょうか:

  • e-upTeX ベースの場合:符号位置 256 以上の欧文文字ノード生成方法の用意 [nptex] 符号位置 256 以上の欧文文字トークンのノード化 #153
  • XeTeX ベースの場合:欧文文字ノードについて 8-bit TFM (Type1) から Unicode (OpenType) への乗換による組版変化(※ inputenc UTF-8 による 8-bit TFM 利用は XeTeX/LuaTeX では使えないんでしたよね)

そうすると,「XeTeX ベースの npTeX + -dvi (A)」「e-upTeX ベースの npTeX (B)」はほとんど差がないように感じます.#153 では,(B) について

そもそも \nptexnoderecipe なる仕組みを考えだしたのは,アクティブ文字 (catcode=13) がコントロールワードで使えないから.

と書いていますが,この点は (A) でも変わらない気がします.

@aminophen
Copy link
Member

xdv (pdf) の代わりに dvi を出力させるスイッチ

ありがとうございます。

「XeTeX ベースの npTeX + -dvi (A)」「e-upTeX ベースの npTeX (B)」はほとんど差がない

エンジン自体の機能およびユーザレベルでは仰る通りですね。パッケージ開発者レベルでは差があって,(A)の場合は LaTeX の随所にある「LuaTeX or XeTeX か否か」という名称判定から「Unicode フォントかどうか」という機能判定に変更して回る処置が必要と思われます。ちょうど pLaTeX が eptex から euptex -kanji-internal=euc になったことで誤判定を直して回ったばかりですが,あの時は日本側で済んだところを今度は海外に説明して回らないといけない感じはします。その点に限っては(B)に軍配が上がります。もちろん,機能的には,XeTeX ベースの npTeX の方が「-dvi 無効=欧文 Unicode フォントできる状態」も存在することの利点があるわけですが。

@aminophen
Copy link
Member

(A)を採る場合に「パッケージ開発者レベル〜〜〜(中略)〜〜〜海外に説明して回らないといけない」を避けるため,スイッチ -dvi 有効時に全ての \XeTeX〜 及び \Umath〜 系列プリミティブを未定義にする,というのが良さそう?

@aminophen
Copy link
Member

ざっと試しに動かしてみていますが,うまく動いていません。私のところでは Mac でビルドするため nptex.am をこのように改変(nptex_LDFLAGS が肝)していますが,そのせいだとは思えず。

他,エンジンの機能上 e-upTeX との差異に気づいた点:

  • 欧文 Unicode 文字ノード (whatsit) に対して
    • \lastnodechar, \lastnodefont が動かない (-1, \nullfont)
    • \postbreakpenalty が入らない:下記コード
\documentclass{article}
\begin{document}

\tracingonline1
\showboxdepth10000
\showboxbreadth10000
和文と違って、Latinの禁則は[まだ]完全でない。
\showoutput % "[" の後の禁則ペナルティが入らない
\end{document}

今後の実装については,fam256.ch 及び \epTeXinputencoding の機能を持ってきたときに XeTeX 拡張(それぞれ \Umath〜 及び \XeTeXinputencoding)と衝突しないかが今後気になるところ。

@h-kitagawa
Copy link
Member

nptex.am

  • \postbreakpenalty が入らない:下記コード

確認ありがとうございます.直しました.

  • 欧文 Unicode 文字ノード (whatsit) に対して
    • \lastnodechar, \lastnodefont が動かない (-1, \nullfont)

こっちは一筋縄ではなさそうです.Latin\typeout{\the\lastnodechar} のように「Unicode 文字ノードの生成が終わっている」状態だとうまく行くのですが,Latin\the\lastnodechar のような「生成途中」だと動かないですね.
なお,同じこと \lastnodetype にも当てはまっています,

@aminophen
Copy link
Member

aminophen commented Aug 20, 2023

\postbreakpenalty の修正ありがとうございます。

他,不具合がおきる例は作っていませんが

@d ita_kern=3 {|subtype| of kern nodes from \.{\\/}}
@d space_adjustment=3 {|subtype| of kern nodes from \.{\\XeTeXinterwordspaceshaping} adjustment}

ここの subtype 値はずらした方が良さそうです。

あと,nptexdir/memo.txt に書かれていませんが \readpapersizespecial は未実装ですね。それと \pdfsavepos の組方向対応。

@aminophen
Copy link
Member

aminophen commented Aug 20, 2023

test02.tex の結果: test02-230820-hy.zip

この理由がまだわかりません…。

→ [edit] 2023-08-22: 何度か rebuild / fmt 再生成したらいつの間にか治りました。

@aminophen
Copy link
Member

aminophen commented Aug 21, 2023

欧文ノード生成途中の \the\lastnodechar が -1 の件ですが,\ifnum\lastnodechar〜も同様になります。多分 \relax 前置で生成打ち切りするのが筋でしょうけども。

[edit] 気づいたことを書いていきます。2023-08-24

  • $c_i\in C_i$ \bye で Segmentation fault: 11(h-kitagawa/texlive-source@1942650, h-kitagawa/texlive-source@3234f2b の両方で発生確認)
  • ajmacros.sty (otf.sty) など ISO-2022-JP なファイルをそのままでは読めない
  • 要確認:ptexenc による文字コード変換(内部 Unicode な upTeX でも濁点・半濁点の結合文字列は合成されていたはず)が npTeX でどうなるか

@h20y6m
Copy link
Collaborator

h20y6m commented Aug 27, 2023

ようやく動かしてためしはじめました。(Windowsは諦めてUbuntu 22.04 on WSL2)

気になったことを書いておきます。

  • xdvipdfmxでxdvのときは和文VFのfallbakが動かないようになっている (texk/dvipdfm-x/vf.c)
    • 単純に条件を1つ外すだけで動くような気がしますが、XeTeXに影響はないか心配
  • upLaTeXで\kcatcode`α=15のようにkcatcode=15で欧文扱いにするみたいなことをしているコードはそこそこある気がするので互換性のためにあったほうがよいかも
    • upTeXと互換にしようとするとブロックの全文字に対して処理しないといけないので実装は大変そう
  • XeTeXのinterchartokensと和文組版機能((x)kanjiskip等)が競合しないか
    • 同時に使いたい場面はないかもしれませんが
    • 現状は文字トークンが和文文字として扱われるときはclass 4095(glue, kern等)と同じ処理になっている?
  • \disablecjktokenのような和文を一括で無効にする機能があると「見出しだけotfフォントを直接使ってプロポーショナル組み」みたいなことができて面白いかも
    • もちろん和文トークンでなないので名前は違うほうが良いでしょうが

@h20y6m
Copy link
Collaborator

h20y6m commented Aug 29, 2023

  • upLaTeXで\kcatcode`α=15のようにkcatcode=15で欧文扱いにするみたいなことをしているコードはそこそこある気がするので互換性のためにあったほうがよいかも

自分で言っておいてなんですが、あまり意味がないような気がしてきました。
TeX Wikiのこのページの欧文の例のようなものを想定してだったのですが、cjkxcode=0にして欧文扱いするだけでは組めるようにはならないみたいなので、結局xllegacyenc.styのような追加のパッケージが必要になるのならそのパッケージで必要な文字をcjkxcode=0にする機能を提供できれば十分な気がします。

早速実装していただいたのにすみません……

@h-kitagawa
Copy link
Member

* `$c_i\in C_i$ \bye` で Segmentation fault: 11([h-kitagawa/texlive-source@1942650](https://github.com/h-kitagawa/texlive-source/commit/1942650063daa1a21786b9035dd1af6d77ac196d), [h-kitagawa/texlive-source@3234f2b](https://github.com/h-kitagawa/texlive-source/commit/3234f2b8c8a2bed27230799bbec0d75a7b8598e2) の両方で発生確認)

後で調べます.

* ajmacros.sty (otf.sty) など ISO-2022-JP なファイルをそのままでは読めない

* 要確認:ptexenc による文字コード変換(内部 Unicode な upTeX でも濁点・半濁点の結合文字列は合成されていたはず)が npTeX でどうなるか

XeTeX では input_line が XeTeX_ext.c で定義されていますが,ここで行われる XeTeX による Unicode 正規化やコード変換の前に)ptexenc の input_line2 に通してしまう,というのはどうでしょうか.

こういう点を見ると,e-upTeX ベースの方が「後から発覚する」トラブルが少なくなる気がしており,悩みます.TeXConf2023 で何かは(「悩んでいる」ということでもいいので)報告したいところですが…….

@aminophen
Copy link
Member

いろいろな検討をありがとうございます。悩ましいです。

XeTeX ベースはどうかと提案した理由は,あまり深く考えずに

  • 実装上 XeTeX は e-TeX の自然な拡張であり(pdfTeX よりも e-(u)pTeX 系列に近い),(x)dvipdfmx も共通なので,そこに (u)pTeX の change file を乗せれば綺麗な実装になるのではないか
  • 文字コード 0x100 以上の欧文文字ノード生成に OpenType が使えれば手間が省けるのでは

という期待でしたが,安直でしたかね…。確かに,後から発覚するトラブルが少ないのは e-upTeX かもしれません。

  • ファイルの文字コード混在は (u)pTeX の世界では普通にあること(特に ISO-2022-JP が一番安全だと思われてきた)なので対応したいところですが,XeTeX には teckit という入力フィルタが入っていて,それと ptexenc が衝突して…というようなことが起きると訳がわからなくなりそうです。
  • LuaTeX への移行に障害があって (u)pTeX を使うモチベーションとして「PDF+OpenType へ完全移行できないケース」があるとするならば,その意味でも XeTeX ベースにはしない方が良いように思えてきました。

悩みつつ要件と論点の整理中…。


npTeX / npLaTeX の目標:(u)pLaTeX ユーザが自然に使える npLaTeX を実現すること

  • 現在の (u)pTeX エンジンの仕様には不都合があり,expl3 の開発が進むにつれて (u)pLaTeX がいつ壊れてもおかしくない状態になっている。(u)pTeX エンジンの仕様の不都合として,以下の 2 点が特に重要と思われる。
    • 内部コード EUC/SJIS の存在。内部コード Unicode だけなら幾分対応しやすい。
    • 和文文字トークンの存在。文字コードが中途半端に 0--255 でなく(e.g.「`あ」できるのに「\catcode`あ」できない),欧文文字は「1バイト1トークン」なのに対し和文文字は「1文字1トークン」であり単位が異なる。
  • npTeX では,以上 2 点の不都合を解消しつつ,従来の (u)pTeX で可能だったことをなるべく維持したい。
    • (u)pLaTeX 用のソース(→ CTAN のパッケージ+各種機関配布の文書クラス)がなるべく通ること。
    • 和文文字が絡む組版が (u)pTeX と同等(→ JFM 参照,和文文字ノード生成,禁則処理など)であること。
  • このように考えると,npTeX の仕様として以下が考えられる。
    • 内部コードは Unicode に固定する。
    • 全ての文字コードに対して「1文字1トークン」に固定する(例えば \prebreakpenalty`」=10000 などが通る)。トークン時点での和文/欧文の区別は必須でないが,組版で生成するノードには和文/欧文の区別が必要(フォント切替)。そのとき,0x100 以上の欧文文字ノード生成方法は別途準備が必要。
  • 以上を満たす npTeX の実現方法は問わない:(A) e-upTeX ベースでも良いし,(B) XeTeX ベースでも良い。ともあれ,なるべく(エンジン本体・LaTeX マクロの両方の観点を総合して)開発と維持が楽になるのが望ましい。
    • どちらが総合的に良いか?
    • PDF 出力で OpenType フォントを利用したいなら,XeTeX ベース (+ xdvipdfmx) が嬉しい。
      • 0x100 以上の欧文文字ノード生成ができ,unicode-math も使える。
    • PostScript 出力したい(例:CID フォントを使う案件,過去の PostScript 資産がある案件)なら,XeTeX ベース (+ xdvipdfmx) は使えない。PDF 出力でも従来の e-(u)pTeX の組版結果を欧文も含めて維持するなら,OpenType ではなく 8-bit TFM の利用が必要。これらを考えると e-upTeX ベースの方が楽か。
      • XeTeX エンジンへの機能制限(8-bit TFM と JFM しか使えなくする)を設け,さらに 0x100 以上の欧文文字ノード生成方法を準備する必要がある。
      • しかし,多くの LaTeX パッケージのエンジン判定が「XeTeX なら OpenType フォントが使える」と思い込んでいて,欧文 8-bit TFM 対応が弱い(※ inputenc UTF-8 不可)。
      • エンジン判定を騙す(OpenType フォント不使用・xdvipdfmx 不使用など)ために,\XeTeX〜 や \Umath〜 系プリミティブを未定義にすることは考えられるが,その分 XeTeX エンジンの改修は複雑になる。
    • その他,入力ファイルの Unicode 正規化やコード変換については…。

TeXConf2023 で何かは(「悩んでいる」ということでもいいので)報告したいところですが…….

何かしら話すきっかけになればありがたいです。

@h-kitagawa
Copy link
Member

こちらこそ,整理をどうもありがとうございます.


  • OpenType フォントを使う場合,エンジン識別はどうするか?(\sys_if_xetex = T でよい?)
    • もしそうするなら,XeTeX によるコード変換・正規化(\XeTeXinputencoding, \XeTeXinputnormalization)との折り合いが必要.ptexenc との二者択一とする?
    • npTeX を「(非互換はコード変換機能だけだが)XeTeX とは別のエンジン」と称すると,XeTeX 由来のコード変換機能はまるまる消せて楽になるが,海外のパッケージ制作者への状況説明が要る.
  • otf パッケージで使われる「0x110000 以上の文字」をどこまで許すか.
    • \kchar の引数としては許されないと意味がない.
    • adjust_hlist のことも考えると,和文文字ノード中の「文字コード」としても許容することになるだろう.
    • 文字トークンや \kchardef としては?

@h-kitagawa
Copy link
Member

自己レスです.

otf パッケージで使われる「0x110000 以上の文字」をどこまで許すか.

e-upTeX の main_loop において chardef トークンや \char の処理方法を見てみると,

hmode+char_given:
  if check_echar_range(cur_chr) then goto main_loop
  else begin cur_cmd:=kcat_code(kcatcodekey(cur_chr)); goto main_loop_j; end;
hmode+char_num: begin scan_char_num; cur_chr:=cur_val;
  if check_echar_range(cur_chr) then goto main_loop
  else begin cur_cmd:=kcat_code(kcatcodekey(cur_chr)); goto main_loop_j; end;
  end;

のように「kcatcode を算出し,文字トークンとして扱う」ことをしています.
また,#46 も考えると,「0x110000 以上の和文文字トークン」まで考えないといけないように思いました.

0x110000 以上の文字コードに対して \catcode, \prebreakpenalty, ... を設定できるようにするのは意味がないように思います,たとえば(0x400000 が境目だったとして)次のようにすると良い?

  • 0x110000--0x3FFFFFF:「和文,漢字」に相当する固定値を返す
  • 0x400000 以上:規定文字のものを採用する

@h20y6m
Copy link
Collaborator

h20y6m commented Sep 3, 2023

「0x110000 以上の和文文字トークン」まで考えないといけないように思いました.

個人的には 0x110000 以上の 文字トークン は無いほうがいいと思います。
これが存在すると expl3 等に特別扱いしてもらう必要が出てきてしまいます。
(例えば文字列を UTF-16 の HEX 表記(PDF 文字列)に変換するとき 0x110000 以上の文字コードのトークンがあると困ったことになる。)

ところで 0x110000 以上の 和文文字ノード は otf パッケージの \CID コマンド等で必要になりますが、0x220000 以上の文字コードって必要なんでしょうか?


気付いたことの追加:

  • \tracinglostchars >= 2 のときに Character ... cannot be typeset in JIS-encoded JFM ... のメッセージが端末に出力されない
    • eptexdir/char-warning-eptex.ch の内容

@t-tk
Copy link
Collaborator Author

t-tk commented Sep 3, 2023

ところで 0x110000 以上の 和文文字ノード は otf パッケージの \CID コマンド等で必要になりますが、0x220000 以上の文字コードって必要なんでしょうか?

[upTeX+dvipdfmx] 異体字セレクタ、Unicode合成文字 #46 で述べているような構想があるのみで、いまだに実用には至っておりません。ただ、いつかは使いたいと思っており、 "reserved" のつもりです。

@h-kitagawa
Copy link
Member

XeTeXのinterchartokensと和文組版機能((x)kanjiskip等)が競合しないか

実現自体はなんとかなりそうですが,
XeTeX デフォルトだと,CJK 文字は \XeTeXcharclass 1, 2, 3 のどれかに割り当てられており,xetex.ini 中で

  \gdef\xtxHanGlue{\hskip0pt plus 0.1em\relax} % between ideographs
  \global\XeTeXinterchartoks 1 1 = {\xtxHanGlue}
  \global\XeTeXinterchartoks 1 2 = {\xtxHanGlue}
  \global\XeTeXinterchartoks 1 3 = {\nobreak\xtxHanGlue}
  \global\XeTeXinterchartoks 2 1 = {\nobreak\xtxHanGlue}
  \global\XeTeXinterchartoks 2 2 = {\nobreak\xtxHanGlue}
  \global\XeTeXinterchartoks 2 3 = {\xtxHanGlue}
  \global\XeTeXinterchartoks 3 1 = {\xtxHanGlue}
  \global\XeTeXinterchartoks 3 2 = {\xtxHanGlue}
  \global\XeTeXinterchartoks 3 3 = {\nobreak\xtxHanGlue}

と,すでにトークン列が割り当てられていることには注意が必要です(nptex.ini からこれらの行を削除するだけでよい?).

個人的には 0x110000 以上の 文字トークン は無いほうがいいと思います。

なるほど……それはそうですね.「[upTeX+dvipdfmx] 異体字セレクタ、Unicode合成文字 (#46 )」の(e-upTeX ベースか XeTeX ベースかに関わらず)npTeX での実装方法とも絡んでくるので,引き続き考えてみます.

@t-tk
Copy link
Collaborator Author

t-tk commented Dec 23, 2023

全然ついていけておらず、少しずつ読み返しております。シロウト質問です。

多くの LaTeX パッケージのエンジン判定が「XeTeX なら OpenType フォントが使える」と思い込んでいて,欧文 8-bit TFM 対応が弱い

そうすると、"多くのLaTeXパッケージ"は、「XeTeX ベースの npTeX + -dvi (A)」ではそもそも使用できない、ということでしょうか。
"多くのLaTeXパッケージ"は、「8bit欧文tfmが使える」ようには一応なっているので「e-upTeX ベースの npTeX (B)」は使用できるであろう、ということでしょうか。

npTeX が「Unicode 1 文字から 1 トークンができる」かつ「(本文の)欧文フォントは tfmであってUnicode フォントではない」というエンジンになったとして、\sys_if_engine_xetex:pでは「本文の欧文フォントはUnicode」という前提を要求されるので"多くのLaTeXパッケージ"は動かない、ということでしょうか。
あるいは、「XeTeX ベースの npTeX + xdv, pdf出力」で「fontspec, unicode-mathは欧文のみ」が実現できれば「和文フォントはJFM」が拡張機能として混入していても、"多くのLaTeXパッケージ"が動くようなことは可能、ということでしょうか?

「日本語pLaTeX向けパッケージ」は「欧文の本文が8bit tfm」であることを要求していてnpTeXは「欧文の本文が8bit tfm」で動かしたいので、"多くのLaTeXパッケージ"にも「Unicode 1 文字から 1 トークンができる」かつ「欧文の本文が8bit tfm」に対応してもらう必要がある、ということでしょうか?

頭の中が混乱しています。

@h-kitagawa
Copy link
Member

多くの LaTeX パッケージのエンジン判定が「XeTeX なら OpenType フォントが使える」と思い込んでいて,欧文 8-bit TFM 対応が弱い

これは

多くの「LaTeX パッケージのエンジン判定」が……

としたほうが良かったでした.すみません.
実際にエンジン判定があるのは,エンジンによって OpenType か 8 bit TFM か切り替える,フォント関連のパッケージが大半だと思います.

こんな感じでしょうか:

  • 「XeTeX ベースの npTeX + -dvi (A)」かつ「エンジン判定で XeTeX と判定される」

    • まともに動かない. LaTeX フォーマットだけの状態でも,現状ジョブの開始時点で OpenType フォント (lmroman10-regular.otf) を読みに行きエラーが発生.
    • フォーマット作成の段階をなんとかしたとしても,フォント設定のパッケージで 「このエンジンは XeTeX だからUnicode フォントを読み込もう」としてエラーが発生する可能性は高い.
  • 「XeTeX ベースの npTeX + -dvi (A)」かつ「エンジン判定で XeTeX と判定しない」
    →「e-upTeX ベースの npTeX (B)」と同じことになる.

  • 「e-upTeX ベースの npTeX (B)」

    • OpenType/8 bit の切り替えだけでエンジン判定を行っている場合は,「8 bit エンジン判定」されるので問題は起きないだろう.
    • 「1 バイト 1 トークン」を前提としたコードは動かない.顕著な例は \usepackage[utf8]{inputenc} 相当の機能が読み込まれないことで,このおかげで Unicode 直接入力は現行の LaTeX ではうまくいかない.従来の \ae, \'{e} のような命令に頼るか,自前で処理を書く必要がある.
  • 「XeTeX ベースの npTeX + xdv/pdf 出力 (A)」かつ「エンジン判定で XeTeX と判定されない」
    →パッケージ側の自動判定では「e-upTeX ベースの npTeX (B)」と同じことになる.ただし手動で OpenType フォントを読み込むことは可能.

あるいは、「XeTeX ベースの npTeX + xdv, pdf出力」で「fontspec, unicode-mathは欧文のみ」が実現できれば「和文フォントはJFM」が拡張機能として混入していても、"多くのLaTeXパッケージ"が動くようなことは可能、ということでしょうか?

私はそのように考えています.

"多くのLaTeXパッケージ"にも「Unicode 1 文字から 1 トークンができる」かつ「欧文の本文が8bit tfm」に対応してもらう必要がある、ということでしょうか?

「どこまでやってもらえるか」は未知数ですが,私は必要性を感じます.

「e-upTeX ベースの npTeX (B)」でも「XeTeX ベースの npTeX + -dvi (A),ただし XeTeX と判定されない」で問題になる事象は,pdfLaTeX 用のソース

\documentclass{article}
\usepackage{times}
\begin{document}
foobar
\end{document}

を「LuaTeX の \directlua って便利そうだな」という理由からタイプセッタを lualatex に変えても意図通りにならない(フォントが Times にならない)というものと同じことです.

@t-tk
Copy link
Collaborator Author

t-tk commented Dec 24, 2023

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

  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
Copy link
Collaborator Author

t-tk commented Apr 6, 2024

upTeX の IVS関連 #45 で kcatcode周りをいじっている最中に思いついた案です。
92aeca9

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 は常に欧文扱いになる。

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

No branches or pull requests

5 participants