
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
議論が進むときに使用します。