我一直在网上阅读和收集来自多个来源的材料,关于外部化包含 TikZ 图片的文档需要哪些步骤,这些图片存储了对其图例的引用,legend to name=<name>
并使用\ref{<name>}
来在底部包含图例,例如groupplots
。
选项包括使用list and make
而不是convert with system call
,或者使用不外部化引用的技巧/技巧,方法是在序言中使用以下内容:
\pgfplotsset{
invoke before crossref tikzpicture={\tikzexternaldisable},
invoke after crossref tikzpicture={\tikzexternalenable},
}
由于我的文档包含 30 多个图形,而且我还没有找到一种方法来避免list and make
每次都重新生成图形(也需要两次传递!),所以我唯一的选择就是尝试“黑客”方法。下面是我所拥有的 MWE。
梅威瑟:
\documentclass{article}
\usepackage{tikz,pgfplots}
\usepgfplotslibrary{groupplots}
\usepgfplotslibrary{external}
\pgfplotsset{
compat=newest,
invoke before crossref tikzpicture={\tikzexternaldisable},
invoke after crossref tikzpicture={\tikzexternalenable},
}
% \tikzexternalize
\begin{document}
\begin{figure}[]
\centering
\begin{tikzpicture}
\begin{groupplot}[
group style={
group size=2 by 1,},]
\nextgroupplot[scale only axis,width=0.35\textwidth,height=0.35\textwidth,legend to name=grouplegend,]
\addplot
coordinates {(1,1) (2,2) (3,3)};
\addlegendentry{Legend 1}
\addplot
coordinates {(1,3) (2,2) (3,1)};
\addlegendentry{Legend 2}
\nextgroupplot[scale only axis,width=0.35\textwidth,height=0.35\textwidth]
\addplot
coordinates {(1,1) (2,2) (3,3)};
\addplot
coordinates {(1,3) (2,2) (3,1)};
\end{groupplot}
\node (legend) at ($(group c1r1.south)!0.5!(group c2r1.south)$)
[below, yshift=-3\pgfkeysvalueof{/pgfplots/every axis title shift}]
{\ref{grouplegend}};
\end{tikzpicture}%
\caption{The caption.}
\end{figure}
\end{document}
如果我使用 两次编译它pdflatex -shell-escape <file>
,则引用将被解析,并且图例将正确显示在两个图形的底部。同样,当list and make
使用 时,运行pdflatex -shell-escape <file>
和make -B -f <makefile>
两次也会解析引用。\tikzexternalize
但是,当使用 时,我找不到解析引用的正确命令序列。无论我运行 多少次pdflatex -shell-escape <file>
,引用仍未解析,图例显示“??”。
有人知道为什么序言中的技巧没有效果吗?我做错了什么吗?
答案1
事实上,没有处理外部化图像内部mode=list and make
的情况是外部库的一个错误。\ref
我已经在 PGF CVS 中修复了这个问题(现在)。
潜在的解决方法:
运行后make -f P.makefile
,下次运行 pdflatex 将导致日志消息
LaTeX Warning: External picture `P-figure0' contains undefined references on input line 36.
我想这是你唯一的机会:你可以生成一些简单的脚本来检查此消息。然后脚本可以删除受影响的 pdf 并重新运行 make。