当尝试用阿拉伯语(音译)为单词着色时,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 重新读取参数,以便正确执行类别代码中的更改。