TikZ从零开始(一)——A Picture for Karl’s Students(上篇)

0、前言

本系列参考官方文档pgfmanual,如果大家装了TeXLive,只需要在命令行texdoc tikz就可以打开啦~

1、问题陈述

在这里插入图片描述
第一个教程结束时,我们将学会(是的没错你可以!)如何画出上面的图。

2、创建环境

\documentclass{article}
\usepackage{tikz}  % 导入该宏包是必需的
\begin{document}
   We will work on this:
   \begin{tikzpicture}  % 画图必须在tikzpicture环境中进行
   	\draw (-1.5,0)--(1.5,0);  % 分号不能少
   	\draw (0,-1.5)--(0,1.5);  %\draw命令用来画线,从一个点连接到另一个点
   \end{tikzpicture}
\end{document}

我以前编译文档时latex命令结束时不需要跟分号,但是画图的时候是必须要跟的,不跟就会报错,TeXstudio还会友好地提示是不是少了个分号。
在这里插入图片描述

3、画直线(Straight Path)

线/路径(Path)是TikZ里面画图的基本模块,分为直线和曲线。线从一个写在圆括号里的坐标开始,中间经过--,在另一个坐标结束,--的两端必须是坐标才可以。

\tikz\draw (-1.5,0) -- (1.5,0) -- (0,-1.5) -- (0,1.5);

在这里插入图片描述
你可能会比较奇怪为什么这条命令不在tizpicture环境里但依然能编译成功。实际上,\draw命令要么是在tizpicture环境里,要么就得跟在\tizk命令后。如果是跟在\tizk命令后面,除了上面这种加分号的写法,还可以不加分号,但是要用花括号把绘图参数包括进内。

\tikz{\draw (-1.5,0) -- (1.5,0) -- (0,-1.5) -- (0,1.5)}

如果我们这么写也是完全没问题的

4、画曲线(Curved Path)

基本语法是\draw a .. controls b and c .. d;其中a b c d均表示圆括号坐标,这个命令的含义是:画一条从a开始至d结束的曲线,曲线在a点处的切线经过b,曲线在d点处的切线经过c。看下图会更明白:
在这里插入图片描述
其中\filldraw是用来画四个圆点的命令,用于帮助理解,这个命令以后会学的。

\begin{tikzpicture}
	\draw (-1.5,0)--(1.5,0);
	\draw (0,-1.5)--(0,1.5);
	\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}

为了精准地画出一个半圆,这里选了三个要经过的点,效果如图。
在这里插入图片描述

5、画圆(Circle Path)

因为圆是要经常画的,上面的方法也太麻烦了,所以当然会有专门用来画圆的命令咯。

\begin{tikzpicture}
	\draw (-1.5,0)--(1.5,0);
	\draw (0,-1.5)--(0,1.5);
	\draw (0,0) circle [radius=10pt]
	% 也可以用下面这个命令
	% \draw (0,0) circle (10pt);
\end{tikzpicture}

在这里插入图片描述
请注意,坐标默认单位是cm,也可以使用pt作为单位,可以看出pt这个单位是很小的, 1 c m ≈ 28.35 p t 1cm\approx28.35pt 1cm28.35pt
画一个一厘米的圆吧!因为厘米是默认单位,故可以省略。

\begin{tikzpicture}
	\draw (-1.5,0)--(1.5,0);
	\draw (0,-1.5)--(0,1.5);
	\draw (0,0) circle [radius=1]
\end{tikzpicture}

在这里插入图片描述
尽管这图看上去比预期的效果图小多了(还记得第一节嘛),但好在TikZ可以方便地按比例缩放,不过这个放在后面再讲。

6、画矩形(Rectangle Path)

现在坐标轴有了,圆也有了,我们要开始画网格啦~方法很多,其中一种就是画很多个小矩形。
画矩形有两种方法,第一种是\draw <a> rectangle <b>;其中a b都是坐标,这样画出的矩形,是以a和b为对顶点的(我们知道矩形有四个自由度,每个点有两个坐标,两个点就一共有四个坐标,是不是刚好等于四个自由度?)。

\begin{tikzpicture}
	\draw (-1.5,0)--(1.5,0);
	\draw (0,-1.5)--(0,1.5);
	\draw (0,0) circle [radius=1];
	\draw (0,0) rectangle (0.5,0.5);
	\draw (-0.5,-0.5) rectangle (-1,-1);
\end{tikzpicture}

现在随便画了俩矩形,效果如下:
在这里插入图片描述
第二种文档在明暗Shading一节才提及,这里一并说明。思路很简单,不是四个自由度嘛,第一种是两个点坐标,现在这种就是给定一个点坐标,再给定长和宽。
<a> rectangle +(<length, width>),其中length width分别是长度和宽度。

\tikz\draw (0,0) rectangle +(5,3);

在这里插入图片描述

但是这个通过画很多矩形来实现网格的思路其实是不切实际的,如果网格很多呢,岂不是代码超级长?另外,如果我们回头去看看第一节的预期效果图,会发现网格是不封闭的,但矩形是封闭的。

7、画网格(Grid Path)

基本语法是\draw [step=<length>] a grid b;,其中<length>是间隔长度(单位长度),a b是两个坐标。我个人是这么理解这条命令的(教程没提),从原点 ( 0 , 0 ) (0,0) (0,0)开始在x,y两个方向分别向外画线,每隔<length>长度就画一条线,一直画到我们指定的边界(边界可以取)。通过以下例子说明。

\begin{tikzpicture}
	\draw (-1.5,0)--(1.5,0);
	\draw (0,-1.5)--(0,1.5);
	\draw (0,0) circle [radius=1];
	\draw [step=.5cm] (-1.4,-1.5) grid (1.4,1.5);
\end{tikzpicture}

x方向上我们从-1.4画到1.4,一共会有 ⌊ 1.4 0.5 ⌋ + ⌊ ∣ − 1.4 ∣ 0.5 ⌋ + 1 = 5 \lfloor\dfrac{1.4}{0.5}\rfloor+\lfloor\dfrac{|-1.4|}{0.5}\rfloor+1=5 0.51.4+0.51.4+1=5条竖直线,y方向上我们从-1.5画到1.5,一共会有 ⌊ 1.5 0.5 ⌋ + ⌊ ∣ − 1.5 ∣ 0.5 ⌋ + 1 = 7 \lfloor\dfrac{1.5}{0.5}\rfloor+\lfloor\dfrac{|-1.5|}{0.5}\rfloor+1=7 0.51.5+0.51.5+1=7条水平线。P.S. ⌊ x ⌋ \lfloor x \rfloor x表示对 x x x向下取整。看效果图:
在这里插入图片描述
掌握了这个方法,我们就可以画出网格中的圆了。

\begin{tikzpicture}
	\draw (-1.5,0)--(1.5,0);
	\draw (0,-1.5)--(0,1.5);
	\draw (0,0) circle [radius=1]
	\draw [step=.5,color=gray,very thin] (-1.4,-1.4) grid (1.4,1.4)
\end{tikzpicture}

指定颜色为“灰色”,线宽为“很细”,我们可以使网格不至喧宾夺主(distracting),整个图形看起来更舒服。
在这里插入图片描述

8、样式

可以为help lines预设局部的样式,后面直接调用,此时你要把它放方括号里。

[help lines/.style={color=blue!50,very thin}]

也可以设定全局样式

\tikzset{help lines/.style=very thin}

按如下方式调用预设样式:

\tikzset{Karl's grid/.style={help lines,color=blue!50}}
...
\draw[Karl's grid] (0,0) grid (5,5);

还可以把它当函数,给它设置参数(甚至可以设定默认参数),参数之间用逗号分隔。

[Karl's grid/.style ={help lines,color=#1!50},
Karl's grid/.default=blue]
\draw[Karl's grid] (0,0) grid (1.5,2);
\draw[Karl's grid=red] (2,0) grid (3.5,2);

样式常常很多,导致预设样式的代码可能会比正式画图代码还要长。

9、绘图选项

color=<color>指定颜色;
line width=<width>指定线宽,可以是 p t , c m , m m pt, cm, mm pt,cm,mm这些单位;
当然也可用一些字符串来指定线宽,从粗到细排序:ultra thick>very thick>thick>semithick>thin>very thin>ultra thin,默认线宽是thin

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

在这里插入图片描述
似乎线宽变细了后,就不大能分得清每种线条了?
还有一种option是dased/dotted,画出来就是虚线和点线,每种都有密集、正常、稀疏三种样式。

\begin{tikzpicture}
	\draw [densely dashed] (-1.8,-1.4)--(1.,1.4);
	\draw [dashed] (-1.4,-1.4)--(1.4,1.4);
	\draw [loosely dashed] (-1,-1.4)--(1.8,1.4);
	\draw [densely dotted] (1,-1.4)--(3.8,1.4);
	\draw [dotted] (1.4,-1.4)--(4.2,1.4);
	\draw [loosely dotted] (1.8,-1.4)--(4.6,1.4);
\end{tikzpicture}

在这里插入图片描述

10、画弧(Arc Path)

基本语法:<a> arc [start angle=<alpha>, end angle=<beta>, radius=<r>]
其中,a是圆弧的起点坐标,alpha beta分别是起终点的极角(假如直角坐标的原点是极坐标的极点),r是弧半径

We will work on this:
\begin{tikzpicture}
	\draw [gray,very thin,step=.5] (-1.4,-1.4) grid (1.4,1.4);
	\draw (-1.5,0)--(1.5,0);
	\draw (0,-1.5)--(0,1.5);
	\draw (0,0) circle [radius=1];
	\draw (.3,0)arc[start angle=0, end angle=30, radius=.3];
\end{tikzpicture}

在这里插入图片描述
可能你会觉得这个图太小了,跟字母比起来,那么我们可以用[scale=3]来按比例放大三倍
P.S.当然你可以直接\draw[scale=3],后面跟上画图命令,但是这么做很麻烦,每一个\draw都要放大,为了方便,我们可以对整个tikzpicture环境按比例放大

We will work on this:
\begin{tikzpicture}[scale=3]  % 指定放大倍数
	\draw [gray,very thin,step=.5] (-1.4,-1.4) grid (1.4,1.4);
	\draw (-1.5,0)--(1.5,0);
	\draw (0,-1.5)--(0,1.5);
	\draw (0,0) circle [radius=1];
	\draw (.3,0)arc[start angle=0, end angle=30, radius=.3];
\end{tikzpicture}

在这里插入图片描述
如果是画椭圆弧,我们就需要指定“两个半径”了,一个是半长轴,一个是半短轴。

We will work on this:
\begin{tikzpicture}[scale=3]
	\draw [gray,very thin,step=.5] (-1.4,-1.4) grid (1.4,1.4);
	\draw (-1.5,0)--(1.5,0);
	\draw (0,-1.5)--(0,1.5);
	\draw (0,0) circle [radius=1];
	\draw (0.,0.)arc[start angle=0, end angle=330, x radius=.3, y radius=.6];
\end{tikzpicture}

在这里插入图片描述

11、线条裁剪(Clipping a Path)

需要使用到\clip命令,用法和\draw一致,只是不画图而已。
比如裁剪出一个矩形:

We will work on this:
\begin{tikzpicture}[scale=3]
	\clip (-0.2,-1) rectangle (1,1); 
	\draw [gray,very thin,step=.5] (-1.4,-1.4) grid (1.4,1.4);
	\draw (-1.5,0)--(1.5,0);
	\draw (0,-1.5)--(0,1.5);
	\draw (0,0) circle [radius=1];
	\draw (0.3,0.)arc[start angle=0, end angle=30, radius=.3];
\end{tikzpicture}

在这里插入图片描述
当然,我们也可以同时做“绘图”与“裁剪”。有三种方式
\clip[draw]\draw[clip]\path[clip, draw],为啥会有第三种方式呢,实际上我们做\clip时其实是在做\path[clip],而在做\draw的时候其实是在做\path[draw],故而两种一起做的时候当然可以把clip和draw都当成path的可选参数!

We will work on this:
\begin{tikzpicture}[scale=3]
	\draw[clip] (0.5,0.5) circle [radius=1.4];
	\draw [gray,very thin,step=.5] (-1.4,-1.4) grid (1.4,1.4);
	\draw (-1.5,0)--(1.5,0);
	\draw (0,-1.5)--(0,1.5);
	\draw (0,0) circle [radius=1];
	\draw (0.3,0.)arc[start angle=0, end angle=30, radius=.3];
\end{tikzpicture}

看起来是不是就像从一个窗户或放大镜里看东西一样~
在这里插入图片描述
注意\clip命令只对在其之后的绘图操作裁剪,在其之前的绘图是不裁剪的,见下例。

We will work on this:
\begin{tikzpicture}[scale=3]
	\draw (-1.5,0)--(1.5,0);\draw (0,-1.5)--(0,1.5); % 第一步画两条交叉线
	\clip (-0.2,-1) rectangle (1,1); % clip第二步进行
	\draw (0,0) circle [radius=1];
	\draw [color=gray,step=.5,very thin] (-1.4,-1.4) grid (1.4,1.4);
	\draw (.3,0) arc [start angle=0,end angle=30,radius=.3];
\end{tikzpicture}

在这里插入图片描述
我们发现,第一步画的两条交叉线没有被裁掉!如果我们最后一步才使用\clip命令,可想而知不会起任何效果。

12、抛物线(Parabola)和正(Sine)/余(Cosine)弦曲线

A parabola: \tikz{\draw [gray,step=.5](0,0) grid (2,4) (0,0) parabola (2,4)}
A sine and cosine: \tikz{\draw (0,0) rectangle (1.57,1) (0,0) sin (1.57,1) (0,1) cos (1.57,0)} curve

在这里插入图片描述

13、填充(Filling)与绘图

以填充扇形为例说明基本语法:\fill[<color>] <a> -- <arc> -- cycle,其中a为任一点,arc为一段弧。例如,我们想填充那个用于标记角的圆弧。

\begin{tikzpicture}[scale=3]
	\clip (-0.1,-0.2) rectangle (1.1,0.75);
	\draw [gray,very thin,step=.5] (-1.4,-1.4) grid (1.4,1.4);
	\draw (-1.5,0)--(1.5,0);
	\draw (0,-1.5)--(0,1.5);
	\draw (0,0) circle [radius=1];
	\fill[green!20!white] (0,0)--(0.3,0.)arc[start angle=0, end angle=30, radius=.3]--cycle;
\end{tikzpicture}

其中,green!20!whitexcolor宏包中的一种颜色表示方法,意思是20%绿色,80%白色混合成的颜色。\fillcycle结尾构成封闭图形,这是推荐的方法,其实也可以用(0,0)作为\fill的结尾,但是这样在某些情况下无法平滑连接,如:
在这里插入图片描述
当然啦,如同裁剪与绘图可以同时进行,填充与绘图也可以同时进行哦。但是又和之前有点点不一样,因为这次要用到新命令\filldraw,在可选参数中,我们可以分别用fill关键字和 draw关键字指定填充颜色和线条颜色。

\begin{tikzpicture}[scale=3]
	\clip (-0.1,-0.2) rectangle (1.1,0.75);
	\draw [gray,very thin,step=.5] (-1.4,-1.4) grid (1.4,1.4);
	\draw (-1.5,0)--(1.5,0);
	\draw (0,-1.5)--(0,1.5);
	\draw (0,0) circle [radius=1];
	\filldraw[fill=green!20!white,draw=green!50!black] (0,0)--(0.3,0.)arc[start angle=0, end angle=30, radius=.3]--cycle;
\end{tikzpicture}

这样就能画出带有轮廓的扇形啦~
在这里插入图片描述

14、明暗(Shading)

设置明暗变化,可以使图形更美观(fancy)。

\begin{tikzpicture}[rounded corners,ultra thick]
	\shade[top color=yellow,bottom color=black] (0,0) rectangle +(2,1);
	\shade[left color=yellow,right color=black] (3,0) rectangle +(2,1);
	\shadedraw[inner color=yellow,outer color=black,draw=yellow] (6,0) rectangle +(2,1);
	\shade[ball color=green] (9,.5) circle (.5cm);
\end{tikzpicture}

在这里插入图片描述
我们想要使得小扇形出现明暗变化,只要用\shadedraw取代\filldraw就可了

\begin{tikzpicture}[scale=3]
	\clip (-0.1,-0.2) rectangle (1.1,0.75);
	\draw [gray,very thin,step=.5] (-1.4,-1.4) grid (1.4,1.4);
	\draw (-1.5,0)--(1.5,0);
	\draw (0,-1.5)--(0,1.5);
	\draw (0,0) circle [radius=1];
	\shadedraw[left color=gray,right color=green,draw=green!50!black] (0,0)--(0.3,0.)arc[start angle=0, end angle=30, radius=.3]--cycle;
\end{tikzpicture}

在这里插入图片描述
限于篇幅,上篇内容至此完结,后续内容请看下篇

  • 8
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值