ラテックスラベルと&

ラテックスラベルと&

「&」を含むラベルを記述する必要があります。これは奇妙なニーズですが、\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}}

aux ファイルの文字列で & を有効な文字として扱うように LaTeX に指示するにはどうすればよいでしょうか?

アドバイスをいただければ幸いです。

答え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外部プログラムは提供されたデータを検索して使用できるようになります。

関連情報