
Preciso escrever um rótulo que contenha um '&'. Esta é uma necessidade estranha, mas é para uso em uma \keyword
macro, 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 \label
apenas para escrever algo no .aux
arquivo: nada criado \label
pode ser usado em um arquivo \ref
, porque você não sabe onde ele será eventualmente composto.
Eu não usaria \newlabel
no .aux
arquivo, 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 \fakelabel
e usar os dados fornecidos.