
Eu tenho usado uma macro X
semelhante 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 X
ou 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 .lof
arquivo 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 \detokenize
foi 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\X
quando estiver em um argumento em movimento.