我正在尝试编写一些宏来简化我在 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}
工作原理如下:
- 输入以逗号分隔并填充序列。
- 通过在每个项目前面添加“差分 d”,可以构建一个新序列。
- 新的序列已交付,并
\wedge
包含在项目之间。