我正在写一份包含大量数据点的图表的文档。许多图表已经完成,我不需要再修改它们了。由于我正在改进和修正文本,所以我需要经常重新编译。每次我必须重新编译时,所有的图表也会重新编译,这个过程需要大量时间。
有没有办法只编译一次图表,然后在后续编译中将它们包含在最终的 pdf 中?
答案1
是的,幸运的是,这是可行的!而且相当容易。
为此,Christian 创建了一个名为的库external
,该库已放入pgf
,tikz
包中并可通过该包访问。
无论如何,下面显示的也适用于在环境pgfplots
中排版的情况tikzpicture
。
它的作用如下:
检查是否找到与当前到达的图像相对应的图像文件:
- 如果找到图像,则检查图像代码是否已改变,如果没有,则插入图像。
- 如果找不到图像或图像代码已更改,请执行以下操作:
- 使用可执行文件调用新的 shell 并创建映像
- 在文档中插入图像
这意味着对于每个外部化的图像,您将获得一个新的编译文档,其中包含附加日志、辅助文件等。即许多新文件。重要的是要注意,由于pgf
使用图像代码的哈希值来检查是否需要重新创建图像,因此它无法确定前置代码或图像中其他地方的任何代码是否会更改生成的图像。所以有时删除图像可能是有利的。
最基本的示例如下:
\documentclass{article}
\usepackage{tikz}
% Load the library
\usetikzlibrary{external}
% Enable the library !!!>>> MUST be in the preamble <<<!!!!
\tikzexternalize
\begin{document}
\begin{tikzpicture}
\draw (0,0) -- (1,1);
\end{tikzpicture}
\end{document}
这将创建一个名为的附加文件。这是文件中<document name>-figure0.pdf
第一个出现的环境。tikzpicture
0
即使您重新排列环境,这也存在读取文件的缺点tikzpicture
。
为此,有一个命令:\tikzsetnextfilename
可用于强制以下tikzpicture
环境为特定文件名。
这可确保图形的正确加载顺序。我鼓励你在每张照片上都这样做。
例如这个:
% Default the externalized name to 'hello'
\tikzsetnextfilename{hello}
\begin{tikzpicture}
\draw[red] (0,0) -- (-1,1);
\end{tikzpicture}
最后,external
库会在当前目录中创建图像。这意味着你将拥有一个包含许多文件的非常混乱的文件夹(因为它编译了许多子仅包含图像的文档)。
绕过此问题的常用方法是将前缀目录添加到文件输出中。您可以使用以下命令执行此操作:\tikzsetexternalprefix
这很容易理解。下面是一个小例子:
\documentclass{article}
\usepackage{tikz}
% Load the library
\usetikzlibrary{external}
% Enable the library
\tikzexternalize
\begin{document}
% Default all images in the subfolder `figs/`
\tikzsetexternalprefix{figs/}
\begin{tikzpicture}
\draw[green] (0,0) -- (1,-1);
\end{tikzpicture}
% You are allowed to rearrange your images to separate folders
\tikzsetexternalprefix{figs/red/}
\begin{tikzpicture}
\draw[red] (0,0) -- (1,-1);
\end{tikzpicture}
\tikzsetexternalprefix{figs/blue/}
\begin{tikzpicture}
\draw[blue] (0,0) -- (1,-1);
\end{tikzpicture}
\end{document}
因此,这也可以用于按章节、风格等对图像进行排序......:)
否则,请在此处搜索external
标签,或查看手册。
一般来说,在执行操作之前删除所有外部图像是一个好习惯最终的编译。这可确保图像得到更新等。
答案2
您可以使用externalize
的库TikZ
,如的文档所pdfplots
建议的(7.1.1)。您必须将此代码添加到您的序言中,其他一切都应该自动运行:
\usepgfplotslibrary{external}
\tikzexternalize
这意味着每张图片只计算一次,并且构建的图像会被保存并在下次编译时重新使用。
如果你愿意的话,你甚至可以使用一个特殊的目录:
\tikzexternalize[prefix=tikzext/]
这会将所有计算的图像保存到路径tikzext/
为了externalize
工作,您需要启用 shell-escape ( write18
)。