是否可以让紧接着 CJK 字符的宏起作用?

是否可以让紧接着 CJK 字符的宏起作用?

例如,当我写(?代表任何 CJK 字符)时,它会报告错误

\TeX??????

由于\TeX??????不是定义的命令。

为了使其正确,我必须{}在 后插入一个空格或\TeX

但是 CJK 字符很少(对我来说从来没有)用作命令名称的一部分。

所以我想知道是否可以进行配置并使其\TeX??????工作。

我正在使用带有 xeCJK 包的 XeTeX。

答案1

如果我问\showthe\catcode`私,XeTeX 会回答

> 11.

因此,日语字符可以成为控制序列名称的一部分。这是 XeTeX 初始化的一部分。将类别代码更改为 12 既不推荐也不容易:您需要识别所有包含日语字符的 Unicode 块并执行循环来更改类别代码。不过,您可能会遇到意想不到的问题。

\documentclass{article}
\usepackage{xeCJK}

\setCJKmainfont{Hiragino Mincho ProN}

\begin{document}

私は\TeXを使います

私は\TeX を使います

\end{document}

后面只要留一个空格就可以了\TeX

控制台输出是

! Undefined control sequence.
l.8 私は\TeXを使います

? 

最终输出为

在此处输入图片描述

如果日语部分无法理解,那就怪谷歌翻译吧。

如果你最终决定使用循环,那么它们如下:

\documentclass{article}
\usepackage{xeCJK}

\setCJKmainfont{Hiragino Mincho ProN}

\ExplSyntaxOn
\cs_new_protected:Nn \jiewuza_make_other:nn
 {
  \int_step_function:nnN { #1 } { #2 } \char_set_catcode_other:n
 }
\jiewuza_make_other:nn { "4E00 } { "9FEF } % CJK ideographs
\jiewuza_make_other:nn { "3041 } { "30FF } % Hiragana-Katakana
\jiewuza_make_other:nn { "31F0 } { "31FF } % Katakana additional
\jiewuza_make_other:nn { "32D0 } { "32FE } % Katakana circled
\jiewuza_make_other:nn { "FF01 } { "FFEE } % fullwidth-halfwidth
\ExplSyntaxOff

\begin{document}

私は\TeXを使います

私は\TeX を使います

\end{document}

在此处输入图片描述

答案2

xetex -ini在 iniTeX 状态下读取unicode-letters.def,所有 unicode 字母的 catcode 11 都在此处设置(参见此文件的第 45 行)。您可以使用 cactode 12 重新声明所有此类字母,而不会对功能产生任何影响(例外:您不能在控制序列中使用此类 unicode 字母)。您可以通过以下代码执行此操作:

\begingroup
   \def\skipdefs #1\fi\fi{}
   \def\C#1 #2 #3 {}
   \def\L#1 #2 #3 {}
   \def\l#1 {\global \catcode"#1=12 }
   \expandafter\skipdefs \input unicode-letters.def
%\endgroup is in unicode-letters.def file

相关内容