我想在使用 pgfplots、tikz spy 和 tikz external 的文档中使用 todonotes。不幸的是,todonotes 破坏了 pgfplots 图形的布局,如下例所示:
\documentclass{article}
\usepackage{tikz}
\usepackage{todonotes}
\usepackage{pgfplots}
\usepackage{lipsum}
\usepackage{xpatch}
\usetikzlibrary{external}
\usetikzlibrary{spy}
\tikzexternalize
[
mode=list and make,
% Does not help
optimize command away={\todo}{1},
]
% Disable externalization for \todo in order to avoid compilation errors.
\xpretocmd\todo{%
\bgroup\tikzexternaldisable
}{}{}
\xapptocmd\todo{%
\egroup
}{}{}
\begin{document}
\begin{figure}[tb]
\centering
\begin{tikzpicture}
[
spy using outlines={%
connect spies,
rectangle,
}
]
\begin{axis}
[
xmin=0,xmax=320,
ymin=0,ymax=300,
]
\coordinate (spyat) at (292,223);
\coordinate (magat) at (150,90);
\end{axis}
\spy[thick] on (spyat) in node at (magat);
\end{tikzpicture}
\end{figure}
% Adding todo does not work
\lipsum\todo{foo}\lipsum
% Works!
%\lipsum\lipsum
\end{document}
避免布局损坏的一种方法是不使用外部化todonotes
或完全禁用外部化。但后者不是一个选择。
还有其他方法可以解决这个问题吗?
答案1
回答我自己的问题。\pgfsyspdfmark
写入.aux
文件似乎要对布局损坏负责。因此,在外部化文档中禁用它的使用,如下所示
\ifthenelse{\equal{\tikzexternalrealjob}{\pgfactualjobname}}{}{%
\renewcommand\pgfsyspdfmark[3]{}%
}
解决了问题。此检查需要该ifthen
包。
或者,也可以使用\tikzifexternalizing
Max Snippe 在评论中所建议的命令:
\tikzifexternalizing{%
\renewcommand\pgfsyspdfmark[3]{}%
}{}