Utilizzo di \ detokenize e underscore in combinazione con \ listoffigures
Ho usato una macro Xsimile a
\newcommand{\X}[1]{{\ttfamily{\detokenize{#1}}}}
per formattare alcune parole che possono contenere un trattino basso, senza dover uscire con \_. Ha funzionato fino a quando non l'ho usato in un file \caption. Ciò si traduce in un errore sia con pdflatex che con lualatex ( ! Missing $ inserted.). Considera questo 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 usare una soluzione diversa / più elaborata Xo devo semplicemente sfuggire ai trattini bassi in generale? Sono più interessato alle migliori pratiche invece che a un trucco molto intelligente.
Risposte
È necessario che il comando sia robusto, altrimenti l'annotazione nel .loffile diventa
\contentsline {figure}{\numberline {1}{\ignorespaces One \texttt {a_b} Two}}{1}%
(Ho cambiato la sintassi da {\ttfamily...}a \texttt{...}, che è meglio). Come vedi, \detokenizeè stato applicato ed è scomparso.
D'altra parte, se lo fai
\newcommand{\X}{}% for safety
\DeclareRobustCommand{\X}[1]{\texttt{\detokenize{#1}}}
l'annotazione sarebbe
\contentsline {figure}{\numberline {1}{\ignorespaces One \X {a_b} Two}}{1}%
e il problema non si sarebbe mostrato.
In alternativa, usa \protect\Xquando in un argomento in movimento.