我正在写一篇论文,其中有很多形式
$$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}