pgfplots:外部化和图例引用

pgfplots:外部化和图例引用

将 pgfplots 选项legend to name与外部化一起使用时会出现一些问题。当我禁用外部化时,一切正常。当我启用外部化时,我收到错误

! Undefined control sequence. 

l.1 ...every legend to name picture/.try]\pgfplots@legend@to@name 

并且我的文档无法编译。legend to name另一方面,如果没有该选项,外部化可以正常工作。我根据 使用了 pgfplots 1.5 版\pgfplotsversion。下面是一个简短的示例。

\documentclass{report}

% begin of externalization
\usepackage{pgfplots}
\usetikzlibrary{external}
\usepgfplotslibrary{external}
\tikzset{external/force remake}
\tikzexternalize
% end of externalization

\begin{document}

% example from manual, page 166
\pgfplotsset{footnotesize,samples=10}
\begin{center}% note that \centering uses less vspace...
\begin{tikzpicture}
\begin{axis}[
legend columns=-1,
legend entries={$(x+0)^k$;,$(x+1)^k$;,$(x+2)^k$;,$(x+3)^k$},
legend to name=named, % critical line
title={$k=1$}]
\addplot {x};
\addplot {x+1};
\addplot {x+2};
\addplot {x+3};
\end{axis}
\end{tikzpicture}
%
\begin{tikzpicture}
\begin{axis}[title={$k=2$}]
\addplot {x^2};
\addplot {(x+1)^2};
\addplot {(x+2)^2};
\addplot {(x+3)^2};
\end{axis}
\end{tikzpicture}
%
\begin{tikzpicture}
\begin{axis}[title={$k=3$}]
\addplot {x^3};
\addplot {(x+1)^3};
\addplot {(x+2)^3};
\addplot {(x+3)^3};
\end{axis}
\end{tikzpicture}
\\
\ref{named}
\end{center}
% end of example

\end{document}

我是否遗漏了什么?

答案1

该问题是由默认转换模式的缺陷引起的。

正如一些评论所解释的那样,禁用自动转换是解决问题的一种方法(比较 Hendrik 的好评)。

然而,小图例图片的图像外化可能,尽管不能通过默认的转换模式。

这是另一个允许外部化小图片的解决方案:

\ref手动(在这种情况下force remake需要禁用)或使用 调用图片命令的外部化mode=list and make

从我的角度来看,这种方法比局部禁用的外部化更可取——但是仅有的如果您愿意使用mode=list and makemake -f <texfile>.makefile转换您的图像。

如果您正在使用 Windows 或make -f <texfile>.makefile不想调用,则应该坚持 Hendrik 的答案。


为了记录和对技术感兴趣的观众,我将总结一下这里发生的事情:

  1. 正如“crossref 图片”的日志文件中所解释的那样,小\ref图片的自动外部化在默认转换模式下不起作用:
! tikz 包错误:抱歉,图像外部化失败:生成的图像为空。我尝试外部化“P-figure_crossref0”,但文档中似乎没有这样的图像!?  
   您当前正在使用“mode=convert with system call”。如果图像(或其前面的图像之一)在 \label{} 内声明(即在 .aux 文件中),则可能会发生此问题:“convert with system call”无法访问主 aux 文件。
   在这种情况下可能的解决方案:
   a)尝试使用“mode=list and make”,
   b) *手动*发出外部化命令“pdflatex -shell-escape -halt-on-error -interaction=batchmode -jobname "P-figure_crossref0" "\def\tikzexternalrealjob{P}\input{P}"”(也检查前面的外部化图像,文件名序列可能不正确)。
   重复:生成的图像为空,需要您的注意。

在您的示例中,我发出了 (b) 中显示的命令,并且它起作用了。

有关此问题原因的详细信息,请参阅 pgfplots 手册。

  1. 正如我们所见,默认转换模式失败。但如果force remake有效,则默认转换模式为总是即使您按照步骤 (b) 操作,也会应用。因此,您可以选择停用force remake或使用mode=list and make

答案2

快速简便的解决方案是使用\tikzexternaldisable和暂时禁用外部化\tikzexternalenable。因此应该这样写:

\tikzexternaldisable
\ref{named}
\tikzexternalenable

而不是简单地

\ref{named}

named标签对应的位置在哪里

legend to name = named,

在环境选项中axis,如本节所述 4.9.7 轴外的图例手册pgfplots

相关内容