下划线不应在宏中强制使用数学模式

下划线不应在宏中强制使用数学模式

当尝试用阿拉伯语(音译)为单词着色时,LaTeX 希望我处于数学模式 ( Missing $ inserted.),因为音译中有下划线。这当然是完全错误的,因为对于某些阿拉伯字母来说,这不是数学惯例,而是arabxetex的惯例。

问题只在我尝试使用宏来着色时才会出现,\color直接使用命令的版本没有任何问题。然而,对我来说,这两者似乎相同,但对 LaTeX 来说,它们显然不是。

如果我强制执行以下代码(忽略所有错误),我会得到以下输出: 强制代码

第一行是“尝试 1”,第二行是“尝试 2”,以及它实际应该是什么样子。我怀疑问题可能出在我的宏上,但我看不出错误在哪里。

% !TEX TS-program = xelatex
% !TEX encoding = UTF-8 Unicode

\documentclass{scrartcl}

\usepackage{xcolor}

\usepackage{fontspec,xltxtra,xunicode}
\setromanfont[Mapping=tex-text]{Linux Libertine O}
\setsansfont[Mapping=tex-text]{Linux Biolinum O}
\newfontfamily\arabicfont[Script=Arabic,Scale=1.5]{Scheherazade}

\usepackage{arabxetex}
\SetTranslitConvention{dmg}

\newcommand*{\place}[1]{{\color{cyan} #1}}

\begin{document}

\place{\textarab[trans]{\UC ya_trib}}% Try No. 1
{\color{cyan} \textarab[trans]{\UC ya_trib}}% Try No. 2

\end{document}

答案1

\textarab命令在内部更改 的类别代码_,以便它不再是数学公式的下标字符,而只是 的参数中的下标字符。但是,如果参数已被读取(在本例中为 的参数),\textarab则此更改不再可能。\place

您有两种可用的策略。

策略1

\begin{document}
\catcode`_=12

如果您的文档中没有或者很少有数学内容,那么它是最简单的;对于数学中偶尔出现的下标,您可以使用\sb而不是_

策略2

\DeclareRobustCommand{\place}{{\color{cyan}\scantokens{#1\noexpand}}}

\place将使 XeTeX 重新读取参数,以便正确执行类别代码中的更改。

相关内容