
Я использовал макрос, 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
в ходе активного спора.