相对于正多边形锚点定位节点

相对于正多边形锚点定位节点

我有一个正多边形,我想将节点定位在第一个角的上方,或者第 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}}}告诉我们 TiZ 尝试访问任何 的中心锚点#1。如果#1是节点或坐标(从技术上讲也是节点),则此方法可行,但如果#1已经是锚点,则方法无效。在后一种情况下,TiZ 尝试访问B.south.center上面代码中第一个无效示例中的某些内容,但这些内容并不存在。当然,错误消息有点难以理解,但有了这种理解,人们就可以对其进行辩护。

相关内容