用换行符替换子字符串

用换行符替换子字符串

我有一个 LaTeX 文档,其中包含几位作者,我输入了\author{First Author \& Second Author \& ...。在文档中的某些地方,我想打印这些作者,并在每个名字后面加换行符,即我想\&\\(或等效命令) 替换所有出现的 。

我发现这个问题关于一个几乎相同的问题,除了不插入换行符。尝试时\StrSubstitute{text \& text}{ \& }{\\}我得到了一大堆错误,没有输出。换行符似乎破坏了\StrSubstitute宏。

有没有办法防止失败?如果没有,还有其他什么方法可行?

答案1

TeX 是一种宏扩展语言:不要使用字符串替换:只需重新定义宏

{\renewcommand\&{\\} \theauthor}

将在表示换行符\theauthor的本地上下文中进行评估\&

答案2

David 的回答对于手头的问题来说非常宝贵、高效且友好。但是,它没有解决您遇到的错误。

该软件包xstring有三种操作模式:

  1. \fullexpandarg
  2. \expandarg
  3. \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>]您可以将其改变\&成任何您喜欢的内容。

相关内容