我有一个正多边形,我想将节点定位在第一个角的上方,或者第 n 边的旁边。
这是我的示例:
\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{shapes.geometric,positioning}
\begin{document}
\begin{tikzpicture}
\node[draw, thick, minimum size=4cm, regular polygon,
regular polygon sides=5] (polygon) {};
\node[draw, above of=polygon] (a) {a};
\node[draw, left of=polygon.corner 3] (b) {b};
\draw (a) to (b);
\end{tikzpicture}
\end{document}
我收到此错误:
! Package pgf Error: No shape named polygon.corner 3 is known.
See the pgf package documentation for explanation.
Type H <return> for immediate help.
...
l.10 ...e[draw, left of=polygon.corner 3] (b) {b};
...这很奇怪,因为我可以像这样画出边缘(它有效):
\foreach \i in {1, ..., 5} \draw (outer.center) -- (outer.corner \i);
谢谢。
答案1
解决方案不是使用语法above of=polygon.corner 1
,而是使用above=of polygon.corner 1
。我发现以前的语法已被弃用,如中所述PGF/TikZ 中“right of=”和“right=of”的区别。
答案2
您说您使用的语法已过时,不应再使用,您说得完全正确。我完全同意您应该改用该positioning
语法(当然是在加载库之后)。
这里要指出的是,您的观察结果与多边形形状无关。相反,弃用的语法恰好对所有节点锚点都失败了。这可以从更基本的 MWE 中看出
\documentclass[tikz,border=3.14mm]{standalone}
\begin{document}
\begin{tikzpicture}
\node at (0,0) (A) {A};
\coordinate (P) at (1,0) ;
\node[draw,left of=A] (B) {B};
%\node[draw,left of=B.south] (C) {C}; % <- fails
\node[draw,right of=P] (D) {D};
%\node[draw,right of=P.center] (D) {D};% <- fails
\end{tikzpicture}
\end{document}
我注释掉了所有不起作用的代码。并且Caramdir 的精彩回答还为我们提供了相关的代码位
% The following are deprecated:
\tikzoption{above of}{\tikz@of{#1}{90}}%
\tikzoption{below of}{\tikz@of{#1}{-90}}%
\tikzoption{left of}{\tikz@of{#1}{180}}%
\tikzoption{right of}{\tikz@of{#1}{0}}%
\tikzoption{above left of}{\tikz@of{#1}{135}}%
\tikzoption{below left of}{\tikz@of{#1}{-135}}%
\tikzoption{above right of}{\tikz@of{#1}{45}}%
\tikzoption{below right of}{\tikz@of{#1}{-45}}%
\def\tikz@of#1#2{%
\def\tikz@anchor{center}%
\let\tikz@do@auto@anchor=\relax%
\tikz@addtransform{%
\expandafter\tikz@extract@node@dist\tikz@node@distance and\pgf@stop%
\pgftransformshift{\pgfpointpolar{#2}{\tikz@extracted@node@distance}}}%
\def\tikz@node@at{\pgfpointanchor{#1}{center}}}
\def\tikz@extract@node@dist#1and#2\pgf@stop{%
\def\tikz@extracted@node@distance{#1}}
告诉我们为什么会发生这种情况。它包含\def\tikz@node@at{\pgfpointanchor{#1}{center}}}
告诉我们 Ti钾Z 尝试访问任何 的中心锚点#1
。如果#1
是节点或坐标(从技术上讲也是节点),则此方法可行,但如果#1
已经是锚点,则方法无效。在后一种情况下,Ti钾Z 尝试访问B.south.center
上面代码中第一个无效示例中的某些内容,但这些内容并不存在。当然,错误消息有点难以理解,但有了这种理解,人们就可以对其进行辩护。