2024年4月17日发(作者:)

TikZ快速入门

cjmuqiao@

2018年10月13日

摘要

本文使用TeXstudio2.12.6对“几个TikZ入门级的例子V1.0”进行

了修订。

y

x

z

A

LT

E

X的特点:

1.学习曲线陡峭;

2.非所见即所得;

3.牵一发而动全身,一个微小的改动需要长时间的全文编译;

4.代码并不能真正显示事物本来的样子。

TikZ因此而继承了此特点。另外TikZ适用于已使用多次的、改动较

少的教学案例、模板文档、旧书重排等。

TikZ的底层是PGF(portablegraphicsformat),即它是PGF的前端。

A

它并不是唯一可以在L

T

E

X中画出漂亮图的宏包,比如,xfig就可以代替

它。另外pstricks和metapost都可以完成TikZ的工作,但pstricks可

移植性不好;而metapost错误一堆,只在LuaT

E

X里预装了它。

1

1从行内画图开始2

在PGF中有很多优秀的并且可以独立于PGF之外运行的包。比如

pgfpages,它功能强大,可以合并多页,可以制作水印,可以将多页缩放到

一个页面里,等等。

1从行内画图开始

我们在一行文字中画一条红色的倾斜线,

实现。

1

。可以使用下面一行代码

tikzdraw[red](0pt,0pt)−−(20pt,6pt);

Tikz默认单位是厘米(cm)。pt是图像的单位“磅(point)”,1pt=0.35146mm。

A

还可以用相对长度单位,比如ex,它指的是L

T

E

X宏包中指定的一行的高

度。比如我们在一个行距高度内画一条蓝色的正弦曲线,,就可以使用

以下代码。

1

tikzdraw[blue](0,0)sin(1ex,1ex)cos(2ex,0)sin(3ex,−1ex)cos(4ex,0);

类似地,你可以用下面代码画这样一段红色的圆弧,

中画的图,会影响行间距。

1

。可以看出行

tikzdraw[red](3mm,0mm)arc[startangle=−120,endangle=60,radius=4

mm];

可以看出,行内画图以tikz开头,以分号”;”结束一行代码(与C语

言相同)。行内画图有点类似行内数学公式环境,适合示例简单的图像。如

果要画复杂图像,就要在文档开头声明usepackage{tikz},并在绘图开始

的地方声明启用“begin{tikzpicture}--end{tikzpicture}”,本文后

面大部分图件都是使用此方法。

2画点

2画点

一行的中间高度画一个半径为一半行高的红点,,用以下代码:

1

3

tikzfilldraw[red](0.5ex,0.5ex)circle[radius=0.5ex];

2.1控制点

起点x的控制点y,指的是曲线所在点x处的切线方向指向y点。如

图1所示。点x

1

(0,0)处的切线方向指向点y

1

(1,1)。点x

2

(2,0)点的切线方

y

1

x

1

y

2

x

2

1:

控制点。

向指向点y

2

(2,1)。代码如下:

1

2

3

4

5

6

7

begin{tikzpicture}

filldraw(0,0)circle[radius=2pt]node[left]{$x_1$};

filldraw[gray](1,1)circle[radius=2pt]node[left]{$y_1$};

filldraw[gray](2,1)circle[radius=2pt]node[right]{$y_2$};

filldraw(2,0)circle[radius=2pt]node[right]{$x_2$};

draw(0,0)..controls(1,1)and(2,1)..(2,0);%核心代码

end{tikzpicture}

再来一个控制点的例子:用控制点画一个半圆,见图2。当然,本例只

是阐释控制点,实际中很少用这种方式画半圆。

图2:用控制点画半圆。

图2代码如下:

1

2

3

4

begin{tikzpicture}

draw(−1.5,0)−−(1.5,0);

draw(0,−0.5)−−(0,1.5);

%showthecontrolpoints

3画圆与扇形4

5

6

7

8

9

10

11

filldraw[gray](−1,0)circle[radius=2pt]

(1,0)circle[radius=2pt]

[cyan](−1,0.555)circle[radius=2pt]

[cyan](−0.555,1)circle[radius=2pt]

[cyan](0.555,1)circle[radius=2pt]

[cyan](1,0.555)circle[radius=2pt];

draw(−1,0)..controls(−1,0.555)and(−0.555,1)..(0,1)..controls(0.555,1)and

(1,0.555)..(1,0);

end{tikzpicture}

12

3画圆与扇形

我们已经知道如何使用tikz在行内画图,下面我们用以下代码在文中

画出图3。

(a)(b)(c)

图3:画圆。(a)圆;(b)旋转15度后的椭圆;(c)扇形。

1

2

3

4

5

6

7

begin{tikzpicture}

draw(−20pt,0)node[auto]{(a)};

draw[thick,blue](0pt,0pt)circle[radius=10pt];

draw

(30

pt

,0)

node

[

auto

]{(

b

)};

draw

[

rotate

=15](60

pt

,0)

ellipse

[

xradius

=20

pt

,

yradius

=10

pt

];

node[left]at(110pt,0){(c)};

draw[draw=red!50!green](130pt,0)−−(160pt,0)arc[startangle=0,endangle

=30,radius=30pt]−−cycle;

end{tikzpicture}

8

4画一个矩形

5画抛物线和正弦曲线5

画正方形或矩形使用关键字rectangle,左下角和右上角坐标控制整个

矩形的形状。如果将矩形旋转,则旋转角度以右下角坐标为轴心,逆时针方

向旋转。

图4:画正方形。

基础代码如下:

1

2

3

4

5

6

7

begin{tikzpicture}[scale=1.5]

%第一个坐标为左下角,第二个坐标为右上角。

filldraw[thick,cyan](0.3,0)rectangle(0.8,0.5);

%旋转角度以右下角坐标为轴心,逆时针旋转。

filldraw[thick,yellow,rotate=15](−0.5,0)rectangle(0,0.5);

draw[thick,green](−0.5,0)rectangle(0,0.5);

end{tikzpicture}

5画抛物线和正弦曲线

画实例用的抛物线使用关键字parabola,正弦或余弦曲线使用关键

字sin/cos。

(a)(b)

图5:抛物线与正弦曲线。(a)抛物线;(b)行距高度内的正弦曲线,第一

个点(0,0)是起点,使用sine画到第二点(1,1)。如果没有给出起点,那么

cosine会以(1,1)为起点,画到点(2,0)。[x=1.57ex,y=1ex]是表示在一个行

距高度内,宽度为1.57倍的行距内画图。

图5的代码如下。

6填充颜色6

1

2

3

4

5

6

begin{tikzpicture}

node[left]at(0,0){(a)};

draw(0,0)parabola(1,1);

node[left]at(4,0){(b)};

draw[x=1.57ex,y=1ex](16,0)sin(17,1)cos(18,0)sin(19,−1)cos(20,0);

end{tikzpicture}

6填充颜色

使用关键字filldraw进行对形状的填充,比如图6。

图6:填充颜色。

1

2

3

%%填充颜色

begin{tikzpicture}

filldraw[fill=green!30!white,draw=red!50!green](0,0)−−(3cm,0cm)arc[start

angle=0,endangle=30,radius=3cm]−−cycle;

end{tikzpicture}

4

有时我们想画带渐变阴影的形状,使用关键字shade,如图7。

图7:渐变阴影。默认阴影是从灰到白、从上到下、无边框。

1

2

3

4

%%渐变阴影。默认为默认阴影是从灰到白、从上到下、无边框。

begin{tikzpicture}

shade(0,0)rectangle(2,1)(3,0.5)circle(0.5cm);

end{tikzpicture}

当然你可以设置不同颜色及不同的渐变方式,比如中心渐变,左部渐变

等,如图8。

7指定参考点或坐标系7

图8:使用其他颜色填充圆角形状。

1

2

3

4

%%使用其他颜色填充圆角形

begin{tikzpicture}[roundedcorners,ultrathick]

shade[topcolor=yellow,bottomcolor=orange](0,0)rectangle+(2,1);

shade[topcolor=yellow,bottomcolor=blue](3,0)−−(4,0)−−(3.5,1.5)−−

cycle;

shadedraw[innercolor=blue,outercolor=black,draw=red](6,0)rectangle

+(2,1);

shade[ballcolor=cyan](9,0.5)circle(0.5cm);

end{tikzpicture}

5

6

7

7指定参考点或坐标系

直角坐标下,二元数(1,2)表示x方向一倍的单位长度(1cm),y方向

2倍的单位长度(1cm)。这种表示是绝对坐标。当然最好是添加上单位。比

如(1cm,2pt),表示x方向1cm,y方向2个单位磅

1

的长度。如图9所示。

另一种方式的坐标是参考上一个点的参考坐标系,通常在二元数前添

加“+”号进行标识。比如+(0cm,1cm)表示相对上一个点向上移动1cm。

而++(2cm,0cm)表示,相对于上一个点向右移动2cm。图10给出几个例

子体会+与++的区别。

1

2

3

4

5

6

%%绝对坐标

begin{tikzpicture}[>=stealth]

draw(0,0)grid(4,4);

draw[−>](0,0)−−(1,2)−−(2,1);

draw(2,4.2)node{verb|(0,0)−−(1,2)−−(2,1)|};

end{tikzpicture}

1

磅,pt是point的简写,是英文字号的单位,在欧美字体度量系统常用,1pt大约为0.35毫米。常用

的5号字体是10.5磅,绝对长度约3.7毫米。

7指定参考点或坐标系

(0,0)--(1,2)--(2,1)

8

图9:绝对坐标。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

%%相对坐标

begin{tikzpicture}[>=stealth]

draw(0,0)grid(4,4);

draw[−>,blue](0,0)−−+(1,2)−−+(2,1);

draw(2,4.2)node{verb|(0,0)+(1,2)+(2,1)|};

end{tikzpicture}

begin{tikzpicture}[>=stealth]

draw(0,0)grid(4,4);

draw[−>,red](0,0)−−++(1,2)−−++(2,1);

draw(2,4.2)node{verb|(0,0)++(1,2)++(2,1)|};

end{tikzpicture}

begin{tikzpicture}[>=stealth]

draw(0,0)grid(4,4);

draw[−>,green](0,0)−−++(1,2)−−+(2,1);

draw(2,4.2)node{verb|(0,0)++(1,2)+(2,1)|};

end{tikzpicture}

begin{tikzpicture}[>=stealth]

draw(0,0)grid(4,4);

draw[−>,cyan](0,0)−−+(1,2)−−++(2,1);

draw(2,4.2)node{verb|(0,0)+(1,2)++(2,1)|};

end{tikzpicture}

在极坐标系下,使用类似(30:1cm)的方式,表示30度方向的一个1cm

长度所在那个点。比如图11这段线段是用极坐标系下(30:1cm)这个点与

原点连线的效果。

1

2

3

%%极坐标系下的相对移动

begin{tikzpicture}

draw(0,0)circle[radius=1cm];

7指定参考点或坐标系9

(0,0)+(1,2)+(2,1)(0,0)++(1,2)++(2,1)

(0,0)++(1,2)+(2,1)(0,0)+(1,2)++(2,1)

图10:相对坐标。+表示相对上一个坐标向上移动,++表示相对上一个坐

标向右移动。

8画一个箭头10

图11:极坐标系下的相对移动。

4

5

draw[red,verythick](30:1cm)−−(0,0cm);

end{tikzpicture}

8画一个箭头

Tikz默认的箭头有点难看,主要是因为它指的不精确。一个名字叫作

“悄悄地(stealth)”的箭头。

1

2

3

4

5

6

7

8

9

10

11

begin{tikzpicture}[scale=0.5]

draw[<−>](0,0)arc[startangle=180,endangle=30,radius=3cm];

draw[<−>](1,0)−−(1.5cm,2.58cm)−−(2cm,0cm)−−(2.5cm,3cm);

draw[−>](0,0)−−(6cm,0cm);

draw(1.25,−1)node{(a)};

end{tikzpicture}

begin{tikzpicture}[>=stealth]

draw[−>,red](0,0)arc[startangle=180,endangle=30,radius=1cm];

draw[<<−,verythick](1,0)−−(1.5cm,10pt)−−(2cm,0pt)−−(2.5cm,10pt);

draw(1.25,−1)node{(b)};

end{tikzpicture}

(a)

(b)

图12:画箭头。使”stealth”样式形状。

9添加文字11

9添加文字

添加文字比较简单,在已知位置上用node标出文字即可,如图13。

1

tanα=

sinα

−1

1

2

−0.5

α

cosα

1

sinα

cosα

0.5

−1

图13:使用node在图中添加文字。

1

2

3

4

5

6

7

8

9

begin{tikzpicture}[scale=3,>=stealth]

draw[step=0.5cm,gray,verythin](−1.4,−1.4)grid(1.4,1.4);

filldraw[fill=green!20!white,draw=red!50!black](0,0)−−(3mm,0mm)

arc[startangle=0,endangle=30,radius=3mm]−−cycle;

draw(2mm,0.4mm)node{$alpha$};

draw[−>](−1.5,0)−−(1.5,0)coordinate(xaxis);

draw[−>](0,−1.5)−−(0,1.5)coordinate(yaxis);

draw(0,0)circle[radius=1cm];

draw[red,verythick](30:1cm)−−node[left=1pt,fill=white]{$sinalpha$}

+(0,−0.5);

draw[blue,verythick](30:1cm)++(0,−0.5)−−node[below=2pt,fill=white]{$

cosalpha$}(0,0);

draw

[

orange

,

verythick

](1,0)

−−

(1,{

tan

(30)})

node

[

right

=1

pt

,

fill

=

white

]

10

11

10画函数12

12

13

14

15

16

{$displaystyletanalphacolor{black}=

frac{{color{red}sinalpha}}{color{blue}cosalpha}$};

draw(0,0)−−(1,{tan(30)});

foreachx/xtextin{−1,−0.5/−frac{1}{2},1}

draw[verythick](xcm,−1pt)−−(xcm,1pt)node[anchor=north,fill=white

]{$xtext$};

foreachyin{−1,−0.5,0.5,1}

draw[verythick](−1pt,ycm)−−(1pt,ycm)node[anchor=east,fill=white]

{$y$};

17

18

10画函数

10.1画连续函数

在Tikz里画连续函数,使用plot关键词,并将函数的表达式表示出来

即可,函数中的变量使用x表示。不过就个人使用经验来年,函数表达式

似乎不能使用像Matlab里幂函数的表达方式,只能用连乘法表示。

y

y=

x

2

x

1

x

e=lim

x→∞

(1+

x

)

0

图14:画函数。

x

1

2

3

4

%%画函数

usepackage{tikz}

begin{tikzpicture}[>=stealth]

draw[blue,thick,<−>](4,0)−|(0,4);

10画函数13

5

6

%%function1

draw[red,domain=0:3]plot(x,x*x/2)node[belowright]{$y=frac{x

^2}{x}$};

node[belowleft]at(0,0){$0$};

node[left]at(0,4){$y$};

node[right]at(4,0){$x$};

%%function2

draw[blue,domain=1.5:4]plot(x,1.0+1.0/x+3.0/x/x+3.0/x/x/x

);

node[below]at(4,1.7){$e=lim_{xtoinfty}{(1+frac{1}{x})^x}$};

end{tikzpicture}

7

8

9

10

11

12

13

10.2画点线

3

2

1

0

11.522.533.54

图15:画点线。

1

2

3

4

5

6

7

8

9

10

11

%%画点线

documentclass{article}

begin{document}

usepackage{tikz}

usepackage{pgfplots}%Usepfgplotspackage

begin{tikzpicture}

begin{axis}[xlabel==x,ylabel==y]

addplotcoordinates{(1,1)(1.5,1.5)(1.8,1)(2,0)(3,3)(4,2)};

end{axis}

end{tikzpicture}

end{document}

11结语14

其实Tikz还可以读取结构化ASCII文件里的数据进行画图,还可以调

用大名鼎鼎的gnuplot时行画图,后期我会专门用一篇文章介绍Tikz这些

稍微复杂一点的绘图功能。

11结语

A

总体感觉,Tikz画图操作比较精确,重要的是它与L

T

E

X完美内嵌。唯

一一点不习惯的是它的代码看起来没有Matlab整齐。

有一个经疑问,既然TikZ画图这么好看,能否把它画的图另存为单

独的文件呢?方法当然有,就是使用standalone文档类。如图16就是用

standalone画好之后的pdf文件插入。

y轴

x轴

z轴

图16:

在文档中插入使用standalone文档类画的TikZ图。这样做的好处之一就是方

便对大量的TikZ图件进行管理归类。这个例子故意使用了中文包ctex。代码见正文。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

%%使用standalone将tikz绘图单独存储

documentclass{standalone}

usepackage{ctex}

usepackage{tikz}

begin{document}

begin{tikzpicture}[>=stealth]

draw[−>](0,0,0)−−(2,0,0)node[atend,right]{$x$轴};

draw[−>](0,0,0)−−(0,2,0)node[atend,left]{$y$轴};

draw[−>](0,0,0)−−(0,0,2)node[atend,left]{$z$轴};

filldraw[red,rotatearoundz=0](0,0)−−(1,1)−−(1,0);

draw[green,rotatearoundz=45](0,0)−−(1,1)−−(1,0);

draw[blue,rotatearoundz=90](0,0)−−(1,1)−−(1,0);

end{tikzpicture}

end{document}

序言里的图片代码如下:

12致谢15

1

2

3

4

5

6

7

8

9

begin{tikzpicture}[>=stealth,scale=0.5]

draw[−>](0,0,0)−−(2,0,0)node[atend,right]{$x$};

draw[−>](0,0,0)−−(0,2,0)node[atend,left]{$y$};

draw[−>](0,0,0)−−(0,0,2)node[atend,left]{$z$};

filldraw[blue](0,1,0)−−(1,1,0)−−(1,0,0);

filldraw[red!30!](0,0,0)−−(1,1,1)−−(1,0,1);

draw[green](0,0,1)−−(1,0,1)−−(1,1,1)−−(0,1,1)−−(0,0,1);

draw[blue](0,1,0)−−(0,1,1)−−(1,0);

end{tikzpicture}

12致谢

本文档是对TillTantau的《TheTikZandPGFPackages-Manual

forversion3.0.1a》(/projects/pgf)中第一个例子“A

PictureforKarl’sStudents”的实践与笔记。算是自己步入TikZ的开端。

A

感谢L

T

E

X技术交流群(91940767)的技术支持。本文使用TeXstudio2.12.6

(hg6631:16db084dae24)编辑器,xelatex进行编译生成。

HappyTikZ-ing!