CTeX-org / ctex-kit

Macro Packages and Scripts for Chinese TeX users
965 stars 124 forks source link

`\__ctex_char_auxi:NNNN` 未定义 #706

Closed muzimuzhi closed 2 months ago

muzimuzhi commented 3 months ago

在尝试 #705 里的「替换/改写废弃命令 \char_to_utfviii_bytes:n」部分时,我遇到 Undefined control sequence \__ctex_char_auxi:NNNN 的报错。这个命令被错误定义为 NNN、但是接受四个参数的形式。

https://github.com/CTeX-org/ctex-kit/blob/e612c95dad5a359dbc211f8f5b7e2ba7f51f4158/ctex/ctex.dtx#L4444-L4451

所需的改动像是显然的:改成 \cs_new:Npn \@@_char:NNNN,4 个 N。但我好奇为什么这段代码一直没被执行。我完全不了解 ctex 里 pdftex 下处理多字节 codepoint 部分的代码。

qinglee commented 2 months ago

\@@_char_auxi:NNN 写错了,确实应该是 \@@_char_auxi:NNNN ,有 4 个 N

CJK 包对汉字首字节的定义中,\protect 这一分支是一种很古早的兼容定义,正常情况下不会走向这一分支,所以一直就没有执行。

从某一个版本开始,LaTeX2e 内核的 \MakeLowercase 等命令用 \text_lowercase:nn 等函数来定义,这些函数会使用 \text_expand:n 展开参数后再转化大小写,引发错误。

比如“汉(UTF-8 编码为 e6 b1 89)”会被 CJK 包定义为

\csname CJK@\number`^^e6\endcsname{`^^b1}{`^^89}\CJK@ignorespaces

这个定义并不能在 \text_expand:n 中正确展开,会引发错误。为此,ctex 包将“汉”改定义为 \CTEX@char@nnn{225}{177}{138}\CTEX@char@nnn 是一个 \protected 宏,不会被 \text_expand:n 展开,同时将 `^^b1 等转化成阿拉伯数字,避免可能的大小写转化。