7. 绘图功能

第七章 绘图功能

除了排版文字,LaTeX 也支持用代码表示图形。不同的扩展已经极大丰富了 LaTeX 的图形功能,TikZ 就是其中之一。本章将带你了解一些基本的绘图功能。

一些特殊的绘图,如交换图、树状图甚至分子式和电路图也能够通过代码绘制,不过其复杂程度已经超出本手册的范围,有兴趣的读者可以查阅一些帮助文档,或者在互联网寻求帮助。

7.1 绘图语言简介

LaTeX 提供了原始的 picture 环境,能够绘制一些基本的图形如点、线、矩形、圆、Bezier曲线等等,不过受制于 LaTeX 本身,它的绘图功能极为有限,效果也不够美观。

当前较为流行的、用于 LaTeX 的绘图宏包 / 程序主要有:

  • PSTricks 以 PostSciprt 语法为基础的绘图宏包,具有优秀的绘图能力。它对老式的 latex+dvips 编译命令支持最好,而现在的几种编译命令下使用起来都不够方便。

  • TikZ & pgf 德国的 Till Tantau 教授在开发著名的 LaTeX 幻灯片文档类 beamer 时一并开发了绘图宏包 pgf,目的是令其能够在 pdflatex 或 xelatex 等不同的编译命令下都能使用。 TikZ 是在 pgf 基础上封装的一个宏包,采用了类似 METAPOST 的语法,提供了方便的绘图命令,绘图能力部署 PSTricks。

  • METAPOST & Asymptote METAPOST 脱胎于高纳德为 TEX 配套开发的字体生成程序 METAFONT ,具有优秀的绘图能力,并能够调用 TEX 引擎向图片中插入文字和公式。Asymptote 在 METAPFONT 的基础上更进一步,具有一定的类似 C 语言的编程能力,支持三维图像的绘制。

它们作为独立的程序,通常的用法是将代码写在单独的文件里,编译生成图片供 LaTeX 引用,也可以借助特殊的宏包在 LaTeX 代码里直接使用。

本手册将介绍 TikZ 绘图宏包里最基础的部分。TikZ 还支持各种自定义的扩展,基于 TikZ 的专门用途的绘图宏包也不胜枚举,其复杂程度已远远超出入门手册的范围(TikZ 的帮助文档有上千页之厚)。对此感兴趣的读者需要自行查阅帮助文档,或者到互联网上参考现成的范例。

7.2 TikZ 绘图语言

在导言区调用 tikz 宏包,就可以用以下命令和环境使用 TikZ 的绘图功能了:

\tikz[_]<tikz code>
\tikz[_]{<tikz code 1>};<tikz code 2>;…}
\begin{tikzpicture}[…]
<tikz code 1>;
<tikz code 2>;
…
\end{tikzpicture}

前一种用法为 \tikz 带单条绘图命令,以分号结束,一般用于在文字之间插入简单的图形后两种用法较为常见,使用多条绘图命令,可以在 figure 等浮动体中使用。

7.2.1 TikZ 坐标和路径

TikZ 用直角坐标系或者极坐标系描述点点位置。

  • 直角坐标下,点的位置写作(,),坐标 可以用 LaTeX 支持的任意单位表示,却省为 cm:
  • 极坐标下,点的位置写作 (<θ>:)。θ 为极角,单位是度。

我们还可以为某个点命名:\coordinate(A)at()然后就可以使用(A)作为点的位置了。

\begin{tikzpicture}
\draw (0,0) -- (30:1) ;
\draw (1,0) -- (2,1) ;
\coordinate (s) at (0,1) ;
\draw (s) -- (1,1) ;
\end{tikzpicture}

坐标的表示形式还包括 “垂足” 形式:

\begin{tikzpictuer}
\coordinate (S) at (2,2) ;
\draw[gray] (-1,2) -- (S) ;
\deaw[gray] (2,-1) -- (S) ;
\draw[red] (0,0) -- (0,0,-|S) ;
\draw[bule] (0,0) -- (0,0 |- S)  ;
\end{tikzpicture}

TikZ 最基本的路径为两点之间连线,如(),()–(),可以连用表示多个连线(折线),连续使用连线时,可以使用 cycle 令路径回到起点,生成闭合的路径。

\begin{tilzpicture}
\draw (0,0) -- (1,1) -- (2,0) --cycle ;
\end{tikzpicture}

多条路径可用于同一条画图命令中,以空格分隔:

\begin{tikzpicture}
\draw (0,0) -- (0,1)
             (1,0) -- (1,1)-- (2,0) --cycle;
\end{tikzpicture}

其它常用的路径还包括:

  • 矩形、圆和椭圆:
\begin{tikzpicture}
\draw (0,0) rectangle (1,5,1) ;
\draw (2,5,0,5) circle [radius=0.5] ;
\draw (4,5,0,5) ellipse
    [x radius=1,y radius=0.5] ;
\end{tikzpicture}

  • 直角、圆弧、椭圆弧:

\begin{tikzpictrue} \draw (0,0) |-(1,1) ; \draw (1,0) -| (2,1) ; \draw (4,0) arc (0:135:1) ; \draw (6,0) arc (0:1351: and 0.5) ; \end{kizepicture}

  • 正弦、余弦曲线(1/4周期):
\begin{tikzpicture}
\draw (0,0) |- (1,1) ;
\draw (1,0) -| (2,1) ;
\draw (4,0) arc (0:135:1) ;
\draw (6,0) arc (0:135:1 and 0.5)
\end{tikzpicture}

  • 抛物线,用 bend 控制顶点:
\begin{tikzpicture}
\draw (0,0) parabola (1,2) ;
\draw (2,0) parabola
    bend (2.25,-0.25)  (3,2) ;
\draw (4,0) parabola
    bend (4.75, 2.25) (5,2) ;
\end{tikzpicture}

  • 二次和三次 Bezier 曲线,分别使用一个和两个控制点:
\begin{tikzpicture}
\draw (0,0)  .. controls
    (2,1) and (3,1)  .. (3,0) ;
\draw (4,0) .. controls
    (5,1)  .. (5,0) ;
\draw[help lines] (0,0)
    -- (2,1) -- (3,1) -- (3,0)
    (4,0) -- (5,1) -- (5,0) ;
\end{tikzpicture}

  • 网格、函数图像,网络可用 step 参数控制王哥大小,函数图像用 domain 参数控制定义域:
\begin{tikzpicture}
\draw[help lines,step=0.5]
            (-1,-1) grid (1,1);
\draw[->] (-1.5,0) -- (1.5,0) ;
\draw[->] (0,-1.5) -- (0,1,5) ;
\draw[domain=-1:1]
            plot(\x,{\x*\x*2 -1});
\end{tikzpicture}