当数据文件改变时重新创建图表

当数据文件改变时重新创建图表

当绘制的数据文件发生变化时,是否可以使用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.tikzexternal库将检测到该图不再是最新的并重新创建它。当任何绘制的数据文件也发生变化时,是否可能产生相同的效果?我尝试了类似的东西,\tikzpicturedependsonfile{data.dat}但它不起作用。无论如何,这不是一个理想的解决方案,因为大多数时候我在每个图中使用许多数据文件,手动列出所有依赖文件会比收益更痛苦。

那么,是否有一种简单、自动化的方法让external库检查其中包含的所有数据文件tikzpicture,并在其中至少有一个发生变化时重新创建图表?

答案1

编辑2

我已向 PGF CVS 提交错误修复。


编辑

尽管我保证它可以起作用,但在您声明它不起作用之后,我还是仔细研究了它。

答案可能是“它曾经可以工作”——但是现在,由于外部库中存在两个相关错误,它无法正常工作。

外部库似乎覆写\tikzpicturedependsonfile如果在外部化的图片环境之外遇到依赖关系。

您的出现\tikzpicturedependsonfile导致了此失败(请注意,您必须将其移至下方\tikzsetnextfilename)。一种解决方案是将此依赖项语句移至thePlot.tikz,即移至环境主体中。但在您这样做之前,让我强调一下,如果您有一个不错的 PGF 版本(比 pgf 2.10 更新),则此特定代码行是多余的:PGF 自动检测图片环境内部的变化并自动重新编译外部文件。

如果您使用 PGF 2.10:将您的依赖声明移到环境中tikzpicturethePlot.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正是您在这里想要的:您有一系列文件作为依赖项,并且每当其中一个文件比其他文件更新时,您就需要执行几个“目标”。

相关内容