LaTeX插入其他PDF中的矢量图

引子:矢量图

$\LaTeX$的使用者,常常会遇到插入图表的情形。TikZ是非常常用的图表工具,但是用TikZ绘图的难度可能比较高,有些时候,诸如Matlab,pyplot之类的工具可能用起来会更加方便。

一个解决方法是导出成png。png算是最通用的,也是支持特性最多的图像格式。相比于jpg等格式,其支持透明背景的特性能够更好地在高级排版中运用。

但是png格式有一个问题。其储存的图像是以标量图的形式展现的。这就导致其经不起放大。远看PNG图像没有什么问题,但放大之后就会出现锯齿。下面这张图就展现了标量图和矢量图放大后的效果。

Scale sample

标量图与矢量图

至于什么是标量图,什么是矢量图,这要从图像的存储结构说起。具体的实现会比较复杂,我们就从他们是怎样显示的,简要对比其中的区别。

你的显示屏,其实是由很多个像素点构成的长方形点阵。如果你凑近看,你能看见色彩斑斓的像素点。每个像素点上显示什么,是由你的显示卡来处理生成的。很容易就能够想到,这种点阵上,不同斜率上的点的距离是不同的。比如45度的斜线,他的点之间的距离就是横向和纵向排列的1.4倍。而如果是更普遍的角度,可能整个显示屏上都不存在能排列在同一条直线上的点。这样的绘图方式对于人眼是难以接受的。

因此,我们采用了一些近似的算法,来让线条看上去是那样的。如果你玩过旧主机,或是像素风的游戏,就能够体会到这一点。当代的算法会高级许多,通过插值模拟的方法,这些算法能让你的显示看起来更平滑。比如你的显示器上的14号字abc,他放大10倍之后,和140号字相比,是这个样子的。

Font shape compare

标量图的原理和显示屏相同。他们储存的是点阵。计算机在显示标量图的时候,因为不清楚图像的实际内容是怎么产生的,因此只能以上图左边的形式,把像素放大到你需要的大小。

而矢量图则不同。矢量图存储的是一系列描述如何显示你需要的图像的指令。计算机直接向图形卡发送绘图的指令,因此图形卡能够直接按照你的显示器尺寸绘制响应的图形。比如你计算机上安装的字体,就是一种矢量图。上面的图片右边的abc看起来很好看,但如果你把这张图放大,最后也能看见像左图一样的插值色块。但文字‘abc’,你把网页缩进到再大,换再高清的屏幕,显示效果都是同样地好。因为你无论如何缩进,文字都是由图形卡来绘制的。而图形卡的高级特性,能够使你看见其设计上最清晰的内容。

我把标量图分辨率调高,不就行了吗?

这又是另一个问题。调高图片的分辨率,看上去显示效果很好,但这样的图形缩小后的显示效果不太好。同样,因为不清楚图像的实际内容是怎么产生的,对于更小的像素,也只能够通过平均的方法来展示。这样的展示方式通常情况下问题不大,但仍然会出现模糊、虚化的问题。尤其在字体上。上图的两个文字,你如果走远一点,或把眼睛眯起来看,就会发现他们的形状是有差异的。

就算你经过精心选择,找到了完美的图片分辨率(比如说直接截屏),打印的效果也与显示不同。

就算是很好的显示屏,比如15英寸4K屏,每一个英寸中能排列的像素点也不到300个。而以笔者20年前的激光打印机为例,每个英寸都能打印1200个像素点。这种素质称为DPI/PPI,是由设备的特性决定的。打印机同样是一种显示设备,不过他将内容显示到纸张上。因为显示原理上的不同,打印机能够很高效地提高显示的素质,而显示屏则受制于屏幕与半导体技术。你会发现,打印机打出来的字几乎像是从模子里印出来的一样,就是这个原理。


因此,能够使用矢量图的时候,就尽量不使用标量图,是每一个使用$\LaTeX$,对排版有着高标准的人都应该具备的策略。

很多图表工具,比如Matlab,pyplot,都能够将结果以矢量图的形式输出。目前笔者常用的是eps格式,不需要额外调包,而且调节大小都支持。eps,即封装PostScript。PostScript是一种打印机图形描述文件,但支持这种文件的打印机很少,使其真正广泛应用的则是PDF,PostScript的后继者。

这就出现了一个问题。其他的PDF里面也有我需要的矢量图,如何将其截取出来呢?截屏显然是一个错误答案。

从PDF中导出图形eps

这里需要使用一个工具:Inkscape。Inkscape是绘制矢量图的开源工具,支持多种平台。

安装后新建文档,选择导入:

Inkscape import

打开需要截取的PDF,找到有需要的图形的那一页,进行导入。如果你的电脑字体安装不全,建议使用从Poppler/Cairo导入。

Import options

选取需要的图形后,使用编辑-反选,并删去其他页面上的内容。

Final figure

选择文件-另存为,文件格式选择eps格式。文字输出选项可以自行调节。

Output word config

这样需要的图形就被导出为eps格式了。如果你选择了“创建LaTeX文件”选项,还会有一个eps_tex后缀的文件生成。这种方式可以使用LaTeX来处理图形中的字体。

导入LaTeX

前者可以直接用\includegraphics导入。例如:

1
2
3
4
5
6
7
8
9
10
% \usepackage{graphicx}
% \usepackage{transparent}
% \usepackage{color}

\includegraphics{example.eps}

\begin{figure}
\includegraphics[width=0.6\textwidth]{example.eps}
\caption{Example} \label{example}
\end{figure}

如果你输出的是eps_tex文件,那么导入的方式需要更改。

1
2
3
4
5
6
7
8
9
10
11
% \usepackage{graphicx}
% \usepackage{transparent}
% \usepackage{color}

\input{example.eps_tex}

\begin{figure}
\def\svgwidth{0.6\textwidth}
\input{example.eps_tex}
\caption{Example} \label{example}
\end{figure}

Ads by Google

Read our privacy policy on how these personalized advertisements are delivered to you.

For your reading experience, we provide full-text RSS feeds. Although math formulas cannot be displayed well, the interface can be adjusted as you like and there are no ads.