Неожиданный результат при попытке использовать \ce{} из пакета mhchem с командой, определенной \DTLgetvalue из пакета datatool

Неожиданный результат при попытке использовать \ce{} из пакета mhchem с командой, определенной \DTLgetvalue из пакета datatool

У меня есть CSV-файл со списком химических соединений, которые я хотел бы проанализировать через из , \ce{}который mhchemпреобразует их в красивую химическую нотацию. При использовании необработанной строки в качестве аргумента для \ce{}works, когда та же строка задана как команда, макрос ничего не делает.

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

Связанный контент