原来数模和 ACM 本不是一个级别的。

数模,三人一队,十天一题。

原本我是学计算机的,谁曾想到那两人 MATLAB 倒也丝毫不落下风,因此我只能回到了自己的老本行——LaTeX 写文档了。写文档当然要涉及到图表、公式、参考文献等等。因此我顺便进一步熟悉了下 Linux 环境下绘图工具的使用。

简单的说,绘图工具分为两类,一类是 CLI 的,另一类是 GUI 的。两种工具也大体代表了不同的理念,前者是 WYTIWYG(What You Think Is What You Get),所思即所得,后者是 WYSIWYG(What You See Is What You Get),所见即所得。具体到应用上,前者以 TeX 派系为代表,后者以 MS Word 派系为代表。

我们先说第一类。和 TeX 配合的绘图工具,我了解的有四个:

  1. MetaPost
  2. Asymptote
  3. PGF/TikZ
  4. PSTricks

前两者属于离线做图工具;后两者属于在线做图工具。可能你又会问,什么叫离线做图工具?什么又叫在线做图工具?

简单来说,离线做图就是单独建立文件,然后生成 eps 等独立的图形文件,通过 \includegraphics 等类似的命令将图形文件嵌入到 LaTeX 文件中(这样说也许不妥,因为 LaTeX 文件经过不同处理可以生成多种类型的文件如 dvi、ps、pdf 等等,嵌入到 LaTeX 中意思是“图形”嵌入到生成的文件中)。MetaPost 和 Asymptote 属于这种。

在线做图就是直接在 TeX 文件中敲相应宏包的绘图命令,经过处理后直接生成图形。 PGF/TikZ 和 PSTricks 属于此类。两种方式并没有优劣之别。离线做图更灵活,在线做图则更加方便。

从历史上来说,MetaPost和 PSTricks 历史更长久一点,而 Asymptote 和 PGF/TikZ 则相对年轻。

语法上,MetaPost 比较怪异;Asymptote 的语法仿照 C++(可见 C++ 确实是王道 ^_^); PGF/TikZ 我用过一段时间,感觉比较乱,毫无章法;PSTricks 基于 PostScript,据说比较强大,但是我没用过,不好评价。

能力上,各有所长,MetaPost 可以解方程;Asymptote的 3d 不错;PGF/TikZ 生成一些特殊的图如自动机、MindMap 等效果非常好;PSTricks,不知道了。其实我觉得四者精通其一即可“纵横天下”。

这里附上一些 Gallery,做图能力强弱,大家自己分明:

  1. MetaPost – gallery1
  2. Asymptote – gallery1
  3. PGF/TikZ – gallery1, gallery2
  4. PSTricks – gallery1, gallery2

上两张图,来猜猜是用什么画出来的。不要告诉我是 Photoshop、Inkscape 哦。

以上是基于 CLI 派基于 TeX 的绘图工具。除此之外,Graphviz 也是非常有用的一个小工具。与 MetaPost 等重量级的工具相比,Graphviz 的长处在于轻便灵活。短短几句话可以生成多种格式的文件。他自创了一种 dot language,并且自动提供了几种 layout 算法。 Graphviz 尤其适合画流程图和类图,可以看看它的 gallery。著名的源码文档工具 doxygen 生成类图时调用的就是 Graphviz。而且 Graphviz 还提供了 Python 语言的调用接口 pygraphviz

提到这里,也就不能不提到 Emacs 了。说 Emacs 是神的编辑器,此言一点也不为过。 Gentoo:

dot 语言的语法非常简练,看看我简单探索的成果:

graphviz-dot-mode ,快捷键:

  • C-c c – compile,根据你想要的 layout,输入相应的编译命令
  • C-c p – preview,预览图片效果。期间遇到了一个问题,用 dot 生成嵌入中文的 ps 或eps文件时,在 Emacs 中预览是正常的,但是嵌入到 LaTeX 文件中就会出现乱码,这可能是文字编码之前。

还有两个工具:

可以将 Graphviz 的 dot 文件转换为 TeX 兼容的格式,直接嵌入 TeX 文件中,具体我就没有用过了。

最后一个推荐的 CLI 派的绘图干将就是 gnuplot 了。gnuplot 主要擅长数学数据的可视化,结合 MaximaOctave 等等可以形成一套完备的 CAS 系统。而且据我所知,gnuplot 本身也是支持 MetaPost 接口导出的。这是 gnuplot 的 gallery,看看什么叫数学之美。

说了这么多废话,第一类总算数的差不多了。接下来再简单数数第二类。基于 GUI 的画图工具,汗牛充栋,大块的如 GIMP、Inkscape 等,做尔等工作,牛刀杀鸡也。

还是一些小工具来得实惠。首先推荐的当然是大名鼎鼎的 Dia 了。引用其官方主页上的介绍:

Dia is a gtk+ based diagram creation program released under the GPL license.

Dia is inspired by the commercial Windows program 'Visio', though more geared towards informal diagrams for casual use. It can be used to draw many different kinds of diagrams. It currently has special objects to help draw entity relationship diagrams, UML diagrams, flowcharts, network diagrams, and many other diagrams. It is also possible to add support for new shapes by writing simple XML files, using a subset of SVG to draw the shape.

It can load and save diagrams to a custom XML format (gzipped by default, to save space), can export diagrams to a number of formats, including EPS, SVG, XFIG, WMF and PNG, and can print diagrams (including ones that span multiple pages).

有趣的是,Dia 还支持 PGF/TikZ、MetaPost、PSTricks 导出。所以把 Dia 当成信手涂鸦工具,导入 TeX 文件中,倒会给一向严谨的 TeX 添点趣味。

最后一个小工具,类似于 Windows 下的几何画板,顺手画一些几何图形还是非常赞的,这就是 Geogebra。我非常赞赏的两点是:

  • 像 AutoCAD 一样,具有命令行模式,既能精确控制,又能随手泼墨
  • 也支持多种格式的导出,如 MetaPost 和 PGF/TikZ 格式

好了,这么晚了,说了这么多废话,但愿说者无意、听者有心。安。