tikzexternalize 如何工作?

tikzexternalize 如何工作?

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不会被跳过。你可以自己尝试一下。

相关内容