防止作者序列中的名字和姓氏之间出现换行

防止作者序列中的名字和姓氏之间出现换行

我有一个以expl3-sequence 形式给出的作者列表,并希望对序列中的每个项目应用一个函数并将其作为列表返回。一开始expl3我不知道该怎么做,而且我得到了意想不到的结果:

在此处输入图片描述

\documentclass[preview]{standalone}
\usepackage{xparse}
\ExplSyntaxOn

\seq_new:N \l_author_seq

\NewDocumentCommand \authors { m }
{ \seq_set_split:Nnn \l_tmpa_seq  {~and~} { #1 }
  \seq_use:Nn \l_tmpa_seq {\par}\par\bigskip

  While~this~worked~as~expected,~the~following~didn't:\par
  \seq_set_map:NNn   \l_tmpb_seq \l_tmpa_seq {\fbox{#1}}
  \seq_use:Nn \l_tmpb_seq {\par}
}

\ExplSyntaxOff

\begin{document}\sffamily

\authors{Susan Ferrari and Zoe Schmid and Akari Demirci}

\bigskip

And I expected an output like

\fbox{Susan Ferrari}\par
\fbox{Zoe Schmid}\par
\fbox{Akari Demirci}
\end{document}

希望我interface3有一天能够理解这份文档。

答案1

的第三个参数\seq_set_map:NNn是序列中被映射的每个项。但是你正在<inline function>使用#1\seq_set_map:NNn 里面所以\authors您必须使用它##1来代替#1那里。

在 的定义里面\authors#1是字符串Susan Ferrari and Zoe Schmid and Akari Demirci,这意味着你的代码大致做了以下事情:

\seq_set_map:NNn \l_tmpb_seq \l_tmpa_seq { \fbox{Susan Ferrari and Zoe Schmid and Akari Demirci} }

这样你就能看到为什么你会得到这样的输出。

此外,它的第三个参数\seq_set_map:NNn是否进行了x扩展,因此必须\fbox在前面加上\exp_not:N, 以确保安全。

在此处输入图片描述

\documentclass[preview]{standalone}
\usepackage{xparse}
\ExplSyntaxOn

\seq_new:N \l_author_seq

\NewDocumentCommand \authors { m }
  {
    \seq_set_split:Nnn \l_tmpa_seq  {~and~} { #1 }
    \seq_use:Nn \l_tmpa_seq {\par}  \par\bigskip
  
    While~this~worked~as~expected,~the~following~didn't:\par
    \seq_set_map:NNn \l_tmpb_seq \l_tmpa_seq { \exp_not:N \fbox{##1} }
    \seq_use:Nn \l_tmpb_seq {\par}
  }

\ExplSyntaxOff

\begin{document}\sffamily

\authors{Susan Ferrari and Zoe Schmid and Akari Demirci}

\bigskip

And I expected an output like

\fbox{Susan Ferrari}\par
\fbox{Zoe Schmid}\par
\fbox{Akari Demirci}
\end{document}

相关内容