尝试使用 mhchem 包中的 \ce{} 和 datatool 包中的 \DTLgetvalue 定义的命令时出现意外结果

尝试使用 mhchem 包中的 \ce{} 和 datatool 包中的 \DTLgetvalue 定义的命令时出现意外结果

我有一个 CSV 文件,里面有我想通过 解析的化合物列表,\ce{}并将mhchem其转换为漂亮的化学符号。虽然使用原始字符串作为 works 的参数\ce{},但当将相同的字符串作为命令时,宏不会执行任何操作。

\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}

收益

结果截图

所以 \ce{\methane}没有做任何事情(它应该4作为下标)。

答案1

似乎\ce需要扩展它的参数(大概是因为\ce解析它)所以你需要使用\expandafter确保参数的格式正确:

\expandafter\ce\expandafter{\methane}

解释

在 中\ce,活动字符(如^_{)具有不同的含义。直观的含义,但技术上与标准 LaTeX 非常不同。因此,\ce必须解析未扩展的输入。

在这个特定案例中,\ce发现\methane,然后它进行了化学格式化。因为它看起来不像化学的,所以它只是被复制过来,然后扩展到CH4

\expandafter\ce\expandafter{\methane}确保在查看之前\methane已将其扩展到。CH4\ce

提示

您可以为此创建自己的命令。

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

这样你就可以简单地写

\myce{\methane}

相关内容