Digamos que eu tenha dois loops foreach aninhados.
\foreach \i in {0, ..., 3}
{
\foreach[parse=true] \j in {0, ..., {1, 5, 7, 8}[\i]}
{
}
}
Isso resulta em um erro extra '}'. Como eu poderia conseguir isso?
Minha intenção é poder desenhar uma grade 2D de círculos. Mas com o comprimento de cada linha podendo variar em um padrão predefinido, ou seja, com valores especificados em uma lista. Algo assim.
ooooo
ooo
ooooooo
ooo
Responder1
As parse
opções do PGFFor são um pouco complicadas, especialmente se o último item vier logo após ...
. Geralmente ajuda adicionar 0+
na frente dele (às vezes +
é suficiente, mas não neste caso).
Adicionei outra construção de loop duplo que não usa um array, mas usa a lista 1, 5, 7, 8
diretamente como as entradas do loop externo. A contagem progressiva 0
ainda é possível usando a count
opção PGFFor.
Não esqueça que se a lista estiver armazenada em uma macro você poderá usar essa macro diretamente como lista:
\newcommand*\myList{1, 5, 7, 8}
\foreach \i in \myList {
…
}
Código
\documentclass[varwidth]{standalone}
%\documentclass{article}
\usepackage{pgffor}
\begin{document}
Loops:
\foreach \i in {0, ..., 3}{
\par $ i = \i $:%
\foreach[parse=true] \j in {0, ..., 0+{1, 5, 7, 8}[\i]}{
$j = \j$,%
}
}
\vspace{1em}
\foreach[count=\cnt from 0] \i in {1, 5, 7, 8}{
\par \cnt. item: $ i = \i $:%
\foreach \j in {0, ..., \i}{
$j = \j$,%
}
}
\end{document}
Bônus
\documentclass[tikz]{standalone}
\begin{document}
\tikz[y=-1cm, radius=.4]\draw
foreach[count=\y from 0] \i in {1, 5, 7, 8}{
[shift=(left:{(\i-1)/2})]
foreach \x in {0, ..., \i}{
(\x, \y) circle[] } };
\end{document}