修改列表并将其传递给另一个命令

修改列表并将其传递给另一个命令

我正在尝试编写一些宏来简化我在 LaTeX 中编写数学公式的过程。为此,我希望有一些宏可以更简洁地编写楔形积。我有一个命令,它根据逗号分隔的列表排版一般楔形积:

\DeclareListParser*{\forcommalist}{,}
\NewDocumentCommand{\wedgeproduct}{s m}{%
    \IfValueTF{#1}{\forcommalist{\listadd\wedgelist}{#2}}{\forlistloop{\listadd\wedgelist}{#2}}
    \newcounter{wedgelength}
    \forlistloop{\ifnumequal{\value{wedgelength}}{0}{}{\wedge}\stepcounter{wedgelength}}{\wedgelist}
}

(使用 xparse 和 etoolbox)。我试图定义一个宏,\diffform如下所示

\NewDocumentCommand{\diffform}{m}{%
    \forcommalist{\listadd\formlist{}d}{#1}
    \wedgeproduct*{{\formlist}}
}

但当使用它作为(在数学模式中)

\diffform{x,y}

它给出了以下错误

! Undefined control sequence.
<argument> ...}{\wedge }\stepcounter {wedgelength}{\formlist 
                                                  }
l.21    \diffform{x,y}

我真的不明白哪里出了问题(因为它不应该寻找\formlist而应该寻找\wedgelist)。我该如何解决这个问题?任何关于在 (Lua)TeX 中编程宏的一般解释的参考也值得赞赏。

完整源代码:

\documentclass{article}

\usepackage{amsmath}
\usepackage{xparse}
\usepackage{etoolbox}

\DeclareListParser*{\forcommalist}{,}
\NewDocumentCommand{\wedgeproduct}{s m}{%
        \IfValueTF{#1}{\forcommalist{\listadd\wedgelist}{#2}}{\forlistloop{\listadd\wedgelist}{#2}}
        \newcounter{wedgelength}
        \forlistloop{\ifnumequal{\value{wedgelength}}{0}{}{\wedge}\stepcounter{wedgelength}}{\wedgelist}
}

\NewDocumentCommand{\diffform}{m}{%
        \forcommalist{\listadd\formlist{}d}{#1}
        \wedgeproduct*{{\formlist}}
}

\begin{document}
\begin{equation*}
        \diffform{x,y}
\end{equation*}
\end{document}

答案1

相反etoolbox, 我 会 选择 功能 更 强大 , 更 不 笨重 的expl3.

\documentclass{article}

\usepackage{amsmath}
\usepackage{xparse}

\newcommand{\diff}{\mathop{}\!d}

\ExplSyntaxOn
\NewDocumentCommand{\diffform}{m}
 {
  \hoekstra_diffform:n { #1 }
 }

\seq_new:N \l__hoekstra_diffform_in_seq
\seq_new:N \l__hoekstra_diffform_out_seq

\cs_new_protected:Nn \hoekstra_diffform:n
 {
  \seq_set_from_clist:Nn \l__hoekstra_diffform_in_seq { #1 }
  \seq_set_map:NNn \l__hoekstra_diffform_out_seq \l__hoekstra_diffform_in_seq { \diff ##1 }
  \seq_use:Nn \l__hoekstra_diffform_out_seq { \wedge }
 }
\ExplSyntaxOff

\begin{document}

\begin{equation*}
\diffform{x} \qquad \diffform{x,y,z,t}
\end{equation*}

\end{document}

工作原理如下:

  1. 输入以逗号分隔并填充序列。
  2. 通过在每个项目前面添加“差分 d”,可以构建一个新序列。
  3. 新的序列已交付,并\wedge包含在项目之间。

在此处输入图片描述

相关内容