如何在LaTeX中使用TikZ绘图的简明教程

这个简明教程主要是教大家使用强大的LaTeX宏包TikZ来绘制工作生活中需要的一些示意图。

首先需要设置好LaTeX的环境,然后在.tex文件的preamble中加入\usepackage{tikz},接着在正文中就可以插入TikZ的代码了。TikZ可以以两种方式加入到文中,可以用inline式的代码绘制正常文本上的overlay,也可以用\begin{tikzpicture}...\end{tikzpicture}这个环境来单独绘图(本文主要介绍此种方法)。

现在我们就用例子来进行学习吧。如果需要改进例子为自己所用,你还需要参考TikZ&PGF的最新版说明

例子1:画图的workflow

这里推荐首先在一个独立的.tex文件中把图片画好,然后再将所需之代码复制粘贴至正文即可。

\documentclass{minimal}
\usepackage{tikz}
\usetikzlibrary{positioning}
% 绘图所需的TikZ子库
\usepackage[active,tightpage]{preview} 
% 用了preview之后你生成的pdf文件都可以直接用`\includegraphics`命令加入文本中
\PreviewEnvironment{tikzpicture}
\setlength\PreviewBorder{2mm} % 边距
\begin{document}
\begin{tikzpicture}

这个例子介绍三种画矩形的方法;首先TikZ默认会有一套2D坐标系,在下面(0.2,0.4)就是表示点的位置

\node (rect) at (0,0) [draw, thick, fill=orange, fill opacity=0.7,
minimum width=1cm,minimum height=4cm] {$Y$};

第一种方法,\node一个通用的命令,你可以在后面的[]中画任何预先定义好的形状, (rect)是给这个node取的名字,draw是指边框,thick是指边框的粗细,fill=orange是指在这个边框围起来的部分填入橙色,fill opacity是指橙色透明度如何,width和height是长宽;前面有minimum表示如果后面{ }中的公式占空间太大的话,你的矩形可以自动改变大小。

\node at (1,0) {$=$};

\draw[thick] (1.5,-2) rectangle (3.5,2); 
\fill[blue, opacity=0.3] (1.5,-2) rectangle (3.5,2); 

第二种方法则比较手动,\draw命令指定从(1.5,-2)到 (3.5,2)画一个矩形,后面的\fill命令来决定填什么颜色。

\draw[thick, fill=blue, fill opacity=0.3] 
(1.5,-2) -- (1.5,2) -- (3.5,2) -- (3.5,-2) -- cycle; 

这是和第二种方法同样画在同一个地方的矩形;只是这次人工指定了每个顶点的位置;最后的--cycle--(1.5,-2)是等价的;而且填色的部分是直接作为\draw命令的选项来设置的。

\node at (2.5,0) {$\Psi$};
\tikzstyle{greenrect} = [rectangle, draw, fill=green!50, fit=#1];
\coordinate (A) at (4,1);
\coordinate (B) at (5,-1);
\node[greenrect={(A) (B)}] {}; 
\node at (4.5,0) {$\beta$};

\end{tikzpicture}
\end{document}

第三种方法使用了TikZ的fit库,有兴趣的同学可以去参考TikZ最新版说明。 效果如图: 例1

这个例子结束之后有一个小tip:每一个TikZ命令结束之后一定要加;,否则LaTeX编译器会无法识别。

例子2:箭头

这个是复分析路径积分的示意图。需要加入TikZ的几个库\usetikzlibrary{decorations,arrows}\usetikzlibrary{decorations.markings}。例子如下

\begin{tikzpicture}
\draw[style=help lines,step=1cm] (-2.3,-2.3) grid (2.3,2.3);

\draw[->,very thick] (-2.8,0) -- (2.8,0) node[right] {$x$};
\draw[->,very thick] (0,-2.8) -- (0,2.8) node[above] {$y$};

\tikzset{->-/.style=
{decoration={markings,mark=at position #1 with 
{\arrow{latex}}},postaction={decorate}}}
\draw[thick,->-=0.5](2,0) -- (0,2);
\draw[thick,->-=0.5](0,2) -- (-2,0);
\draw[thick,->-=0.5](-2,0) -- (0,-2);
\draw[thick,->-=0.5](0,-2) -- (2,0);

\filldraw[fill= blue!50,opacity=0.3] (2,0) -- (0,2) -- (-2,0) -- (0,-2) -- cycle;
\filldraw[fill= white,opacity=1] (-1,0) circle (0.3);

\draw[thick, decoration={markings, mark=at position 0.3 
with {\arrow{latex reversed}}}, postaction={decorate}] (-1,0) circle (0.3);

\node[above] at (1.2,1){$C$};
\node[above] at (-1,0.3){$C'$};
\end{tikzpicture}

效果如下图: 例子2

例子3:函数图像

\begin{tikzpicture}
\draw[very thin,color=gray] (-0.1,-1.1) grid (3.9,8.1);
\draw[->,thick] (-0.5,0) -- (4,0) node[right] {$x$};
\draw[->,thick] (0,-1.2) -- (0,8.2) node[above] {$y$};

\draw[domain=0:3] plot (\x,{\x*\x-1}) node[below right] {$y = x^2-1$};
\draw[domain=0:3] plot (\x,{exp(-\x*\x/2)}) node[below right] {$y = e^{-x^2/2}$};
\end{tikzpicture}

上面面这段命令用\drawplot自命令绘制了$x^2-1$和$e^{-x^2/2}$这两个函数的图像。之后的node[above]node[below right]指出在函数图旁边建立node用来填写函数的表达式。 效果如下图: 例子3

例子4:给一些样本点,画一个区域(光滑度可调节)

\begin{tikzpicture}
\draw[thick]  plot [smooth,tension=0.8] 
coordinates {(-3,0.8) (-1.5,3.2) (1.8,2.8) (3.1,0.8)
(2.5,-2.2)  (0.2,-1.5) (-3,-3.5) (-3,0.8)};

\node at (1.6,1.6){$\Omega$};
\end{tikzpicture}

上面的代码画了一个比较光滑的区域$\Omega$示意图(如下): 例41

这是在上面介绍过的plot自命令中加入smooth选项和tension参数的结果,如果把tension调节成0.2,则会变成这样: 例子42

而干脆去掉smooth和tension参数,plot会直接画一个经过这些给定坐标的多边形: 例子43

例子5:循环\foreach和三维坐标系统

\begin{tikzpicture}[x={(1cm,0.5cm)},z={(0cm,0.5cm)},y={(1cm,-0.2cm)}]
\draw[->,thick,black!70] (0,6.5,0) -- (6.2,6.5,0) node[right] {Frequency}; % 频率轴
\draw[->,thick,black!70] (0,0,0) -- (0,6.5,0) node[below right] {Time}; % 时间轴
\draw[->,thick] (0,0,0) -- (0,0,2) node[above] {Magnitude}; 

\foreach \n in {0.5,1.5,...,5.5}{
\draw [cyan!50, domain=0:2*pi,samples=200,smooth] 
 plot (\n,\x, {sin(4*\n*\x r)/\n });
\draw[blue, ultra thick] (\n,6.5,0) -- (\n,6.5,1/\n);
} % 频率逐渐增大振幅逐渐变小的正弦函数

\draw [red, thick, domain=0:2*pi,samples=200,smooth] 
plot (0,\x, {sin(4*0.5*\x r)/0.5 + sin(4*1.5*\x r)/1.5 + sin(4*2.5*\x r)/2.5 + sin(4*3.5*\x r)/3.5 + sin(4*4.5*\x r)/4.5 + sin(4*5.5*\x r)/5.5} ); 
% 最后是手动加起来得到矩形波的逼近
\end{tikzpicture}

\foreach命令就是TikZ中的for循环,比如\foreach \n in {0.5,1.5,...,5.5}这段命令就是让\n取到0.5到5.5之间间隔为0.5的数,然后代入取代后面plot命令中的\n

效果如下图: 傅里叶变换

上面这些例子是笔者平时教学研究时候绘制的示意图,希望对大家学习TikZ有所帮助。最后要给大家介绍一个网站: http://www.texample.net/tikz/examples/ 有各式各样的例子,从三维的球极投影,曲面的三角化,费曼图,到制作日历,在beamer里面加入overlay等等。

Comments