Имея верхнюю границу цикла foreach как индекс из массива

Имея верхнюю границу цикла foreach как индекс из массива

Допустим, у меня есть два вложенных цикла foreach.

\foreach \i in {0, ..., 3}
{
    \foreach[parse=true] \j in {0, ..., {1, 5, 7, 8}[\i]}
    {
    }
}

Это приводит к дополнительной ошибке '}'. Как этого добиться?

Моя цель — нарисовать 2d сетку кругов. Но с длиной каждой строки, которая может изменяться по заданному шаблону, т. е. со значениями, указанными в списке. Что-то вроде этого.

 ooooo
  ooo
ooooooo
  ooo 

решение1

Параметры parsePGFFor немного привередливы, особенно если последний элемент идет сразу после .... Обычно помогает добавление 0+перед ним (иногда достаточно просто, +но не в этом случае).

Я добавил еще одну конструкцию двойного цикла, которая не использует массив, а вместо этого использует список 1, 5, 7, 8напрямую как записи внешнего цикла. Подсчет вверх от 0все еще возможен с помощью countопции PGFFor.

Не забывайте, что если список сохранен в макросе, вы можете использовать этот макрос непосредственно в качестве списка:

\newcommand*\myList{1, 5, 7, 8}
\foreach \i in \myList {
}

Код

\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}

Бонус

\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}

Выход

введите описание изображения здесь

Связанный контент