Ter o limite superior de um loop foreach como um índice de um array

Ter o limite superior de um loop foreach como um índice de um array

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 parseopçõ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, 8diretamente como as entradas do loop externo. A contagem progressiva 0ainda é possível usando a countopçã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}

Saída

insira a descrição da imagem aqui

informação relacionada