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

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