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

ptexenc 側で ^^-記法に変換しない実験 #147

Open
h-kitagawa opened this issue Sep 6, 2022 · 3 comments
Open

ptexenc 側で ^^-記法に変換しない実験 #147

h-kitagawa opened this issue Sep 6, 2022 · 3 comments

Comments

@h-kitagawa
Copy link
Member

#146 に関連する実験です.

(e-)pTeX では,input_line2 関数において,UTF-8 入力を内部コードに変換してから TeX 側で処理する形になっていますが,その際に

内部コードで表せない UTF-8 バイト列は ^^ 記法に変換される
ことになっています.

ただ,現行のこの仕様ですと「^ + (非 JIS X 0208 文字)」が正しく扱えません.#146 の例ですと,UTF-8 入力「^☃」は TeX に

^^^e2^^98^^83

と渡されてしまい,文字トークン列

[^^^] [e] [2] [^^98] [^^83]

と解釈されることになります.
LaTeX3 で正規表現を扱える (l3regex) ことを考えると,何らかの対応はしたい気分です.


……というわけで,h-kitagawa/ptexenc_buffer2 ブランチで,「input_line2 関数では ^^ 記法に変換せず,和文由来のバイト列は #81 で導入した別配列 buffer2 にフラグを立てる」というお遊び実験をしています.

  • 考えるのが面倒だったので,(e-)(u)pTeX 以外 (pMetaPost, ppltotf, ...) ではオフにしています.
  • upTeX では「和文文字となりうる UTF-8 バイト列」(つまり,U+0080 以降)に buffer2 フラグを立てるようにしています.→kcatcode=15 の場合は TeX 側で該当箇所のフラグをオフにします.

ただこの方法だと,「TeX に渡る時点で和文(になりうる)・欧文の区別をつける」ことになり,\scantokens を実行した場合の挙動は要検討です.

@h-kitagawa
Copy link
Member Author

\scantokens を実行した場合の挙動

(私が)忘れないうちに記録しておきます.

現行 (e-(u)pTeX 4.0.0) の挙動

(どこかで zr さんが書かれていた記憶がありますが)

input_line2 から TeX に外部ファイルからの入力が渡されるときには,和文・欧文の区別はありません1.通常の「トークン列の文字列化」では和文・欧文の区別は失われませんが,\scantokens の内部処理では「擬似ファイルからの入力」を行うため,やはり通常の和文・欧文の区別は失われます.そのため

\scantokens{^^e3^^81^^82.あ.^^a4^^a2.^^82^^a0\noexpand}% UTF-8 入力

  • 内部コード EUC の場合:[^^e3][^^81][^^82][.][あ][.][あ][.][^^82][^^a0]
  • 内部コード SJIS の場合:[縺][^^82][.][あ][.][^^a4][^^a2][.][あ]
  • 内部コード uptex の場合:[あ][.][あ][.][^^a4][^^a2][.][^^82][^^a0]

とトークン化され,欧文バイト列が和文文字に化けることになります.

ptexenc_buffer2 ブランチ(h-kitagawa@6159031 時点)の挙動

input_line2 から TeX に外部ファイルの入力が渡される段階で和文・欧文の区別を行います.そのため,\scantokens による文字列化でも和文由来・欧文由来の区別は失われません.そのため

\scantokens{^^e3^^81^^82.あ.^^a4^^a2.^^82^^a0\noexpand}% UTF-8 入力

は内部コードがEUC, SJIS, uptex いずれの場合でも

[^^e3][^^81][^^82][.][あ][.][^^a4][^^a2][.][^^82][^^a0]

とトークン化されます.

ただ,実装から,e-upTeX では \scantokens 時の \kcatcode をいじることで

  • 和文文字トークンが欧文バイト列に変換されることはある
  • 一方,欧文バイト列を和文文字トークンに変換されることはない

という非対称性が生まれています.例えば

% UTF-8 入力,内部コード uptex
\kcatcode`ひ=15
\def\xA{ひカ漢:}
\kcatcode"3041=17 \kcatcode"30A1=17
\edef\xB{\scantokens\expandafter{\xA\noexpand}}

から得られる \xB は,

[^^e3][^^81][^^b2][^^e3][^^82][^^ab][漢][:]

というトークン列になってしまいます(「ひ」が和文文字トークンになっていない).

参考:\write\read と TCX ファイル

なお,pTeX 4.0.0 では欧文バイトの「出力可能性」を TCX ファイル (https://tug.org/texinfohtml/web2c.html#TCX-files) で制御できるようになっています.この指定によっては,「トークン列を \write→同じファイルから \read で読み込み」すると欧文バイト列が和文文字に変わることがあります.

たとえば

% eptex
\immediate\openout0=temp.tex
\immediate\write0{^^e3^^81^^82}
\immediate\closeout0
\immediate\openin0=temp.tex \read0to\CS \immediate\closein0

において,

  • TCX ファイル無指定時には,temp.tex に ^^e3^^81^^82 と書かれるため,\CS の中身は [^^e3][^^81][^^82]となる.
  • -translate-file=cp227.tcx と TCX ファイルを指定すると,temp.tex に と書かれるため,\CS の中身は [あ]となる.

Footnotes

  1. buffer2 は TeX が入力行からトークンを読み取る過程でセットされます.

t-tk added a commit that referenced this issue Jan 1, 2023
ptexenc 側で ^^-記法に変換しない実験
debug codeを含む
@t-tk
Copy link
Collaborator

t-tk commented Jan 1, 2023

別案です。eb9add8

  • upTeX の内部 euc/sjis モード前提。(以下、uptex-euc, uptex-sjis などと記載。)
  • 入力ファイルは UTF-8
  • input_line2 の buffer は UTF-8 (line_buff_utf8のフラグで動作)
  • uptex(内部uptex) と同様、kcatcode のチェックで欧文扱い/CJK扱いが選べる
  • kcatcodeの設定は pTeX と同様、JISの上位バイト毎に管理される
  • input_line2 の buffer から内部バッファに入れる際に、charcode が UTF-8 → EUC/SJIS に変換 ReEncodeInteralEnc() され
    kcatcode/charcodeの組で格納

大体動いているように見えますが、どういうテストが良いのかよく分かっていません。

% UTF-8 入力,内部コード uptex, euc or sjis
\kcatcode`ひ=15
\def\xA{ひカ漢:ABC}
%\show\xA

\kcatcode\ucs"3041=17 \kcatcode\ucs"30A1=17
\edef\xB{\scantokens\expandafter{\xA\noexpand}}

\show\xA
\show\xB

uptex-euc ::

> \xA=macro:
->^^a4劵繊^^a7ABC.
l.46 \show\xA

?
> \xB=macro:
->ひカ漢:ABC.
l.47 \show\xB

?

uptex-sjis ::

> \xA=macro:
->^^82^^d0カ漢:ABC.
l.46 \show\xA

?
> \xB=macro:
->ひカ漢:ABC.
l.47 \show\xB

?

uptex-uptex ::

> \xA=macro:
->^^e3^^81^^b2カ漢:ABC.
l.46 \show\xA

?
> \xB=macro:
->ひカ漢:ABC.
l.47 \show\xB

?

@t-tk
Copy link
Collaborator

t-tk commented Jan 1, 2023

eb9add8 は動作が変でした。
筋は悪くないと思っているので出直します。

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

2 participants