5

LaTeX插入其他PDF中的矢量图

 2 years ago
source link: https://victrid.dev/2021/latex-cha-ru-qi-ta-pdf-zhong-de-shi-liang-tu/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

引子:矢量图

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导入。例如:

% \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文件,那么导入的方式需要更改。

% \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}

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK