我有一个 LaTeX 文档,其中包含几位作者,我输入了\author{First Author \& Second Author \& ...
。在文档中的某些地方,我想打印这些作者,并在每个名字后面加换行符,即我想\&
用\\
(或等效命令) 替换所有出现的 。
我发现这个问题关于一个几乎相同的问题,除了不插入换行符。尝试时\StrSubstitute{text \& text}{ \& }{\\}
我得到了一大堆错误,没有输出。换行符似乎破坏了\StrSubstitute
宏。
有没有办法防止失败?如果没有,还有其他什么方法可行?
答案1
TeX 是一种宏扩展语言:不要使用字符串替换:只需重新定义宏
{\renewcommand\&{\\} \theauthor}
将在表示换行符\theauthor
的本地上下文中进行评估\&
。
答案2
David 的回答对于手头的问题来说非常宝贵、高效且友好。但是,它没有解决您遇到的错误。
该软件包xstring
有三种操作模式:
\fullexpandarg
\expandarg
\noexpandarg
第一个是默认的。它们在手册的第 3.1.1 节中描述,以及所提供命令的哪些参数受此扩展影响的列表。在 的情况下\StrSubstitute
,全部参数,但后面可选的参数受操作模式影响。因此你的
\StrSubstitute{\theauthor}{\&}{\\}
将对\theauthor
、\&
和进行完全扩展\\
。如果你足够幸运, 可以在\theauthor
完全扩展后继续存在(如果作者姓名不包含重音字母,则可以);这\&
并不危险,因为它在内部用 定义\chardef
,因此无法扩展;\\
绝对无法在完全扩展后继续存在,因为它的操作需要进行定义。
现在你知道这\fullexpandarg
不好,但\noexpandarg
也不是,因为你想展开\theauthor
一次或\&
找不到:您需要作者姓名列表,而不是包含他们的宏。您能做什么?有几种可能性。
使用\expandarg
\saveexpandmode % remember what's the current mode of operations
\expandarg % operation mode where only one step of expansion is performed
\StrSubstitute{\theauthor}{\&}{\noexpand\\}
\restoreexpandmode % restore the previous mode of operations
使用\noexpandarg
\saveexpandmode % remember what's the current mode of operations
\noexpandarg % operation mode where only one step of expansion is performed
\expandafter\StrSubstitute\expandafter{\theauthor}{\&}{\\}%
\restoreexpandmode % restore the previous mode of operations
选择您更喜欢的方法。您也可以在 之后的序言中说\expandarg
或,当您需要不同的模式时,可以更改模式。\noexpandarg
\usepackage{xstring}
更改模式也会尊重分组,因此
\begingroup
\expandarg % operation mode where only one step of expansion is performed
\StrSubstitute{\theauthor}{\&}{\noexpand\\}%
\endgroup
将恢复以前的模式。如果您只需要打印更改的令牌列表,那么这可能就足够了。当然\renewcommand{\&}{\\}
效率更高,但在其他情况下,您可能需要这些技巧。
一个不同的策略是l3regex
:
\usepackage{xparse,l3regex}
\ExplSyntaxOn
\NewDocumentCommand\printauthors{O{\\}}
{
\tl_set:Nn \l_tmpa_tl { #1 }
\tl_set_eq:NN \l_tmpb_tl \theauthor
\regex_replace_all:nnN { \c{&} } { \u{l_tmpa_tl} } \l_tmpb_tl
\tl_use:N \l_tmpb_tl
}
\ExplSyntaxOff
然后\printauthors
根据需要进行相同的替换;\printauthors[<something else>]
您可以将其改变\&
成任何您喜欢的内容。