Utilizzo di \ detokenize e underscore in combinazione con \ listoffigures

Sep 10 2020

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

1 egreg Sep 10 2020 at 18:12

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