我需要一个具有以下行为的宏:
\mpoly{x}{1}{2}
输出 (x+1)(x+2)
\mpoly{x}{1}{2}{3}
输出 (x+1)(x+2)(x+3)
\mpoly{x}{1}{2}{3}{5}
输出 (x+1)(x+2)(x+3)(x+5)
等等。我对 tex 的可变长度参数处理一点都不自信。有人能帮我吗?
答案1
我通过将所有术语数据放在第二个参数中的逗号分隔列表中来简化语法。我使用listofitems
来解析列表(默认列表分隔符是逗号,但可以更改)。该包的\foreachitem
宏允许轻松复述。
\documentclass{report}
\usepackage{listofitems}
\newcommand\mpoly[2]{%
\readlist\myterms{#2}%
\foreachitem\x\in\myterms{(#1+\x)}%
}
\begin{document}
$y_1 =\mpoly{x}{1,2}$
$y_2 =\mpoly{x}{1,2,3}$
$y_3 = \mpoly{x}{1,2,3,5}$
\end{document}
这可以推广为更具包容性的格式,使用嵌套解析,允许多个变量以及设置 +/- 操作:
\documentclass{report}
\usepackage{listofitems}
\newcommand\mpoly[1]{%
\setsepchar{*/+||-/,}
\readlist\myterms{#1}%
\foreachitem\x\in\myterms[]{
\foreachitem\y\in\myterms[\xcnt,2]{(\myterms[\xcnt,1]\mytermssep[\xcnt,1]\y)}%
}%
}
\begin{document}
$y_1 =\mpoly{x+1,2 * y-3,4}$
$y_2 =\mpoly{x+2,3 * x-4,5,6,7}$
$y_3 = \mpoly{x-1,2 * y+3,5 * z-6}$
\end{document}
答案2
不同的语法可以更加灵活:
\usepackage{pgffor}
\newcommand*\mpoly[2]{\foreach\x in{#2}{(#1\x)}}
那会让你做\mpoly{x-}{1,2,3}
或\mpoly{x+}{2,...,5}
。
另一种选择可能是
\newcommand*\mpolyn[3]{\foreach\x in{#3}{(#1#2\x)}}
这将允许您执行\mpolyn x-{1,2,3}
或\mpolyn x+{2,...,5}
。或者可能是最后一个语法的更清晰的定义
\newcommand\mpolyn{}
\protected\def\mpolyn#1#{\mpolynaux{#1}}
\protected\def\mpolynaux#1#2{\foreach\x in{#2}{(#1\x)}}
这样你就可以,\mpolyn xyz - {1,2,3}
或者\mpolyn \ln(x) + {2,...,5}
例如。