foreachループの上限を配列のインデックスにする

foreachループの上限を配列のインデックスにする

ネストされた foreach ループが 2 つあるとします。

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

これにより、余分な '}' エラーが発生します。どうすればこれを実現できますか?

私の意図は、2D グリッドの円を描画できるようにすることです。ただし、各行の長さは、事前設定されたパターンで変化させることができます。つまり、リストで指定された値です。次のようになります。

 ooooo
  ooo
ooooooo
  ooo 

答え1

PGFFor のオプションparseは、特に最後の項目が の直後に来る場合、少し扱いに​​くいです。通常は、 の前に...を追加すると役立ちます( だけで十分な場合もありますが、この場合はそうではありません)。0++

配列を使用せず、代わりにリストを1, 5, 7, 8外側のループのエントリとして直接使用する別の二重ループ構造を追加しました。PGFFor のオプションを使用すると、カウントアップは0引き続き可能ですcount

リストがマクロに保存されている場合は、そのマクロをリストとして直接使用できることを忘れないでください。

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

出力

ここに画像の説明を入力してください

関連情報