끝점 중 하나가 실제로 다른 노드에 연결되지 않은 화살표를 그리고 싶고 화살표의 길이가 화살표가 연결되는 노드의 노드 거리를 고려하도록 하고 싶습니다.~이다첨부된. 그래서 나는 다음과 같은 글을 쓰고 싶습니다.
\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
아마도 없이 사용하는 더 좋은 방법이 있을 것입니다 \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}