有没有办法逐个遍历两个参数列表?

有没有办法逐个遍历两个参数列表?

有没有办法编写一个宏,像 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}

相关内容