这是我上一个问题的后续如何将整数序列转换为单项式
问题 1.是否有可能有一个接受两个输入的宏
- 变量名称:
{ x1, x2, ... , xn }
- 经验值:
{ e1, e2, ... , en }
并生成TeX
输出
x1^{e1} \cdots xn^{en}
例子:
- 变量名 =
{ a, B, \gamma, \Delta }
- 经验值 =
{ -3, 0, 1, 4 }
会给
a^{-3} B^0 \gamma^1 \Delta^4
注意:两个输入列表具有相同的正长度,但该长度可能会因实例而异。
问题2。 与上面相同的基本宏,具有以下附加功能。
- 如果其中之一
ei
是1
,则打印xi
而不是xi^1
。 - 不要打印任何指数为零的项。
在例子中,这次我们想要
a^{-3} \gamma \Delta^4
注意:问题 2不取代问题 1;在某些情况下我需要显示单项式的每个项,包括指数为 0 或 1 的项。
答案1
您可以使用\seq_mapthread_function:nn
该命令\monomial
采用变量和指数;它遍历两个列表(其中一个结束时停止)并对每一对项目执行作业。
*-variant 使每个变量和指数都被打印。
\documentclass{article}
\ExplSyntaxOn
\NewDocumentCommand{\monomial}{smm}
{
\underflow_monomial:nnn { #1 } { #2 } { #3 }
}
\seq_new:N \l__underflow_monomial_var_seq
\seq_new:N \l__underflow_monomial_exp_seq
\bool_new:N \l__underflow_monomial_show_bool
\cs_new_protected:Nn \underflow_monomial:nnn
{
\group_begin:
\bool_set:Nn \l__underflow_monomial_show_bool { #1 }
\seq_set_from_clist:Nn \l__underflow_monomial_var_seq { #2 }
\seq_set_from_clist:Nn \l__underflow_monomial_exp_seq { #3 }
\seq_mapthread_function:NNN
\l__underflow_monomial_var_seq % first seq
\l__underflow_monomial_exp_seq % second seq
\__underflow_monomial_print:nn
\group_end:
}
\cs_new_protected:Nn \__underflow_monomial_print:nn
{
\str_case:nnF { #2 }
{
{0}{\bool_if:NT \l__underflow_monomial_show_bool { #1^{0} }}
{1}{#1\bool_if:NT \l__underflow_monomial_show_bool { ^{1} }}
}
{ #1^{#2} }
}
\ExplSyntaxOff
\begin{document}
$\monomial{ a, B, \gamma, \Delta }{ -3, 0, 1, 4 }$
$\monomial*{ a, B, \gamma, \Delta }{ -3, 0, 1, 4 }$
\end{document}
不考虑每个指数都为零的极端情况(在这种情况下你什么也得不到)。
和
$\monomial{x_1,x_2,x_3}{e_1,e_2,e_3}$
你得到
答案2
我们能用 TeX 基元做什么:
\def\afterfi#1#2\fi{\fi#1}
\def\addto#1#2{\expandafter\def\expandafter#1\expandafter{#1#2}}
\def\monomial#1#2{\def\mnL{}\mnA #1,\end #2,\end}
\def\mnA #1,#2\end #3,#4\end{\addto\mnL{\mnB{#1}{#3}}%
\ifx^#2^\mnL \else \afterfi{\mnA #2\end#4\end}\fi
}
\def\mnB#1#2{\ifcase#2\or #1\else #1^{#2}\fi}
$\monomial{ a, B, \gamma, \Delta }{ -3, 0, 1, 4 }$
如果要打印所有指数,请定义:
\def\mnB#1#2{#1^{#2}}