我试图使用\foreach
tikz 中的循环来缩短公式列表。在每个公式中,只有一个索引会发生变化,所以我认为我可以foreach
在环境中使用将每个公式写在一行上。除非我删除后面的align
换行符,否则这不起作用。有没有办法在里面使用换行符?\\
r^2
foreach
\documentclass[10pt]{article}
\usepackage{tikz} % for foreach
\usepackage{amsmath} % for align
\begin{document}
\begin{align*}
\foreach \i in {1,2,3}{ (x_\i - x_c)^2 + (y_\i - y_c)^2 = r^2 \\ }
\end{align*}
\end{document}
答案1
您正在用大锤通过复制粘贴完成一项简单的任务。无论如何,这至少有两个原因无法实现:每个\foreach
循环的代码都是在一个组中执行的,并align
构建与 相同的表tabular
,因此每个单元格也形成一个组。
即使\foreach
没有将每个循环括在一个组中,它也不能跨越单元格。
你可以做
\documentclass[10pt]{article}
\usepackage{pgffor} % for foreach
\usepackage{amsmath} % for align
\usepackage{etoolbox}
\newcommand{\aligntemp}{}
\begin{document}
\gdef\aligntemp{}%
\foreach \i in {1,2,3}{%
\xappto\aligntemp{(x_\i - x_c)^2 + (y_\i - y_c)^2 &= r^2 \noexpand\\ }%
}%
\begin{align*}
\aligntemp
\end{align*}
\end{document}
值得这么麻烦吗?请注意,诸如 之类的“危险”命令\text
应该以 为前缀\noexpand
(当然\text
,不仅仅是 )。此外,\\
最后会产生一条不受欢迎的行。
这是一个更好的版本:
\documentclass[10pt]{article}
\usepackage{xparse}
\usepackage{amsmath}
\ExplSyntaxOn
\NewDocumentCommand{\mathrepeat}{O{align*}mm}
{
\seq_clear:N \l_flawr_mathrepeat_seq
\clist_map_inline:nn {#2}
{
\seq_put_right:Nn \l_flawr_mathrepeat_seq { #3 }
}
\begin{#1}\seq_use:Nn \l_flawr_mathrepeat_seq { \\ }\end{#1}
}
\seq_new:N \l_flawr_mathrepeat_seq
\ExplSyntaxOff
\begin{document}
\mathrepeat{1,2,3}{
(x_{#1} - x_c)^2 + (y_{#1} - y_c)^2 &= r^2
}
\end{document}
输出与以前相同。
可选参数\mathrepeat
是要使用的环境的名称;例如\mathrepeat[align]{1,2,3}{...}
对行进行编号。
\documentclass[10pt]{article}
\usepackage{xparse}
\usepackage{amsmath}
\ExplSyntaxOn
\NewDocumentCommand{\mathrepeat}{O{align*}mm}
{
\seq_clear:N \l_flawr_mathrepeat_seq
\clist_map_inline:nn {#2}
{
\seq_put_right:Nn \l_flawr_mathrepeat_seq { #3 }
}
\begin{#1}\seq_use:Nn \l_flawr_mathrepeat_seq { \\ }\end{#1}
}
\seq_new:N \l_flawr_mathrepeat_seq
\ExplSyntaxOff
\begin{document}
\mathrepeat[align]{1,2,3}{
(x_{#1} - x_c)^2 + (y_{#1} - y_c)^2 &= r^2 \label{myeqs#1}
}
We see in \eqref{myeqs1}--\eqref{myeqs3} that \dots
\end{document}
答案2
\documentclass[10pt]{article}
\usepackage{tikz} % for foreach
\usepackage{amsmath} % for align
\begin{document}
\foreach \i in {1,2,3}{\expandafter\xdef\csname eq\i\endcsname{%
(x_\i - x_c)^2 + (y_\i - y_c)^2 = r^2}}
\begin{align*}
\csname eq1\endcsname\\
\csname eq2\endcsname\\
\csname eq3\endcsname
\end{align*}
\end{document}