Combining calc and perpendicular coordinates in tikz

The syntax of the line to operation given in the manual is to place |- between two coordinates:

Sometimes you want to connect two points via straight lines that are only horizontal and vertical. For this, you can use two path construction operations.

\path . . . -|< coordinate or cycle> . . . ;

This operation means “first horizontal, then vertical.”

Following by these example:

\begin{tikzpicture}
\draw (0,0) node(a) [draw] {A} (1,1) node(b) [draw] {B};
\draw (a.north) |- (b.west);
\draw[color=red] (a.east) -| (2,1.5) -| (b.north);
\end{tikzpicture}

and these drawing: two-path

Thus, this two-path operation is not intended to make a translation from one point to another. This is a handy shortcut when you need to draw horizontal lines followed by vertical lines or vice versa.

You just have to write (syntactically) in your code:

\draw ($ (node1.south) + (1,0) $) to ($ (node1.south) + (1,0) $) |- (node2.north);

instead of

\draw ($ (node1.south) + (1,0) $) to ( ( ( $ (node1.south) + (1,0) $) |- node2.north);`

Your code becomes like this:

\documentclass{report}

\usepackage{tikz}
\usetikzlibrary{calc}

\begin{document}
\begin{tikzpicture}
\node at (0,  0) (node1) {Hello};
\node at (0, -2) (node2) {World};

% working:
%\draw ($ (node1.south) + (1,0) $) to ( node1.south |- node2.north);

% now working too:
\draw ($ (node1.south) + (1,0) $) to  ($ (node1.south) + (1,0) $) |- (node2.north);
\end{tikzpicture}
\end{document}

To have the same path as the one you want, you must build your path as indicated by @marmot or @ignasi.


Just for completeness: a version that is really the equivalent of the first. AndreC's nice answer is correct but I don't see how the second path, which has a corner, is the shifted version of the first one.

\documentclass{report}

\usepackage{tikz}
\usetikzlibrary{calc}

\begin{document}
\begin{tikzpicture}
\node at (0,  0) (node1) {Hello};
\node at (0, -2) (node2) {World};

% working:
\draw ($ (node1.south) + (1,0) $) to ( node1.south |- node2.north);

% not working:
\draw ($ (node1.south) + (1,0) $) to ([xshift=1cm] node1.south |- node2.north);

\end{tikzpicture}
\end{document}

You can always declare an auxiliary coordinate and use it. This way you don't need to remember which is the working syntax ;-)

\documentclass{report}

\usepackage{tikz}
\usetikzlibrary{calc}

\begin{document}
\begin{tikzpicture}
\node at (0,  0) (node1) {Hello};
\node at (0, -2) (node2) {World};

% working:
\draw ($ (node1.south) + (1,0) $) to ( node1.south |- node2.north);

% working:
\draw ($ (node1.south) + (1,0) $) coordinate (aux) to (aux |- node2.north);

\end{tikzpicture}
\end{document}