Использовать цикл foreach в формулах?

Использовать цикл foreach в формулах?

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

введите описание изображения здесь

Связанный контент