像几乎所有编程语言一样, 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);
}
}
}
}
}
另外附上开头 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}