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

[eptex] \Uchar and \Ucharcat #95

Closed
h-kitagawa opened this issue Oct 31, 2019 · 14 comments
Closed

[eptex] \Uchar and \Ucharcat #95

h-kitagawa opened this issue Oct 31, 2019 · 14 comments

Comments

@h-kitagawa
Copy link
Member

tex-jp-builkd/#81 から分離しました.もとの aminiophen さんのコメントを載せておきます:

====
メモです。

https://twitter.com/zr_tex8r/status/1189063963381600257 からの某ZRさんのツイートで

\Uchar はXeTeXやLuaTeXの拡張プリミティブで、これを使うと
「文字コードから文字トークンへの変換が展開限定文脈で行う」
ことが可能になる。

欧文が256文字しかないエンジンだと、\Uchar はTeX言語で実装できる。256文字全部を予め生成しておいて、後は擬似配列なり \ifcase なりを使えばよい。expl3 の \char_generate:nn はpdfTeX上ではこの方法で実装されている。

pTeXの和文の \Uchar はどうかというと、実装する方法が一つだけある。
「和文と欧文バイト列が文字列化において混同されてしまう、という現象を濫用する」
という方法。

とあって,まさにこれが「バイト列と和文文字トークンを区別する」ようになると封じられる部分です。実際に濫用された事例があるのかどうか,情報を集めたいのですが,探すの難しい…。

Originally posted by @aminophen in #81 (comment)

@h-kitagawa
Copy link
Member Author

https://github.com/h-kitagawa/tex-jp-build/tree/ucharcat でとりあえず作ってみたところです(動作説明は uchar.tex 中に書いています)が,時間がとれていないので JFM グルー挿入処理との関係については未調査です.

@aminophen
Copy link
Member

h-kitagawa@c994855 の win32 バイナリを置きます。お試しください> @zr-tex8r

This is pTeX, Version 3.14159265-p3.8.3 (utf8.sjis) (TeX Live 2019/W32TeX)
This is upTeX, Version 3.14159265-p3.8.3-u1.25 (utf8.uptex) (TeX Live 2019/W32TeX)
This is e-pTeX, Version 3.14159265-p3.8.3-191030-2.6 (utf8.sjis) (TeX Live 2019/W32TeX)
This is e-upTeX, Version 3.14159265-p3.8.3-u1.25-191030-2.6 (utf8.uptex) (TeX Live 2019/W32TeX)

という状態でビルドしています。

@aminophen
Copy link
Member

遅くなりましたが試してみました。良いと思います。e-pTeX で \Ucharcat の文字コードに 0--255 しか許していないのは texjporg/ptex-manual#4

pTeX では和文文字トークンには kcatcode が含まれず,その都度算出される

と合致していますし。

JFM グルー挿入処理との関係

これはよくわからないので確認していません。

@h-kitagawa
Copy link
Member Author

動作確認どうもありがとうございます.

JFM グルー挿入処理との関係

これはよくわからないので確認していません。

よく考えてみたら,\Uchar, \Ucharcat は展開可能だからこれで JFM グルー挿入処理が中断されることはなさそうですね.

@aminophen
Copy link
Member

\Uchar, \Ucharcat は展開可能だからこれで JFM グルー挿入処理が中断されることはなさそうですね.

そうですね。

もし気になる点があるとしたら,プリミティブの名前でしょうか。

  • もし「\Uchar/\Ucharcat をマーカーとして Unicode な TeX エンジン (LuaTeX/XeTeX) を検出する」という実装のパッケージがあれば,誤認されるかも?
  • \Uchar という名前から引数が Unicode だと勘違いされないか?(LuaTeX のマニュアルでは Unicode と書かれているので)

個人的には,今の名前のままでドキュメントを整備して完了で良いと思います。

@aminophen
Copy link
Member

  • もし「\Uchar/\Ucharcat をマーカーとして Unicode な TeX エンジン (LuaTeX/XeTeX) を検出する」という実装のパッケージがあれば,誤認されるかも?

ざっと探しましたが TeX Live には今のところ無いですね。


現在の TeX Live に含まれるもので,今回の \Uchar/\Ucharcat で影響を受けるのは下記の2個だけのように見えます。挙動が変わるというだけで,問題は多分ないと思います。

[1] \usepackage{ucharcat} でエラーが出なくなる。

現在このパッケージは LuaTeX でしか機能しない。XeTeX では静かに \endinput され,pdfTeX / e-(u)pTeX ではエラー

! Package ucharcat Error: \Ucharcat may only be used with xetex and luatex.

が出る。一方,新しい e-(u)pTeX では,現在の XeTeX と同様に静かに \endinput する。

[2] expl3-code.tex の実装には

\cs_new:Npn \__char_str_change_case:nN #1#2
  {
    \int_compare:nNnTF {#1} = 0
      { \tl_to_str:n {#2} }
      { \char_generate:nn {#1} { 12 } }
  }
\cs_if_exist:NF \tex_Uchar:D
  {
    \cs_set:Npn \__char_str_change_case:nN #1#2
      { \tl_to_str:n {#2} }
  }

というコードがあるので,

\documentclass{article}
\usepackage{expl3}
\begin{document}

\ExplSyntaxOn
\cs_show:N \__char_str_change_case:nN
\ExplSyntaxOff

a

\end{document}

の結果が

  • 現 e-pTeX:
    \long macro:#1#2->\tl_to_str:n {#2}.
  • 新 e-upTeX:
    \long macro:#1#2->\int_compare:nNnTF {#1}=0{\tl_to_str:n {#2}}{\char_generate:nn {#1}{12}}.

に変わる。

@h-kitagawa
Copy link
Member Author

ZR さんの #81 (comment) に関連しますが,upTeX においては

  • 現行でも printkanji_16bit (バイト列と和文文字トークンの区別 #81) でも,和文文字トークンになったときのカテゴリーコードはそのときの \kcatcode の値である
  • 一方,\Uchar による和文文字トークンは,常にカテゴリーコード 18 (other_kchar)

となっています(pTeX では元々和文文字トークンにカテゴリーコード情報は格納されないので両者とも一致します).

両者の挙動を統一させる必要は(また,させるとしたらどちらに)あるでしょうか?

\message{STRING}
\edef\a{\string ア}
\expandafter\ifcat\a\message{16}\fi
\expandafter\ifcat\a\message{17}\fi
\expandafter\ifcat\a\message{18}\fi
\message{UCHAR}
\expandafter\ifcat\Uchar`ア 漢\message{16}\fi
\expandafter\ifcat\Uchar`ア イ\message{17}\fi
\expandafter\ifcat\Uchar`ア !\message{18}\fi
\bye
% ==> STRING 17 UCHAR 18

@aminophen
Copy link
Member

\Uchar の結果は欧文文字では \string と同じになるので,upTeX の和文文字でもこれに合うのが直感的だと思います。そういえば #88 の「\readline の和文文字」はどうしたのでしたっけ?

@h-kitagawa
Copy link
Member Author

#88 の「\readline の和文文字」

他の「文字列化→再トークン化」と同様に,そのときの \kcatcode の値を持ちます.

\endlinechar=-1
\readline16to \a

\message{\meaning\a}
\expandafter\ifcat\a\message{16}\fi
\expandafter\ifcat\a\message{17}\fi
\expandafter\ifcat\a\message{18}\fi
\bye
This is e-upTeX, Version 3.14159265-p3.8.3-u1.25-191030-2.6 (utf8.uptex) (TeX Live 2020/dev) (preloaded format=euptex-beta)
 restricted \write18 enabled.
entering extended mode
(./a.tex
\a=ア
macro:->ア 17 )
No pages of output.

\Uchar の動作変更は本日中に行います.

@h-kitagawa
Copy link
Member Author

\Uchar の結果は欧文文字では \string と同じになるので,upTeX の和文文字でもこれに合うのが直感的だと思います。

h-kitagawa@07b2f3d で 一致させました.

@aminophen
Copy link
Member

動作確認しました。ありがとうございます。

cad0ebc で e-pTeX version 191112 にして ChangeLog も付けました。(eptex_version.h)

大丈夫そうなので svn にコミットしてよいでしょうか?

@h-kitagawa
Copy link
Member Author

どうもありがとうございます,お願いします.

@aminophen
Copy link
Member

Done (r52771).

@aminophen
Copy link
Member

texjporg/ptex-manual@19f0847 で英語版 pTeX ガイドにも \Uchar / \Ucharcat に言及。

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