写在前面

上节(​​TikZ学习笔记(一) 基本图形_zorchp​​​我们说到TikZ学习笔记(二)循环_矢量图的简单图形绘制方法, 这次我们来学习一下有关图形中循环语句(​​​foreach...in...​​​)的使用, 有了这个强有力的工具, 我们就能通过TikZ学习笔记(二)循环_矢量图方便又快捷地生成很多精致的矢量图了.

P.S. 这里针对不同的图形种类, 很多大佬已经封装了一些好用的宏包, 例如平面几何绘图包​​tikz-euclide​​​, 用这个包来绘制平面几何的常用图形比起直接使用TikZ学习笔记(二)循环_矢量图要简单很多, 不过这里还是建议先研究一下TikZ学习笔记(二)循环_矢量图, 因为其他这些包都是基于TikZ学习笔记(二)循环_矢量图二次开发的, 这也算简单了解一下"所以然"了.

预备知识

在介绍循环之前, 我们先来介绍一下一些基本的绘图知识点, 这些也十分重要, 特别是用在下面的例子中时.

线段的等分

这里先介绍TikZ学习笔记(二)循环_矢量图​的一个子包​​calc​​​, 需要在导言区(preamble)加入​​\usetikzlibrary{calc}​​, 就能使用线段等分的命令了.

默认的调用格式是​​($(线段起始点)!<比例>!(线段终止点)$)​​ , 还是很好理解的. 例如下面的语句就是将线段AB进行等分, 分点取D.

\documentclass[tikz,border=3pt]{standalone}
\usetikzlibrary{calc}

\begin{document}
\begin{tikzpicture}[]
% 标记点A, B, C
\coordinate[label=left:{$A$}] (A) at (0,2);
\coordinate[label=right:{$B$}] (B) at (5,2);

% 绘制线段AB
\draw (A) -- (B);
% 线段等分, 中间的参数可选0~1之间的数, 这里取`.5`
\coordinate[label=below:{$D$}] (D) at ($(A)!.5!(B)$);
% 使用红色的圆形填充D点
\filldraw[red] (D) circle (1pt);

\end{tikzpicture}
\end{document}

TikZ学习笔记(二)循环_csdn博客_07

同样, 如果需要取AD的分点, 可以加上下面的两条命令:

\coordinate[label=below:{$E$}] (E) at ($(A)!.25!(B)$);
\filldraw[green] (E) circle (1pt);

TikZ学习笔记(二)循环_TikZ_08

循环(pgfmanual-chap88)

目前十分流行的矢量图绘制软件Adobe illustrator(AI), 能够实现直接用鼠标来创建矢量图, 但是当遇到大量重复工作时, TikZ学习笔记(二)循环_矢量图中的​​​foreach​​​语句就能很好地发挥其威力, 下面用一个小例子来说明, 这个例子就是我之前学习TikZ学习笔记(二)循环_矢量图​时候绘制的尺规作图系列第一幅图, ​​TikZ绘图示例——尺规作图:线段的任意等分_zorchp​

对于循环, 这里我们先介绍其主要格式, 即

\foreach \i in {...}
{
...
}

对第一处省略号, 可以采用如下的方式来定义, 即​​起始值,第二值,...,结束值​​​,(第二值可以不写, 默认为​​1​​) 相当于C++中的for循环语句的定义, 都是需要三个参数来实现循环变量的生成.

下面是一些由​​\foreach​​​生成的值, 在pgfmanual中都有, 可以加深大家对​​\foreach​​的理解.

\foreach \x in {1,2,...,6} {\x, } yields 1, 2, 3, 4, 5, 6,
\foreach \x in {1,2,3,...,6} {\x, } yields 1, 2, 3, 4, 5, 6,
\foreach \x in {1,3,...,11} {\x, } yields 1, 3, 5, 7, 9, 11,
\foreach \x in {1,3,...,10} {\x, } yields 1, 3, 5, 7, 9,
\foreach \x in {0,0.1,...,0.5} {\x, } yields 0, 0.1, 0.20001, 0.30002, 0.40002,
\foreach \x in {a,b,9,8,...,1,2,2.125,...,2.5} {\x, } yields a, b, 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, 2.125, 2.25, 2.375, 2.5,

\foreach \x in {1,...,6} {\x, } yields 1, 2, 3, 4, 5, 6,
\foreach \x in {9,...,3.5} {\x, } yields 9, 8, 7, 6, 5, 4,

\foreach \x in {a,...,m} {\x, } yields a, b, c, d, e, f, g, h, i, j, k, l, m,
\foreach \x in {Z,X,...,M} {\x, } yields Z, X, V, T, R, P, N,

\foreach \x in {2^1,2^...,2^7} {$\x$, } yields 21, 22, 23, 24, 25, 26, 27,
\foreach \x in {0\pi,0.5\pi,...\pi,3\pi} {$\x$, } yields 0π, 0.5π, 1π, 1.5π, 2π, 2.5π, 3π,
\foreach \x in {A_1,..._1,H_1} {$\x$, } yields A1, B1, C1, D1, E1, F1, G1, H1,

下面是一个小例子, 用于绘制一个坐标轴.

\documentclass[tikz,border=3pt]{standalone}

\begin{document}
\begin{tikzpicture}
% 绘制网格
\draw[gray!50, thin] (-2,-2) grid (10,10);
% 绘制箭头
\draw[-latex] (-3,0) -- (11,0);
\draw[-latex] (0,-3) -- (0,11);
% 标记点以及label
\coordinate [label=below:$x$] (x) at (11,0);
\coordinate [label=right:$y$] (y) at (0,11);
\coordinate [label=below left:$O$] (O) at (0,0);

% 开始绘制刻度
\foreach \i in {1,...,10} {
% 标记刻度: label来定制字体颜色
\coordinate [label={[red] below right:$\i$}] (x\i) at (\i-.1,0);
\coordinate [label={[green] below left:$\i$}] (y\i) at (0,\i+.1);
% 使用小椭圆填充
\filldraw (\i,0) ellipse (.5pt and 1pt);
\filldraw (0,\i) ellipse (1pt and .5pt);
}
\end{tikzpicture}
\end{document}

TikZ学习笔记(二)循环_LaTeX_11

一个例子

下面以尺规作图系列中最简单的一幅图为例进行讲解.

\documentclass[tikz,border=3pt]{standalone}
\usetikzlibrary{calc}

\begin{document}

\begin{tikzpicture}[]
% 标记点A, B, C
\coordinate[label=left:{$A$}] (A) at (0,2);
\coordinate[label=right:{$B$}] (B) at (5,2);
\coordinate[label=below right:{$C$}] (C) at (5,0);

% 绘制线段AB, AC
\draw (A) -- (B);
\draw (A) -- (C);

% 等分线段AC
\foreach \i in {1,...,5}
{
\coordinate[label=below:{$\i'$}] (a\i) at ($(A)!\i/5!(4.5,.2)$);
\coordinate[label=above:{$\i$}] (b\i) at ($(A)!\i/5!(B)$);
\draw (a\i) -- (b\i);
}

\end{tikzpicture}
\end{document}

TikZ学习笔记(二)循环_TikZ_12