我正在寻找一种方法来迭代某些过程,以便在数学模式下少写一些内容。让我们举个例子。
\[
F_x = q\left[\frac{\partial E_x}{\partial x}\operatorname{d}x +
\frac{\partial E_x}{\partial y}\operatorname{d}y +
\frac{\partial E_z}{\partial x}\operatorname{d}z\right]
\]
产生输出 现在我想要的是使用类似循环的方式自动执行书写迭代,如下所示:
\[
F_x = q\left[for \i in {x, y, z} +\frac{\partial E_x}{\partial \i}\operatorname{d}\i
\right]
\]
类似于 for 循环的东西,TikZ
以避免重复书写。这可能吗?
答案1
答案2
\documentclass{article}
\usepackage{amsmath}
\newcommand\z[2]{\frac{\partial E_x}{\partial #1}\operatorname{d}#1
\ifx\z#2+\fi#2}
\begin{document}
\[
F_x = q\left[\z x\z y\z z\right]
\]
\end{document}
答案3
不确定是否值得这么麻烦:
\documentclass{article}
\usepackage{xparse}
\newcommand\diff{\mathop{}\!\mathrm{d}}
\ExplSyntaxOn
\NewDocumentCommand{\totaldiff}{mm}
{
\seq_set_split:Nnn \l_opisthofulax_variables_seq { , } { #2 }
\seq_pop_left:NN \l_opisthofulax_variables_seq \l_opisthofulax_firstvar_tl
\frac{\partial #1}{\partial\l_opisthofulax_firstvar_tl}\diff\l_opisthofulax_firstvar_tl
\seq_map_inline:Nn \l_opisthofulax_variables_seq
{
+\frac{\partial #1}{\partial##1}\diff ##1
}
}
\seq_new:N \l_opisthofulax_variables_seq
\tl_new:N \l_opisthofulax_firstvar_tl
\ExplSyntaxOff
\begin{document}
\[
F_x=q\biggl[\totaldiff{E}{x,y,z}\biggr]
\]
\[
\totaldiff{f}{x}\qquad \totaldiff{g}{u,v}
\]
\end{document}
请注意\operatorname{d}x
给出错误的间距。
更通用的版本,其中\doloop
定义了一个宏,将逗号分隔的项目列表和用于执行该作业的模板作为参数。还有一个可选的尾随参数,用于设置循环的连续应用之间的分隔符。
给出了一些使用示例。
\documentclass{article}
\usepackage{amsmath}
\usepackage{xparse}
\newcommand\diff{\mathop{}\!\mathrm{d}}
\ExplSyntaxOn
\NewDocumentCommand{\doloop}{mmO{+}}
{% #1 = variables for the loop, #2 = template, #3 = separator, default +
\giutex_doloop:nnn { #1 } { #2 } { #3 }
}
\clist_new:N \l__giutex_doloop_clist
\tl_new:N \l__giutex_doloop_tl
% initialize
\cs_new:Nn \__giutex_doloop_first:n {}
\cs_generate_variant:Nn \__giutex_doloop_first:n { V }
\cs_new:Nn \__giutex_doloop:n {}
\cs_new_protected:Nn \giutex_doloop:nnn
{
\cs_set:Nn \__giutex_doloop_first:n { #2 }
\cs_set:Nn \__giutex_doloop:n { #3 #2 }
\clist_set:Nn \l__giutex_doloop_clist { #1 }
\clist_pop:NN \l__giutex_doloop_clist \l__giutex_doloop_tl
\__giutex_doloop_first:V \l__giutex_doloop_tl
\clist_map_function:NN \l__giutex_doloop_clist \__giutex_doloop:n
}
\ExplSyntaxOff
% if you define a command in terms of \doloop, the variable item is denoted by ##1
\newcommand{\totaldiff}[2]{%
\doloop{#2}{\frac{\partial #1}{\partial##1}\diff##1}%
}
\begin{document}
\[
F_x=q\Bigl[\doloop{x,y,z}{\frac{\partial E}{\partial#1}\diff#1}\Bigr]
\]
\[
F_x=q\Bigl[\totaldiff{E}{x,y,z}\Bigr]
\]
\[
D(f+g+h)=\doloop{f,g,h}{\frac{\diff #1}{\diff x}}
\]
\[
n!=\doloop{n,(n-1),\dotsb,3,2,1}{#1}[\cdot]
\]
\end{document}
请注意,循环中的当前项用 表示#1
;这必须是##1
如果\doloop
用于定义另一个宏,例如\totaldiff
。
答案4
如果对差分符号和封装使用宏esdiff
,则可以获得更短的代码和更好的间距。比较:
\documentclass{article}
\usepackage{mathtools}
\usepackage{esdiff}
\newcommand*{\dd}{\mathop{\kern0pt\mathrm{d}}\mkern-2mu{}}
\begin{document}
\[
F_x = q\left[\frac{\partial E_x}{\partial x}\operatorname{d}x +
\frac{\partial E_x}{\partial y}\operatorname{d}y +
\frac{\partial E_z}{\partial x}\operatorname{d}z\right]
\]
\[ F_x = q\left[\diffp{E_x}{x}\dd x + \diffp{E_x}{y}\dd y + \diffp{E_z}{x}\dd z \right] \]
\end{document}