跳至内容
Topos Uranos

摘要

本课讲授如何用 TikZ 在文档内部绘图。它说明在 LaTeX 中绘图能得到什么(正文的字体与公式、无损缩放、在源代码中修改、版本控制)、要付出什么代价,以及什么时候更适合从 R 或 Python 导出图表;它说明,在 babel 模块会把某些符号变成活动简写的语言中(例如西班牙语),TikZ 需要它自己的 babel 库,否则第一个箭头就会引发一连串错误;它介绍 tikzpicture 环境和 \tikz 命令、直角坐标、极坐标和相对坐标,以及路径(线段、矩形、圆、圆弧和曲线);它逐一讲解线条选项和 arrows.meta 库的箭头;它讲授节点:有名称的节点、锚点,以及用 positioning 库相对放置的节点;它用自定义样式固定记法;它用 \foreach 处理重复;它绘制流程图、受力图、概念树、句法树和函数图像,并提醒 plot 以度为单位计算角度;它介绍用于数据图的 pgfplots;它把图放进浮动体,并比较三种缩放方式;最后讲常见错误、编译时间和应当避免的做法。

学习目标

  1. 能够有理有据地判断一幅图应当用 TikZ 绘制、用 pgfplots 绘制,还是从数据分析程序中导出。
  2. 能够为使用 TikZ 的文档准备导言区,并说明何时以及为何需要 babel 库。
  3. 能够用绝对坐标、极坐标和相对坐标绘图,并预测一串带 + 和 ++ 的坐标所画出的路径。
  4. 能够用有名称的节点、positioning 库和只定义一次的自定义样式组合出示意图。
  5. 能够把图放进带图题和标签的浮动体,在缩放时预见文字会如何变化,并根据日志诊断常见错误。

为什么要在 LaTeX 中绘图

前面几课插入的是在文档之外制作的图片。用 TikZ 画的图则不同:它以命令的形式写在源代码里,由引擎像排版正文一样排版。由此带来四个好处。第一是排版的统一:图中标注使用与正文相同的字体和字号,标注里的公式与讨论它的段落中的公式完全一致。第二是无损缩放:结果是矢量图,放大时不会出现像素。第三是图在源代码中修改:改一个标注或移动一个点,只是改一行,不必回到绘图软件,也不必寻找原始文件。第四是图与正文一起进行版本控制,因为它本身就是文本:它与正文在同一个文件、同一份备份、同一段修改历史中。

不过,这些好处是有代价的。TikZ 是一门有自己语法的语言,手册超过一千页;在绘图软件中用鼠标一分钟就能画好的图,在这里第一次可能要花半个小时。因此需要区分情况。示意图、框图和几何图形由少量带标注的形状组成,是 TikZ 的天然领地。数据图则更适合用 pgfplots 来画(它建立在 TikZ 之上,在本课末尾介绍);如果数据是在 R 或 Python 中分析的,就用分析数据的同一个程序来画:图表导出为 PDF,按照讲图片的那一课插入,从而与产生它的数据和分析保持联系。这两种语言还都能把图表写成供 LaTeX 使用的代码(R 中的 tikzDevice 宏包,Python 中 matplotlib 的 PGF 输出),使标注采用文档的字体。