Foreach for Tex

Пакет pgffor для использования функции FOREACH в TEX

Установка

\usepackage{pgffor} % LATEX 
\input pgffor.tex % plain TEX 
\usemodule[pgffor] % ConTEXt

Отдельный пакет для самостоятельного использования в документах Tex и Latex

По умолчанию сам загружает пакет \tikz

Он определяет две новые команды: \foreach и \breakforeach.

Синтаксис

\foreach 〈variables〉 [〈options〉] in 〈list〉 〈commands〉

Простой пример

\def\mylist{1,2,3,0}  
\foreach \x in \mylist {[\x]}

Выдаст: [1][2][3][0]

Вложенные циклы

\begin{tikzpicture} 
\foreach \x in {0,1,2,3} 
	\foreach \y in {0,1,2,3} 
		{  
			\draw (\x,\y) circle (0.2cm); 
			\fill (\x,\y) circle (0.1cm); 
		}  
\end{tikzpicture}

Списки через многоточие

\foreach \x in {a,b,9,8,...,1,2,2.125,...,2.5} {\x, } 

выдаст:
a, b, 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, 2.125, 2.25, 2.375, 2.5,

\foreach \x in {2^1,2^...,2^7} {$\x$, } yields 21, 22, 23, 24, 25, 26, 27,
\foreach \x in {0\pi,0.5\pi,...\pi,3\pi} {$\x$, } yields 0π, 0.5π, 1π, 1.5π, 2π, 2.5π, 3π,  
\foreach \x in {A_1,..._1,H_1} {$\x$, } yields A1, B1, C1, D1, E1, F1, G1, H1,

Координаты для TIKZ

\tikz \foreach \position in {(0,0), (1,1), (2,0), (3,1)} 
\draw \position rectangle +(.25,.5);

Несколько переменных в цикле

\begin{tikzpicture}  
	\foreach \x/\xtext in {0,...,3,2.72 / e} 
	\draw (\x,0) node{$\xtext$}; 
\end{tikzpicture}

задан паттерн для получения переменных \x второе значение через /\xtext Отсутствие значений для второго параметра замещается первым значением.

\begin{tikzpicture}  % Let's draw circles at interesting points:  
\foreach \x / \y / \r in {0 / 0 / 2mm, 1 / 1 / 3mm, 2 / 0 / 1mm} 
\draw (\x,\y) circle (\r);  

% Same effect  
\foreach \center/\r in {{(0,0)/2mm}, {(1,1)/3mm}, {(2,0)/1mm}} \draw[yshift=2.5cm] \center circle (\r); 
\end{tikzpicture}

Угловые координаты

\begin{tikzpicture}[line cap=round,line width=3pt] 
\filldraw [fill=yellow!80!black] (0,0) circle (2cm);  

\foreach \angle / \label in 
{0/3, 30/2, 60/1, 90/12, 120/11, 150/10, 180/9, 210/8, 240/7, 270/6, 300/5, 330/4} 
	{  
		\draw[line width=1pt] (\angle:1.8cm) -- (\angle:2cm); 
		\draw (\angle:1.4cm) node{\textsf{\label}}; 
	}  
\foreach \angle in {0,90,180,270} 
	\draw[line width=2pt] (\angle:1.6cm) -- (\angle:2cm);  
	
	\draw (0,0) -- (120:0.8cm); % hour 
	\draw (0,0) -- (90:1cm); % minute 
\end{tikzpicture}%

clock

Параметры настройки оператора foreach

Описанные ниже ключи можно использовать в аргументе 〈options〉 команды \foreach. Все они имеют путь /pgf/foreach/, однако путь устанавливается автоматически при анализе 〈options〉, поэтому его не нужно указывать явно.

  • /pgf/foreach/var=〈variable〉 — Этот ключ обеспечивает альтернативный способ указания переменных: \foreach [var=\x,var=\y] аналогичен \foreach \x/\y.
  • /pgf/foreach/evaluate=〈variable〉 as 〈macro〉 using 〈formula〉 — Этот ключ позволяет оценивать переменную с помощью математического механизма. \foreach \x [evaluate=\x] in {2^0,2^...,2^8}{$\x$, } вернет 1.0, 2.0, 4.0, 8.0, 16.0, 32.0, 64.0, 128.0, 256.0,

as

или \foreach \x [evaluate=\x as \xeval] in {2^0,2^...,2^8}{$\x=\xeval$, } значение будет помещено в \xeval

using

указывает формулу для вычисления

\tikz\foreach \x [evaluate=\x as \shade using \x*10] in {0,1,...,10} \node [fill=red!\shade!yellow, minimum size=0.65cm] at (\x,0) {\x};

  • /pgf/foreach/remember=〈variable〉 as 〈macro〉 (initially 〈value〉) — Этот ключ позволяет запомнить значение элемента, хранящееся в 〈variable〉, во время следующей итерации, сохраненное в 〈macro〉.
\foreach \x [remember=\x as \lastx (initially A)] in {B,...,H}{$\overrightarrow{\lastx\x}$, }
  • /pgf/foreach/count=〈macro〉 from 〈value〉 — считает номер итерации
\tikz[x=0.75cm,y=0.75cm]  
\foreach \x [count=\xi] in {a,...,e} 
\foreach \y [count=\yi] in {\x,...,e} 
	\node [draw, top color=white, bottom color=blue!50, minimum size=0.666cm] 
		at (\xi,-\yi) {$\mathstrut\x\y$};
  • /pgf/foreach/parse={〈boolean〉} — Если для этого ключа установлено значение true, верхняя граница цикла будет передана в \pgfmathparse.
  • /pgf/foreach/expand list={〈boolean〉} — Если для этого ключа установлено значение true, содержимое списка полностью раскрывается с помощью \edef перед дальнейшей обработкой.

\breakforeach

Если эта команда задана внутри команды \foreach, дальнейшее выполнение 〈команд〉 происходить не будет. Однако текущее выполнение 〈команд〉 продолжается в обычном режиме, поэтому, вероятно, лучше использовать эту команду только в конце команды \foreach.