最慢的部分是十几个图表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.tex
和maindocument-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。