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

\__ctex_char_auxi:NNNN 未定义 #706

Closed
muzimuzhi opened this issue Mar 20, 2024 · 1 comment
Closed

\__ctex_char_auxi:NNNN 未定义 #706

muzimuzhi opened this issue Mar 20, 2024 · 1 comment

Comments

@muzimuzhi
Copy link
Contributor

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

ctex-kit/ctex/ctex.dtx

Lines 4444 to 4451 in e612c95

\cs_new:Npn \@@_char:NNN #1#2#3
{
\token_if_eq_meaning:NNTF #2 \protect
{ \@@_char_auxi:NNNN #1#3 }
{ \@@_char_auxii:NNN #1#2#3 }
}
\cs_new:Npn \@@_char_auxi:NNN #1#2#3#4
{ \@@_char_auxii:NNN #1#2#4 }

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

@qinglee
Copy link
Member

qinglee commented Apr 20, 2024

\@@_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 等转化成阿拉伯数字,避免可能的大小写转化。

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