我有几个大型 TikZ 图想要外部化。如果不进行外部化,一切都会正常进行。
文档:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{external}
%\tikzexternalize
\begin{document}
\input{plot}
\end{document}
输出:
$ pdflatex article
<output omitted>
(./plot.tex) [1{/var/lib/texmf/fonts/map/pdftex/updmap/pdftex.map}]
(./article.aux) )</usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/
cmr10.pfb>
Output written on article.pdf (1 page, 357026 bytes).
Transcript written on article.log.
但是,当我取消注释时\tikzexternalize
,pdflatex
存在错误。
$ pdflatex article
<output omitted>
(./plot.tex
Runaway text?
[x=1pt,y=1pt] \definecolor {fillColor}{RGB}{255,255,255} \path [use a\ETC.
! TeX capacity exceeded, sorry [main memory size=5000000].
<argument> ... circle ( 1.16); \par \path [dr\ETC.
l.21034 \end{tikzpicture}
! ==> Fatal error occurred, no output PDF file produced!
Transcript written on article.log.
这是怎么回事?外部化怎么会增加空间消耗?毕竟,外部化的全部意义在于提高编译时的效率和空间消耗。
答案1
你说的没错:外部化的目的是为了减少资源使用。然而,每个优化都会有一些开销。要将图片外部化 Ti钾Z 读取整个环境的内容tikzpicture
,并将其传递给引擎的外部运行以生成图片。外部化库以宏的形式传递图片的内容,以便设置一切以制作图片,最终创建同一事物的多个副本。
当您编译文档时,会出现错误消息,询问Runaway text?
并告诉您 TeX 的内存已满。
你的plot.tex
文件是 1.1 MB,而 TeX 的主内存大小是5000000
“内存字数”,或者2.5 兆字节,因此只需复制两份多一点的文件内容就会耗尽空间。
解决方案?使用 TeX 的宏和 Ti钾Z 的样式可以减少输入的大小,同时保持代码的结果。例如,您的文件有 10269 个 (!) 实例
\path[draw=drawColor,line width= 0.4pt,line join=round,line cap=round]
如果你
\tikzset{mydots/.style={draw=drawColor,line width= 0.4pt}}
%,line join=round,line cap=round <-- These two don't do anything here anyway
然后将该选项列表的所有其他出现替换为,mydots
您将文件大小减少到 500 kB(足以使其工作)。
您可以进一步定义一个宏
\def\circ(#1,#2){\path[mydots](#1,#2)circle(1.16);}
然后替换所有
\path [mydots] ( something, another) circle (1.16);
经过
\circ(something,another)
这将使文件大小减小到 200 kB。
可以使用 Ti 进一步优化钾Z 的魔力,但我会把它留给读者作为练习;)
这是为您提供的 200 kB 文件:https://pastebin.com/rJfe4ctx
答案2
如果文档稳定并且您只会对其进行少量修改tikzpicture
,则最好将其处理在单独的文件中并将它们作为图像(或input
...)包含在内。ltximg
脚本您可以执行以下操作:
$ ltximg --subenv --imgdir=mypics --prefix=tkz -o test-out test-in.tex
现在您将拥有一个将环境转换为图像的文档tikzpicture
(保留字体的一致性),并且每个tikzpicture
环境也将位于单独的文件中(以防您需要进行一些额外的修改)。首先检查文档以查看输入文件必须满足的选项和条件。