datatool パッケージの \DTLgetvalue で定義されたコマンドで mhchem パッケージの \ce{} を使用しようとすると、予期しない結果が発生します。

datatool パッケージの \DTLgetvalue で定義されたコマンドで mhchem パッケージの \ce{} を使用しようとすると、予期しない結果が発生します。

化合物のリストを含む CSV ファイルがあり、 から を介して解析して、\ce{}適切mhchemな化学表記に変換したいと考えています。 の引数として生の文字列を使用すると機能しますが\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}

関連情報