
He estado usando una macro X
similar 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 X
o 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 .lof
archivo 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 \detokenize
ha 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\X
cuando en un argumento en movimiento.