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!


发布评论