Usando \ detokenize e sublinhado em combinação com \ listoffigures
Tenho usado uma macro Xsemelhante a
\newcommand{\X}[1]{{\ttfamily{\detokenize{#1}}}}
para formatar certas palavras que podem conter um sublinhado, sem ter que escapar com \_. Isso funcionou até que eu usei em a \caption. Isso resulta em um erro com pdflatex e 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}
Devo usar uma solução diferente / mais elaborada Xou devo apenas escapar dos sublinhados em geral? Estou mais interessado nas melhores práticas em vez de um hack muito inteligente.
Respostas
Você precisa que o comando seja robusto, caso contrário, a anotação no .lofarquivo torna-se
\contentsline {figure}{\numberline {1}{\ignorespaces One \texttt {a_b} Two}}{1}%
(Eu mudei a sintaxe de {\ttfamily...}para \texttt{...}, o que é melhor). Como você pode ver, o \detokenizefoi aplicado e desapareceu.
Por outro lado, se você fizer
\newcommand{\X}{}% for safety
\DeclareRobustCommand{\X}[1]{\texttt{\detokenize{#1}}}
a anotação seria
\contentsline {figure}{\numberline {1}{\ignorespaces One \X {a_b} Two}}{1}%
e o problema não apareceria.
Como alternativa, use \protect\Xquando estiver em um argumento móvel.