Usar \detokenize y guión bajo en combinación con \listoffigures

Usar \detokenize y guión bajo en combinación con \listoffigures

He estado usando una macro Xsimilar a

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

para formatear ciertas palabras que pueden contener un guión bajo, sin tener que escapar con \_. Esto funcionó hasta que lo usé en un \caption. Esto da como resultado un error tanto con pdflatex como con lualatex ( ! Missing $ inserted.). Considere este 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}

¿Tengo que utilizar una solución diferente o más elaborada Xo debería simplemente evitar los guiones bajos en general? Estoy más interesado en las mejores prácticas que en un truco muy inteligente.

Respuesta1

Necesita que el comando sea robusto; de lo contrario, la anotación en el .lofarchivo se vuelve

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

(Cambié la sintaxis de {\ttfamily...}a \texttt{...}, que es mejor). Como veis, el \detokenizeha sido aplicado y desaparecido.

Por otro lado, si lo haces

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

la anotación sería

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

y el problema no se mostraría.

Alternativamente, utilícelo \protect\Xcuando en un argumento en movimiento.

información relacionada