# Precise placement of arrow anchors

I have a (TikZ) diagram with several "blocks" of text connected by arrows. For reasons the (centers of the) blocks are not precisely horizontally aligned, but I'd still like my vertical arrows to be perfectly, well, vertical. Example:

\documentclass[tikz]{standalone}
\begin{document}
\begin{tikzpicture}
\node[rectangle, draw] (a) at (0,0) {Some rather long text};
\node[rectangle, draw] (b) at (.5,-2) {Even more text};
\path[->] (a) edge (b);
\path[red, ->] (a.315) edge (b.130);
\end{tikzpicture}
\end{document}


Instead of the black arrow, I'd prefer the red one which I've created by fiddling around with stupid numbers. Hence:

Is there a way to create, automatically, instead of the black arrow-between-centers, an arrow which is (1) perfectly vertical and (2) intersects the original arrow roughly at its center?

Or, if you want the arrow to be in the center,

\documentclass[tikz]{standalone}
\begin{document}
\begin{tikzpicture}
\node[rectangle, draw] (a) at (0,0) {Some rather long text};
\node[rectangle, draw] (b) at (.5,-2) {Even more text};
\path (a) -- (b) coordinate[midway] (aux);
\draw[->] (a.south -| aux) -- (b.north -| aux);
\end{tikzpicture}
\end{document}


• You guys are amazing: this is precisely what I wanted. – Uli Fahrenberg Nov 14 '18 at 15:11
• +1: What is the aux node for? – Dr. Manuel Kuehner Nov 14 '18 at 15:19
• @Dr.ManuelKuehner It is midway between a and b and placed solely for calculation. – TeXnician Nov 14 '18 at 15:19
• @Dr.ManuelKuehner This is a trick to find out (what TikZ thinks is) the middle between the two nodes, which then will determine the horizontal position of the arrow. – marmot Nov 14 '18 at 15:20
• @Dr.ManuelKuehner I guess the best explanation for what |- and -| do can be found here. – marmot Nov 14 '18 at 15:25

You can specify the horizontal and vertical position in terms of nodes.

\documentclass[tikz]{standalone}
\begin{document}
\begin{tikzpicture}
\node[rectangle, draw] (a) at (0,0) {Some rather long text};
\node[rectangle, draw] (b) at (.5,-2) {Even more text};
\draw[->] (b|-a.south) -- (b);
\end{tikzpicture}
\end{document}

• Nice (+1)... I think that the OP woyld like to use anchor=east too in order to not calculating manually the horizontal alignment. So, \documentclass[tikz]{standalone} \begin{document} \tikzset{mynode/.style={rectangle,draw,anchor=east}} \begin{tikzpicture} \node[mynode] (a) at (0,0) {Some rather long text}; \node[mynode] (b) at (0,-2) {Even more text}; \draw[->] (b|-a.south) -- (b); \end{tikzpicture} \end{document} would be an easier way. – koleygr Nov 14 '18 at 14:58