我最近刚刚升级了我的TeXLive
版本2010 到2011(操作系统版本 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@name
时pgflibraryshapes.callouts.code.tex
,我得到了似乎正确的行为。(这可能不是唯一需要修复的地方:\pgf@test
在该库中又使用了几次;其他的没有记录,不需要修复这代码。)
长期修复:在 PGF 错误跟踪器上报告此问题。
短期修复:复制将文件pgflibraryshapes.callouts.code.tex
放到首先被读取的位置(texmf
例如个人目录),并根据上述内容进行修改(即替换\pgf@test
为\shape@name
)。