Closed muzimuzhi closed 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
等转化成阿拉伯数字,避免可能的大小写转化。
在尝试 #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 部分的代码。