这个简明教程主要是教大家使用强大的LaTeX宏包TikZ来绘制工作生活中需要的一些示意图。
首先需要设置好LaTeX的环境,然后在.tex
文件的preamble中加入\usepackage{tikz}
,接着在正文中就可以插入TikZ的代码了。TikZ可以以两种方式加入到文中,可以用inline式的代码绘制正常文本上的overlay,也可以用\begin{tikzpicture}...\end{tikzpicture}
这个环境来单独绘图(本文主要介绍此种方法)。
现在我们就用例子来进行学习吧。如果需要改进例子为自己所用,你还需要参考TikZ&PGF的最新版说明。
画图的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}
% 你的绘图代码
\end{tikzpicture}
\end{document}
例子1:矩形
这个例子介绍三种画矩形的方法;首先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$};
第三种方法使用了TikZ的fit库,有兴趣的同学可以去参考TikZ最新版说明。 效果如图:
这个例子结束之后有一个小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}
效果如下图:
例子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}
上面面这段命令用\draw
的plot
自命令绘制了$x^2-1$和$e^{-x^2/2}$这两个函数的图像。之后的node[above]
和node[below right]
指出在函数图旁边建立node用来填写函数的表达式。
效果如下图:
例子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$示意图(如下:
这是在上面介绍过的plot
自命令中加入smooth选项和tension参数的结果,如果把tension调节成0.2,则会变成这样:
而干脆去掉smooth和tension参数,plot
会直接画一个经过这些给定坐标的多边形:
例子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