Wie verwende ich den Knotenabstand, um den Anfang und/oder das Ende eines Pfeils mit TikZ zu versetzen?

Wie verwende ich den Knotenabstand, um den Anfang und/oder das Ende eines Pfeils mit TikZ zu versetzen?

Ich möchte einen Pfeil zeichnen, bei dem einer der Endpunkte nicht wirklich an einen anderen Knoten angebunden ist, und ich möchte, dass die Länge des Pfeils die Knotenentfernung des Knotens berücksichtigt, zu dem der PfeilIstangehängt. Ich würde also gerne so etwas schreiben können wie

\draw [->] ([left of] the-node) -- (the-node);

Siehe das MWE unten:

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

Hier ist das Ergebnis des MWE:

Bildbeschreibung hier eingeben

Irgendwelche Ideen, wie ich das erreichen könnte?

Antwort1

Auf der linken Seite können Sie relative Koordinaten verwenden. (Auf der rechten Seite müssen Sie calc verwenden.)

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

Eine noch einfachere Lösung:

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

Antwort2

Hier ist eine einfache Lösung (die zeigt, wie man es benutzt node distance):

Bildbeschreibung hier eingeben

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

Antwort3

Standardmäßige Entfernungswerte

Die node distanceEinstellung ist kein Attribut eines Knotens, sondern des umgebenden Bereichs. Sie können also nicht darauf zugreifen"die Knotendistanz vonn "wie du es sagst, aber nur„der aktuelle Knotenabstand“. Damit können Sie einen Stil definieren, der den aktuellen Knotenabstand als Versatz verwendet, wie in:

my above/.style={yshift=\tikz@node@distance},

Nun können Koordinaten der Form verwendet werden ([my above] n.center). Leider ist die Angabe eines Knotenankers notwendig, da TikZ sonst versucht, einen Punkt auf der Grenze des Knotens zu berechnen und yshiftdabei die Option ignoriert.

Aktuelle Knotendistanz verwenden

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

Distanzwerte pro Knoten

Wenn Sie nun ein Attribut pro Knoten speichern möchten, müssen Sie ein globales Makro definieren, dessen Name den Knotennamen (gespeichert in \tikz@fig@name) enthält, der den gewünschten Wert enthält:

my distance/.style={execute at end node={%
        \expandafter\gdef\csname my@node@distance@\tikz@fig@name\endcsname{#1}%
}},

Der Stil macht folgendes my distance: Er definiert ein Makro namens , \my@node@distance@NAMEwobei NAMEder Name des aktuell deklarierten Knotens ist. Dieses Makro enthält den in zugewiesenen Wert my distance=10mm, auf den später unter dem zuvor erwähnten Namen zugegriffen werden kann, wie im my above2Stil gezeigt:

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

Der einzige Nachteil ist, dass Sie den Knotennamen erneut als Argument angeben müssen, wie in , da der Name des Knotens bei der Verarbeitung der Optionen noch nicht analysiert wurde. Wir benötigen also das zusätzliche Argument, um anzugeben, dass die gespeicherte Distanz des Knotens und nicht die eines anderen Knotens ([my above2=n] n.center)verwendet werden soll .n

Beachten Sie, dass der violette Pfeil nicht von der auf festgelegten Knotendistanz betroffen ist scopeund weiterhin den Wert verwendet my distance=10mm, der bei der Definition des Knotens angegeben wurde n.

Verwenden der Distanz pro Knoten

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

Der komplette Code

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

Antwort4

Es gibt wahrscheinlich bessere Verwendungsmöglichkeiten \tikz@node@distanceohne \makeatletterund, \makeatotheraber ich kenne sie nicht, daher bin ich für jeden Vorschlag offen.

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

Bildbeschreibung hier eingeben

Bearbeiten:Der nächste Code zeigt einen der Vorschläge von 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}

verwandte Informationen