
Considere o seguinte 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}
que produzem
Agora: por que tenho que abraçar (todos os trocadilhos) a \ce{CO2}
macro com colchetes, enquanto a \text{}
macro não precisa deles? O texto comentado produz um erromissing { inserted c_\ce{CO2}
Responder1
Vejamos o que amstext.sty
diz:
\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
}%
}
Se estivermos no modo matemático, quando \text{xyz}
for encontrado, o TeX segue o ramo “verdadeiro” e assim é apresentado \text@{xyz}
(porque o \else...\fi
é descartado.
Então ele substitui \text@
por sua definição, ou seja,
{\mathchoice{...}}
e esses aparelhos adicionais ficam _
felizes. Devemos lembrar que _
no modo matemático causa a expansão dos seguintes tokens.
Acho que os colchetes adicionais foram introduzidos apenas para evitar erros inescrutáveis que _\text{xyz}
produziriam o contrário.
Infelizmente, issopermiteesse tipo de entrada “errada”. É muito semelhante ao que acontece com _\mathrm{xyz}
, que expliquei aproximadamente emhttps://tex.stackexchange.com/a/160538/4427
Por outro lado, a definição de \ce
não tem nada deste tipo:
\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
}
Isso definitivamente deixará o TeX infeliz ao ver _\ce{...}
.