使用两个列表元素执行操作的命令

使用两个列表元素执行操作的命令

这可能吗?

\documentclass{article}
\usepackage{xparse,amsmath}
\NewDocumentCommand{\myfunc}{O{} m O{+} m}{
    % some dark sorcery
}
\begin{document}
\[
\myfunc[a]{x,y}{2,3} % should return ax^2 + ay^3
\]
\end{document}

答案1

\documentclass{article}
\usepackage{xparse,amsmath,listofitems}
\NewDocumentCommand{\myfunc}{O{} m O{+} m}{
  \readlist\bases{#2}%
  \readlist\exponents{#4}%
  \foreachitem\z\in\bases[]{%
    \ifnum\zcnt=1\else#3\fi
    #1\z^{\exponents[\zcnt]}%
  }%  
}
\begin{document}
\[
\myfunc[a]{x,y}{2,3} % should return ax^2 + ay^3
\]
\end{document}

在此处输入图片描述

答案2

\documentclass{article}
\usepackage{xparse,amsmath}
\NewDocumentCommand{\myfunc}{O{} m O{+} m}{
    \zz{#1}#2,\relax{#3}#4,\relax
}
\def\zz#1#2,#3\relax#4#5,#6\relax{%
#1#2^{#5}
\if$#3$\expandafter\zzstop\else#4\fi
\zz{#1}#3\relax{#4}#6\relax
}
\def\zzstop#1\relax#2\relax{}
\begin{document}
\[
\myfunc[a]{x,y}{2,3} % should return ax^2 + ay^3
\]
\end{document}

在此处输入图片描述

答案3

或者,您可以使用 Expl3 编码样式来管理它:

\ExplSyntaxOn
\NewDocumentCommand{\myfunc}{O{} m O{+} m}{
  \seq_set_from_clist:Nn \l_tmpa_seq {#2}
  \seq_set_from_clist:Nn \l_tmpb_seq {#4}
  \cs_set:Npn \__mapper ##1##2 {\__sep #1##1^{##2}}
  \cs_set:Npn \__sep {\cs_set:Npn \__sep {#3}}
  \seq_mapthread_function:NNN \l_tmpa_seq \l_tmpb_seq \__mapper
}
\ExplSyntaxOff

(我花了很多时间尝试编写一个内核扩展来对两个序列进行压缩,这需要两个序列和一个 map 函数来创建一个新序列,但后来我偶然发现了\seq_mapthread_function:NNN哪种方法可以完成我所寻找的功能,但不输出到序列。我可能会在以后继续这样做,只是为了磨练我的 expl3 技能。它还可以让我用类似的东西替换最后三行

\seq_set_zip \__tmp_seq \l_tmpa_seq \l_tmpb_seq {#1##1^{##2}}
\seq_use:Nn \__tmp_seq { #3 }

这可以说更清楚)。

我不知道是否严格有必要创建\__mapper,但似乎缺乏创建\seq_mapthread_function:NNn决定了这一点。

相关内容