TikZ「标注」定位问题

TikZ「标注」定位问题

我最近刚刚升级了我的TeXLive版本20102011(操作系统版本 Ubuntu 10.10/Maverick 32 位和 Windows 7/64 位)。

This is pdfTeX, Version 3.1415926-2.3-1.40.12 (Web2C 2011)
(format=pdflatex 2011.8.10) 15 AUG 2011 09:34

为了测试新版本,我认为尝试编译一些旧文档是个好主意。一切都很顺利,直到我遇到一篇包含一些 TikZ 图形的论文,它产生了错误。经过一番调查,我发现问题是由 TikZ 的一些定位元素引起的。这是一个 MWE:

\documentclass{report}

\usepackage{tikz}
\usetikzlibrary{shapes.callouts}

\begin{document}
\begin{figure}[tb]
\begin{center}
\begin{tikzpicture}[remember picture, note/.style={rectangle callout, fill=#1}]
\draw [help lines] grid(3,2);
\node [note=red!50, callout relative pointer={(0,2)}] at (0,0) {Good};
\node [note=blue!50, callout relative pointer={(0,2)}] at (2,0) {Good};
%\node [note=blue!50, callout absolute pointer={(0,2)}] at (2,0) {Error};
\end{tikzpicture}
\end{center}
\end{figure}
\end{document}

上述代码是 TikZ 和 PGF 手册 2.10 版第 454 页(第二个示例)中的示例的稍微修改的版本。该错误是由注释行引起的。无论何时使用绝对定位,都会产生如下错误:

! Undefined control sequence.
\pgf@sh@bg@rectangle callout ...f@sh@np@\pgf@test 
                                              \noexpand \endcsname }\ede...
l.24 ...lute pointer={(0,1)}] at (1,0) {Absolute};

我将非常感激您的任何指点。谢谢。

答案1

更新:请参阅 Daniel 的回答标注和投影仪以获得更完整的补丁。


这似乎是 PGF 中的一个错误。查看 中的相关行pgflibraryshapes.callouts.code.tex,我看到以下代码:

%
% \pgf@test = the shape name (from \pgfmultipartnode)
%
\ifx\pgf@test\pgfutil@empty%
\else%
    %
    % Now hack an extra saved anchor \calloutpointeranchor,
    % with the new anchor for the callout pointer.
    %
    \edef\pgf@sh@@temp{\noexpand\expandafter\noexpand\pgfutil@g@addto@macro\noexpand\csname pgf@sh@np@\pgf@test\noexpand\endcsname}%
    \edef\pgf@sh@@@temp{%
        \noexpand\def\noexpand\calloutpointeranchor{%
            \noexpand\pgf@x\the\pgf@x%
            \noexpand\pgf@y\the\pgf@y%
        }%
    }%
    \expandafter\pgf@sh@@temp\expandafter{\pgf@sh@@@temp}%
\fi%

但是当我查看 的定义时,\pgfmultipartnode我找不到\pgf@test将 分配给形状名称的地方。相反,我找到了\def\shape@name{#1}% CJ。当我\pgf@test用替换\shape@namepgflibraryshapes.callouts.code.tex,我得到了似乎正确的行为。(这可能不是唯一需要修复的地方:\pgf@test在该库中又使用了几次;其他的没有记录,不需要修复代码。)

长期修复:在 PGF 错误跟踪器上报告此问题。

短期修复:复制将文件pgflibraryshapes.callouts.code.tex放到首先被读取的位置(texmf例如个人目录),并根据上述内容进行修改(即替换\pgf@test\shape@name)。

答案2

正如评论中指出的那样,一个永久的解决方案是将 TikZ 升级到 3.0 版本,无论是从他们的网站或者使用你的 tex 发行版的数据包管理工具。

如果你可以或者不想走那条路,我发现最简单的解决方案就是不被接受的答案相关问题(引用自回答上面)。诀窍是同时包含decorations.textTikZ 库,如下所示:

\usetikzlibrary{shapes.callouts}
\usetikzlibrary{decorations.text}

相关内容