我目前正在使用 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 make
(mode=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
缺点:
对于某些人来说,连续四个字符
m
、a
、k
、会引起恐慌。如果您需要帮助,请告诉我们。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,因为它允许并行化。