Minimal TikZ 学习笔记

本文为A very minimal introduction to TikZ学习笔记,主要将一些重点内容用中文记录下来。基本原因是我看英语看得头疼。

该指南作者为Jacques Cr´emer,内容发表于2011年3月11日。

本文使用TikZJax进行TikZ代码执行。在网络不好的情况下无法显示出执行效果。请自行准备科学工具?

Picture环境

通常使用如下基本配置,实现中文环境下文章的编辑。通常情况下,我们会外套table环境用于图片定位。

1
2
3
4
5
6
7
8
9
10
11
\documentclass[tikz]{article}
\usepackage{tikz}
\usepackage[UTF8]{ctex}
\begin{document}
\begin{figure}
\begin{tikzpicture}
code here
\end{tikzpicture}
\caption{CAPTION}
\end{figure}
\end{document}

如果只希望进行配图的生成,使用如下配置。

1
2
3
4
5
6
7
8
\documentclass[margin=10pt,tikz]{standalone}
\usepackage{tikz}
\usepackage[UTF8]{ctex}
\begin{document}
\begin{tikzpicture}
code here
\end{tikzpicture}
\end{document}

基本绘图

TikZ使用坐标系来精确定位图像元素的位置,请在绘图时将图像坐标牢记于心。

我们会建议用户使用结点\node来标记元素坐标,而不是直接使用立即数。但是,教程中我们采取了后者,为了清晰可见的视觉效果。

直线

一条直线,注意分号是必须的。

1
2
3
\begin{tikzpicture}
\draw (0, 0) -- (1, 2);
\end{tikzpicture}

一条折线

1
2
3
\begin{tikzpicture}
\draw (0, 0) -- (1, 2) -- (2, 3) -- (1, 0);
\end{tikzpicture}
1
2
3
4
\begin{tikzpicture}
\draw [help lines] (0, 0) grid (4, 4);
\draw (0, 0) -- (1, 2) -- (2, 3) -- (1, 0);
\end{tikzpicture}

带有辅助网格的折线,辅助网格可以帮助用户定位。辅助网格使用风格help lines,推荐在其他元素之前绘制,防止覆盖和叠加。

图像缩放

通过在环境上添加scale的值,可以调整图片的缩放尺度。

1
2
3
\begin{tikzpicture}[scale=3]
\draw (0, 0) -- (1, 1);
\end{tikzpicture}
1
2
3
\begin{tikzpicture}[xscale=2, yscale=3]
\draw (0, 0) -- (1, 1);
\end{tikzpicture}

箭头,和对应衍生物

线可以添加相应的”装饰”。通常来说,箭头类装饰只会出现在线的两侧,折线也是如此。

1
2
3
4
5
\begin{tikzpicture}
\draw [->] (0, 0) -- (2, 0);
\draw [<-] (0, -0.5) -- (2,-0.5);
\draw [|->] (0,-1) -- (2,-1);
\end{tikzpicture}

双向箭头可以作为一种取巧的方式产生坐标系。

1
2
3
\begin{tikzpicture}
\draw [<->] (0,2) -- (0,0) -- (3,0);
\end{tikzpicture}

改变线的宽度

通过各种decoration来改变线的风格,宽度的风格有ultra thin, very thin, thin, semithick, thick, very thick, ultra thick

1
2
3
4
5
\begin{tikzpicture}
\draw [ultra thick] (0,1) -- (2,1);
\draw [thick] (0,0.5) -- (2,0.5);
\draw [thin] (0,0) -- (2,0);
\end{tikzpicture}

先前提及的help lines,其实是一种fine gray的装饰,可以用作各种辅助线。

1
2
3
4
5
6
\begin{tikzpicture}
\draw [<->] (0,2) -- (0,0) -- (4,0);
\draw [thick] (0,1.5) -- (3,0);
\draw [ultra thick] (0,0) -- (2,2);
\draw [help lines] (1,0) -- (1,1) -- (0,1);
\end{tikzpicture}

当然可以自由指定线宽。

1
2
3
4
\begin{tikzpicture}
\draw [line width=12] (0,0) -- (2,0);
\draw [line width=0.2cm] (4,.75) -- (5,.25);
\end{tikzpicture}

dashes and dots

可以使用散点和散线。

1
2
3
4
5
\begin{tikzpicture}
\draw [dashed, ultra thick] (0,1) -- (2,1);
\draw [dashed] (0, 0.5) -- (2,0.5);
\draw [dotted] (0,0) -- (2,0);
\end{tikzpicture}

颜色

可以直接指定颜色,包括red, green, blue, cyan, magenta, yellow, black, gray, darkgray, lightgray, brown, lime, olive, orange, pink, purple, teal, violet, white,也可以通过不同方法定义自己的颜色。参考手册即可。

1
2
3
4
5
\begin{tikzpicture}
\draw [gray] (0,1) -- (2,1);
\draw [red] (0, 0.5) -- (2,0.5);
\draw [blue] (0,0) -- (2,0);
\end{tikzpicture}

文中符号和图形

事实上,如果不外套figure环境,你可以做到行内符号和图形。

1
\begin{tikzpicture} \draw [yellow, line width=6] (0,0) -- (.5,0); \end{tikzpicture}

限于工具的使用,这里就不在网页中展示行内符号的样式了。可以自行测试。

曲线

TikZ提供各种各样的曲线。示例如下。

1
2
3
4
5
\begin{tikzpicture}
\draw [blue] (0,0) rectangle (1.5,1);
\draw [red, ultra thick] (3,0.5) circle [radius=0.5];
\draw [gray] (6,0) arc [radius=1, start angle=45, end angle= 120];
\end{tikzpicture}

arc中,各个参数有这样的含义,即radius表示半径,start angle 表示起始点的角度,end angle 表示终止点的角度。

TikZ也允许你获得圆滑的路径。

1
2
3
\begin{tikzpicture}
\draw [<->, rounded corners, thick, purple] (0,2) -- (0,0) -- (3,0);
\end{tikzpicture}

其他的曲线呢?TikZ允许你通过大量的点,(x, y)模拟一条曲线。当然这不是最佳的选择。TikZ提供了数学工具,可以产生大致的曲线。不过你需要指定起点终点的倾角。这个倾角的取值范围为[0, 360),大概。我没看手册,应该吧。

1
2
3
\begin{tikzpicture}
\draw[very thick] (0,0) to [out=90,in=195] (2,1.5);
\end{tikzpicture}

注意这里使用了to关键词表示你制定了一条曲线。值得提醒的是,你也可以使用<->之类的符号给曲线增加箭头。

数学作图

TikZ允许你通过数学公式绘制图像。代码如下。

1
2
3
4
\begin{tikzpicture}[xscale=13,yscale=3.8]
\draw [<->] (0,0.8) -- (0,0) -- (0.5,0);
\draw[green, ultra thick, domain=0:0.5] plot (\x, {0.025+\x+\x*\x});
\end{tikzpicture}

这里的\x事实上是点的真实坐标。domain提供了定义域的范围。除了这些函数,TkiZ还提供了

  • factorial(\x)
  • sqrt(\x),
  • pow(\x, y),x的y次幂。
  • exp(\x)
  • ln(\x)
  • log10(\x)
  • log2(\x)
  • abs(\x),x的绝对值。
  • mod(\x, y),x 模 y。
  • round(\x),取值到最近的整数。
  • floor(\x),下取整数。
  • ceil(\x),上取整数。
  • sin(\x),x是角度,如果想使用弧度,请使用函数sin(\x r)。
  • cos(\x),x是角度,如果想使用弧度,请使用函数cos(\x r)。
  • tan(\x), x是角度,如果想使用弧度,请使用函数tan(\x r)。
  • min(\x, y)
  • max(\x, y)

rnd产生[0,1]中随机数的函数,和两个常数e = 2.718281828, pi = 3.141592654

下面的图象有不错的视觉效果。

1
2
3
4
5
6
7
\begin{tikzpicture}
\draw [help lines, <->] (0,0) -- (6.5,0);
\draw [help lines, ->] (0,-1.1) -- (0,1.1);
\draw [green,domain=0:2*pi] plot (\x, {(sin(\x r)* ln(\x+1))/2});
\draw [red,domain=0:pi] plot (\x, {sin(\x r)});
\draw [blue, domain=pi:2*pi] plot (\x, {cos(\x r)*exp(\x/exp(2*pi))});
\end{tikzpicture}

填充区域

简单使用fill参数即可将闭曲线填充。

1
2
3
4
5
6
7
8
\begin{tikzpicture}
\draw [fill=red,ultra thick] (0,0) rectangle (1,1);
\draw [fill=red,ultra thick,red] (2,0) rectangle (3,1);
\draw [blue, fill=blue] (4,0) -- (5,1) -- (4.75,0.15) -- (4,0);
\draw [fill] (7,0.5) circle [radius=0.1];
\draw [fill=orange] (9,0) rectangle (11,1);
\draw [fill=white] (9.25,0.25) rectangle (10,1.5);
\end{tikzpicture}

fill = red告诉TikZ你想要用红色填充,red告诉TikZ你想用红色绘制路径。

有的时候你不想看到路径,即边框线。那么可以使用\path指令实现这一功能。

1
2
3
\begin{tikzpicture}
\path [fill=gray] (0,0) rectangle (1.5,1);
\end{tikzpicture}

复杂路径仍然可以填充

只要路径的终点和起点相吻合,图形一样可以填充。

1
2
3
4
5
\begin{tikzpicture}
\draw [ultra thick] (0,0) to [out=87,in=150] (1,1) -- (.85,.15) -- (0,0);
\draw [ultra thick, fill=purple] (2,0) to [out=87,in=150] (3,1) -- (2.85,.15) -- (2,0);
\path [fill=purple] (4,0) to [out=87,in=150] (5,1) -- (4.85,.15) -- (4,0);
\end{tikzpicture}

图像中放置标签

标签的放置可以通过\node实现。

1
2
3
4
\begin{tikzpicture}
\draw [thick, <->] (0,2) -- (0,0) -- (2,0);
\node at (1,1) {yes};
\end{tikzpicture}

\node 可以添加标记,即\node(node name)。如果只是为了标记,可以使用\node (node name) at (x, y)定义坐标点。

1
2
3
4
5
6
7
8
\begin{tikzpicture}
\draw [thick, <->] (0,2) -- (0,0) -- (2,0);
\draw [fill] (1,1) circle [radius=0.025];
\node [below] at (1,1) {below};
\node [above] at (1,1) {above};
\node [left] at (1,1) {left};
\node [right] at (1,1) {right};
\end{tikzpicture}

也有更加绚丽的图片。

1
2
3
4
5
6
7
8
\begin{tikzpicture}
\draw [thick, <->] (0,1) -- (0,0) -- (1,0);
\draw[fill] (1,1) circle [radius=0.025];
\node [below right, red] at (.5,.75) {below right};
\node [above left, green] at (.5,.75) {above left};
\node [below left, purple] at (.5,.75) {below left};
\node [above right, magenta] at (.5,.75) {above right};
\end{tikzpicture}

这种情况下,我们可以获得一个完美的坐标系。

1
2
3
4
5
6
7
\begin{tikzpicture}
\draw [thick, <->] (0,1) -- (0,0) -- (1,0);
\node [below right] at (1,0) {$x$};
\node [left] at (0,1) {$y$};
\draw[fill] (.4,.6) circle [radius=.5pt];
\node[above right] (.4,.6) {$A$};
\end{tikzpicture}

当然我们可以将指令合在一起写,省去结点的声明。不过这样的话不符合我们先前约定的规范。

1
2
3
4
5
6
\begin{tikzpicture}
\draw [thick, <->] (0,1) node [left] {$y$}
-- (0,0) -- (1,0) node [below right] {$x$};
\draw[fill] (.4,.6) circle [radius=.5pt]
node[above right] (.4,.6) {$A$};
\end{tikzpicture}

在一个结点内,如果你想要产生多行文字,你需要告诉TikZ你在哪个地方换行,使用\\符号。同时,你需要指定对齐方式,否则TikZ将不会渲染。

1
2
3
4
5
6
7
8
9
10
11
12
13
\begin{tikzpicture}
\draw [thick] (0,0) -- (9,0);
\draw (0,-.2) -- (0, .2);
\draw (3,-.2) -- (3, .2);
\draw (6,-.2) -- (6, .2);
\draw (9,-.2) -- (9, .2);
\node[align=left, below] at (1.5,-.5)%
{This happens\\in period 1\\and is aligned\\ left};
\node[align=center, below] at (4.5,-.5)%
{This happens\\in period 2\\and is centered};
\node[align=right, below] at (7.5,-.5)%
{This happens\\in period 2\\and is right\\aligned};
\end{tikzpicture}

集成进入Beamer

Beamer 和 TikZ出于同一个作者之手,当然具有良好的集成性。在Beamer中,可以直接使用TikZ。

1
2
3
4
5
6
7
8
9
10
11
\begin{frame}
a few lines
\begin{center}
\begin{tikzpicture}
\draw [blue, ultra thick] (-1,2) -- (6,3);
\uncover<1>{\draw [green,thick] (-4,3) -- (2,2.5);}
\uncover<2>{\draw [red,thick] (0,0) -- (0,5);}
\end{tikzpicture}
\end{center}
and something under.
\end{frame}

其中\uncover不能换成\only,否则其他元素的位置将会改变。

结语

学习TikZ是一个漫长的过程。TikZ功能强大,还有许多宏包辅助功能,这些都会在将来的实践中发挥作用。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!