节点相对放置中点运算符的行为

节点相对放置中点运算符的行为

在使用相对定位放置新节点时,当引用现有命名节点时,点运算符的行为是什么?例如,如果xc是现有命名节点,则以下内容是什么意思?

\path (xc.71) +(1,0) node (xd) {$x_4$};

这是一个简短的例子(有这样的情况),绘制了一个简单的有向链:

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{shapes,arrows}
\begin{document}

\begin{tikzpicture}[auto,scale=1.0,%
block/.style = {draw,circle,very thick,minimum size=0.5cm},%
directed/.style ={draw,-triangle 45, shorten >= 0pt, very thick}]

\pgfmathsetmacro{\strch}{1.2}

\path (0*\strch,0) node[block] (xa) {$x_1$}
      (1*\strch,0) node[block] (xb) {$x_2$}
      (2*\strch,0) node[block] (xc) {$x_3$};
\path (xa) [directed] -- (xb);
\path (xb) [directed] -- (xc);

\path (xc.71) +(\strch,0) node (threedots) {$\ldots$};

\path (threedots) +(\strch,0) node[block] (xn) {$x_n$};
\path (xc) [directed] -- (threedots);
\path (threedots) [directed] -- (xn);

\end{tikzpicture}
\end{document}

当然,将节点引用更改为(xc.11)(xc.999)(xc.0)会产生不同的结果,但在仔细阅读 PGF 手册后,我仍不清楚小数点后的位到底意味着什么。

(FWIW,这个问题是由于错误地x3使用存储值 3.0 而不是 3 的宏来引用节点而引起的,因此x3.0。我已经修复了那个错误,但是我现在只是对这种行为感到好奇。)

提前致谢!

答案1

以下是 TikZ 点扫描机制的具体运作:

\def\tikz@@scan@@no@calculator#1(#2){% This receives the actual coordinate input. 
                                     % #1 and #2 are irrelevant for now
  \pgfutil@in@{cs:}{#2}%             %Checks if cs syntax is present
  \ifpgfutil@in@%                    % Yes no? 
    \let\@next\tikz@parse@coordinatesystem% Send it to the coordinate system parser
  \else%
    \pgfutil@in@{intersection }{#2}% % any intersections? 
    \ifpgfutil@in@%                  % Yes no? 
      \let\@next\tikz@parse@intersection% Send it....
    \else%
      \pgfutil@in@|{#2}%             % Check if |- or -| is used
      \ifpgfutil@in@                 %
        \pgfutil@in@{-|}{#2}%        % 
        \ifpgfutil@in@
          \let\@next\tikz@parse@hv%
        \else%
          \let\@next\tikz@parse@vh%
        \fi%
      \else%
        \pgfutil@in@:{#2}%           % Check if a polar input such as (45:1cm) is given
        \ifpgfutil@in@               %
          \let\@next\tikz@parse@polar% 
        \else%
          \pgfutil@in@,{#2}%         % Finally check if (a,b) is given
          \ifpgfutil@in@%      
            \let\@next\tikz@parse@regular% REGULAR
          \else%
            \let\@next\tikz@parse@node% Then it should be a node name, 
                                      % send it to node dept. 
          \fi%
        \fi%
      \fi%
    \fi%
  \fi%
  \@next#1(#2)%
}

实际上还有更多内容,但在确保没有$符号用于计算并且不涉及几件事之后,它归结为这个宏。那么这有什么用呢?好吧,逐行逐行地看有点乏味,所以我在其中放了一些注释作为指针。基本上,TikZ 用尽它知道的所有选项,然后决定输入是一个命名的坐标(或节点,但坐标也是一个特殊节点),并进一步调用

\def\tikz@parse@node#1(#2){%
  \pgfutil@in@.{#2}% Ok, flag this
  \ifpgfutil@in@
    \tikz@calc@anchor#2\tikz@stop%
  \else%
    \tikz@calc@anchor#2.center\tikz@stop% to be on the save side, in
                                % case iftikz@shapeborder is ignored...
    \expandafter\ifx\csname pgf@sh@ns@#2\endcsname\tikz@coordinate@text%
    \else
      \tikz@shapebordertrue%
      \def\tikz@shapeborder@name{#2}%
    \fi%
  \fi%
  \edef\tikz@marshal{\noexpand#1{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}}%
  \tikz@marshal%
}

\def\tikz@calc@anchor#1.#2\tikz@stop{%
  \pgfpointanchor{#1}{#2}%
}

您不必理解每一点(无论如何我都不会彻底研究这个)但要点很重要。它检查名称是否(c)属于a coordinate。如果它确实是一个坐标,那么它会丢弃的剩余部分,(c.30)因为坐标只是一个点并且它只有一个锚点。如果不是,则(ab)被解释为shape a with angle b。然后它检查是否a有形状边框。手册中有更好的解释,但长话短说,如果定义了边框形状(自定义节点形状可能没有),TikZ 会从中心锚点以给定的角度绘制一条线,直到它与形状边框相交。显然,如果没有这样的边界,TikZ 不会像老板一样在意。以下是常见的快捷方式及其代表的角度:

\def\tikz@polar@dir@up{90}
\def\tikz@polar@dir@down{-90}
\def\tikz@polar@dir@left{180}
\def\tikz@polar@dir@right{0}
\def\tikz@polar@dir@north{90}
\def\tikz@polar@dir@south{-90}
\def\tikz@polar@dir@east{0}
\def\tikz@polar@dir@west{180}
\expandafter\def\csname tikz@polar@dir@north east\endcsname{45}
\expandafter\def\csname tikz@polar@dir@north west\endcsname{135}
\expandafter\def\csname tikz@polar@dir@south east\endcsname{-45}
\expandafter\def\csname tikz@polar@dir@south west\endcsname{-135}

因此您也可以使用(a.south)类似解析的等。

答案2

(nodename.<number>)指着外部节点的边界线nodename与角度<number>(度)。

所以,( )指向的是具有角度的a 3.0节点的边界线。a 30

例子:

在此处输入图片描述

\documentclass[tikz]{standalone}
\usetikzlibrary{shapes.geometric}
\begin{document}
\begin{tikzpicture}
  \node[draw=orange,font=\huge,line width=3pt,inner sep=10pt] (A) {A};
  \draw[->,green!50!black] (A.center) -- ++(20:5mm);
  \foreach \angle in {0,20,...,340}{
    \fill[blue!50!black] (A.\angle) circle[radius=1pt]
    node[font=\tiny,rotate=\angle,right]{A.\angle};
  }

  \node[draw=orange,circle,font=\huge,line width=3pt,inner sep=10pt]
  (C) at (0,-3.5) {C};
  \draw[->,green!50!black] (C.center) -- ++(20:5mm);
  \foreach \angle in {0,20,...,340}{
    \fill[blue!50!black] (C.\angle) circle[radius=1pt]
    node[font=\tiny,rotate=\angle,right]{C.\angle};
  }

  \node[draw=orange,ellipse,font=\huge,line width=3pt,inner sep=10pt]
  (E) at (0,-7) {--- E ---};
  \draw[->,green!50!black] (E.center) -- ++(20:10mm);
  \foreach \angle in {0,20,...,340}{
    \fill[blue!50!black] (E.\angle) circle[radius=1pt]
    node[font=\tiny,rotate=\angle,right]{E.\angle};
  }

  \node[draw=orange,trapezium,font=\huge,line width=3pt,inner sep=10pt]
  (T) at (0,-10.5) {--- T ---};
  \draw[->,green!50!black] (T.center) -- ++(20:10mm);
  \foreach \angle in {0,20,...,340}{
    \fill[blue!50!black] (T.\angle) circle[radius=1pt]
    node[font=\tiny,rotate=\angle,right]{T.\angle};
  }
\end{tikzpicture}
\end{document}

相关内容