下标中的 mhchem 宏

下标中的 mhchem 宏

考虑以下 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{...}

相关内容