\detokenize とアンダースコアを \listoffigures と組み合わせて使用​​する

\detokenize とアンダースコアを \listoffigures と組み合わせて使用​​する

X私は次のようなマクロを使っています

\newcommand{\X}[1]{{\ttfamily{\detokenize{#1}}}}

アンダースコアを含む可能性のある特定の単語を、 でエスケープせずにフォーマットします\_。 で使用するまではうまくいきました\caption。 その結果、pdflatex と lualatex ( ) の両方でエラーが発生します! Missing $ inserted.。 次の MWE を検討してください。

\documentclass{article}

\newcommand{\X}[1]{{\ttfamily{\detokenize{#1}}}}

\begin{document}    
\listoffigures
\begin{figure}
  \centering
  \caption{One \X{a_b} Two}
\end{figure}
\end{document}

別の、またはより複雑なソリューションを使用する必要がありますかX、それともアンダースコアを一般的にエスケープするだけですか? 私は非常に巧妙なハックではなく、ベストプラクティスに興味があります。

答え1

コマンドは堅牢である必要があります。そうでないと、.lofファイル内の注釈が

\contentsline {figure}{\numberline {1}{\ignorespaces One \texttt {a_b} Two}}{1}%

(構文を から に変更しました{\ttfamily...}\texttt{...}こちらの方が適切です)。 ご覧のとおり、 が\detokenize適用されて消えています。

一方、もしあなたが

\newcommand{\X}{}% for safety
\DeclareRobustCommand{\X}[1]{\texttt{\detokenize{#1}}}

注釈は

\contentsline {figure}{\numberline {1}{\ignorespaces One \X {a_b} Two}}{1}%

そして問題は現れません。

あるいは、\protect\X議論が進むときに使用します。

関連情報