用于打印单项式的宏

用于打印单项式的宏

这是我上一个问题的后续如何将整数序列转换为单项式

问题 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。 与上面相同的基本宏,具有以下附加功能。

  • 如果其中之一ei1,则打印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}}

相关内容