在使用相对定位放置新节点时,当引用现有命名节点时,点运算符的行为是什么?例如,如果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 3
0
例子:
\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}