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}

MWE

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?

up vote 4 down vote accepted

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}

enter image description here

  • You guys are amazing: this is precisely what I wanted. – Uli Fahrenberg Nov 14 at 15:11
  • +1: What is the aux node for? – Dr. Manuel Kuehner Nov 14 at 15:19
  • 1
    @Dr.ManuelKuehner It is midway between a and b and placed solely for calculation. – TeXnician Nov 14 at 15:19
  • 1
    @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 at 15:20
  • 2
    @Dr.ManuelKuehner I guess the best explanation for what |- and -| do can be found here. – marmot Nov 14 at 15:25

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

vertical arrow

\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 at 14:58

Your Answer

By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

Not the answer you're looking for? Browse other questions tagged or ask your own question.