当绘制的数据文件发生变化时,是否可以使用TikZ
/external
库并重新pgfplots
创建图形?假设我有类似以下内容:
file.tex
:
\documentclass{article}
\usepackage{tikz,pgfplots}
\usetikzlibrary{external}
\pgfplotsset{compat=newest}
\tikzexternalize
\newcommand{\figFilename}{}
\begin{document}
\begin{figure}[t]
\centering
\renewcommand{\figFilename}{thePlot}
\tikzpicturedependsonfile{\figFilename.tikz}
\tikzsetnextfilename{\figFilename}
\input{\figFilename.tikz}
\caption{The caption.}
\end{figure}
\end{document}
thePlot.tikz
:
\begin{tikzpicture}
\begin{axis}[
xlabel={$x$},
ylabel={$y$},]
\addplot+[only marks,mark=x]
table[x=x,y=y] {data.dat};
\end{axis}
\end{tikzpicture}%
data.dat
:
x y
0 20.44
1 20.06
2 19.76
3 19.54
4 19.40
5 19.34
如果我更改thePlot.tikz
,external
库将检测到该图不再是最新的并重新创建它。当任何绘制的数据文件也发生变化时,是否可能产生相同的效果?我尝试了类似的东西,\tikzpicturedependsonfile{data.dat}
但它不起作用。无论如何,这不是一个理想的解决方案,因为大多数时候我在每个图中使用许多数据文件,手动列出所有依赖文件会比收益更痛苦。
那么,是否有一种简单、自动化的方法让external
库检查其中包含的所有数据文件tikzpicture
,并在其中至少有一个发生变化时重新创建图表?
答案1
编辑2
我已向 PGF CVS 提交错误修复。
编辑
尽管我保证它可以起作用,但在您声明它不起作用之后,我还是仔细研究了它。
答案可能是“它曾经可以工作”——但是现在,由于外部库中存在两个相关错误,它无法正常工作。
外部库似乎覆写\tikzpicturedependsonfile
如果在外部化的图片环境之外遇到依赖关系。
您的出现\tikzpicturedependsonfile
导致了此失败(请注意,您必须将其移至下方\tikzsetnextfilename
)。一种解决方案是将此依赖项语句移至thePlot.tikz
,即移至环境主体中。但在您这样做之前,让我强调一下,如果您有一个不错的 PGF 版本(比 pgf 2.10 更新),则此特定代码行是多余的:PGF 自动检测图片环境内部的变化并自动重新编译外部文件。
如果您使用 PGF 2.10:将您的依赖声明移到环境中tikzpicture
,thePlot.tikz
这样就没问题了。
如果您使用较新的 PGF 版本(即不稳定的 PGF 版本):它包含另一个相关错误,该错误也会覆盖依赖文件。在这种情况下:按照上一段进行操作,但也要调用\tikzexternalize[up to date check=simple]
外部化语句 - 这将停用最新检查。
我将修复 PGF 中的两个错误,并在更新完成后在此处发布更新。此错误修复(希望)将允许您使用我最初的回答中概述的开箱即用的两个所需功能(见下文)。
提及/要求的功能
- 如果环境内容
tikzpicture
发生变化,则重新编译外部化 PDF - 如果包含的数据文件的内容
data.dat
发生变化,则重新编译外部化的 pdf
已经可用。第一项开箱即用,当且仅当您拥有比 2.10 更新的 PGF 版本时(正如您已经提到的;我只是想在这里强调这一点)。
第二点只有在使用 时才有效\tikzexternalize[mode=list and make]
。只要你这样做,它就可以立即使用,因为只要执行 ,就会pgfplots
始终调用。\tikzpicturedependsonfile{<filename>.<ext>}
\addplot table {<filename>}
\tikzpicturedependsonfile
目前,除非您使用,否则外部库将被忽略mode=list and make
。
请注意,这make
正是您在这里想要的:您有一系列文件作为依赖项,并且每当其中一个文件比其他文件更新时,您就需要执行几个“目标”。