覆盖 TikZ 外部化“最新”标志

覆盖 TikZ 外部化“最新”标志

我目前正在使用 TikZexternal包,以避免重新编译论文中的所有图形。有超过 50 个图形,依赖于大量数据,并且不进行外部化的完整构建需要几分钟才能运行。仅作为一些背景介绍,我使用 Latexmk 调用 xelatex 进行构建。

现在我的问题是,根据文档,如果满足以下条件,则文件被视为“最新的”文件:

最新性检查很简单:如果文件不存在,则它不是最新的。此外,如果 force remake 或 remake next 键之一为真,则该图不是最新的。在所有其他情况下,该文件都被视为最新。

我想更改文件的要求,使其保持最新状态。更具体地说,鉴于以下 MWE

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{external}
\tikzexternalize
\tikzsetexternalprefix{figures/cache/}
\begin{document}
\tikzsetnextfilename{circle}
\begin{tikzpicture}
  \draw (0,0) circle [radius=1];
\end{tikzpicture}
\end{document}

当前行为是,如果文件存在,则不重建图形figures/cache/circle.pdf。如果我对 tikz 源进行更改,例如\draw (0,0) circle [radius=2];,则不会重建图形。

现在,我\tikzset{external/remake next}在图形之前添加,运行 latexmk,等待外部化开始,然后快速注释掉强制重建(如果我不这样做,图形会在每次运行时重建,这会花费大量的构建时间)。

有没有办法告诉 tikz 仅当对图形源进行了编辑时才重建?

[作为奖励,当使用自定义格式时,这也应该有效external/system call,例如从 pdf 转换为 png]

答案1

截至 2012 年 5 月 17 日,该external库支持校验和检查以及基于差异的检查(撰写本文时的 CVS 版本)。

在此版本中,图片内容会与最近一次成功的图像外化状态进行比较。图片内容的更改将自动导致和的重新制作mode=list and makemode=convert with system call后者是系统默认的)。

初始设置将使用 MD5 校验和。如果 MD5 校验和不可用,它将自动回退到基于 diff 的检查。

请注意,文档序言中的更改仍然需要手动解决(通过重新制作所有受影响的图片)。

感谢您在此领域提出的(大量)功能请求。

答案2

编辑:此解决方案遵循 Martin Scharrer 的建议。由于 OP 使用 XeLaTeX,因此它不适合他。但它适合所有使用 pdfLaTeX 或 LuaLaTeX 的人。)

将您的 tikzpicture 放在外部文件中(例如,image.tex)并使用 filemod 包(来自 Martin Scharrer)来比较修改日期。

这是外部 tikzpicture 文件(image.tex)

\begin{tikzpicture}
\fill[green] circle[radius=1cm];
\end{tikzpicture}

主文档(main.tex):

\documentclass{article}

\usepackage{filemod}
\usepackage{tikz}
\usetikzlibrary{external}
\tikzexternalize[prefix=ext-tikz/]

\newcommand\autoupdateexternfigure[1]{
  \tikzsetnextfilename{#1}
  \filemodCmp{#1.tex}{ext-tikz/#1.log}%
  {\tikzset{external/force remake=true}\input{#1}}
  {\input{#1}}
}

\begin{document}
\autoupdateexternfigure{image}
\end{document}

编译主文档:

pdflatex -shell-escape main

答案3

以下是一些简化最新检查的内置方法的概述:

对于大型项目来说,这mode=list and make是最好的,并且它对最新检查的支持最多。考虑使用make(在 Linux 上:内置;在 Windows 上:更复杂;作为 cygwin 包的一部分提供)。

将其与Makefile类似内容相结合

all: pgfplots_talk_FTUG_2012.pdf

include pgfplots_talk_FTUG_2012.makefile

pgfplots_talk_FTUG_2012.makefile:
    pdflatex -shell-escape pgfplots_talk_FTUG_2012

pgfplots_talk_FTUG_2012.pdf: allimages FORCE
    pdflatex -shell-escape pgfplots_talk_FTUG_2012

clean:
    rm -f *.vrb *.toc *.nav *.out *.log *.aux *.snm *.pdf *.dep *.dpth *.djs *.figlist *.makefile tex3.tmp

FORCE:

为了获得一个简单的主要Makefile

优点:

  • Makefile运行主程序make -j 4将同时使用 4 个并发进程 - 从而使图像外部化的速度提高 4 倍。

  • 您可以依赖 来\tikzpicturedependsonfile{<filename>}添加文件依赖项。此功能目前仅适用于mode=list and make。然后,无论何时<filename>发生更改,都会重建相关图像。自动将其与和pgfplots结合使用。一种可能性是为每张图片使用单独的文件并相应地添加。\addplot table\addplot file.tex\tikzpicturedependsonfile

  • 此模式自动支持\label\ref

  • 不需要shell-escape

缺点:

  • 对于某些人来说,连续四个字符mak、会引起恐慌。如果您需要帮助,请告诉我们。e

  • 它分配了更多的\write寄存器。

独立于以下项的提示mode = list and make

  • 考虑使用\tikzsetfigurename{subsubsection_}(参见手册中的示例)。这样只需提供通用前缀即可重新制作完整部分的所有图形。

  • 在您的序言中使用\pgfkeys{/pgf/images/include external/.code={\href{file:#1}{\pgfimage{#1}}}}。这会为每个外部图形生成一个超链接 - 在任何像样的 pdf 查看器中单击超链接都会打开外部.pdf图形。此外,查看器喜欢xpdf显示文件名作为工具提示/状态栏。此信息可用于仅从磁盘中删除此文件并重新运行外部化。如果您遵循此提示,则在最终发布 pdf 之前,您不应忘记禁用外部化(或密钥)(查看 pgfplots 手册 - 偶尔,我忘记重新激活它 ;-) )

答案4

由于提问者使用 Latexmk,我想为 .latexmkrc 提供一种可能的配置:

add_cus_dep('tikz', 'pdf', 0, 'maketikz');

sub maketikz {
    system("pdflatex -shell-escape -halt-on-error -interaction=batchmode -jobname '$_[0]' '\\def\\tikzexternalrealjob{$rootfile_name}\\input{$rootfile_name}'");
}

-interaction请注意,和之间没有空格=batchmode,我只是无法修复标记(如果有人可以:请编辑并删除此句子)。此配置要求 tikzpicture 环境位于以 结尾的单独文件中tikz。通过调整 的第一个参数,也可以使用其他文件结尾add_cus_dep

该命令主要从外部库生成的 makefile 中复制而来。由于需要主文件的名称,因此使用 Latexmk 的变量 $rootfile_name,这是 latexmk 作者建议的約翰·柯林斯。他考虑记录这个变量。

已通过以下方式测试:

\usepgfplotslibrary{external}
\tikzexternalize[mode=list and make]

需要指出的是,这主要在一次只更改一个 tikzpicture 时有用,即在正常写作工作流程期间。如果必须(重新)生成所有图形,则应使用 makefile,因为它允许并行化。

相关内容