这可能吗?
\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
决定了这一点。