\usepgflibrary{matrix.skeleton}

\usetikzlibrary{matrix}
\usetikzlibrary{fit}
\usetikzlibrary{backgrounds}

\tikzset{
  label skeleton/.code = {
    \pgfmatrixlabelskeleton
  },
  add styling node/.style = {
    append after command = {
      \pgfextra
        \pgfinterruptpath
          % This next line is not useful in CVS. This is protection that was needed in the past for nodes.
          \setbox\tikz@figbox=\box\pgfutil@voidb@x
          #1
        \endpgfinterruptpath
      \endpgfextra
    }
  },
  style odd rows/.style = {
    label skeleton,
    add styling node = {
      \foreach \row in {1, ..., \the\pgfmatrixcurrentrow}{
        \ifodd\row
          \fitandstyle{(\tikzlastnode-row-\row)}{#1}
        \fi
      }
    }
  },
  style even rows/.style = {
    label skeleton,
    add styling node={
      \foreach \row in {1, ..., \the\pgfmatrixcurrentrow}{
        \ifodd\row
        \else
          \fitandstyle{(\tikzlastnode-row-\row)}{#1}
        \fi
      }
    }
  },
  style odd rows on layer/.style 2 args= {
    label skeleton,
    add styling node = {
      \foreach \row in {1, ..., \the\pgfmatrixcurrentrow}{
        \ifodd\row
          \fitandstyle[#1]{(\tikzlastnode-row-\row)}{#2}
        \fi
      }
    }
  },
  style even rows on layer/.style 2 args = {
    label skeleton,
    add styling node={
      \foreach \row in {1, ..., \the\pgfmatrixcurrentrow}{
        \ifodd\row
        \else
          \fitandstyle[#1]{(\tikzlastnode-row-\row)}{#2}
        \fi
      }
    }
  },
  style odd tiling rows/.style = {
    label skeleton,
    add styling node = {
      \foreach \row in {1, ..., \the\pgfmatrixcurrentrow}{
        \ifodd\row
          \fitandstyle{(\tikzlastnode-tiling-row-\row)}{#1}
        \fi
      }
    }
  },
  style even tiling rows/.style = {
    label skeleton,
    add styling node={
      \foreach \row in {1, ..., \the\pgfmatrixcurrentrow}{
        \ifodd\row
        \else
          \fitandstyle{(\tikzlastnode-tiling-row-\row)}{#1}
        \fi
      }
    }
  },
  style odd tiling rows on layer/.style 2 args= {
    label skeleton,
    add styling node = {
      \foreach \row in {1, ..., \the\pgfmatrixcurrentrow}{
        \ifodd\row
          \fitandstyle[#1]{(\tikzlastnode-tiling-row-\row)}{#2}
        \fi
      }
    }
  },
  style even tiling rows on layer/.style 2 args = {
    label skeleton,
    add styling node={
      \foreach \row in {1, ..., \the\pgfmatrixcurrentrow}{
        \ifodd\row
        \else
          \fitandstyle[#1]{(\tikzlastnode-tiling-row-\row)}{#2}
        \fi
      }
    }
  },
  style odd columns/.style = {
    label skeleton,
    add styling node = {
      \foreach \col in {1, ..., \the\pgf@matrix@numberofcolumns}{
        \ifodd\col
          \fitandstyle{(\tikzlastnode-column-\col)}{#1}
        \fi
      }
    }
  },
  style even columns/.style = {
    label skeleton,
    add styling node={
      \foreach \col in {1, ..., \the\pgf@matrix@numberofcolumns}{
        \ifodd\col
        \else
          \fitandstyle{(\tikzlastnode-column-\col)}{#1}
        \fi
      }
    }
  },
  style odd columns on layer/.style 2 args= {
    label skeleton,
    add styling node = {
      \foreach \col in {1, ..., \the\pgf@matrix@numberofcolumns}{
        \ifodd\col
          \fitandstyle[#1]{(\tikzlastnode-column-\col)}{#2}
        \fi
      }
    }
  },
  style even columns on layer/.style 2 args = {
    label skeleton,
    add styling node={
      \foreach \col in {1, ..., \the\pgf@matrix@numberofcolumns}{
        \ifodd\col
        \else
          \fitandstyle[#1]{(\tikzlastnode-column-\col)}{#2}
        \fi
      }
    }
  },
  style odd tiling columns/.style = {
    label skeleton,
    add styling node = {
      \foreach \col in {1, ..., \the\pgf@matrix@numberofcolumns}{
        \ifodd\col
          \fitandstyle{(\tikzlastnode-tiling-column-\col)}{#1}
        \fi
      }
    }
  },
  style even tiling columns/.style = {
    label skeleton,
    add styling node={
      \foreach \col in {1, ..., \the\pgf@matrix@numberofcolumns}{
        \ifodd\col
        \else
          \fitandstyle{(\tikzlastnode-tiling-column-\col)}{#1}
        \fi
      }
    }
  },
  style odd tiling columns on layer/.style 2 args= {
    label skeleton,
    add styling node = {
      \foreach \col in {1, ..., \the\pgf@matrix@numberofcolumns}{
        \ifodd\col
          \fitandstyle[#1]{(\tikzlastnode-tiling-column-\col)}{#2}
        \fi
      }
    }
  },
  style even tiling columns on layer/.style 2 args = {
    label skeleton,
    add styling node={
      \foreach \col in {1, ..., \the\pgf@matrix@numberofcolumns}{
        \ifodd\col
        \else
          \fitandstyle[#1]{(\tikzlastnode-tiling-column-\col)}{#2}
        \fi
      }
    }
  },
  style contour/.style = {%
    label skeleton,
    add styling node = {
      \stylecontour{#1}
    }
  },
  style contour on layer/.style 2 args= {%
    label skeleton,
    add styling node = {
      \pgfonlayer{#1}
        \stylecontour{#2}
      \endpgfonlayer
    }
  },
  style grid/.style = {%
    label skeleton,
    add styling node = {
      \stylegrid{#1}
    }
  },
  style grid on layer/.style 2 args= {%
    label skeleton,
    add styling node = {
      \pgfonlayer{#1}
        \stylegrid{#2}
      \endpgfonlayer
    }
  },
  style tiling grid/.style = {%
    label skeleton,
    add styling node = {
      \styletilinggrid{#1}
    }
  },
  style tiling grid on layer/.style 2 args= {%
    label skeleton,
    add styling node = {
      \pgfonlayer{#1}
        \styletilinggrid{#2}
      \endpgfonlayer
    }
  },
}

\def\fitandstyle{\@ifnextchar[{\fitandstyle@layer}{\fitandstyle@main}}
\def\fitandstyle@layer[#1]#2#3{
  \pgfonlayer{#1}
    \fitandstyle@main{#2}{#3}
  \endpgfonlayer
}
\def\fitandstyle@main#1#2{\node [fit = #1, inner sep = 0pt, #2] {};}

\def\stylecontour#1{
  \path [#1] (\tikzlastnode-row-1.north west) -- (\tikzlastnode-row-1.north east) -- (\tikzlastnode-row-\the\pgfmatrixcurrentrow.south east) -- (\tikzlastnode-row-\the\pgfmatrixcurrentrow.south west) -- cycle;
}

\def\stylegrid#1{
  \ifnum\the\pgfmatrixcurrentrow>1\relax%
    \foreach \row in {1, ..., \the\pgfmatrixcurrentrow}{
      \ifnum\row<\the\pgfmatrixcurrentrow\relax%
        \path [#1] (\tikzlastnode-inter-row-\row.west) -- (\tikzlastnode-inter-row-\row.east);
      \fi
    }
  \fi
  \ifnum\the\pgf@matrix@numberofcolumns>1\relax%
    \foreach \column in {1, ..., \the\pgf@matrix@numberofcolumns}{
      \ifnum\column<\the\pgf@matrix@numberofcolumns\relax%
        \path [#1] (\tikzlastnode-inter-column-\column.north) -- (\tikzlastnode-inter-column-\column.south);
      \fi
    }
  \fi
}

\def\styletilinggrid#1{
  \ifnum\the\pgfmatrixcurrentrow>1\relax%
    \foreach \row in {1, ..., \the\pgfmatrixcurrentrow}{
      \ifnum\row<\the\pgfmatrixcurrentrow\relax%
        \path [#1] (\tikzlastnode-tiling-row-\row.south west) -- (\tikzlastnode-tiling-row-\row.south east);
      \fi
    }
  \fi
  \ifnum\the\pgf@matrix@numberofcolumns>1\relax%
    \foreach \column in {1, ..., \the\pgf@matrix@numberofcolumns}{
      \ifnum\column<\the\pgf@matrix@numberofcolumns\relax%
        \path [#1] (\tikzlastnode-tiling-column-\column.north east) -- (\tikzlastnode-tiling-column-\column.south east);
      \fi
    }
  \fi
}
