最初感受到在 LATEX 中插图是一个问题,是在我刚学习 LATEX 的时候。注意本文所谈论的插图,指的是由数据生成的图,比如曲线图 (line plot)、散点图 (scatter plot)、柱状图 (bar plot)等,不包括数字图像、扫描的位图等。
当时我在Visio中画了一个图,需要在其中加上特别的字符,须与论文中利用 LATEX 命令产生的字符一致。在Visio中找不到那个字符,我也向周围的好多人请教,也没有答案。到现在我才有一个清晰的答案。Visio中画出的图,用术语来说称为Drawing,不属于本文讨论的对象。我只是把它作为引子,引起大家的重视,不要把在 LATEX 的插图问题想象的太简单。
向 LATEX 文档中插入数据图的方法可以分为两种:一是利用专门的软件生成一定格式的数据图,然后将该图导入到 LATEX 中,常用的格式有pdf和eps;另外一种是由 LATEX 引擎本身产生,所利用的包为pgfplots。我们可以将上述两种方法分别称为外部图法、内部图法。
外部图法使用的比较广泛,其产生早于内部图法。现在还有好多人倾向于使用该法。只要你对产生外部图的专门工具比较熟,那就使用外部法,没必要为了插图而专门学习内部图法,因为pgfplots有自己的语法格式,这就相当于又学习了一门语言。而内部图法也有自己的优势,那就是产生的图与最终的文档紧密结合,不产生中间格式的图片文件,占用的磁盘空间小,支持在数据图中加入任何 LATEX 提供的特别字符。内部图法的特殊字符支持这一个优势特别好,因为 LATEX 可以说是支持显示特殊字符的最好的语言,没有之一,其他专门产生外部图的语言所支持的特殊字符根本没法语 LATEX 相比。在读一些论文中,我也发现,论文中正文的一些特殊字符是很规范的希腊字符,而相应的图片中的字符却变成了罗马格式的字符。这样让整个论文的看起来不协调,影响了论文的质量。作者本人肯定也知道这个问题,可能是苦于没有好的解决办法,或者没有进一步深究该问题。该论文发表的档次也不低。而内部图法则很多解决了特殊字符显示的问题。
显然,产生外部数据图的那些语言也在发展,好多已经将 LATEX 的产生特殊字符的语法融合了进来,例如,Matlab、R语言等,这样就扩大了它们各自的使用范围。至于Python语言支不支持 LATEX 的特殊字符语法,我没有去了解。这是一个可喜的发展,能让我们在绝大部分情况下得到需要的图。注意,Matlab、R和Python都能产生pdf、eps格式的图形,使用起来也方便。数据图重要的是先要有数据,通常情况下,有了原始数据后往往还需要进一步的处理,从中再产生一些新的数据信息。在这种情况下,外部图法就体现出它的优势了。Matlab、R、Python等本身就一种功能强大的编程语言,它们都具备强大的数据运算能力,因此,利用这几种语言产生数据图前,你可以加入自己想要的运算,然后在生成最终的数据图。整个过程一气呵成,比较顺畅。但是,这不能成为否定内部图法的一个借口。你可以利用Python等语言将原始数据运算成自己需要的最终数据,再将最终数据交给 LATEX 画,这也能达到同样的效果。这看起来好像多了一道,具体采用哪种方法,就只能取决于作者个人的偏好了。
我赞赏内部图法的简洁优雅、协调一致,也惊叹外部图法的方便灵活,功能强大。完成同一个任务存在着方法的多样性,这就是整个世界丰富多彩的原因。最终方法的选定由用户来定。
我的建议是:只要能满足自己的需求,就采用外部法;当个别情况不满足时,才去求助于内部图法。
这要使用包pgfplots,看代码示例1:
\usepackage{pgfplots}
\usepackage{tikz}
\begin{tikzpicture}
\begin{axis}[width=8cm, height=6cm, tick align=outside]
\addplot[draw=blue] coordinates {(0,1) (1,1) (2,3) (3,2) (4,2)};
\addlegendentry{Line 1}
\addplot[draw=red] coordinates {(0,0) (1,4) (2,4) (3,3) (4,3)};
\addlegendentry{Line 2}
\end{axis}
\end{tikzpicture}
这里举一个R语言产生eps格式图的例子。利用R语言产生eps图有两种方法:一种方法比较简便,在所产生的图上面点击右键,然后再点击save as postscript…,最后就产生了eps 格式的文件,如下图:
另一种方法为:
>postscript("xx.ps")
>画图代码
>dev.off()
就会生成一个图片文件xx.ps。
有了外部图片文件,接下来就可以使用 LATEX 代码将其载入了。载入代码想必对 LATEX 熟的人都知道,但为了本文的完整性,给出加载外部图片的代码,如下:
\usepackage{graphicx}
...
\begin{figure}[tbp]
\centering
\includegraphics{xx.eps}
\caption{Sysu logo}
\end{figure}