etiqueta de látex com &

etiqueta de látex com &

Preciso escrever um rótulo que contenha um '&'. Esta é uma necessidade estranha, mas é para uso em uma \keywordmacro, que também adiciona uma string ao arquivo aux, que posso analisar posteriormente (por exemplo, com um programa externo). Aparentemente, os nomes em inglês podem conter um &, como no S&P~500.

\documentclass{article}

\NewDocumentCommand{\keyword}{ m }{%
  \label{KW:\thesection:\thepage:#1}%
  \textbf{#1}
}

\begin{document}

\keyword{abc}
\keyword{def}
\label{i\&j}
\keyword{s\&p500}

\end{document}

O erro é claro

! Missing \endcsname inserted.
<to be read again> 
\&
l.4 \newlabel{i\&j}{{}{1}}

Como eu pediria ao latex para considerar apenas o & um caractere viável em uma string para o arquivo aux?

conselho apreciado.

Responder1

Você está abusando \labelapenas para escrever algo no .auxarquivo: nada criado \labelpode ser usado em um arquivo \ref, porque você não sabe onde ele será eventualmente composto.

Eu não usaria \newlabelno .auxarquivo, mas um marcador diferente.

\documentclass{article}

\ExplSyntaxOn
\NewDocumentCommand{\fakelabel}{m}{} % for the .aux file

\NewDocumentCommand{\keyword}{ m }
  {
    \group_begin:
    \cs_set:Npx \& { \token_to_str:N \& }
    \iow_shipout:cx { @auxout }
      {
        \token_to_str:N \fakelabel { KW : \thesection : \thepage : #1 }
      }
    \group_end:
    \textbf{#1}
  }
\ExplSyntaxOff

\begin{document}

\keyword{abc}
\keyword{def}
\keyword{s\&p500}

\end{document}

Sobre \label{i\&j}, apenas evite ou use \label{i&j}o que funciona.

O conteúdo do arquivo aux será

\relax
\fakelabel{KW:0:1:abc}
\fakelabel{KW:0:1:def}
\fakelabel{KW:0:1:s\&p500}
\gdef \@abspage@last{1}

Seu programa externo poderá procurar \fakelabele usar os dados fornecidos.

informação relacionada