在 LaTeX 中循环遍历类似数组的结构

在 LaTeX 中循环遍历类似数组的结构

假设我有以下 Latex 文件:

\documentclass{article}
\usepackage{amsmath}

\begin{equation}
  a+b
\end{equation}

\begin{equation}
  a^2+b^2
\end{equation}

\begin{equation}
  a^2+b^2=c^2
\end{equation}

\end{document}

我想避免equation为每个新方程式重写环境。是否可以在 LaTeX 中执行以下操作?

  • 将方程式分配给变量
  • 循环遍历方程式,这样我只需要明确地写equation一次环境

如果是,怎么办?我看到它TikZ确实提供了一个 for-each 类型的命令,但似乎TikZ为了这个而导入所有内容有点小题大做,因为我没有生成任何图表。

答案1

使用连续的equation环境是错误的,如果用空行将它们分开则更是如此。请使用适当的amsmath环境,例如aligngather

我不确定这样的语法

\printequations{a+b=c \\ a^2+b^2 \\ a^2+b^2=c^2}

确实比

\begin{gather}
a+b=c \\
a^2+b^2 \\
a^2+b^2=c^2
\end{gather}

但您可以通过一种简单的方式获得您想要的东西:

\documentclass{article}
\usepackage{amsmath}

\newcommand{\printequations}[1]{%
  \begin{gather}#1\end{gather}%
}

\begin{document}

\printequations{a+b=c \\ a^2+b^2 \\ a^2+b^2=c^2}

\end{document}

在此处输入图片描述

如果你喜欢不同的语法,

\documentclass{article}
\usepackage{amsmath}

%\usepackage{xparse}% uncomment for LaTeX prior to 2020-10-01

\ExplSyntaxOn
\NewDocumentCommand{\printequations}{m}
 {
  \begin{gather}
  \seq_set_split:Nnn \l_tmpa_seq {} { #1 }
  \seq_use:Nn \l_tmpa_seq { \\ }
  \end{gather}
 }
\ExplSyntaxOff

\begin{document}

\printequations{{a+b}{a^2+b^2}{a^2+b^2=c^2}}

\end{document}

会产生与以前相同的结果。

如果你的目的是定义一组方程并一个接一个地使用它们,你可以这样做

\documentclass{article}
\usepackage{amsmath}

%\usepackage{xparse}% uncomment for LaTeX prior to 2020-10-01

\ExplSyntaxOn

\seq_new:N \l_egreg_equations_list_seq

\NewDocumentCommand{\defineequations}{m}
 {
  \seq_set_split:Nnn \l_egreg_equations_list_seq {\\} { #1 }
 }
\NewDocumentCommand{\nextequation}{}
 {
  \seq_pop_left:NN \l_egreg_equations_list_seq \l_tmpa_tl
  \begin{equation}
  \l_tmpa_tl
  \end{equation}
 }

\ExplSyntaxOff

\begin{document}

\defineequations{a+b \\ a^2+b^2 \\ a^2+b^2=c^2}

Some text before the first equation
\nextequation
Some other text between the first and the second equation
\nextequation
Some other text between the second and third equation
\nextequation
Some final text

\end{document}

在此处输入图片描述

如果您想索引方程式,这里有一个可行的方法。 之前的 kay=是任意字符串。

\documentclass{article}
\usepackage{amsmath}

%\usepackage{xparse}% uncomment for LaTeX prior to 2020-10-01

\ExplSyntaxOn
\NewDocumentCommand{\defineequations}{m}
 {
  \prop_set_from_keyval:Nn \l_egreg_equations_list_prop { #1 }
 }
\NewDocumentCommand{\useequation}{m}
 {
  \begin{equation}
  \prop_item:Nn \l_egreg_equations_list_prop { #1 }
  \end{equation}
 }

\ExplSyntaxOff

\begin{document}

\defineequations{
 1={a+b},
 2={a^2+b^2},
 3={a^2+b^2=c^2}
}
Some text before the first equation
\useequation{2}
Some other text between the first and the second equation
\useequation{1}
Some other text between the second and third equation
\useequation{3}
Some final text

\end{document}

在此处输入图片描述

答案2

\@tfor是 LaTeX 格式的一部分:

\@tfor\Macroname:=Tokenlist\do{stuff to be done}

为了@在宏名中使用\@tfor,必须将其使用包装在\makeatletter和内\makeatother(除非定义在用 加载的文件中\usepackage)。%符号避免使用虚假空格。

\documentclass{article}
\makeatletter
\newcommand\manyequations[1]{%
  \@tfor\Equation:=#1\do{%
    \begin{equation}
      \Equation
    \end{equation}%
  }%
}
\makeatother
\begin{document}
\manyequations{{a+b}{a^2+b^2}{a^2+b^2=c^2}}
\end{document}

在此处输入图片描述

答案3

格式中包含多种可用的循环宏\@for,但使用直接执行的自定义宏更简单(实际上更有效),因为所有循环宏本质上都是围绕这种执行的语法糖。

在此处输入图片描述

\documentclass{article}
\usepackage{amsmath}


\begin{document}


\section{testing\ldots}
\newcommand\mydo[1]{Some text\begin{equation}#1\end{equation}}

\mydo{a+b}\mydo{a^2+b^2}\mydo{a^2+b^2=c^2}

\end{document}

相关内容