латексная этикетка с &

латексная этикетка с &

Мне нужно написать метку, содержащую '&'. Это странная потребность, но она для использования в \keywordмакросе, который также добавляет строку в aux-файл, который я могу позже проанализировать (например, с помощью внешней программы). Имена на английском языке, по-видимому, могут содержать &, как в 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}

Ошибка, конечно

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

Как бы я попросил latex просто считать & допустимым символом в строке для aux-файла?

ценю советы.

решение1

Вы злоупотребляете, \labelпросто записывая что-то в .auxфайл: ничто подобное не \labelможет быть использовано в \ref, потому что вы не знаете, где это в конечном итоге будет набрано.

Я бы не использовал \newlabelфайл .aux, а другой маркер.

\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}

О \label{i\&j}, просто избегайте этого или используйте \label{i&j}то, что работает.

Содержимое aux-файла будет

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

Ваша внешняя программа сможет искать \fakelabelи использовать предоставленные данные.

Связанный контент