本文为A very minimal introduction to TikZ
学习笔记,主要将一些重点内容用中文记录下来。基本原因是我看英语看得头疼。
该指南作者为Jacques Cr´emer,内容发表于2011年3月11日。
本文使用TikZJax
进行TikZ
代码执行。在网络不好的情况下无法显示出执行效果。请自行准备科学工具?
Picture环境
通常使用如下基本配置,实现中文环境下文章的编辑。通常情况下,我们会外套table环境用于图片定位。
| \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功能强大,还有许多宏包辅助功能,这些都会在将来的实践中发挥作用。