Я пытался использовать \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}