Usando \ detokenize e sublinhado em combinação com \ listoffigures

Sep 10 2020

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

1 egreg Sep 10 2020 at 18:12

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.