考虑以下 MWE
\documentclass{article}
\usepackage[version=3]{mhchem}
\begin{document}
\begin{equation*}
% c_\ce{CO2} not working
c_{\ce{CO2}} \quad c_\text{working}
\end{equation*}
\end{document}
产生
现在:为什么我必须用\ce{CO2}
括号括住宏(所有双关语都是故意的),而\text{}
宏并不需要它们?注释文本会产生错误missing { inserted c_\ce{CO2}
答案1
我们来看看是怎么amstext.sty
说的:
\DeclareRobustCommand{\text}{%
\ifmmode\expandafter\text@\else\expandafter\mbox\fi}
\def\text@#1{{\mathchoice
{\textdef@\displaystyle\f@size{#1}}%
{\textdef@\textstyle\f@size{\firstchoice@false #1}}%
{\textdef@\textstyle\sf@size{\firstchoice@false #1}}%
{\textdef@\textstyle \ssf@size{\firstchoice@false #1}}%
\check@mathfonts
}%
}
如果我们处于数学模式,当\text{xyz}
发现时,TeX 会遵循“真实”分支,因此会显示\text@{xyz}
(因为被\else...\fi
丢弃)。
然后它\text@
用其定义替代,即
{\mathchoice{...}}
并且这些附加括号保持_
正常。我们必须记住,_
在数学模式下会导致以下标记的扩展。
我猜想引入额外的括号只是为了避免_\text{xyz}
产生难以理解的错误。
不幸的是,允许那种“错误”的输入。这与_\mathrm{xyz}
我在https://tex.stackexchange.com/a/160538/4427
另一方面,的定义\ce
却没有这样的内容:
\newcommand*{\ce}{%
\ifx\protect\@typeset@protect
\csname ce \expandafter\endcsname
\else
\ifx\protect\@unexpandable@protect
\protect@unexpand@cmd@arg\ce
\else
\ifx\protect\string
\protect@string@cmd@arg\ce
\else
\expandafter\protect@unknown@cmd@arg
\csname ce \endcsname
\fi
\fi
\fi
}
这肯定会让 TeX 看到后不高兴_\ce{...}
。