有没有办法编写一个宏,像 Python 函数那样逐对遍历两个参数列表zip
?例如,我想编写一个这样的宏(使用这个,xparse
因为这是我一直在尝试的;我愿意接受其他选择):
\NewDocumentCommand{\Zip}{ >{\SplitList{,}}m >{\SplitList{,}}m }{%
% something that calls \myfunc in an itemize environment
}
\newcommand{\myfunc}[2]{\item #1, #2}
因此调用Zip{zebra,frog,jay}{mammal,amphibian,bird}
相当于
\begin{itemize}
\item zebra, mammal
\item frog, amphibian
\item jay, bird
\end{itemize}
这可能吗?我研究过,xparse
但似乎只允许一次浏览两个列表,而不能将它们压缩在一起。这里有一个类似的问题2011 年,但我希望现在有一个更好的解决方案。
答案1
您可以使用这样的方法\seq_mapthread_function:NNN
来迭代两个变量。seq
\documentclass{article}
\ExplSyntaxOn
\seq_new:N \l__gil_tmpa_seq
\seq_new:N \l__gil_tmpb_seq
\NewDocumentCommand \Zip { m m }
{
\seq_set_from_clist:Nn \l__gil_tmpa_seq {#1}
\seq_set_from_clist:Nn \l__gil_tmpb_seq {#2}
\seq_mapthread_function:NNN
\l__gil_tmpa_seq \l__gil_tmpb_seq \myfunc
}
\ExplSyntaxOff
\newcommand{\myfunc}[2]{\item #1, #2}
\begin{document}
\begin{itemize}
\Zip{zebra,frog,jay}{mammal,amphibian,bird}
\end{itemize}
\end{document}
答案2
使用\foreach
来自pgffor
,根据评论进行说明。
遍历成对组合矩阵的对角线:
\foreach \x [count=\xi] in {#1}{%
\foreach \y [count=\yi] in {#2}{%
\ifnum \xi=\yi%
\item \x , \y
\fi
}
}
平均能量损失
\documentclass{article}
\usepackage{xparse}
\usepackage{pgffor}
\ExplSyntaxOn
\seq_new:N \l__gil_tmpa_seq
\seq_new:N \l__gil_tmpb_seq
\NewDocumentCommand \Zip { m m }
{
\seq_set_from_clist:Nn \l__gil_tmpa_seq {#1}
\seq_set_from_clist:Nn \l__gil_tmpb_seq {#2}
\seq_mapthread_function:NNN
\l__gil_tmpa_seq \l__gil_tmpb_seq \myfunc
}
\ExplSyntaxOff
\newcommand{\myfunc}[2]{\item #1, #2}
\newcommand{\myfuncb}[2]{%
\begin{itemize}
\foreach \x [count=\xi] in {#1}{%
\foreach \y [count=\yi] in {#2}{%
\ifnum \xi=\yi%
\item \x , \y
\fi
}
}
\end{itemize}
}
\begin{document}
Expl3:
\begin{itemize}
\Zip{zebra,frog,jay}{mammal,amphibian,bird}
\end{itemize}
\textbackslash foreach:
\myfuncb{zebra,frog,jay}{mammal,amphibian,bird}
\end{document}