假设我有以下 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
环境,例如align
或gather
。
我不确定这样的语法
\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}