如何使用多张 TikZ 图片加速 LaTeX 编译?

如何使用多张 TikZ 图片加速 LaTeX 编译?

最慢的部分是十几个图表TikZ.

答案1

阅读第 52 节“外部图形”PGF 手册v3.1.9a

答案2

成为你的朋友!

这个问题很久以前就解决了,所以让我们利用 Unix 给我们提供的所有优秀工具吧!

对于大型文档,我能想到的最佳解决方案就是根本不要在文档中包含任何\begin{tikzpicture}\tikz宏,然后执行一切\includepdf

为此,我制作了一个 makefile(用于 GNU Make),它看起来(我的意思是,看起来– Makefile 是老的技术——太老了,制表符实际上是重要的语法......)有点像我的一个项目:

TIME     = /usr/bin/time -p
LATEXMK  = latexmk -silent -f -g --pdf
PDFLATEX = pdflatex -interaction=batchmode
PDFCROP  = pdfcrop
RM       = /bin/rm

default : Project.pdf

StandAloneGraphicsTeXFiles = $(wildcard *_sag.tex)

PDFGraphics = $(patsubst %_sag.tex,%_sag.pdf,$(StandAloneGraphicsTeXFiles))

InputTeXFiles = $(wildcard *_input.tex)

%_sag.pdf : %_sag.tex
        $(PDFLATEX) $< 
        $(PDFCROP) $@ $@

Project.pdf : $(PDFGraphics) $(InputTeXFiles) Project.tex
        $(TIME) $(LATEXMK) Project.tex

clean : .PHONY
        $(RM) -f -- *.aux *.bak *.bbl *.blg *.log *.out *.toc *.tdo _region.*

depclean : clean
        $(RM) -f -- *_sag.pdf

distclean : depclean
        $(RM) -f -- Project.pdf

.PHONY :

我如何使用它?!

每当您使用tikzpicture环境或\tikz宏时,请为您的图片起一个暗示性的名称,例如riemann_sum,将 TikZ 代码放在一个独立的文档中(带有一些样板,使其与您的主文档的样式相匹配。例如,我们不希望在主文档使用 Times 排版或 10pt/12pt 字体大小冲突时,我们的图片中使用 Computer Modern)调用riemann_sum_sag.tex并使用\includepdf{riemann_sum_sag}。目标是在运行时不编译单个图片make而不修改*_sag.tex文件。如果这是不可能的,因为您需要\ref图片中的某些内容,那就这样吧,但尽量将其保持在最低限度,而是选择好的标题或其他内容。

您还会注意到,有一个文件匹配规则*_input.tex。这是为了将项目拆分为多个文件,这在进行大型项目时当然总是一个好主意。该规则检测此类文件是否已被修改,如果已修改,则触发文档的重新编译。LaTeX 的\includeonly功能可能与此相得益彰。

答案3

您可以尝试创建一个预编译前言(Wayback 机器快照)或文档的“格式”。该技术基本上缓存了 LaTeX 在处理前言(即之前的内容)时进行的所有计算\begin{document}。如果您的包、宏定义等没有改变,它可以节省大量时间。

更新

刚刚注意到对 TikZ 的引用-在这种情况下斯科特的建议是最切题的。

更新 2:

mylatex格式包可以帮助创建和使用格式文件。


也可以看看使用 LuaTeX 的预编译前言来加速编译

答案4

我使用纯 XeTeX ,因此 TikZ 手册中描述的外部化对我来说不起作用。但我找到了一种加快编译速度的巧妙方法。

就像 Andrew 在他的回答中展示的那样,我将图形拆分到它们自己的.tex文件中,这样我就有了maindocument.texmaindocument-figs.tex。在里面maindocument-figs.tex,我确保两个 TeX 文件之间的字体、基线跳跃等是相同的。然后我在文件中使用一个简单的宏-figs.tex

\def\minpage#1{\setbox0\hbox{#1}\dimen0=\ht0\advance\dimen0 by\dp0%
  \special{papersize=\the\wd0,\the\dimen0}\box0\eject}

这将生成一个包含我输入内容的页面,其大小与内容大小相同(或多或少)。不过会有一些额外的空间,需要通过

\voffset=0pt\hoffset=0pt
\advance\voffset by-1in\advance\hoffset by-1in

现在,我这样做之后\minpage{\tikzpicture ... \endtikzpicture},我将获得一个 PDF,其中每个文件都\minpage在各自的页面上。

然后就maindocument.tex事物而言,我还有另一个简单的宏:

\newcount\figcount
\def\fig#1{%
  \global\advance\figcount by1
  \topinsert
    \centerline{\XeTeXpdffile "maindocument-figs.pdf" page\the\figcount}
    \smallskip
    \centerline{Figure \the\figcount:\enspace\it #1}
  \endinsert
}

现在,每当我想要一个数字时,我只需写下\fig{The caption of the figure.}

当然,如果我对-figs.tex文件进行了更改,则需要重新编译该文件以及该maindocument.tex文件。


我意识到问题标题专门询问有关 LaTeX 的问题,但在问题主体中,速度变慢归因于使用 TikZ,所以我希望我可以分享我的经验,即使不是使用 LaTeX。

相关内容