todonotes 通过外部化破坏​​了 pgfplots 和 tikz spy

todonotes 通过外部化破坏​​了 pgfplots 和 tikz spy

我想在使用 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包。

或者,也可以使用\tikzifexternalizingMax Snippe 在评论中所建议的命令:

\tikzifexternalizing{%
  \renewcommand\pgfsyspdfmark[3]{}%
}{}

相关内容