将 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 make
并make -f <texfile>.makefile
转换您的图像。
如果您正在使用 Windows 或make -f <texfile>.makefile
不想调用,则应该坚持 Hendrik 的答案。
为了记录和对技术感兴趣的观众,我将总结一下这里发生的事情:
- 正如“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 手册。
- 正如我们所见,默认转换模式失败。但如果
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
。