我的问题非常类似这问题。我在图中标记了某条曲线,并放大了其中的一部分。该\spy
命令重复执行\label
,这会导致multiply defined
令人讨厌的标签警告。
链接问题中提出的解决方案不适用于我的示例,因为我无法命名以后可以参考的节点。
我怎样才能停止\spy
重复标签pgfplot
?
\documentclass{article}
\usepackage{tikz}
\usepackage{pgfplots}
\usetikzlibrary{spy}
\begin{document}
\begin{tikzpicture}[spy using outlines={circle, magnification=2, size=1cm,
connect spies}]
\begin{axis}
\addplot{x^2 - x +4};\label{plot:curve}
\end{axis}
\begin{scope}
\spy[green!30!black,size=1cm] on (3,.85) in node [fill=white] at (4,2);
\end{scope}
\end{tikzpicture}
\ref{plot:curve}
\end{document}
答案1
\label
每当 a依赖于要标记的项目的上下文时,就会出现问题。在这种情况下,pgfplots
提供自己的标签功能。这反过来最终归结为标准 LaTeX\label
命令。
标准 LaTeX 的\label
结果是\write{....}
(将一些内容写入文件.aux
)。
这\write
是与库结合的“问题” spy
:spy
库将其所有内容收集到一个 TeX 框中,并将其排版两次。A也是该框的一部分,每次使用该框时都会执行(据我所知和所见)。解决方案是在此上下文中\write
使用\immediate\write
而不是。\write
** 编辑:** 这个答案很草率;下面建议的解决方案可能休息链接:虽然我上面的分析似乎是正确的,但下面提出的解决方案可能没有我声称的那么有用。昨天晚上晚些时候,我没有想到最重要的问题:为什么有人推迟写入吗!?当然,他这样做是因为标签机制用于在标记项和引用之间建立联系。通常,这需要标记项排版的页码。而这又只能使用延迟写入来检索。
也许你仍然可以使用我的 pgfplots 破解方法,因为在那里,你不想知道页码 - 你想要小图例图像。那应该可以。但是,我的破解方法可能会(?)破坏超链接。
但解决方案显然是错误的对于其他任何情况\label
,因为它会破坏较大文档的页码信息。
自行承担使用风险。
您可以\write
按照以下示例临时替换该功能 - 并且它将起作用(对于每个\label
,而不仅仅是pgfplots
):
\documentclass{article}
\usepackage{tikz}
\usepackage{pgfplots}
\usetikzlibrary{spy}
\newenvironment{writereplace}{%
\begingroup
\let\writeold=\write
\def\write{\immediate\writeold}%
}{%
\endgroup
}%
\begin{document}
\begin{writereplace}
\begin{tikzpicture}[spy using outlines={circle, magnification=2, size=1cm,
connect spies}]
\begin{axis}
\addplot{x^2 - x +4};\label{plot:curve}
\end{axis}
\begin{scope}
\spy[green!30!black,size=1cm] on (3,.85) in node [fill=white] at (4,2);
\end{scope}
\end{tikzpicture}
\end{writereplace}
\ref{plot:curve}
\end{document}