使用 TikZ/Externalize 进行预编译的前言

使用 TikZ/Externalize 进行预编译的前言

我正在使用外化TikZ(库)的功能external,以加快我的 TikZ 图片的编译速度(如自动外部化 TikZ 图形的脚本)。

此外,我想通过预编译序言来加快编译速度。在http://magic.aladdin.cs.cmu.edu/2007/11/02/precompiled-preamble-for-latex/如何实现这一点。预编译头文件的命令是:

pdflatex -ini -job-name="main" "&pdflatex fmt.tex\dump"

其中fmt.tex包含 documentclass 和 package 声明,并且随后通过第一行将标题插入到文件中

%&fmt

这两种方法本身都很好用,而且速度也不错。现在,我尝试同时应用这两种方法。编译时,我得到了以下错误消息:

! Package tikz Error: Sorry, the system call 'pdflatex -shell-escape -halt-on-e
    rror -interaction=batchmode -jobname "figures/fmt-figure0" "\def\tikzexternalre
    aljob{fmt}\input{fmt}"' did NOT result in a usable output file 'figures/fmt-fig
    ure0' (expected one of .pdf:.jpg:.jpeg:.png:). Please verify that you have enab
    led system calls. For pdflatex, this is 'pdflatex -shell-escape'. Sometimes it 
    is also named 'write 18' or something like that. Or maybe the command simply fa
    iled? Error messages can be found in 'figures/fmt-figure0.log'. If you continue
     now, I'll try to typeset the picture.

注意:我已经使用该选项进行编译-shell-escape。此外,我还使用该选项预编译了标头。

最小工作(中断)示例:

fmt.tex - 标题

\documentclass{article} 
\usepackage{tikz}
\usetikzlibrary{external}
\tikzexternalize[prefix=figures/]

test.tex-主文件

%&fmt
\begin{document}
\begin{tikzpicture}
\node[draw, circle, minimum width=1cm] {};
\end{tikzpicture}
\end{document}

答案1

\tikzexternalize命令添加到动态的序言,一切都会好起来。

所以应该是:

fmt.tex - 标题

\documentclass{article} 
\usepackage{tikz}
\usetikzlibrary{external}

test.tex-主文件

%&fmt
\tikzexternalize[prefix=figures/]
\begin{document}
    \begin{tikzpicture}
        \node[draw, circle, minimum width=1cm] {};
    \end{tikzpicture}
\end{document}

答案2

其他答案对我不起作用,因为我无法评论,所以我这样做了:我-fmt=yourfmtfile在外部/系统调用选项中添加了一个选项。这是我的主文件的开头:

%&preamble
\usetikzlibrary{external}
\tikzset{external/system call={xelatex -fmt=preamble.fmt \tikzexternalcheckshellescape -halt-on-error -interaction=batchmode -jobname "\image" "\texsource"}}
\tikzexternalize

我正在使用 xelatex,但我猜测 pdflatex 也是一样的。

答案3

如果您需要在静态前导中调用 tikzexternalize(例如如果您有其他依赖于该宏),您可以执行以下操作之一:

  • 以项目作业名称命名格式文件,方法是运行

    pdflatex -ini -job-name="<yourJobNameHere>" "&pdflatex fmt.tex\dump"
    

    或者如果您不想在每次创建新项目时都重新编译前言,那么只需在工作目录中创建一个名为的符号链接,yourJobNameHere.fmt链接到文件main.fmt

  • 在动态前导中添加以下命令:

    \renewcommand{\tikzexternaljobname}{yourJobNameHere}
    

但是,根据您需要在预编译前言中写入的宏,第二种解决方案可能会导致问题。

相关内容