关于 CJK、mbox 和 newcommand 的问题

关于 CJK、mbox 和 newcommand 的问题

我很难理解以下行为。我试图在数学模式下使用日语字符。在使用 CJK 的某个乳胶文档中,以下代码可以正确呈现:

We have $x = \mbox{山}$

也就是说,我能够在方程式中的 \mboxes 中放置汉字,一切正常。但是,如果我尝试:

\newcommand{\san}{\mbox{山}}
...
\begin{document}
We have $x = \san$

结果输出为“x =(空格)”这是一个有效/无效的示例:

\documentclass{article}

\usepackage{CJK}
\newcommand{\san}{\mbox{山}}

\begin{document}
\begin{CJK}{UTF8}{min}
The equations $x = \san$ and $x = \mbox{山}$ should look the same.
\end{CJK}

\end{document}

当我使用 pdflatex 编译上述示例时,我得到:“方程式 x = 和 x = 山 应该看起来相同。” 我的问题是:有没有办法定义宏 \san 来生成正确的行为?

答案1

您必须在 CJK 环境中定义该命令。然后必须使该定义成为全局定义。

\begin{CJK}{UTF8}{}
\gdef\foo{山}
\end{CJK}

答案2

由于您似乎主要使用 UTF8 编码,因此加载该CJKutf8包对我来说是有效的。

\documentclass{article}

\usepackage{CJKutf8}
\newcommand{\san}{\mbox{山}}

\begin{document}
\begin{CJK}{UTF8}{min}
The equations $x = \san$ and $x = \mbox{山}$ should look the same.
\end{CJK}

\end{document}

答案3

环境CJK负责为组成 CJK 字符的字节簇赋予含义(从技术上讲,它激活这些字符)。当您给出 的定义时\san,组成 山 的三个字节不处于活动状态,并且在\san扩展时它们仍保持活动状态。

解决方案。当字符被正确解释时执行定义:

\begin{CJK}{UTF8}{min}
\gdef\san{\mbox{山}}
\end{CJK}

你不能使用\newcommand,因为它不执行全局定义,除非你说

\begin{CJK}{UTF8}{min}
\globaldefs=1
\newcommand{\san}{\mbox{山}}
\end{CJK}

但我不会使用它,因为它似乎\end{CJK}可以执行全局的分配(并且可能不是有意的)。

相关内容