
Quiero dibujar una flecha donde uno de los puntos finales no esté realmente conectado a otro nodo, y quiero que la longitud de la flecha tenga en cuenta la distancia del nodo al que apunta la flecha.esadjunto. Entonces me gustaría poder escribir algo como
\draw [->] ([left of] the-node) -- (the-node);
Vea el MWE a continuación:
\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}
Aquí está el resultado del MWE:
¿Alguna idea de cómo podría lograr esto?
Respuesta1
Puede utilizar coordenadas relativas en el lado izquierdo. (En el lado derecho tienes que usar calc.)
\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}
Una solución aún más sencilla:
\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}
Respuesta2
Aquí hay una solución simple (que muestra cómo usarla 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}
Respuesta3
Valores de distancia con alcance estándar
La node distance
configuración no es un atributo de un nodo, sino del ámbito circundante. Entonces no puedes acceder"la distancia entre nodos de n
"como lo dices, pero solo"la distancia actual del nodo". Usando esto, puede definir un estilo que use la distancia del nodo actual como un desplazamiento, como en:
my above/.style={yshift=\tikz@node@distance},
Ahora puedes usar coordenadas de la forma ([my above] n.center)
. Desafortunadamente, es necesario especificar un ancla de nodo, porque de lo contrario TikZ intentará calcular un punto en el borde del nodo, ignorando la yshift
opción en el proceso.
\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}
Valores de distancia por nodo
Ahora, si desea almacenar un atributo por nodo, debe definir una macro global cuyo nombre contenga el nombre del nodo (almacenado en \tikz@fig@name
), que contiene el valor deseado:
my distance/.style={execute at end node={%
\expandafter\gdef\csname my@node@distance@\tikz@fig@name\endcsname{#1}%
}},
Esto es lo que my distance
hace el estilo: define una macro llamada \my@node@distance@NAME
donde NAME
está el nombre del nodo actualmente declarado. Esta macro contiene el valor asignado en my distance=10mm
, al que luego se puede acceder usando el nombre mencionado anteriormente, como se muestra en el my above2
estilo:
my above2/.style={yshift/.expanded=\csname my@node@distance@#1\endcsname },
El único inconveniente es que debe especificar nuevamente el nombre del nodo como argumento, como en ([my above2=n] n.center)
, porque el nombre del nodo aún no se ha analizado al procesar las opciones. Entonces necesitamos el argumento adicional para decirle que use la distancia almacenada del nodo n
, y no algún otro nodo.
Tenga en cuenta que la flecha violeta no se ve afectada por la distancia del nodo establecida en scope
y aún usa el valor de my distance=10mm
, que se especificó al definir el nodo 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}
El código completo
\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}
Respuesta4
Probablemente haya mejores formas de usarlo \tikz@node@distance
sin \makeatletter
y, \makeatother
pero no las conozco, así que estoy abierto a cualquier sugerencia.
\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}
Editar:El siguiente código muestra una de las sugerencias de 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}