\foreach
Ich habe versucht, die Schleife von Tikz zu verwenden, um eine Liste von Formeln zu kürzen. Innerhalb jeder Formel ändert sich nur ein Index, also dachte ich, ich könnte foreach
innerhalb einer align
Umgebung jede Formel in eine Zeile schreiben. Das funktioniert jedoch nicht, wenn ich die Zeilenumbrüche \\
nach nicht entferne r^2
. Gibt es eine Möglichkeit, Zeilenumbrüche innerhalb von zu verwenden 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}
Antwort1
Sie verwenden einen Vorschlaghammer für eine einfache Aufgabe mit Kopieren und Einfügen. Das kann aus mindestens zwei Gründen nicht funktionieren: Der Code jedes \foreach
Zyklus wird in einer Gruppe ausgeführt und align
erstellt eine Tabelle auf die gleiche Weise wie tabular
, sodass jede Zelle ebenfalls eine Gruppe bildet.
Selbst wenn \foreach
nicht jeder Zyklus in einer Gruppe eingeschlossen wäre, könnte er nicht zwischen Zellen hin- und herspringen.
DukönnteTun
\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}
Ist es den Aufwand wert? Beachten Sie, dass „riskante“ Befehle wie \text
mit dem Präfix beginnen sollten ( natürlich \noexpand
nicht nur ). Außerdem würde am Ende eine unerwünschte Zeile entstehen.\text
\\
Hier ist eine bessere Version:
\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}
Die Ausgabe ist die gleiche wie zuvor.
Das optionale Argument \mathrepeat
ist der Name der zu verwendenden Umgebung; beispielsweise \mathrepeat[align]{1,2,3}{...}
würde die Zeilen nummeriert.
\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}
Antwort2
\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}