[Tex/LaTex] Add more anchors to standard TikZ nodes with TikZ 3.0

node-connectionsnodestikz-pgf

In order to define additional anchors in TikZ, I use the code from this popular answer. Unfortunately, after updating to TikZ 3.0, the code does not work anymore. I now receive several errors and my file does not compile.

! Package PGF Math Error: Unknown function `westsouthwest' (in
'westsouthwest').

See the PGF Math package documentation for explanation. Type H
for immediate help. …

l.38 \draw (a.westsouthwest) — (a.north);

I assume that some command has been changed due to the update, but I don't really know how fix this. Here is the code:

MWE

\documentclass{article}
\usepackage{tikz}

\makeatletter
\def\pgfaddtoshape#1#2{%
  \begingroup
  \def\shape@name{#1}%
  \let\anchor\pgf@sh@anchor
  #2%
  \endgroup
}

\def\useanchor#1#2{\csname pgf@anchor@#1@#2\endcsname}

\def\@shiftback#1#2#3#4#5#6{%
    \advance\pgf@x by -#5\relax
    \advance\pgf@y by -#6\relax
}

\pgfaddtoshape{rectangle}{%
  \anchor{westsouthwest}{%
    \pgf@process{\northeast}%
    \pgf@ya=.5\pgf@y%
    \pgf@process{\southwest}%
    \pgf@y=1.5\pgf@y%
    \advance\pgf@y by \pgf@ya%
    \pgf@y=.5\pgf@y%
  }%
}

\makeatother

\begin{document}
\begin{tikzpicture}
\node (a) at (0,0) {1};
\draw (a.westsouthwest) -- (a.north);
\end{tikzpicture}
\end{document}

Best Answer

In the newer version of PGF \shape@name is now \pgf@sm@shape@name:

\documentclass[tikz,border=5]{standalone}
\makeatletter
\long\def\pgfshapeaddanchor#1#2{%
{%
  \def\pgf@sm@shape@name{#1}%
  \let\anchor=\pgf@sh@anchor%
  #2}%
}
\pgfshapeaddanchor{rectangle}{%
  \anchor{west north west}{%
    \pgf@process{\northeast}%
    \pgf@ya=1.5\pgf@y%
    \pgf@process{\southwest}%
    \pgf@y.5\pgf@y%
    \advance\pgf@y by \pgf@ya%
    \pgf@y=.5\pgf@y%
  }%
  \anchor{north north west}{%
    \pgf@process{\southwest}%
    \pgf@xa=1.5\pgf@x%
    \pgf@process{\northeast}%
    \pgf@x.5\pgf@x%
    \advance\pgf@x by \pgf@xa%
    \pgf@x=.5\pgf@x%
  }%
  \anchor{west south  west}{%
    \pgf@process{\northeast}%
    \pgf@ya=.5\pgf@y%
    \pgf@process{\southwest}%
    \pgf@y=1.5\pgf@y%
    \advance\pgf@y by \pgf@ya%
    \pgf@y=.5\pgf@y%
  }%
  \anchor{south south  west}{%
    \pgf@process{\northeast}%
    \pgf@xa=.5\pgf@x%
    \pgf@process{\southwest}%
    \pgf@x=1.5\pgf@x%
    \advance\pgf@x by \pgf@xa%
    \pgf@x=.5\pgf@x%
  }%
}

\makeatother
\tikzset{shape example/.style={
    color=black!30, draw, fill=yellow!30,
    line width=.5cm, inner xsep=2.5cm, inner ysep=0.5cm,
}}
\begin{document}
\Huge
\begin{tikzpicture}
\node[name=s,shape=rectangle,shape example] {Rectangle\vrule width 1pt height 2cm};
\foreach \anchor/\placement in
  {north west/above left, north/above,
   west/left,  south west/below left, south/below}
    \draw[shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)}
      node[\placement] {\scriptsize\texttt{(s.\anchor)}};

\foreach \anchor/\placement in
  {west south west/below left, west north west/above left,
   north north west/above, south south west/below}
    \draw[red,shift=(s.\anchor)] plot[mark=x] coordinates{(0,0)}
      node[\placement] {\scriptsize\texttt{(s.\anchor)}};
\end{tikzpicture}

\end{document}

enter image description here