TikZ로 화살표의 시작 및/또는 끝을 오프셋하기 위해 노드 거리를 사용하는 방법은 무엇입니까?

TikZ로 화살표의 시작 및/또는 끝을 오프셋하기 위해 노드 거리를 사용하는 방법은 무엇입니까?

끝점 중 하나가 실제로 다른 노드에 연결되지 않은 화살표를 그리고 싶고 화살표의 길이가 화살표가 연결되는 노드의 노드 거리를 고려하도록 하고 싶습니다.~이다첨부된. 그래서 나는 다음과 같은 글을 쓰고 싶습니다.

\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@NAMENAMEmy distance=10mmmy above2

my above2/.style={yshift/.expanded=\csname my@node@distance@#1\endcsname },

유일한 단점은 ([my above2=n] n.center)옵션을 처리할 때 노드 이름이 아직 구문 분석되지 않았기 때문에 에서와 같이 노드 이름을 다시 인수로 지정해야 한다는 것입니다. 따라서 n다른 노드가 아닌 노드의 저장된 거리를 사용하도록 지시하려면 추가 인수가 필요합니다 .

보라색 화살표는 에 설정된 노드 거리의 영향을 받지 않으며 여전히 노드를 정의할 때 지정한 scope값을 사용합니다 .my distance=10mmn

노드당 거리 사용

\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}

관련 정보