% Copyright 2022 by Qrrbrbirlbel
%
% This file may be distributed and/or modified
%
% 1. under the LaTeX Project Public License and/or
% 2. under the GNU Free Documentation License.
%

%% For the operators r-lr, r-rl, r-ud and r-du we need to check after TikZ found r
\let\tikz@orig@rect\tikz@rect
\def\tikz@rect{\pgfutil@ifnextchar e\tikz@orig@rect\tikzext@tikz@r}
\def\tikzext@tikz@r -{%
  \pgfutil@ifnextchar l\tikzext@tikz@lr@lineto{%
    \pgfutil@ifnextchar r\tikzext@tikz@rl@lineto{%
      \pgfutil@ifnextchar u\tikzext@tikz@ud@lineto{%
        \pgfutil@ifnextchar d\tikzext@tikz@du@lineto\tikz@expand
      }%
    }%
  }%
}
%% For the operator |-| we need to check after TikZ found |-
\let\tikz@orig@vh@lineto@next\tikz@vh@lineto@next
\def\tikz@vh@lineto@next{%
  \pgfutil@ifnextchar|{\expandafter\tikzext@tikz@vhv@lineto\pgfutil@gobble}%
    {\pgfutil@ifnextchar\tikz@activebar{\expandafter\tikzext@tikz@vhv@lineto\pgfutil@gobble}%
      {\tikz@orig@vh@lineto@next}}}
%% For the operator -|- we need to check after TikZ found -|
\let\tikz@orig@hv@lineto\tikz@hv@lineto
\def\tikz@hv@lineto{%
  \pgfutil@ifnextchar-{\expandafter\tikzext@tikz@hvh@lineto\pgfutil@gobble}%
    {\tikz@orig@hv@lineto}}

%% |-|[<opts>] and -|-[<opts>] are allowed
\def\tikzext@tikz@vhv@lineto{\pgfutil@ifnextchar[{\tikzext@tikz@collect@hvvh@options\tikzext@tikz@vhv@lineto@next}{\tikzext@tikz@collect@hvvh@options\tikzext@tikz@vhv@lineto@next[]}}
\def\tikzext@tikz@hvh@lineto{\pgfutil@ifnextchar[{\tikzext@tikz@collect@hvvh@options\tikzext@tikz@hvh@lineto@next}{\tikzext@tikz@collect@hvvh@options\tikzext@tikz@hvh@lineto@next[]}}

%% r-rl[<opts>], r-lr[<opts>], etc.
\def\tikzext@tikz@rl@lineto rl{\pgfutil@ifnextchar[{\tikzext@tikz@collect@hvvh@options\tikzext@tikz@rl@lineto@next}{\tikzext@tikz@collect@hvvh@options\tikzext@tikz@rl@lineto@next[]}}
\def\tikzext@tikz@lr@lineto lr{\pgfutil@ifnextchar[{\tikzext@tikz@collect@hvvh@options\tikzext@tikz@lr@lineto@next}{\tikzext@tikz@collect@hvvh@options\tikzext@tikz@lr@lineto@next[]}}
\def\tikzext@tikz@du@lineto du{\pgfutil@ifnextchar[{\tikzext@tikz@collect@hvvh@options\tikzext@tikz@du@lineto@next}{\tikzext@tikz@collect@hvvh@options\tikzext@tikz@du@lineto@next[]}}
\def\tikzext@tikz@ud@lineto ud{\pgfutil@ifnextchar[{\tikzext@tikz@collect@hvvh@options\tikzext@tikz@ud@lineto@next}{\tikzext@tikz@collect@hvvh@options\tikzext@tikz@ud@lineto@next[]}}

%% TikZ interjects are done, the rest is independent:


\newdimen\tikzext@tikz@udlr@distance
\newdimen\tikzext@tikz@hvvh@distance
\newif\iftikzext@tikz@hvvh@middle         % checks whether spacing = 0 was selected
\newif\iftikzext@tikz@hvvh@fromcenter
\newif\iftikzext@ortho@preflush
\tikzext@ortho@preflushtrue

%%% HVVH/UDLR
\tikzset{%
  ortho/.code=\pgfqkeys{/tikz/ortho}{#1},
  hvvh/.code=\pgfqkeys{/tikz/ortho}{#1},%
  udlr/.code=\pgfqkeys{/tikz/ortho}{#1},%
  ortho/.search also=/tikz,
  ortho/middle 0 to 1/.style={/tikz/ortho/spacing=0},%
  ortho/from center/.is if=tikzext@tikz@hvvh@fromcenter,%
  ortho/spacing/.code=% spacing = 0 means that the middle part are the pos-itions 0 to 1,
  %                                           the first part is -1 to 0, the last part is to 2
    \pgfmathint{#1}\let\tikzext@tikz@hvvh@timing@parts\pgfmathresult% in case they are calculations to be done
    \ifcase\tikzext@tikz@hvvh@timing@parts\relax
      \tikzext@tikz@hvvh@middletrue
      \def\tikzext@tikz@hvvh@timing@parts{1}%
      \def\tikzext@tikz@hvvh@timing@first{0}%
      \def\tikzext@tikz@hvvh@timing@last{1}%
      \def\tikzext@tikz@hvvh@timing@subtr{0}%
      \def\tikzext@tikz@hvvh@timing@factor{1}%
    \else            % in all other cases n > 0 the kinks are at pos = 1/n and (n - 1)/n
      \tikzext@tikz@hvvh@middlefalse
      \pgfmathreciprocal{#1}\let\tikzext@tikz@hvvh@timing@first\pgfmathresult
      \pgfmathsetmacro\tikzext@tikz@hvvh@timing@last{1-\pgfmathresult}%
      \pgfmathreciprocal{#1-2}%
      \let\tikzext@tikz@hvvh@timing@subtr\pgfmathresult
      \pgfmathsetmacro\tikzext@tikz@hvvh@timing@factor{1+2*\pgfmathresult}%
    \fi,%
  ortho/ratio/.code=\pgfmathsetmacro\tikzext@tikz@hvvh@ratio{#1},%
  % TODO: not possible to do distance in TikZ coordinate system
  ortho/distance/.code=\pgfmathsetlength\tikzext@tikz@hvvh@distance{#1}\let\tikzext@tikz@hvvh@ratio\pgfutil@empty,%
  ortho/udlr distance/.style={%
    /tikz/ortho/ud distance={#1},%
    /tikz/ortho/du distance={#1},%
    /tikz/ortho/lr distance={#1},%
    /tikz/ortho/rl distance={#1}},%
  ortho/ud distance/.initial=+.5cm,%
  ortho/du distance/.initial=+.5cm,%
  ortho/lr distance/.initial=+.5cm,%
  ortho/rl distance/.initial=+.5cm,%
  ortho/ratio=.5,% default value
  ortho/spacing=4,% default value
}%

%BEGIN_FOLD Timer
\def\tikz@timer@hvhline{%
  \pgf@process{\tikz@timer@start}\pgf@ya\pgf@y
  \pgf@process{\tikz@timer@end}\pgf@yc\pgf@y
  \pgf@process{\tikz@timer@middle}\pgf@xb\tikz@time pt%
  \ifdim\tikz@time pt<\tikzext@tikz@hvvh@timing@first pt% first quarter
    \iftikzext@tikz@hvvh@middle
      \advance\pgf@xb1pt%
    \else
      \pgf@xb\tikzext@tikz@hvvh@timing@parts\pgf@xb
    \fi
    \edef\tikz@marshal{\noexpand\pgftransformlineattime{\pgf@sys@tonumber{\pgf@xb}}{\noexpand\tikz@timer@start}{%
        \noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@ya}}}%
  \else
    \ifdim\tikz@time pt>\tikzext@tikz@hvvh@timing@last pt% last quarter
      \iftikzext@tikz@hvvh@middle
        \advance\pgf@xb-1pt%
      \else
        \pgf@xb\tikzext@tikz@hvvh@timing@parts\pgf@xb
      \fi
      \advance\pgf@xb\dimexpr-\tikzext@tikz@hvvh@timing@parts pt+1pt\relax%
      \edef\tikz@marshal{\noexpand\pgftransformlineattime{\pgf@sys@tonumber{\pgf@xb}}%
        {\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@yc}}{\noexpand\tikz@timer@end}}%
    \else% middle half
      \pgf@xb\tikzext@tikz@hvvh@timing@factor\pgf@xb%
      \advance\pgf@xb-\tikzext@tikz@hvvh@timing@subtr pt%
      \edef\tikz@marshal{\noexpand\pgftransformlineattime{\pgf@sys@tonumber{\pgf@xb}}%
        {\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@ya}}{\noexpand\tikz@timer@middle}}%
    \fi\fi\tikz@marshal}
\def\tikz@timer@vhvline{%
  \pgf@process{\tikz@timer@start}\pgf@xa\pgf@x
  \pgf@process{\tikz@timer@end}\pgf@xc\pgf@x
  \pgf@process{\tikz@timer@middle}\pgf@xb\tikz@time pt%
  \ifdim\tikz@time pt<\tikzext@tikz@hvvh@timing@first pt% first quarter
    \iftikzext@tikz@hvvh@middle
      \advance\pgf@xb1pt%
    \else
      \pgf@xb\tikzext@tikz@hvvh@timing@parts\pgf@xb
    \fi
    \edef\tikz@marshal{\noexpand\pgftransformlineattime{\pgf@sys@tonumber{\pgf@xb}}{\noexpand\tikz@timer@start}{%
        \noexpand\pgfqpoint{\the\pgf@xa}{\the\pgf@y}}}%
  \else
    \ifdim\tikz@time pt>\tikzext@tikz@hvvh@timing@last pt% last quarter
    \iftikzext@tikz@hvvh@middle
      \advance\pgf@xb-1pt%
    \else
      \pgf@xb\tikzext@tikz@hvvh@timing@parts\pgf@xb
    \fi
      \advance\pgf@xb by\dimexpr-\tikzext@tikz@hvvh@timing@parts pt+1pt\relax%
      \edef\tikz@marshal{\noexpand\pgftransformlineattime{\pgf@sys@tonumber{\pgf@xb}}%
        {\noexpand\pgfqpoint{\the\pgf@xc}{\the\pgf@y}}{\noexpand\tikz@timer@end}}%
    \else% middle half
      \pgf@xb=\tikzext@tikz@hvvh@timing@factor\pgf@xb
      \advance\pgf@xb by-\tikzext@tikz@hvvh@timing@subtr pt%
      \edef\tikz@marshal{\noexpand\pgftransformlineattime{\pgf@sys@tonumber{\pgf@xb}}%
        {\noexpand\pgfqpoint{\the\pgf@xa}{\the\pgf@y}}{\noexpand\tikz@timer@middle}}%
      \fi\fi\tikz@marshal}%

%% collect options and nodes, coordinates and pics onpath
\let\tikz@hvvh@currentoption\pgfutil@empty
\def\tikzext@tikz@collect@hvvh@options#1[#2]{\edef\tikz@hvvh@currentoption{#2}#1}
\def\tikzext@tikz@hvh@lineto@next{%
  \pgfutil@ifnextchar n{\tikz@collect@label@onpath\tikzext@tikz@hvh@lineto@next}
    {\pgfutil@ifnextchar c{\tikz@collect@coordinate@onpath\tikzext@tikz@hvh@lineto@next}%
      {\pgfutil@ifnextchar p{\tikz@collect@pic@onpath\tikzext@tikz@hvh@lineto@next}{\tikz@scan@one@point\tikzext@tikz@@hvh@lineto}}}}%
\def\tikzext@tikz@vhv@lineto@next{%
  \pgfutil@ifnextchar n{\tikz@collect@label@onpath\tikzext@tikz@vhv@lineto@next}
    {\pgfutil@ifnextchar c{\tikz@collect@coordinate@onpath\tikzext@tikz@vhv@lineto@next}%
      {\pgfutil@ifnextchar p{\tikz@collect@pic@onpath\tikzext@tikz@vhv@lineto@next}{\tikz@scan@one@point\tikzext@tikz@@vhv@lineto}}}}%
\def\tikzext@tikz@ud@lineto@next{%
  \pgfutil@ifnextchar n{\tikz@collect@label@onpath\tikzext@tikz@ud@lineto@next}
    {\pgfutil@ifnextchar c{\tikz@collect@coordinate@onpath\tikzext@tikz@ud@lineto@next}
      {\pgfutil@ifnextchar p{\tikz@collect@pic@onpath\tikzext@tikz@ud@lineto@next}{\tikz@scan@one@point\tikzext@tikz@@ud@lineto}}}}%
\def\tikzext@tikz@du@lineto@next{%
  \pgfutil@ifnextchar n{\tikz@collect@label@onpath\tikzext@tikz@du@lineto@next}
    {\pgfutil@ifnextchar c{\tikz@collect@coordinate@onpath\tikzext@tikz@du@lineto@next}
      {\pgfutil@ifnextchar p{\tikz@collect@pic@onpath\tikzext@tikz@du@lineto@next}{\tikz@scan@one@point\tikzext@tikz@@du@lineto}}}}%
\def\tikzext@tikz@lr@lineto@next{%
  \pgfutil@ifnextchar n{\tikz@collect@label@onpath\tikzext@tikz@lr@lineto@next}
    {\pgfutil@ifnextchar c{\tikz@collect@coordinate@onpath\tikzext@tikz@lr@lineto@next}
      {\pgfutil@ifnextchar p{\tikz@collect@pic@onpath\tikzext@tikz@lr@lineto@next}{\tikz@scan@one@point\tikzext@tikz@@lr@lineto}}}}%
\def\tikzext@tikz@rl@lineto@next{%
  \pgfutil@ifnextchar n{\tikz@collect@label@onpath\tikzext@tikz@rl@lineto@next}
    {\pgfutil@ifnextchar c{\tikz@collect@coordinate@onpath\tikzext@tikz@rl@lineto@next}
      {\pgfutil@ifnextchar p{\tikz@collect@pic@onpath\tikzext@tikz@rl@lineto@next}{\tikz@scan@one@point\tikzext@tikz@@rl@lineto}}}}%

\def\tikz@do@hvvh#1#2#3#4#5{%
% #1 = first kink
% #2 = second kink
% #3 = end
% #4 = timer
% #5 = tikz@shapeborder@name
  \pgfpathlineto{#1}%
  \pgfpathlineto{#2}%
  \pgfpathlineto{#3}%
  \def\tikz@timer@middle{#2}%
  \def\tikz@timer@end{#3}%
  \let\tikz@timer#4
  \edef\pgf@temp{#5}%
  \ifx\pgf@temp\pgfutil@empty
    \let\tikz@moveto@waiting\relax
  \else
    \let\tikz@moveto@waiting\pgf@temp
  \fi
  \tikz@scan@next@command}%

%% -|- operator
\def\tikzext@tikz@@hvh@lineto#1{%
  \edef\tikz@timer@start{\noexpand\pgfqpoint{\the\tikz@lastx}{\the\tikz@lasty}}%
  \pgf@xb=\tikz@lastx
  \pgf@xc=\tikz@lastx
  \pgf@yc=\tikz@lasty
  \tikz@make@last@position{#1}%
  \tikz@flush@moveto@toward{\pgfqpoint{\tikz@lastx}{\pgf@yc}}\pgf@xc\pgf@yc
  \begingroup
    \pgfqkeys{/tikz/ortho}{/tikz/style/.expand once=\tikz@hvvh@currentoption}%
    \iftikz@shapeborder
      \pgf@process{\pgfpointshapeborder{\tikz@shapeborder@name}{\pgfqpoint{\pgf@xb}{\tikz@lasty}}}%
      \iftikzext@tikz@hvvh@fromcenter
        \pgf@xc\pgf@xb
      \fi
      \pgfutil@ifxempty\tikzext@tikz@hvvh@ratio{%
        \ifdim\tikzext@tikz@hvvh@distance<0pt\relax
          \iftikzext@tikz@hvvh@fromcenter
            \pgf@xc\tikz@lastx
          \else
            \pgf@xc\pgf@x
          \fi
        \fi
        \ifdim\pgf@xb>\tikz@lastx
          \tikzext@tikz@hvvh@distance-\tikzext@tikz@hvvh@distance
        \fi
      }{%
        \iftikzext@tikz@hvvh@fromcenter
          \tikzext@tikz@hvvh@distance\tikz@lastx
        \else
          \tikzext@tikz@hvvh@distance\pgf@x
        \fi
        \advance\tikzext@tikz@hvvh@distance-\pgf@xc
        \tikzext@tikz@hvvh@distance\tikzext@tikz@hvvh@ratio\tikzext@tikz@hvvh@distance
      }%
      \advance\pgf@xc\tikzext@tikz@hvvh@distance
      \edef\pgf@tempa{\noexpand\pgfqpoint{\the\pgf@xc}{\the\pgf@yc}}%
      \edef\pgf@tempb{\noexpand\pgfqpoint{\the\pgf@xc}{\the\tikz@lasty}}%
      \edef\pgf@temp{\pgfqpoint{\the\pgf@x}{\the\pgf@y}}%
    \else
      \let\tikz@shapeborder@name\pgfutil@empty
      \iftikzext@tikz@hvvh@fromcenter
        \pgf@xc\pgf@xb
      \fi
      \pgfutil@ifxempty\tikzext@tikz@hvvh@ratio{%
        \ifdim\tikzext@tikz@hvvh@distance<0pt\relax
          \pgf@xc\tikz@lastx
        \fi
        \ifdim\pgf@xb>\tikz@lastx
          \tikzext@tikz@hvvh@distance-\tikzext@tikz@hvvh@distance
        \fi
      }{%
        \tikzext@tikz@hvvh@distance\tikz@lastx
        \advance\tikzext@tikz@hvvh@distance-\pgf@xc
        \tikzext@tikz@hvvh@distance\tikzext@tikz@hvvh@ratio\tikzext@tikz@hvvh@distance
      }%
      \advance\pgf@xc\tikzext@tikz@hvvh@distance
      \edef\pgf@tempa{\noexpand\pgfqpoint{\the\pgf@xc}{\the\pgf@yc}}%
      \edef\pgf@tempb{\noexpand\pgfqpoint{\the\pgf@xc}{\the\tikz@lasty}}%
      \edef\pgf@temp{\pgfqpoint{\the\tikz@lastx}{\the\tikz@lasty}}%
    \fi%
    \xdef\pgf@marshal{%
      \noexpand\tikz@do@hvvh
        {\expandafter\noexpand\pgf@tempa}%
        {\expandafter\noexpand\pgf@tempb}%
        {\expandafter\noexpand\pgf@temp}%
        {\noexpand\tikz@timer@hvhline}{\tikz@shapeborder@name}}%
  \endgroup
  \pgf@marshal}%

%% |-| operator
\def\tikzext@tikz@@vhv@lineto#1{%
  \edef\tikz@timer@start{\noexpand\pgfqpoint{\the\tikz@lastx}{\the\tikz@lasty}}%
  \pgf@xc=\tikz@lastx
  \pgf@yb=\tikz@lasty
  \pgf@yc=\tikz@lasty
  \tikz@make@last@position{#1}%
  \tikz@flush@moveto@toward{\pgfqpoint{\pgf@xc}{\tikz@lasty}}\pgf@xc\pgf@yc
  \begingroup
    \pgfqkeys{/tikz/ortho}{/tikz/style/.expand once=\tikz@hvvh@currentoption}%
    \iftikz@shapeborder
      \pgf@process{\pgfpointshapeborder{\tikz@shapeborder@name}{\pgfqpoint{\tikz@lastx}{\pgf@yb}}}%
      \iftikzext@tikz@hvvh@fromcenter
        \pgf@yc\pgf@yb
      \fi
      \ifx\tikzext@tikz@hvvh@ratio\pgfutil@empty
        \ifdim\tikzext@tikz@hvvh@distance<0pt\relax
          \iftikzext@tikz@hvvh@fromcenter
            \pgf@yc\tikz@lasty
          \else
            \pgf@yc\pgf@y
          \fi
        \fi
        \ifdim\pgf@yb>\tikz@lasty
          \tikzext@tikz@hvvh@distance-\tikzext@tikz@hvvh@distance
        \fi
      \else
        \iftikzext@tikz@hvvh@fromcenter
          \tikzext@tikz@hvvh@distance\tikz@lasty
        \else
          \tikzext@tikz@hvvh@distance\pgf@y
        \fi
        \advance\tikzext@tikz@hvvh@distance-\pgf@yc
        \tikzext@tikz@hvvh@distance\tikzext@tikz@hvvh@ratio\tikzext@tikz@hvvh@distance
      \fi
      \advance\pgf@yc\tikzext@tikz@hvvh@distance
      \edef\pgf@tempa{\noexpand\pgfqpoint{\the\pgf@xc}{\the\pgf@yc}}%
      \edef\pgf@tempb{\noexpand\pgfqpoint{\the\tikz@lastx}{\the\pgf@yc}}%
      \edef\pgf@temp{\pgfqpoint{\the\pgf@x}{\the\pgf@y}}%
    \else
      \let\tikz@shapeborder@name\pgfutil@empty
      \iftikzext@tikz@hvvh@fromcenter
        \pgf@yc\pgf@yb
      \fi
      \ifx\tikzext@tikz@hvvh@ratio\pgfutil@empty
        \ifdim\tikzext@tikz@hvvh@distance<0pt\relax
          \pgf@yc\tikz@lasty
        \fi
        \ifdim\pgf@yb>\tikz@lasty
          \tikzext@tikz@hvvh@distance-\tikzext@tikz@hvvh@distance
        \fi
      \else
        \tikzext@tikz@hvvh@distance\tikz@lasty
        \advance\tikzext@tikz@hvvh@distance-\pgf@yc
        \tikzext@tikz@hvvh@distance\tikzext@tikz@hvvh@ratio\tikzext@tikz@hvvh@distance
      \fi
      \advance\pgf@yc\tikzext@tikz@hvvh@distance
      \edef\pgf@tempa{\noexpand\pgfqpoint{\the\pgf@xc}{\the\pgf@yc}}%
      \edef\pgf@tempb{\noexpand\pgfqpoint{\the\tikz@lastx}{\the\pgf@yc}}%
      \edef\pgf@temp{\pgfqpoint{\the\tikz@lastx}{\the\tikz@lasty}}%
    \fi%
    \xdef\pgf@marshal{%
      \noexpand\tikz@do@hvvh
        {\expandafter\noexpand\pgf@tempa}%
        {\expandafter\noexpand\pgf@tempb}%
        {\expandafter\noexpand\pgf@temp}%
        {\noexpand\tikz@timer@vhvline}{\tikz@shapeborder@name}}%
  \endgroup
  \pgf@marshal}%

%% r-ud operator
\def\tikzext@tikz@@ud@lineto#1{%
  \edef\tikz@timer@start{\noexpand\pgfqpoint{\the\tikz@lastx}{\the\tikz@lasty}}%
  \pgf@xc\tikz@lastx
  \pgf@yb\tikz@lasty
  \advance\tikz@lasty1pt%
  \let\pgf@temp\tikz@moveto@waiting
  \tikz@flush@moveto@toward{\pgfqpoint{\tikz@lastx}{\tikz@lasty}}\pgf@xc\pgf@yc
  \tikz@make@last@position{#1}%
  \begingroup
    \pgfqkeys{/tikz/ortho}{/tikz/style/.expand once=\tikz@hvvh@currentoption}%
    \pgfmathsetlength\tikzext@tikz@udlr@distance{\pgfkeysvalueof{/tikz/ortho/ud distance}}%
    \iftikz@shapeborder
      \advance\pgf@y1pt%
      \pgf@process{\pgfpointshapeborder{\tikz@shapeborder@name}{\pgfqpoint{\pgf@x}{\pgf@y}}}%
      \iftikzext@tikz@hvvh@fromcenter
        \pgf@yc\pgf@yb
      \else\ifx\pgf@temp\relax
          \pgf@yc\pgf@yb
        \fi
      \fi
      \ifdim\pgf@yc<\pgf@y
        \iftikzext@tikz@hvvh@fromcenter
          \pgf@yc=\tikz@lasty
        \else
          \pgf@yc=\pgf@y
        \fi
      \fi
      \advance\pgf@yc\tikzext@tikz@udlr@distance
      \edef\pgf@temp{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}%
    \else
      \let\tikz@shapeborder@name\pgfutil@empty
      \ifx\pgf@temp\relax\else
        \iftikzext@tikz@hvvh@fromcenter\else
          \pgf@yb\pgf@yc
        \fi
      \fi
      \ifdim\pgf@yb<\tikz@lasty\pgf@yb\tikz@lasty\fi
      \advance\pgf@yb\tikzext@tikz@udlr@distance
      \pgf@yc\pgf@yb
      \edef\pgf@temp{\noexpand\pgfqpoint{\the\tikz@lastx}{\the\tikz@lasty}}%
    \fi
    \xdef\pgf@marshal{%
      \noexpand\tikz@do@hvvh
        {\noexpand\pgfqpoint{\the\pgf@xc}{\the\pgf@yc}}%
        {\noexpand\pgfqpoint{\the\tikz@lastx}{\the\pgf@yc}}%
        {\expandafter\noexpand\pgf@temp}%
        {\noexpand\tikz@timer@vhvline}{\tikz@shapeborder@name}}%
  \endgroup
  \pgf@marshal}%

%% r-du operator
\def\tikzext@tikz@@du@lineto#1{%
  \edef\tikz@timer@start{\noexpand\pgfqpoint{\the\tikz@lastx}{\the\tikz@lasty}}%
  \pgf@xc\tikz@lastx
  \pgf@yb\tikz@lasty
  \advance\tikz@lasty-1pt%
  \let\pgf@temp\tikz@moveto@waiting
  \tikz@flush@moveto@toward{\pgfqpoint{\tikz@lastx}{\tikz@lasty}}\pgf@xc\pgf@yc
  \tikz@make@last@position{#1}%
  \begingroup
    \pgfqkeys{/tikz/ortho}{/tikz/style/.expand once=\tikz@hvvh@currentoption}%
    \pgfmathsetlength\tikzext@tikz@udlr@distance{\pgfkeysvalueof{/tikz/ortho/du distance}}%
    \iftikz@shapeborder
      \advance\pgf@y-1pt%
      \pgf@process{\pgfpointshapeborder{\tikz@shapeborder@name}{\pgfqpoint{\pgf@x}{\pgf@y}}}%
      \iftikzext@tikz@hvvh@fromcenter
        \pgf@yc\pgf@yb
      \else\ifx\pgf@temp\relax
          \pgf@yc\pgf@yb
        \fi
      \fi
      \ifdim\pgf@yc>\pgf@y
        \iftikzext@tikz@hvvh@fromcenter
          \pgf@yc=\tikz@lasty
        \else
          \pgf@yc=\pgf@y
        \fi
      \fi
      \advance\pgf@yc-\tikzext@tikz@udlr@distance
      \edef\pgf@temp{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}%
    \else
      \let\tikz@shapeborder@name\pgfutil@empty
      \ifx\pgf@temp\relax\else
        \iftikzext@tikz@hvvh@fromcenter\else
          \pgf@yb\pgf@yc
        \fi
      \fi
      \ifdim\pgf@yb>\tikz@lasty\pgf@yb\tikz@lasty\fi
      \advance\pgf@yb-\tikzext@tikz@udlr@distance
      \pgf@yc\pgf@yb
      \edef\pgf@temp{\noexpand\pgfqpoint{\the\tikz@lastx}{\the\tikz@lasty}}%
    \fi
    \xdef\pgf@marshal{%
      \noexpand\tikz@do@hvvh
        {\noexpand\pgfqpoint{\the\pgf@xc}{\the\pgf@yc}}%
        {\noexpand\pgfqpoint{\the\tikz@lastx}{\the\pgf@yc}}%
        {\expandafter\noexpand\pgf@temp}%
        {\noexpand\tikz@timer@vhvline}{\tikz@shapeborder@name}}%
  \endgroup
  \pgf@marshal}%

%% r-lr operator
\def\tikzext@tikz@@lr@lineto#1{%
  \edef\tikz@timer@start{\noexpand\pgfqpoint{\the\tikz@lastx}{\the\tikz@lasty}}%
  \pgf@xb\tikz@lastx
  \pgf@yc\tikz@lasty
  \advance\tikz@lastx-1pt%
  \let\pgf@temp\tikz@moveto@waiting
  \tikz@flush@moveto@toward{\pgfqpoint{\tikz@lastx}{\tikz@lasty}}\pgf@xc\pgf@yc
  \tikz@make@last@position{#1}%
  \begingroup
    \pgfqkeys{/tikz/ortho}{/tikz/style/.expand once=\tikz@hvvh@currentoption}%
    \pgfmathsetlength\tikzext@tikz@udlr@distance{\pgfkeysvalueof{/tikz/ortho/lr distance}}%
    \iftikz@shapeborder
      \advance\pgf@x-1pt%
      \pgf@process{\pgfpointshapeborder{\tikz@shapeborder@name}{\pgfqpoint{\pgf@x}{\pgf@y}}}%
      \iftikzext@tikz@hvvh@fromcenter
        \pgf@xc\pgf@xb
      \else\ifx\pgf@temp\relax
          \pgf@xc\pgf@xb
        \fi
      \fi
      \ifdim\pgf@xc>\pgf@x
        \iftikzext@tikz@hvvh@fromcenter
          \pgf@xc=\tikz@lastx
        \else
          \pgf@xc=\pgf@x
        \fi
      \fi
      \advance\pgf@xc-\tikzext@tikz@udlr@distance
      \edef\pgf@temp{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}%
    \else
      \let\tikz@shapeborder@name\pgfutil@empty
      \ifx\pgf@temp\relax\else
        \iftikzext@tikz@hvvh@fromcenter\else
          \pgf@xb\pgf@xc
        \fi
      \fi
      \ifdim\pgf@xb>\tikz@lastx\pgf@xb\tikz@lastx\fi
      \advance\pgf@xb-\tikzext@tikz@udlr@distance
      \pgf@xc\pgf@xb
      \edef\pgf@temp{\noexpand\pgfqpoint{\the\tikz@lastx}{\the\tikz@lasty}}%
    \fi
    \xdef\pgf@marshal{%
      \noexpand\tikz@do@hvvh
        {\noexpand\pgfqpoint{\the\pgf@xc}{\the\pgf@yc}}%
        {\noexpand\pgfqpoint{\the\pgf@xc}{\the\tikz@lasty}}%
        {\expandafter\noexpand\pgf@temp}%
        {\noexpand\tikz@timer@hvhline}{\tikz@shapeborder@name}}%
  \endgroup
  \pgf@marshal}%

%% r-rl operator
\def\tikzext@tikz@@rl@lineto#1{%
  \edef\tikz@timer@start{\noexpand\pgfqpoint{\the\tikz@lastx}{\the\tikz@lasty}}%
  \pgf@xb\tikz@lastx
  \pgf@yc\tikz@lasty
  \advance\tikz@lastx1pt%
  \let\pgf@temp\tikz@moveto@waiting
  \tikz@flush@moveto@toward{\pgfqpoint{\tikz@lastx}{\tikz@lasty}}\pgf@xc\pgf@yc
  \tikz@make@last@position{#1}%
  \begingroup
    \pgfqkeys{/tikz/udlr}{/tikz/ortho/.expand once=\tikz@hvvh@currentoption}%
    \pgfmathsetlength\tikzext@tikz@udlr@distance{\pgfkeysvalueof{/tikz/ortho/rl distance}}%
    \iftikz@shapeborder%
      \advance\pgf@x1pt%
      \pgf@process{\pgfpointshapeborder{\tikz@shapeborder@name}{\pgfqpoint{\pgf@x}{\pgf@y}}}%
      \iftikzext@tikz@hvvh@fromcenter
        \pgf@xc\pgf@xb
      \else\ifx\pgf@temp\relax
          \pgf@xc\pgf@xb
        \fi
      \fi
      \ifdim\pgf@xc<\pgf@x
        \iftikzext@tikz@hvvh@fromcenter
          \pgf@xc=\tikz@lastx
        \else
          \pgf@xc=\pgf@x
        \fi
      \fi
      \advance\pgf@xc\tikzext@tikz@udlr@distance
      \edef\pgf@temp{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}%
    \else
      \let\tikz@shapeborder@name\pgfutil@empty%
      \ifx\pgf@temp\relax\else
        \iftikzext@tikz@hvvh@fromcenter\else
          \pgf@xb\pgf@xc
        \fi
      \fi
      \ifdim\pgf@xb<\tikz@lastx\pgf@xb\tikz@lastx\fi
      \advance\pgf@xb\tikzext@tikz@udlr@distance
      \pgf@xc\pgf@xb
      \edef\pgf@temp{\noexpand\pgfqpoint{\the\tikz@lastx}{\the\tikz@lasty}}%
    \fi
    \xdef\pgf@marshal{%
      \noexpand\tikz@do@hvvh
        {\noexpand\pgfqpoint{\the\pgf@xc}{\the\pgf@yc}}%
        {\noexpand\pgfqpoint{\the\pgf@xc}{\the\tikz@lasty}}%
        {\expandafter\noexpand\pgf@temp}%
        {\noexpand\tikz@timer@hvhline}{\tikz@shapeborder@name}}%
  \endgroup
  \pgf@marshal}%

%% a few nice to haves, use with to or edge operator
\tikzset{
  node as new start/.is if=tikzext@ortho@preflush,
  node as new start,
  ortho/install shortcuts/.style={
    *|/.style={only vertical second={#1}},   *|/.default=,
    |*/.style={only vertical first={#1}},    |*/.default=,
    *-/.style={only horizontal second={#1}}, *-/.default=,
    -*/.style={only horizontal first={#1}},  -*/.default=,
    |-/.style={to path={|-(\tikztotarget)\tikztonodes}},
    -|/.style={to path={-|(\tikztotarget)\tikztonodes}},
    -|-/.style=/tikz/horizontal vertical horizontal,
    |-|/.style=/tikz/vertical horizontal vertical,
  },
  horizontal vertical/.style={to path={-| (\tikztotarget) \tikztonodes}},
  vertical horizontal/.style={to path={|- (\tikztotarget) \tikztonodes}},
  horizontal vertical horizontal/.style={to path={-|- (\tikztotarget) \tikztonodes}},
  vertical horizontal vertical/.style={to path={|-| (\tikztotarget) \tikztonodes}},
  only vertical second/.style={to path={
    \pgfextra
      \let\tikzext@ortho@anchor\pgfutil@empty
      \let\tikzext@origtotarget\pgfutil@empty
      \tikz@scan@one@point\pgfutil@firstofone(\tikztostart)\relax
      \iftikz@shapeborder
        \tikz@scan@one@point\pgfutil@firstofone(\tikztotarget)\relax
        \ifdim\pgf@y>\tikz@lasty\relax
          \edef\tikztostart{\tikztostart.north}%
          \iftikz@shapeborder\def\tikzext@ortho@anchor{.south}\fi
        \else
          \edef\tikztostart{\tikztostart.south}%
          \iftikz@shapeborder\def\tikzext@ortho@anchor{.north}\fi
        \fi
      \fi
      \def\tikz@tempa{#1}%
      \ifx\tikz@tempa\pgfutil@empty\else
        \let\tikzext@origtotarget\tikztotarget
        \edef\tikztotarget{[xshift={#1}]\tikztotarget\tikzext@ortho@anchor}%
      \fi
    \endpgfextra
    [insert path/.expanded={
      (perpendicular cs: horizontal line through={(\tikztostart)},
                         vertical line through={(\tikztotarget)}) -- (\tikztotarget)}] \tikztonodes
      \pgfextra
        \ifx\tikzext@origtotarget\pgfutil@empty\else
          \iftikzext@ortho@preflush(\tikzext@origtotarget)\fi\fi\endpgfextra}},
  only vertical second/.default=,
  only horizontal second/.style={to path={
    \pgfextra
      \let\tikzext@ortho@anchor\pgfutil@empty
      \let\tikzext@origtotarget\pgfutil@empty
      \tikz@scan@one@point\pgfutil@firstofone(\tikztostart)\relax
      \iftikz@shapeborder
        \tikz@scan@one@point\pgfutil@firstofone(\tikztotarget)\relax
        \ifdim\pgf@x>\tikz@lastx\relax
          \edef\tikztostart{\tikztostart.east}%
          \iftikz@shapeborder\def\tikzext@ortho@anchor{.west}\fi
        \else
          \edef\tikztostart{\tikztostart.west}%
          \iftikz@shapeborder\def\tikzext@ortho@anchor{.east}\fi
        \fi
      \fi
      \def\tikz@tempa{#1}%
      \ifx\tikz@tempa\pgfutil@empty\else
        \let\tikzext@origtotarget\tikztotarget
        \edef\tikztotarget{[yshift={#1}]\tikztotarget\tikzext@ortho@anchor}%
      \fi
    \endpgfextra
    [insert path/.expanded={
      (perpendicular cs: vertical line through={(\tikztostart)},
                         horizontal line through={(\tikztotarget)}) -- (\tikztotarget)}] \tikztonodes
    \pgfextra
      \ifx\tikzext@origtotarget\pgfutil@empty\else
        \iftikzext@ortho@preflush(\tikzext@origtotarget)\fi\fi\endpgfextra}},
  only horizontal second/.default=,
  only vertical first/.style={to path={
    \pgfextra
      \let\tikzext@ortho@anchor\pgfutil@empty
      \let\tikzext@origtotarget\pgfutil@empty
      \tikz@scan@one@point\pgfutil@firstofone(\tikztotarget)\relax
      \pgf@ya=\pgf@y
      \iftikz@shapeborder
        \let\tikzext@origtotarget\tikztotarget
        \tikz@scan@one@point\pgfutil@firstofone(\tikztostart)\relax
        \ifdim\pgf@ya>\tikz@lasty\relax
          \edef\tikztotarget{\tikztotarget.south}%
          \iftikz@shapeborder\def\tikzext@ortho@anchor{.north}\fi
        \else
          \edef\tikztotarget{\tikztotarget.north}%
          \iftikz@shapeborder\def\tikzext@ortho@anchor{.south}\fi
        \fi
      \fi
      \def\tikz@tempa{#1}%
      \ifx\tikz@tempa\pgfutil@empty\else
        \edef\tikztostart{[xshift={#1}]\tikztostart\tikzext@ortho@anchor}%
      \fi
    \endpgfextra
    [insert path/.expanded={(\tikztostart)}] 
    -- (perpendicular cs: vertical line through/.expanded={(\tikztostart)},
                        horizontal line through={(\tikztotarget)})
    \tikztonodes
    \pgfextra
      \ifx\tikzext@origtotarget\pgfutil@empty\else
        \iftikzext@ortho@preflush(\tikzext@origtotarget)\fi\fi\endpgfextra}},
  only vertical first/.default=,
  only horizontal first/.style={to path={
    \pgfextra
      \let\tikzext@ortho@anchor\pgfutil@empty
      \let\tikzext@origtotarget\pgfutil@empty
      \tikz@scan@one@point\pgfutil@firstofone(\tikztotarget)\relax
      \pgf@xa=\pgf@x
      \iftikz@shapeborder
        \let\tikzext@origtotarget\tikztotarget
        \tikz@scan@one@point\pgfutil@firstofone(\tikztostart)\relax
        \ifdim\pgf@xa>\tikz@lastx\relax
          \edef\tikztotarget{\tikztotarget.west}%
          \iftikz@shapeborder\def\tikzext@ortho@anchor{.east}\fi
        \else
          \edef\tikztotarget{\tikztotarget.east}%
          \iftikz@shapeborder\def\tikzext@ortho@anchor{.west}\fi
        \fi
      \fi
      \def\tikz@tempa{#1}%
      \ifx\tikz@tempa\pgfutil@empty\else
        \edef\tikztostart{[yshift={#1}]\tikztostart\tikzext@ortho@anchor}%
      \fi
    \endpgfextra
    [insert path/.expanded={(\tikztostart)}]
      -- (perpendicular cs: horizontal line through/.expanded={(\tikztostart)},
                              vertical line through={(\tikztotarget)})
    \tikztonodes \pgfextra
      \ifx\tikzext@origtotarget\pgfutil@empty\else
        \iftikzext@ortho@preflush(\tikzext@origtotarget)\fi\fi\endpgfextra}},
  only horizontal first/.default=,
  only vertical first to center/.style={to path={
      \pgfextra
        \let\tikzext@origtotarget\tikztotarget
      \endpgfextra
    (\tikztostart) -- (perpendicular cs: vertical line through={(\tikztostart)},
                                         horizontal line through={(\tikztotarget)})
    \tikztonodes \ifx\tikzext@origtotarget\pgfutil@empty\else\iftikzext@ortho@preflush(\tikzext@origtotarget)\fi\fi}},
  only horizontal first to center/.style={to path={
      \pgfextra
        \let\tikzext@origtotarget\tikztotarget
      \endpgfextra
    (\tikztostart) -- (perpendicular cs: horizontal line through={(\tikztostart)},
                                         vertical line through={(\tikztotarget)})
    \tikztonodes \ifx\tikzext@origtotarget\pgfutil@empty\else\iftikzext@ortho@preflush(\tikzext@origtotarget)\fi\fi}}%
}
\endinput