h20y6m/plexpl3

[l3regex] [pTeX] \regex_replace_...関数の奇妙な動作

Closed this issue · 4 comments

以下のコードが pTeX で奇妙な結果になる。

\ExplSyntaxOn
\tl_set:Nn \l_tmpa_tl {吾輩は☃である。}
\regex_replace_all:nnN {[^☃]} {*} \l_tmpa_tl
\tl_show:N \l_tmpa_tl
\ExplSyntaxOff

pTeX:

> \l_tmpa_tl=吾輩は^^e2**である。.

upTeX:

> \l_tmpa_tl=***☃****.

pdfTeX:

> \l_tmpa_tl=*********☃************.

このコードが非Unicodeエンジンで意図通りの動作をしないのはわかるが、upTeX, pdfTeXと比較してpTeXの挙動が奇妙なので調べておきたい。

^☃ (^, ^^e2, ^^98, ^^83) を tl_to_str (\detokenize) すると ^^^, e, 2, ^^98, ^^83 になってしまうことが原因のよう。

おそらく \detokenize のとき内部的に ^^^e2^^98^^83 という文字列が生成されそれを再解釈することで発生すると思われる。

ptexenc の仕様に起因するもので \detokenize は無関係。
texjporg/tex-jp-build#146 (comment)

以下のようにすれば問題ない

\ExplSyntaxOn
\tl_set:Nn \l_tmpa_tl {吾輩は☃である。}
\regex_replace_all:nnN {[^ ☃]} {*} \l_tmpa_tl
\tl_show:N \l_tmpa_tl
\ExplSyntaxOff
> \l_tmpa_tl=***^^e2^^98^^83****.

h-kitagawa/ptexenc_buffer2 ブランチで個人的に実験しています.\scantokens 周りなどまだはっきりしていない点もありますが,何かあればそちらに.