TikZ 的 for 循环

像几乎所有编程语言一样, TikZ 可以使用 for 循环以简化代码, 手册给的使用规则如下

\foreach <variable> in {list of values} <commands>

另外注明了

If the <commands> do not start with a brace, everything
up to the next semicolon is used as <commands>.

但是为了代码的逻辑性和可读性, 我一般都是用 花括号 把循环体括起来. 所以, 根据使用环境, 没有嵌套的, 我一般如下两种:

\foreach \j in {1,2,3,...,10}
{
   \draw (\j,0) node [below] {$\j$} -- (\j,0.25);
}
\foreach \j/\k in {1/I, 2/II, 3/III, 4/IV, 5/V, 6/VI, 7/VII, 8/VIII, 9/IX, 10/X}
{
	\draw (\j,0) node [below] {$\mathrm{\k}$} -- (\j,0.25);
}

需要说明的是, 如果 \j 的取值范围是像自然数一样的, 可以先写前三个, 中间三个点 ...,, 最后以一个值停止即可, 比如还可以 -1,-0.9,-0.8,…,1 得到 21 个值. 当有两个甚至更多的变量伴随时, 使用 \j/\k/\l 之类, 取值范围也是对应赋值, 如果某一组 \j,\k,\l 的值相等, 可以只提供一个, 即 3/3/3 和 一个 3 效果一样.

同样, 也可以嵌套, 规则如下:

\foreach \i in {1,2,3,4}
{
	\foreach \j in {1,2,3}
	{
		\draw (\i,0) -- (\j,1);
	}
}

这就得到了完全二部图 $K_{3,4}$. 使用 foreach 的嵌套, 很容易画出高维立方体, 比如五维立方体代码:

\foreach \i in {0,1}
{
   \foreach \j in {0,1}
   {
      \foreach \k in {0,1}
      {
         \foreach \l in {0,1}
         {
            \foreach \t in {0,1}
            {
               \draw (\j+3*\l-5*\t,-\j-\k-\l-\t) -- (-1+\j+3*\l-5*\t,-1-\j-\k-\l-\t)
                     (-\i+3*\l-5*\t,-\i-\k-\l-\t) -- (-\i+1+3*\l-5*\t,-\i-1-\k-\l-\t)
                     (-\i+\j+3*\l-5*\t,-\i-\j-\l-\t) -- (-\i+\j+3*\l-5*\t,-\i-\j-1-\l-\t)
                     (-\i+\j-5*\t,-\i-\j-\k-\t) -- (-\i+\j+3-5*\t,-\i-\j-\k-1-\t)
                     (-\i+\j+3*\l,-\i-\j-\k-\l) -- (-\i+\j+3*\l-5,-\i-\j-\k-\l-1);
               \filldraw (-\i+\j+3*\l-5*\t,-\i-\j-\k-\l-\t) circle (2pt);
            }
         }
      }
   }
}
五维立方体, 也可以认为是五维 Boole 格的 Hasse 图

另外附上开头 Petersen 图和标注了 Hamilton 圈的 Grotzsch 图的代码:

\documentclass{standalone}

\usepackage{tikz}

\begin{document}


%Petersen graph
\begin{tikzpicture}[scale=2]
\foreach \i in {0,...,4}
{
   \draw (90+72+72*\i:2) -- (90+72*\i:2) --
   (90+72*\i:1) -- (90+144+72*\i:1);
   \foreach \r in {1,2}
   {
      \filldraw (90+72*\i:\r) circle (2pt);
   }
}
\end{tikzpicture}
%%Grotzsch graph
\begin{tikzpicture}[scale=2]

\foreach \i in {0,...,4}
{
   \draw (90+72*\i:1) -- (90-72+72*\i:2) -- (90+72*\i:2) -- (90-72+72*\i:1) -- (0,0);
   \foreach \r in {0,1,2}
   {
      \filldraw (90+72*\i:\r) circle (2pt);
   }
}
%Hamiltonian cycle
  \draw[thick] (90:2) -- (90+72:1) -- (90+144:2) -- (90+72:2) -- (90:1) -- (90-72:2) -- (90-144:1) -- (0:0) -- (90+144:1) -- (90-144:2) -- (90-72:1) -- cycle;
\end{tikzpicture}

\end{document}