Resultado inesperado ao tentar usar \ce{} do pacote mhchem com um comando definido por \DTLgetvalue do pacote datatool

Resultado inesperado ao tentar usar \ce{} do pacote mhchem com um comando definido por \DTLgetvalue do pacote datatool

Eu tenho um arquivo CSV com uma lista de compostos químicos que gostaria de analisar através do \ce{}qual mhchemos converte em uma boa notação química. Ao usar a string bruta como argumento para \ce{}obras, quando a mesma string é fornecida como um comando, a macro não faz nada.

\documentclass{scrartcl}
\begin{filecontents*}{foo.csv}
Molecule
CH4
\end{filecontents*}
\usepackage{datatool}
\usepackage{mhchem}
\DTLloaddb{foo}{foo.csv}
\DTLgetvalue{\methane}{foo}{1}{1}
\begin{document}

CH4

\methane

\ce{CH4}

\ce{\methane}

\end{document}

Rendimentos

Captura de tela do resultado

Então \ce{\methane}não está fazendo nada (deveria estar colocando 4como subscrito).

Responder1

Parece que \cerequer que seu argumento seja expandido (presumivelmente porque \ceo analisa), então você precisa usar\expandafterpara garantir que o argumento esteja no formato correto:

\expandafter\ce\expandafter{\methane}

Explicação

Dentro de \ce, caracteres ativos (como ^, _e {) têm um significado diferente. Um significado intuitivo, mas tecnicamente muito diferente do LaTeX padrão. Portanto, \ceé necessário analisar a entrada não expandida.

Neste caso específico, \ceencontrei \methane, então fez a formatação química. Como não parece químico, ele é apenas copiado e posteriormente expandido para o formato CH4.

\expandafter\ce\expandafter{\methane}certifica-se de que \methaneestá expandido para CH4antes de \cedar uma olhada nele.

Dica

Você pode criar um comando próprio para isso.

\newcommand*\myce[1]{\expandafter\ce\expandafter{#1}}

Para que você pudesse simplesmente escrever

\myce{\methane}

informação relacionada