考虑以下 MWE。如果\tikzpicturedependsonfile
注释掉,代码将按预期运行。创建了,表明对A.dep
的依赖关系。现在,让我们尝试将 tikz 源文件添加为依赖项。A.pdf
A.dat
A.tikz
但是,如果\tikzpicturedependsonfile
代码中包含了,那么\tikzsetnextfilename
就不会产生任何效果,而是main-figure0.pdf
会创建 来代替A.pdf
。
梅威瑟:
\documentclass{report}
\usepackage{tikz,tikzscale,pgfplots,pgfplotstable}
\pgfplotsset{compat=1.7}
\usetikzlibrary{external}
\tikzexternalize[mode=list and make]
%
\begin{filecontents}{A.tikz}
\begin{tikzpicture}
\begin{axis}
\addplot [] table [header=false] {A.dat};
\end{axis}
\end{tikzpicture}
\end{filecontents}
%
\begin{filecontents}{A.dat}
1 1
2 2
\end{filecontents}
%
\begin{document}
\newcommand{\figFilename}{}
\renewcommand{\figFilename}{A}
\tikzsetnextfilename{\figFilename}
\tikzpicturedependsonfile{\figFilename.tikz}
\input{\figFilename.tikz}
\end{document}
此活动的目的是将 的源文件 ( A.tikz
)tikzpicture
以及默认添加的数据文件 ( A.dat
) 添加到依赖项中。一旦完成此操作,每次编辑 tikzpicture 时,它都会自动重新编译。
答案1
这是外部库中的一个错误(存在于 PGF 2.10 和 pgfplots 1.7 附带的副本中)。
我已经修复了它;它将包含在下一个 PGF 版本中。更新的副本也随 pgfplots 版本一起提供(前提是您说的\usepgfplotslibrary{external}
是 tikz 版本)。
该错误的影响是“获取下一个文件名”会重置 (a) 已设置的值\tikzsetnextfilename
和 (b) 的值export next
。
如果你等不及了,一个解决办法似乎是\tikzsetnextfilename
后你的台词是\tikzpicturedependsonfile
。
答案2
原因与您的另一个问题相同(tikzscale 和 \tikzsetnextfilename 不能一起工作),每次调用 后,文件名都会被全局重置\tikzexternalgetnextfilename
。在这种情况下,这样的调用是由 进行的\tikzpicturedependsonfile
。这肯定是 TikZ 中的一个错误!
解决方法(\tikzpicturedependsonfile
如果调用则重置名称\tikzexternalgetnextfilename
):
\documentclass{report}
\usepackage{tikz,pgfplots,pgfplotstable}
\pgfplotsset{compat=1.7}
\usetikzlibrary{external}
\makeatletter
\def\tikzpicturedependsonfile@ACTIVE#1{%
\begingroup
\tikzexternalgetcurrentfilename\tikzpicturedependsonfile@name
\ifx\tikzpicturedependsonfile@name\pgfutil@empty
\tikzexternalgetnextfilename\tikzpicturedependsonfile@name
\expandafter\tikzsetnextfilename\expandafter{\tikzpicturedependsonfile@name}
\fi
\expandafter\tikzexternalfiledependsonfile\expandafter{\tikzpicturedependsonfile@name}{#1}%
\endgroup
}%
\makeatother
\tikzexternalize[mode=list and make]
%
\begin{filecontents}{A.tikz}
\begin{tikzpicture}
\begin{axis}
\addplot [] table [header=false] {A.dat};
\end{axis}
\end{tikzpicture}
\end{filecontents}
%
\begin{filecontents}{A.dat}
1 1
2 2
\end{filecontents}
%
\begin{document}
\newcommand{\figFilename}{}
\renewcommand{\figFilename}{A}
\tikzsetnextfilename{\figFilename}
\tikzpicturedependsonfile{\figFilename.tikz}
\input{\figFilename.tikz}
\end{document}