我想繪製一個箭頭,其中一個端點實際上並未連接到另一個節點,並且我希望箭頭的長度考慮到箭頭到的節點的節點距離是隨附的。所以我希望能夠寫出類似的東西
\draw [->] ([left of] the-node) -- (the-node);
請參閱下面的 MWE:
\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{positioning}
\begin{document}
\begin{tikzpicture}[
node/.style={
node distance=5mm,
},
]
\node [node] (n) {n};
% This is what I would like to write (or something like it)
%\draw [->] ([left of] n) -- (n);
% Here are my options so far, none of which I like
% 1:
\draw [->] ([yshift=5mm] n.north) -- (n);
% CON: requires explicit use of the node distance
% 2:
\coordinate (coord1) at ([xshift=5mm] n.east);
\draw [->] (coord1) -- (n);
% CON: requires explicit use of the node distance AND an extra coordinate
% 3:
\coordinate [below=of n] (coord2);
\draw [->] (coord2) -- (n);
% CON: requires an extra coordinate, and it doesn't seem to use the node
% distance of 'n' anyway
\end{tikzpicture}
\end{document}
這是 MWE 的結果:
我有什麼想法可以實現這個目標嗎?
答案1
您可以使用左側的相對座標。 (在右側你必須使用計算。)
\documentclass{standalone}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\node (n) {n};
\draw [->] (n.north)+(0,5mm) -- (n);
\draw [->] (n.east)+(5mm,0) -- (n);
\draw [->] (n.south)+(0,-5mm) -- (n);
\end{tikzpicture}
\end{document}
一個更簡單的解決方案:
\documentclass{standalone}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\node (n) {n};
\draw [<-] (n.north) -- +(0,5mm);
\draw [<-] (n.east) -- +(5mm,0);
\draw [<-] (n.south) -- +(0,-5mm);
\end{tikzpicture}
\end{document}
答案2
這是一個簡單的解決方案(展示瞭如何使用node distance
):
\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{positioning}
\begin{document}
\begin{tikzpicture}
\node (n) {n};
\begin{scope}[node distance=2cm]
\draw[red,->] coordinate[below=of n] (a) (a) -- (n);
\end{scope}
\begin{scope}[node distance=1cm]
\draw[blue,->] coordinate[left=of n] (a) (a) -- (n);
\end{scope}
\begin{scope}[node distance=5mm]
\draw[green,->] coordinate[right=of n] (a) (a) -- (n);
\end{scope}
\end{tikzpicture}
\end{document}
答案3
標準範圍距離值
此node distance
設定不是節點的屬性,而是周圍範圍的屬性。所以你無法訪問“節點距離n
”正如你所說,但僅“當前節點距離”。使用它,您可以定義一個使用目前節點距離作為偏移量的樣式,如下所示:
my above/.style={yshift=\tikz@node@distance},
現在您可以使用表單的座標([my above] n.center)
。不幸的是,指定節點錨點是必要的,因為否則 TikZ 將嘗試計算節點邊界上的點,忽略yshift
該過程中的選項。
\begin{tikzpicture}[node distance=5mm]
\node[node distance=20mm] (n) {n}; % node distance does nothing here
\draw[->,red] ([my above=n] n.center) -- (n);
\draw[->,green] ([my below]n.center) -- (n);
\draw[->,blue] ([my left]n.center) -- (n);
% Larger node distance for the right line
\begin{scope}[node distance=10mm]
\draw[->,purple] ([my right]n.center) -- (n);
\end{scope}
\end{tikzpicture}
每節點距離值
現在,如果要在每個節點上儲存屬性,則必須定義一個全域宏,其名稱包含節點名稱(儲存在 中\tikz@fig@name
),其中包含所需的值:
my distance/.style={execute at end node={%
\expandafter\gdef\csname my@node@distance@\tikz@fig@name\endcsname{#1}%
}},
這就是my distance
樣式的作用:它定義一個名為的宏,\my@node@distance@NAME
其中NAME
是目前聲明的節點的名稱。此巨集包含在 中指派的值my distance=10mm
,稍後可以使用前面提到的名稱來存取該值,如樣式所示my above2
:
my above2/.style={yshift/.expanded=\csname my@node@distance@#1\endcsname },
唯一的缺點是您必須再次指定節點名稱作為參數,如 中所示([my above2=n] n.center)
,因為在處理選項時尚未解析節點名稱。因此,我們需要額外的參數來告訴它使用節點的儲存距離n
,而不是其他節點。
請注意,紫色箭頭不受 上設定的節點距離的影響,並且仍然使用定義節點時指定scope
的值。my distance=10mm
n
\begin{tikzpicture}[node distance=5mm]
\node[my distance=10mm] (n) {n};
\draw[->,red] ([my above2=n] n.center) -- (n);
\draw[->,green] ([my below2=n] n.center) -- (n);
\draw[->,blue] ([my left2=n] n.center) -- (n);
% This method is completely unaffected by setting node distance
\begin{scope}[node distance=20mm]
\draw[->,purple] ([my right2=n]n.center) -- (n);
\end{scope}
\end{tikzpicture}
完整程式碼
\documentclass[tikz,margin=5pt]{standalone}
\usepackage{tikz}
\begin{document}
\makeatletter
% Basic solution using the current node distance
\tikzset{
my above/.style={yshift=\tikz@node@distance},
my below/.style={yshift=-\tikz@node@distance},
my right/.style={xshift=\tikz@node@distance},
my left/.style={xshift=-\tikz@node@distance},
}
\begin{tikzpicture}[node distance=5mm]
\node[node distance=20mm] (n) {n}; % node distance does nothing here
\draw[->,red] ([my above=n] n.center) -- (n);
\draw[->,green] ([my below]n.center) -- (n);
\draw[->,blue] ([my left]n.center) -- (n);
% Larger node distance for the right line
\begin{scope}[node distance=10mm]
\draw[->,purple] ([my right]n.center) -- (n);
\end{scope}
\end{tikzpicture}
\vspace{1cm}
% Advanced solution using per-node storage
\tikzset{
my above2/.style={yshift/.expanded=\csname my@node@distance@#1\endcsname },
my below2/.style={yshift/.expanded=-\csname my@node@distance@#1\endcsname},
my right2/.style={xshift/.expanded=\csname my@node@distance@#1\endcsname },
my left2/.style= {xshift/.expanded=-\csname my@node@distance@#1\endcsname},
my distance/.style={
execute at end node={%
\expandafter\gdef\csname my@node@distance@\tikz@fig@name\endcsname{#1}%
}%
},
}
\makeatother
\begin{tikzpicture}[node distance=5mm]
\node[my distance=10mm] (n) {n};
\draw[->,red] ([my above2=n] n.center) -- (n);
\draw[->,green] ([my below2=n] n.center) -- (n);
\draw[->,blue] ([my left2=n] n.center) -- (n);
% This method is completely unaffected by setting node distance
\begin{scope}[node distance=20mm]
\draw[->,purple] ([my right2=n]n.center) -- (n);
\end{scope}
\end{tikzpicture}
\end{document}
答案4
可能有更好的使用\tikz@node@distance
without\makeatletter
和的方法,\makeatother
但我不知道它們,所以我願意接受任何建議。
\documentclass[border=2mm,tikz]{standalone}
\begin{document}
\begin{tikzpicture}
\node (n) {n};
\makeatletter
\begin{scope}[node distance=2cm]
\draw [->, red] (n) --++(90:\tikz@node@distance);
\begin{scope}[node distance=1cm]
\draw [->, blue] (n) --++(0:\tikz@node@distance);
\draw [->, orange] (n) --++(180:\tikz@node@distance);
\end{scope}
\draw [->, green] (n) --++(-90:\tikz@node@distance);
\end{scope}
\makeatother
\end{tikzpicture}
\end{document}
編輯:下一個程式碼顯示了 percusse 的建議之一:
\documentclass[border=2mm,tikz]{standalone}
\makeatletter
\def\nodedistance{\tikz@node@distance}
\makeatother
\begin{document}
\begin{tikzpicture}
\node (n) {n};
\begin{scope}[node distance=2cm]
\draw [->, red] (n) --++(90:\nodedistance);
\begin{scope}[node distance=1cm]
\draw [->, blue] (n) --++(0:\nodedistance);
\draw [->, orange] (n) --++(180:\nodedistance);
\end{scope}
\draw [->, green] (n) --++(-90:\nodedistance);
\end{scope}
\end{tikzpicture}
\end{document}