%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% matrix.skeleton, version 1.1
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\usepgfmodule{matrix}

\def\pgfmatrixlabelskeleton{
 \let\pgf@matrix@compute@origin\pgf@matrix@skeleton@compute@origin
 \let\pgf@matrix@shift@nodes@initial\pgf@matrix@skeleton@shift@nodes@initial
 \let\pgf@end@matrix\pgf@end@matrix@skeleton
}

\expandafter\def\expandafter\pgf@end@matrix@skeleton\expandafter{\pgf@end@matrix \pgf@matrix@create@skeleton}%

% Creates the skeleton

% orig contains the upper left corner of the different boxes

\def\pgf@matrix@create@skeleton{%
 \xdef\pgf@matrix@skel@innerxsep{\pgfkeysvalueof{/pgf/inner xsep}}%
 \xdef\pgf@matrix@skel@innerysep{\pgfkeysvalueof{/pgf/inner ysep}}%
 \pgfscope%
   \pgf@process{\pgfpointanchor{\tikz@fig@name}{south west}}%
   \pgfmathsetlength\pgf@xa{\pgf@x + \pgf@matrix@skel@innerxsep}%
   \pgfmathsetlength\pgf@ya{\pgf@y + \pgf@matrix@skel@innerysep - \csname pgf@matrix@miny\the\pgfmatrixcurrentrow\endcsname - \pgfmatrixrowsep}%
   \pgftransformshift{\pgfpoint{\pgf@xa}{\pgf@ya}}%
   \pgfset{inner sep=0pt}%
   \pgf@matrix@skeleton@create@cells%
   \pgf@matrix@skeleton@create@tiling@cells%
   \pgf@matrix@skeleton@create@rows%
   \pgf@matrix@skeleton@create@tiling@rows%
   \pgf@matrix@skeleton@create@columns%
   \pgf@matrix@skeleton@create@tiling@columns%
 \endpgfscope%
}

\def\pgf@matrix@skeleton@create@cells{%
 \newcount\pgf@matrix@skel@next@row
 \foreach \pgf@matrix@skel@row in {1, ..., \pgfmatrixcurrentrow} {%
   \pgf@matrix@skel@next@row=\pgf@matrix@skel@row
   \advance\pgf@matrix@skel@next@row by 1
   \pgfmathsetmacro{\pgf@matrix@skel@origy}{\csname pgf@matrix@origy\pgf@matrix@skel@row\endcsname + \csname pgf@matrix@maxy\pgf@matrix@skel@row\endcsname}%
   \pgfmathsetmacro{\pgf@matrix@skel@height}{\csname pgf@matrix@maxy\pgf@matrix@skel@row\endcsname - \csname pgf@matrix@miny\pgf@matrix@skel@row\endcsname - \pgflinewidth}%
   \pgfmathsetmacro{\pgf@matrix@skel@height}{\pgf@matrix@skel@height - \csname pgf@matrix@row@sep@\the\pgf@matrix@skel@next@row\endcsname}
   \foreach \pgf@matrix@skel@col in {1, ..., \pgf@matrix@numberofcolumns} {%
     \pgfmathsetmacro{\pgf@matrix@skel@origx}{\csname pgf@matrix@origx\pgf@matrix@skel@col\endcsname + \csname pgf@matrix@minx\pgf@matrix@skel@col\endcsname}%
     \pgfmathsetmacro{\pgf@matrix@skel@width}{\csname pgf@matrix@maxx\pgf@matrix@skel@col\endcsname - \csname pgf@matrix@minx\pgf@matrix@skel@col\endcsname - \pgflinewidth}%
     \ifnum\pgf@matrix@skel@col>1\relax%
       \pgfmathsetmacro{\pgf@matrix@skel@origx}{\pgf@matrix@skel@origx + \csname pgf@matrix@column@sep@\pgf@matrix@skel@col\endcsname}%
       \pgfmathsetmacro{\pgf@matrix@skel@width}{\pgf@matrix@skel@width - \pgflinewidth - \csname pgf@matrix@column@sep@\pgf@matrix@skel@col\endcsname}%
     \fi%
     {%
       \pgfset{minimum width=\pgf@matrix@skel@width, minimum height=\pgf@matrix@skel@height}%
       \pgftransformshift{\pgfpoint{\pgf@matrix@skel@origx pt}{\pgf@matrix@skel@origy pt}}%
       \pgfnode{rectangle}{north west}{}{\pgf@matrix@par@name-cell-\pgf@matrix@skel@row-\pgf@matrix@skel@col}{}%
     }
   }
 }
}

\def\pgf@matrix@skeleton@create@tiling@cells{%
 \newcount\pgf@matrix@skel@next@col
 \newcount\pgf@matrix@skel@next@row
 \foreach \pgf@matrix@skel@row in {1, ..., \pgfmatrixcurrentrow} {%
   \pgf@matrix@skel@next@row=\pgf@matrix@skel@row
   \advance\pgf@matrix@skel@next@row by 1
   \pgfmathsetmacro{\pgf@matrix@skel@origy}{\csname pgf@matrix@origy\pgf@matrix@skel@row\endcsname + \csname pgf@matrix@maxy\pgf@matrix@skel@row\endcsname}%
   \pgfmathsetmacro{\pgf@matrix@skel@height}{\csname pgf@matrix@maxy\pgf@matrix@skel@row\endcsname - \csname pgf@matrix@miny\pgf@matrix@skel@row\endcsname - \pgflinewidth}%
   \ifnum\pgf@matrix@skel@row=1\relax%
     \pgfmathsetmacro{\pgf@matrix@skel@origy}{\pgf@matrix@skel@origy + \pgf@matrix@skel@innerysep}%
     \pgfmathsetmacro{\pgf@matrix@skel@height}{\pgf@matrix@skel@height + \pgf@matrix@skel@innerysep}%
   \fi
   \ifnum\pgf@matrix@skel@row=\pgfmatrixcurrentrow\relax%
     \pgfmathsetmacro{\pgf@matrix@skel@height}{\pgf@matrix@skel@height + \pgf@matrix@skel@innerysep - \pgfmatrixrowsep}%
   \fi
   \ifnum\pgf@matrix@skel@row>1\relax%
     \pgfmathsetmacro{\pgf@matrix@skel@origy}{\pgf@matrix@skel@origy + 0.5 * \csname pgf@matrix@row@sep@\pgf@matrix@skel@row\endcsname}
     \pgfmathsetmacro{\pgf@matrix@skel@height}{\pgf@matrix@skel@height + 0.5 * \csname pgf@matrix@row@sep@\pgf@matrix@skel@row\endcsname}
   \fi
   \ifnum\pgf@matrix@skel@row<\pgfmatrixcurrentrow\relax%
     \pgfmathsetmacro{\pgf@matrix@skel@height}{\pgf@matrix@skel@height - 0.5 * \csname pgf@matrix@row@sep@\the\pgf@matrix@skel@next@row\endcsname}
   \fi
   \foreach \pgf@matrix@skel@col in {1, ..., \pgf@matrix@numberofcolumns} {%
     \pgf@matrix@skel@next@col=\pgf@matrix@skel@col
     \advance\pgf@matrix@skel@next@col by 1
     \pgfmathsetmacro{\pgf@matrix@skel@origx}{\csname pgf@matrix@origx\pgf@matrix@skel@col\endcsname + \csname pgf@matrix@minx\pgf@matrix@skel@col\endcsname}%
     \pgfmathsetmacro{\pgf@matrix@skel@width}{\csname pgf@matrix@maxx\pgf@matrix@skel@col\endcsname - \csname pgf@matrix@minx\pgf@matrix@skel@col\endcsname- \pgflinewidth}%
     \ifnum\pgf@matrix@skel@col=1\relax%
       \pgfmathsetmacro{\pgf@matrix@skel@origx}{\pgf@matrix@skel@origx - \pgf@matrix@skel@innerxsep}%
       \pgfmathsetmacro{\pgf@matrix@skel@width}{\pgf@matrix@skel@width + \pgf@matrix@skel@innerxsep}%
     \fi%
     \ifnum\pgf@matrix@skel@col=\pgf@matrix@numberofcolumns\relax%
       \pgfmathsetmacro{\pgf@matrix@skel@width}{\pgf@matrix@skel@width + \pgf@matrix@skel@innerxsep}%
     \fi%
     \ifnum\pgf@matrix@skel@col<\pgf@matrix@numberofcolumns%
       \pgfmathsetmacro{\pgf@matrix@skel@width}{\pgf@matrix@skel@width + 0.5 * \csname pgf@matrix@column@sep@\the\pgf@matrix@skel@next@col\endcsname}%
     \fi%
     \ifnum\pgf@matrix@skel@col>1%
       \pgfmathsetmacro{\pgf@matrix@skel@origx}{\pgf@matrix@skel@origx + 0.5 * \csname pgf@matrix@column@sep@\pgf@matrix@skel@col\endcsname}%
       \pgfmathsetmacro{\pgf@matrix@skel@width}{\pgf@matrix@skel@width - 0.5 * \csname pgf@matrix@column@sep@\pgf@matrix@skel@col\endcsname}%
     \fi%
     {%
       \pgfset{minimum width=\pgf@matrix@skel@width, minimum height=\pgf@matrix@skel@height}%
       \pgftransformshift{\pgfpoint{\pgf@matrix@skel@origx pt}{\pgf@matrix@skel@origy pt}}%
       \pgfnode{rectangle}{north west}{}{\pgf@matrix@par@name-tiling-cell-\pgf@matrix@skel@row-\pgf@matrix@skel@col}{}%
     }
   }
 }
}

\def\pgf@matrix@skeleton@create@rows{%
 \newcount\pgf@matrix@skel@next@row%
 \pgfmathsetmacro{\pgf@matrix@skel@width}{\csname pgf@matrix@origx\the\pgf@matrix@numberofcolumns\endcsname + \csname pgf@matrix@maxx\the\pgf@matrix@numberofcolumns\endcsname - \pgflinewidth}%
 \pgfmathsetmacro{\pgf@matrix@skel@origx}{\csname pgf@matrix@origx1\endcsname + \csname pgf@matrix@minx1\endcsname}%
 \foreach \pgf@matrix@skel@row in {1, ..., \pgfmatrixcurrentrow} {%
   \pgf@matrix@skel@next@row=\pgf@matrix@skel@row\relax%
   \advance\pgf@matrix@skel@next@row by1\relax%
   \pgfmathsetmacro{\pgf@matrix@skel@origy}{\csname pgf@matrix@origy\pgf@matrix@skel@row\endcsname + \csname pgf@matrix@maxy\pgf@matrix@skel@row\endcsname}%
   \pgfmathsetmacro{\pgf@matrix@skel@height}{\csname pgf@matrix@maxy\pgf@matrix@skel@row\endcsname - \csname pgf@matrix@miny\pgf@matrix@skel@row\endcsname - \csname pgf@matrix@row@sep@\the\pgf@matrix@skel@next@row\endcsname - \pgflinewidth}%
   {%
     \pgfset{minimum width=\pgf@matrix@skel@width, minimum height=\pgf@matrix@skel@height}%
     \pgftransformshift{\pgfpoint{\pgf@matrix@skel@origx pt}{\pgf@matrix@skel@origy pt}}%
     \pgfnode{rectangle}{north west}{}{\pgf@matrix@par@name-row-\pgf@matrix@skel@row}{}%
   }
   \ifnum\pgf@matrix@skel@row<\pgfmatrixcurrentrow\relax%
     \pgfmathsetmacro{\pgf@matrix@skel@origy}{\csname pgf@matrix@origy\the\pgf@matrix@skel@next@row\endcsname + \csname pgf@matrix@maxy\the\pgf@matrix@skel@next@row\endcsname + \csname pgf@matrix@row@sep@\the\pgf@matrix@skel@next@row\endcsname + 0.5 * \pgflinewidth}%
     \pgfmathsetmacro{\pgf@matrix@skel@height}{\csname pgf@matrix@row@sep@\the\pgf@matrix@skel@next@row\endcsname}%
     {%
       \pgfset{minimum width=\pgf@matrix@skel@width, minimum height=\pgf@matrix@skel@height}%
       \pgftransformshift{\pgfpoint{\pgf@matrix@skel@origx pt}{\pgf@matrix@skel@origy pt}}%
       \pgfnode{rectangle}{north west}{}{\pgf@matrix@par@name-inter-row-\pgf@matrix@skel@row}{}%
     }
   \fi%
 }
}

\def\pgf@matrix@skeleton@create@tiling@rows{%
 \newcount\pgf@matrix@skel@next@row%
 \pgfmathsetmacro{\pgf@matrix@skel@width}{\csname pgf@matrix@origx\the\pgf@matrix@numberofcolumns\endcsname + \csname pgf@matrix@maxx\the\pgf@matrix@numberofcolumns\endcsname - \pgflinewidth + 2 * \pgf@matrix@skel@innerxsep}%
 \pgfmathsetmacro{\pgf@matrix@skel@origx}{\csname pgf@matrix@origx1\endcsname + \csname pgf@matrix@minx1\endcsname - \pgf@matrix@skel@innerxsep}%
 \foreach \pgf@matrix@skel@row in {1, ..., \pgfmatrixcurrentrow} {%
   \pgf@matrix@skel@next@row=\pgf@matrix@skel@row\relax%
   \advance\pgf@matrix@skel@next@row by1\relax%
   \pgfmathsetmacro{\pgf@matrix@skel@origy}{\csname pgf@matrix@origy\pgf@matrix@skel@row\endcsname + \csname pgf@matrix@maxy\pgf@matrix@skel@row\endcsname}%
   \pgfmathsetmacro{\pgf@matrix@skel@height}{\csname pgf@matrix@maxy\pgf@matrix@skel@row\endcsname - \csname pgf@matrix@miny\pgf@matrix@skel@row\endcsname - \csname pgf@matrix@row@sep@\the\pgf@matrix@skel@next@row\endcsname - \pgflinewidth}%
   \ifnum\pgf@matrix@skel@row=1\relax%
     \pgfmathsetmacro{\pgf@matrix@skel@origy}{\pgf@matrix@skel@origy + \pgf@matrix@skel@innerysep}%
     \pgfmathsetmacro{\pgf@matrix@skel@height}{\pgf@matrix@skel@height + \pgf@matrix@skel@innerysep}%
   \fi
   \ifnum\pgf@matrix@skel@row=\pgfmatrixcurrentrow\relax%
     \pgfmathsetmacro{\pgf@matrix@skel@height}{\pgf@matrix@skel@height + \pgf@matrix@skel@innerysep}%
   \fi
   \ifnum\pgf@matrix@skel@row>1\relax%
     \pgfmathsetmacro{\pgf@matrix@skel@origy}{\pgf@matrix@skel@origy + 0.5 * \csname pgf@matrix@row@sep@\pgf@matrix@skel@row\endcsname}%
     \pgfmathsetmacro{\pgf@matrix@skel@height}{\pgf@matrix@skel@height + 0.5 * \csname pgf@matrix@row@sep@\pgf@matrix@skel@row\endcsname}%
   \fi%
   \ifnum\pgf@matrix@skel@row<\pgfmatrixcurrentrow\relax%
     \pgfmathsetmacro{\pgf@matrix@skel@height}{\pgf@matrix@skel@height + 0.5 * \csname pgf@matrix@row@sep@\the\pgf@matrix@skel@next@row\endcsname}%
   \fi%
   {%
     \pgfset{minimum width=\pgf@matrix@skel@width, minimum height=\pgf@matrix@skel@height}%
     \pgftransformshift{\pgfpoint{\pgf@matrix@skel@origx pt}{\pgf@matrix@skel@origy pt}}%
     \pgfnode{rectangle}{north west}{}{\pgf@matrix@par@name-tiling-row-\pgf@matrix@skel@row}{}%
   }
 }
}

\def\pgf@matrix@skeleton@create@columns{%
 \newcount\pgf@matrix@skel@prev@col%
 \pgfmathsetmacro{\pgf@matrix@skel@height}{\csname pgf@matrix@origy1\endcsname + \csname pgf@matrix@maxy1\endcsname - \csname pgf@matrix@miny\the\pgfmatrixcurrentrow\endcsname - \pgfmatrixrowsep - \pgflinewidth}%
 \pgfmathsetmacro{\pgf@matrix@skel@origy}{\csname pgf@matrix@origy1\endcsname + \csname pgf@matrix@maxy1\endcsname}%
 \foreach \pgf@matrix@skel@col in {1, ..., \pgf@matrix@numberofcolumns} {%
   \ifnum\pgf@matrix@skel@col>1\relax%
     \pgfmathsetmacro{\pgf@matrix@skel@origx}{\csname pgf@matrix@origx\pgf@matrix@skel@col\endcsname + \csname pgf@matrix@minx\pgf@matrix@skel@col\endcsname + \csname pgf@matrix@column@sep@\pgf@matrix@skel@col\endcsname}%
     \pgfmathsetmacro{\pgf@matrix@skel@width}{\csname pgf@matrix@maxx\pgf@matrix@skel@col\endcsname - \csname pgf@matrix@minx\pgf@matrix@skel@col\endcsname - \csname pgf@matrix@column@sep@\pgf@matrix@skel@col\endcsname - \pgflinewidth}%
   \else%
     \pgfmathsetmacro{\pgf@matrix@skel@origx}{\csname pgf@matrix@origx\pgf@matrix@skel@col\endcsname + \csname pgf@matrix@minx\pgf@matrix@skel@col\endcsname}%
     \pgfmathsetmacro{\pgf@matrix@skel@width}{\csname pgf@matrix@maxx\pgf@matrix@skel@col\endcsname - \csname pgf@matrix@minx\pgf@matrix@skel@col\endcsname - \pgflinewidth}%
   \fi%
   {%
     \pgfset{minimum width=\pgf@matrix@skel@width, minimum height=\pgf@matrix@skel@height}%
     \pgftransformshift{\pgfpoint{\pgf@matrix@skel@origx pt}{\pgf@matrix@skel@origy pt}}%
     \pgfnode{rectangle}{north west}{}{\pgf@matrix@par@name-column-\pgf@matrix@skel@col}{}%
   }
   \ifnum\pgf@matrix@skel@col>1\relax%
     \pgf@matrix@skel@prev@col=\pgf@matrix@skel@col\relax%
     \advance\pgf@matrix@skel@prev@col by-1\relax%
     \pgfmathsetmacro{\pgf@matrix@skel@origx}{\csname pgf@matrix@origx\the\pgf@matrix@skel@prev@col\endcsname + \csname pgf@matrix@maxx\the\pgf@matrix@skel@prev@col\endcsname - 0.5 * \pgflinewidth}%
     \pgfmathsetmacro{\pgf@matrix@skel@width}{\csname pgf@matrix@column@sep@\pgf@matrix@skel@col\endcsname}%
     {%
       \pgfset{minimum width=\pgf@matrix@skel@width, minimum height=\pgf@matrix@skel@height}%
       \pgftransformshift{\pgfpoint{\pgf@matrix@skel@origx pt}{\pgf@matrix@skel@origy pt}}%
       \pgfnode{rectangle}{north west}{}{\pgf@matrix@par@name-inter-column-\the\pgf@matrix@skel@prev@col}{}%
     }
   \fi%
 }
}

\def\pgf@matrix@skeleton@create@tiling@columns{%
 \newcount\pgf@matrix@skel@next@col%
 \pgfmathsetmacro{\pgf@matrix@skel@height}{\csname pgf@matrix@origy1\endcsname + \csname pgf@matrix@maxy1\endcsname - \csname pgf@matrix@miny\the\pgfmatrixcurrentrow\endcsname - \pgfmatrixrowsep - \pgflinewidth + 2 * \pgf@matrix@skel@innerysep}%
 \pgfmathsetmacro{\pgf@matrix@skel@origy}{\csname pgf@matrix@origy1\endcsname + \csname pgf@matrix@maxy1\endcsname + \pgf@matrix@skel@innerysep}%
 \foreach \pgf@matrix@skel@col in {1, ..., \pgf@matrix@numberofcolumns} {%
   \pgf@matrix@skel@next@col=\pgf@matrix@skel@col\relax%
   \advance\pgf@matrix@skel@next@col by1\relax%
   \ifnum\pgf@matrix@skel@col>1\relax%
     \pgfmathsetmacro{\pgf@matrix@skel@origx}{\csname pgf@matrix@origx\pgf@matrix@skel@col\endcsname + \csname pgf@matrix@minx\pgf@matrix@skel@col\endcsname + \csname pgf@matrix@column@sep@\pgf@matrix@skel@col\endcsname}%
     \pgfmathsetmacro{\pgf@matrix@skel@width}{\csname pgf@matrix@maxx\pgf@matrix@skel@col\endcsname - \csname pgf@matrix@minx\pgf@matrix@skel@col\endcsname - \csname pgf@matrix@column@sep@\pgf@matrix@skel@col\endcsname - \pgflinewidth}%
   \else%
     \pgfmathsetmacro{\pgf@matrix@skel@origx}{\csname pgf@matrix@origx\pgf@matrix@skel@col\endcsname + \csname pgf@matrix@minx\pgf@matrix@skel@col\endcsname}%
     \pgfmathsetmacro{\pgf@matrix@skel@width}{\csname pgf@matrix@maxx\pgf@matrix@skel@col\endcsname - \csname pgf@matrix@minx\pgf@matrix@skel@col\endcsname - \pgflinewidth}%
   \fi%
   \ifnum\pgf@matrix@skel@col=1\relax%
     \pgfmathsetmacro{\pgf@matrix@skel@origx}{\pgf@matrix@skel@origx - \pgf@matrix@skel@innerxsep}%
     \pgfmathsetmacro{\pgf@matrix@skel@width}{\pgf@matrix@skel@width + \pgf@matrix@skel@innerxsep}%
   \fi
   \ifnum\pgf@matrix@skel@col=\pgf@matrix@numberofcolumns\relax%
     \pgfmathsetmacro{\pgf@matrix@skel@width}{\pgf@matrix@skel@width + \pgf@matrix@skel@innerxsep}%
   \fi
   \ifnum\pgf@matrix@skel@col>1\relax%
     \pgfmathsetmacro{\pgf@matrix@skel@origx}{\pgf@matrix@skel@origx - 0.5 * \csname pgf@matrix@column@sep@\pgf@matrix@skel@col\endcsname}%
     \pgfmathsetmacro{\pgf@matrix@skel@width}{\pgf@matrix@skel@width + 0.5 * \csname pgf@matrix@column@sep@\pgf@matrix@skel@col\endcsname}%
   \fi
   \ifnum\pgf@matrix@skel@col<\pgf@matrix@numberofcolumns\relax%
     \pgfmathsetmacro{\pgf@matrix@skel@width}{\pgf@matrix@skel@width + 0.5 * \csname pgf@matrix@column@sep@\the\pgf@matrix@skel@next@col\endcsname}%
   \fi
   {%
     \pgfset{minimum width=\pgf@matrix@skel@width, minimum height=\pgf@matrix@skel@height}%
     \pgftransformshift{\pgfpoint{\pgf@matrix@skel@origx pt}{\pgf@matrix@skel@origy pt}}%
     \pgfnode{rectangle}{north west}{}{\pgf@matrix@par@name-tiling-column-\pgf@matrix@skel@col}{}%
   }
 }
}

% Compute the real positions of the origins

% We must now compute the real positions of the origins of all the
% small pictures. To this end, we need to compute prefix sums. After
% the procedure is done, the origx and the origy will contain the origin
% positions.

\def\pgf@matrix@skeleton@compute@origin{%
 %
 % Inverse prefix sum on the vertical positions
 %
 {%
   \ifnum\pgfmatrixcurrentrow>0\relax%
     \expandafter\gdef\csname pgf@matrix@origy\the\pgfmatrixcurrentrow\endcsname{0pt}%
   \fi%
   \c@pgf@counta=\pgfmatrixcurrentrow\relax%
   \loop%
   \ifnum\c@pgf@counta>1\relax%
     \pgf@y=\csname pgf@matrix@origy\the\c@pgf@counta\endcsname\relax%
     \advance\pgf@y by\csname pgf@matrix@maxy\the\c@pgf@counta\endcsname\relax
     \advance\c@pgf@counta by-1\relax%
     \pgf@ya=\csname pgf@matrix@miny\the\c@pgf@counta\endcsname\relax%
     \advance\pgf@y by-\pgf@ya\relax%
     \expandafter\xdef\csname pgf@matrix@origy\the\c@pgf@counta\endcsname{\the\pgf@y}%
   \repeat%
 }%
 %
 % Prefix sum on the horizontal positions
 %
 {%
   \ifnum\pgf@matrix@numberofcolumns>0\relax%
     \pgf@x=\csname pgf@matrix@minx1\endcsname\relax%
     \pgf@x=-\pgf@x%
     \expandafter\xdef\csname pgf@matrix@origx1\endcsname{\the\pgf@x}%
   \fi%
   \c@pgf@counta=1\relax%
   \loop%
   \ifnum\c@pgf@counta<\pgf@matrix@numberofcolumns\relax%
     \pgf@x=\csname pgf@matrix@origx\the\c@pgf@counta\endcsname\relax%
     \advance\pgf@x by\csname pgf@matrix@maxx\the\c@pgf@counta\endcsname\relax%
     \advance\c@pgf@counta by1\relax%
     \pgf@xa=\csname pgf@matrix@minx\the\c@pgf@counta\endcsname\relax%
     \advance\pgf@x by-\pgf@xa\relax%
     \expandafter\xdef\csname pgf@matrix@origx\the\c@pgf@counta\endcsname{\the\pgf@x}%
   \repeat%
 }%
}


% Shift the nodes to their origins

% The following procedure shifts all nodes in
% \pgf@matrix@node@list to their location inside a temporary
% picture. This picture will later be shifted again to its final
% position in the real picture.

\def\pgf@matrix@skeleton@shift@nodes@initial{%
 {%
 \pgfutil@for\pgf@matrix@node@name:=\pgf@matrix@node@list\do{%
   \ifx\pgf@matrix@node@name\pgfutil@empty%
   \else%
     \expandafter\ifx\csname pgf@matrix@node@visited@\pgf@matrix@node@name\endcsname\relax%
       \pgf@shift@node{\pgf@matrix@node@name}{%
         \pgf@x=\csname pgf@matrix@origx%
           \expandafter\expandafter\expandafter\pgfutil@secondoftwo\csname pgf@matrix@node@location@\pgf@matrix@node@name\endcsname\endcsname%
         \pgf@y=\csname pgf@matrix@origy%
           \expandafter\expandafter\expandafter\pgfutil@firstoftwo\csname pgf@matrix@node@location@\pgf@matrix@node@name\endcsname\endcsname%
         }%
       \expandafter\let\csname pgf@matrix@node@visited@\pgf@matrix@node@name\endcsname=\pgfutil@empty%
     \fi%
   \fi%
 }%
 }%
}


% End of line
\def\pgfmatrixendrow{%
 % if the cell contains nothing, the following \let will be at the
 % beginning (macro expansion has stopped here since neither \omit
 % nor \span was found)
 \let\pgf@matrix@signal@cell@end=\pgf@matrix@signal@cell@end%
 &\pgf@matrix@correct@calltrue%
 \global\pgf@matrix@fixedfalse%
 \pgf@y=0pt%
 \pgf@matrix@addtolength\pgf@y{\pgfmatrixrowsep}%
 \pgfutil@ifnextchar[{\pgfmatrixendrow@skip}{
 {
 \advance\pgfmatrixcurrentrow by1\relax % only temporary for the following:
 \expandafter\xdef\csname pgf@matrix@row@sep@\the\pgfmatrixcurrentrow\endcsname{\the\pgf@y}%
 }
 \pgf@matrix@finish@line}%
}

\def\pgfmatrixendrow@skip[#1]{%
 \pgf@matrix@addtolength\pgf@y{#1}%
 {
 \advance\pgfmatrixcurrentrow by1\relax % only temporary for the following:
 \expandafter\xdef\csname pgf@matrix@row@sep@\the\pgfmatrixcurrentrow\endcsname{\the\pgf@y}%
 }
 \pgf@matrix@finish@line%
}