我需要编写一个包含“&”的标签。这是一个奇怪的需求,但它用于\keyword
宏,它还会向辅助文件添加一个字符串,我稍后可以解析它(例如,使用外部程序)。英文名称显然可以包含 &,例如 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 将 & 视为辅助文件字符串中的可行字符?
谢谢您的建议。
答案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
并使用所提供的数据。