我有一个以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}