如何将整数序列转换为单项式

如何将整数序列转换为单项式

我正在写一篇论文,其中有很多形式

$$x^3 y^2 x^{-1} y x^2 y^5$$

长度和指数都可能因实例的不同而改变。

是否可以创建一个宏,并调用它\xy,以便

\xy{3,2,-1,1,2,5}

会给出上面的单词,并且

\xy{-1,7,4}

会给

$$x^{-1} y^7 x^4$$

笔记:

  • 每个指数都非零(否则我们只需合并相邻项)
  • 可以有两个命令\xyodd,并且\xyeven取决于字的长度的奇偶性
  • 可以有两个版本,一个以 x 开头,另一个以 y 开头
  • 如果指数为 1,理想情况下它只会打印变量而不是例如x^1,但这只是一个小问题。
  • 该命令可以有两个输入,一个用于单词的长度,另一个用于指数列表。

例如

\xynew{ 6, {3,2,-1,1,2,5} }

会给

$$x^3 y^2 x^{-1} y x^2 y^5$$

尽管

\xynew{ 3, {-1,7,4} }

会给

$$x^{-1} y^7 x^4$$

答案1

在此处输入图片描述

\documentclass{article}
% initialise variable to x and add a `\relax` marker for the end
\def\xy#1{\def\xya{x}\xxy#1,\relax,}

% grab one term
\def\xxy#1,{%
% if \relax, stop
\ifx\relax#1%
\else
% print the varable
\xya
% add superscript if not 1
\ifnum#1=1 \else^{#1}\fi
% flip definition between x and y
\edef\xya{\if\xya x y\else x\fi}%
% jump past closing \fi, and grab next item
\expandafter\xxy
\fi}

\begin{document}

\[
\xy{3,2,-1,1,2,5}
\]
\[
\xy{-1,7,4}
\]
\end{document}

答案2

只是为了好玩...

在此处输入图片描述

这是建议的 API。

\begin{document}

\section{Default use}

\[ \xy{1,2,3,4,5,6} \]

\[ \xy{3,2,1,1,2,3} \]

\[ \xy{-1,-2,-3} \]

\[ \xy{1,2} \]

\[ \xy{12345} \]

\[ \xy{1,2,3,4,5,6,7,8,9,10,11,12} \]


\section{Customized use}

\UnderflowSetUp{A,B,C}

\[ \xy{1,2,3,4,5,6,7,8,9,10,11,12} \]

\UnderflowSetUp{u,n,d,e,r,f,l,o,w}

\[ \xy{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18} \]

\end{document}

这是完整的代码。

\documentclass{article}

\ExplSyntaxOn

\clist_new:N \g_flavour_var_names_clist
\int_new:N   \g_flavour_vars_pos_MAX_int

\NewDocumentCommand{\UnderflowSetUp}{m}{
  \clist_set:Nn \g_flavour_var_names_clist 
                {#1}

  \int_set:Nn \g_flavour_vars_pos_MAX_int 
              {\clist_count:N \g_flavour_var_names_clist}
}

\UnderflowSetUp{x,y}



\int_new:N \l_flavour_expo_pos_int
\int_new:N \l_flavour_expo_pos_MAX_int

\NewDocumentCommand{\xy}{m}{
% CSV data.
  \clist_set:Nn \l_tmpa_clist {#1}
  
% Let's iterate to do the job.
  \int_set_eq:NN \l_flavour_expo_pos_int {1}
  \int_set:Nn    \l_flavour_expo_pos_MAX_int
                 {\clist_count:N \l_tmpa_clist}
  
  \int_do_while:nn {\l_flavour_expo_pos_int <= \l_flavour_expo_pos_MAX_int}{
% Which variable?
    \clist_item:Nn \g_flavour_var_names_clist 
                   {\int_mod:nn {\l_flavour_expo_pos_int - 1} 
                                {\g_flavour_vars_pos_MAX_int} + 1}
% Current exponent if not 1.
    \int_set:Nn \l_tmpa_int
                {\clist_item:Nn \l_tmpa_clist \l_flavour_expo_pos_int}

    \if_int_compare:w \l_tmpa_int = 1
    \else:
      ^ {\int_use:N \l_tmpa_int}
    \fi:
% One step further.
    \int_incr:N \l_flavour_expo_pos_int
  }
}
\ExplSyntaxOff
   

\begin{document}

\section{Default use}

\[ \xy{1,2,3,4,5,6} \]

\[ \xy{3,2,1,1,2,3} \]

\[ \xy{-1,-2,-3} \]

\[ \xy{1,2} \]

\[ \xy{12345} \]

\[ \xy{1,2,3,4,5,6,7,8,9,10,11,12} \]


\section{Customized use}

\UnderflowSetUp{A,B,C}

\[ \xy{1,2,3,4,5,6,7,8,9,10,11,12} \]

\UnderflowSetUp{u,n,d,e,r,f,l,o,w}

\[ \xy{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18} \]

\end{document}

相关内容