如何使用中文字符(或更一般地说,Unicode 字符)作为宏名?

如何使用中文字符(或更一般地说,Unicode 字符)作为宏名?
\documentclass{article}
\usepackage{CJKutf8}
\usepackage{ruby}
\renewcommand\rubysep{.05ex}
\renewcommand\rubysize{0.2}

\newcommand\神{\ruby{神}{かみ}}

\begin{document}
\begin{CJK}{UTF8}{min}
\神
\end{CJK}
\end{document}

如何使用中文字符(或更一般地说,Unicode 字符)作为宏名?

我可以使用pdflatex(首选)或xelatex(最后的手段)。

答案1

运行xelatexlualatex

\documentclass{article}
\usepackage{ruby}
\renewcommand\rubysep{.05ex}
\renewcommand\rubysize{0.2}
\usepackage{fontspec}
\setmainfont{Arial Unicode MS}

\newcommand\神{\ruby{神}{かみ}}

\begin{document}
\神
\end{document}

在此处输入图片描述

答案2

如果您使用 LuaTeX 或 XeTeX 作为引擎,您当然可以定义\神来执行该任务。当然,您必须记住在后面加上非字母\神或将类别代码更改为 12。

使用 pdfTeX 作为引擎会发生什么?这\newcommand将导致错误:

! LaTeX Error: Missing \begin{document}

因为\newcommand不能定义参数文本不只由 #1#1#2等等组成的宏(见下文)。

使用\def\神{...}也无济于事:标记化之前的输入流将是字节序列

<5C><64><65><66><E7><A5><9E><7B>

即反斜杠、d、e、f,然后是与 UTF-8 表示(U+795E) 对应的三个字节和左括号。接下来的内容对于主题并不重要,因为当 TeX 看到左括号时,它知道范围正文已结束。

你真正定义的其实是一个控制符号,因为这个字节<E7>被赋予了类别代码 13(活动)。这个控制符号必须后面跟着字节(如果愿意的话,可以是字符)<A5><9E>

只要你不定义其他类似的组合,这不会产生不良后果。例如,如果你也这样做

\def\祟{...}

(使用 U+795F)你会遇到一个问题:这将是控制符号 的定义\<E7>,因此它会覆盖 的先前定义和用法\神

事实上,编辑器显示的单个字符对于 TeX 来说是由三个字节(字符)组成的。可能<E7>将、<A5>和的类别代码更改<9E>为 11,这样就可以形成控制字,但是这样就无法键入和获取字符,因为CJKutf8依赖于才能<E7>处于活动状态。


你可以定义一个包装器,比如

\newcommand\CJKnewcommand[2]{% #1 is a character, #2 the replacement text
  \expandafter\newcommand\csname CJK++\detokenize{#1}++\endcsname{#2}%
}
\protected\def\?#1?{\csname CJK++\detokenize{#1}++\endcsname}

所以之后

\CJKnewcommand{神}{\ruby{神}{かみ}}

你可能会使用

\?神?

完整示例。

\documentclass{article}
\usepackage{CJKutf8}
\usepackage{ruby}
\renewcommand\rubysep{.05ex}
\renewcommand\rubysize{0.2}

\newcommand\CJKnewcommand[2]{% #1 is a character, #2 the replacement text
  \expandafter\newcommand\csname CJK++\detokenize{#1}++\endcsname{#2}%
}
\protected\def\?#1?{\csname CJK++\detokenize{#1}++\endcsname}


\CJKnewcommand{神}{\ruby{神}{かみ}}

\begin{document}
\begin{CJK}{UTF8}{min}
\?神?
\end{CJK}
\end{document}

在此处输入图片描述

相关内容