Foreach for Tex
Categories:
Установка
\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}%
Параметры настройки оператора 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.