tikzexternalize 似乎尊重本地定义。例如,
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{external}
\tikzexternalize
\begin{document}
\tikzset{every picture/.style={red}}
\begin{tikzpicture}
\draw (0,0) rectangle (1,1);
\end{tikzpicture}
\end{document}
按照预期将正方形绘制为红色。tikzexternalize 是如何做到这一点的?如果我查看输出,我会看到
\write18 enabled.
entering extended mode
===== 'mode=convert with system call': Invoking 'pdflatex -shell-escape -halt-o
n-error -interaction=batchmode -jobname "...-figure0" "\def\tikzex
ternalrealjob{...}\input{...}"' ========
我的 tex 文件的名称在哪里...
。因此 latex 似乎在同一个文件上被调用,然后一些魔法似乎确保 latex 只输出有问题的图片。但它是否必须在此之前处理所有代码?我想是的,但这比在图片出现之前实际编译所有页面要快得多。
有人可以澄清一下吗?
编辑:tikzexternaize 实现这一目标的机制是否难以理解?例如,是否可以定义一个myexternalize
与 tikzexternalize 相同的环境tikzpicture
,但针对一般内容?
答案1
Qrrbrbirlbel 的评论正确解释了正在发生的事情。为了证明这一点:
\documentclass{article}
\usepackage{tikz}
\usepackage{shellesc}
\usetikzlibrary{external}
\tikzexternalize
\begin{document}
\begin{tikzpicture}
\ShellEscape{sleep 5s}
\draw (0,0) rectangle (1,1);
\end{tikzpicture}
\tikzset{every picture/.style={red}}
\begin{tikzpicture}
\draw (0,0) rectangle (1,1);
\end{tikzpicture}
\end{document}
保存到a.tex
,删除所有辅助文件(包括a-figure0.pdf
等),然后pdflatex -shell-escape a.tex
。
编译大约需要 5 秒钟,后续编译大约需要 0 秒钟。这意味着在处理第二幅图像时不会处理 5 秒的休眠时间。
另一方面,如果它被移到外面......
\documentclass{article}
\usepackage{tikz}
\usepackage{shellesc}
\usetikzlibrary{external}
\tikzexternalize
\begin{document}
\begin{tikzpicture}
\draw (0,0) rectangle (1,1);
\end{tikzpicture}
\ShellEscape{sleep 5s}
\tikzset{every picture/.style={red}}
\begin{tikzpicture}
\draw (0,0) rectangle (1,1);
\end{tikzpicture}
\end{document}
这大约需要 15 秒,如果所有图形都已生成,则大约需要 5 秒。
无论如何,关键点在于加速是通过跳过tikzpicture
环境主体来实现的,这是 TikZ 的环境,因此可以控制。不需要魔法。
另一方面,这意味着其他环境例如tabular
不会被跳过。你可以自己尝试一下。