
Рассмотрим следующий 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{...}
.