如何在数学模式下创建 for 循环

如何在数学模式下创建 for 循环

我正在寻找一种方法来迭代某些过程,以便在数学模式下少写一些内容。让我们举个例子。

\[
  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

在此处输入图片描述

\documentclass{article}

\usepackage{tikz}


\begin{document}

\[
F_x = q\left[\foreach \i/\p in {x/, y/+, z/+} {\p\frac{\partial E_\i}{\partial \i}\mathrm{d}\i}  
\right]
\]
\end{document}

注意:加载 tikz 是过度的。

答案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} 

在此处输入图片描述

相关内容