\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
运行xelatex
或lualatex
\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}