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

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

Eu tenho usado uma macro Xsemelhante a

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

para formatar certas palavras que podem conter um sublinhado, sem precisar escapar com \_. Isso funcionou até que eu usei em um arquivo \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}

Preciso usar uma solução diferente/mais elaborada Xou devo apenas escapar dos sublinhados em geral? Estou mais interessado nas melhores práticas do que em um hack muito inteligente.

Responder1

Você precisa que o comando seja robusto, caso contrário a anotação no .lofarquivo se tornará

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

(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.

Alternativamente, use \protect\Xquando estiver em um argumento em movimento.

informação relacionada