% \iffalse
% <*chit>
% --------------------------------------------------------------------
% \fi
% \subsubsection{Table of chits}
%
%    \begin{macrocode}
\tikzset{
  chit/cell background/.style={fill=black},
  %chit/cell background flipped/.style={fill=black},
  blank chit/.style={/chit/frame={draw=none,fill=none}},
  chit/grid lines/.style={dashed},
}
%    \end{macrocode}
% 
% These macros are used when we set tables of chits.  This allows us
% to define blank spaces in the table by giving the element
% \texttt{blank~chit}.
% 
%    \begin{macrocode}
\def\chit@blank{blank chit}
\def\chit@cellbg(#1,#2)#3{%
  \draw[chit/cell background](#1-#3/2,#2-#3/2) rectangle++(#3,#3);
}
\def\chit@celldblbg(#1,#2)#3{%
  \draw[chit/cell background,chit/cell background flipped/.try]%
  (#1-#3/2,#2-#3/2) rectangle++(#3,#3);
}
%    \end{macrocode}
% 
% \begin{Macro}{\ifchits@reset}
%
%   This `if' controls whether to reset the coordinates to the origin
%   when \cs{chits} is called.  If true, then reset for a new table.
%   
%    \begin{macrocode}
\newif\ifchits@reset\chits@resettrue
%    \end{macrocode}
% \end{Macro}
% 
% \begin{Macro}{\chits,\@chits,\chit@sng@cellupdate}
%    \begin{macrocode}
\def\chit@sng@cellupdate(#1,#2)#3#4{%
  \chit@dbg{2}{Current `#1' vs `#4'*(`#3'+1)}
  \pgfmathparse{ifthenelse(#1>=#4*(#3-1),#2-#4,#2)}%
  \xdef#2{\pgfmathresult}%
  \pgfmathparse{ifthenelse(#1>=#4*(#3-1),0,#1+#4)}%
  \xdef#1{\pgfmathresult}%
}
%    \end{macrocode}
%
% The stared version (\cs{chits*}) of this macro continues the
% previously set chit table.
% 
%    \begin{macrocode}
\def\chits{%
  \@ifstar{\chits@resetfalse\@chits}{\chits@resettrue\@chits}}
%    \end{macrocode}
% 
%    \begin{macrocode}
\def\@chits#1#2#3{
  \ifchits@reset
    \def\r{0}%
    \def\c{0}%
  \fi
  \chit@dbg{1}{Chits to make: #1}%
  \foreach[count=\ti from 0] \t/\x in #1{%
    \chit@dbg{2}{Turn `\t' with option `\x'}
    \ifx\t\empty\else%
      \foreach \u/\m in \t{%
        \ifx\u\empty\else%
          \chit@dbg{2}{Next chit `\u' with possible multiplicity `\m'}%
          \ifx\m\@empty\def\m{1}\fi%
          \ifx\u\m\def\m{1}\fi%
          \chit@dbg{2}{Next chit `\u' multiplicity `\m'}%
          \foreach \n in {1,...,\m}{%
            \ifx\u\chit@blank%
              \chit@dbg{3}{Ignoring blank chit:\u}%
            \else%
              \chit@cellbg(\c,\r){#3}%
              \chit[\u=\ti](\c,\r)%
              \chit@sng@cellupdate(\c,\r){#2}{#3}%
            \fi%
          }%
        \fi%
      }%
    \fi%
  }%
  \@ifnextchar;{\@gobble}{}}
%    \end{macrocode}
% \end{Macro}
% \begin{Macro}{\chitgrid}
% \begin{enumerate}
% \item columns
% \item rows
% \item cell-size
% \end{enumerate}
%
%    \begin{macrocode}
\def\chitgrid#1#2#3{%
  \pgfmathparse{#3/2}\edef\rmin{\pgfmathresult}%
  \pgfmathparse{#2*#3-#3/2}\edef\rmax{\pgfmathresult}%
  %\draw[red](-#3/2,\rmin)rectangle(#3*#1-#3/2,-\rmax);
  \foreach \cc in {0,...,#1}{
    \draw[chit/grid lines] (\cc*#3-#3/2,3*#3/4)--(\cc*#3-#3/2,-\rmax-#3/4);}
  %\chit@dbg{0}{Drawing horizontal lines from `\rmin, `-\rmin', ..., `-\rmax'}
  \foreach \rr in {\rmin,-\rmin,...,-\rmax}{
    %\chit@dbg{0}{Horizontal line at `\rr'}
    \draw[chit/grid lines] (-3*#3/4,\rr)--(#1*#3-#3/4,\rr);}  
}
%    \end{macrocode}
% \end{Macro}
%
% \begin{Macro}{\doublechits,
%   \@doublechits,
%   \chit@dbl@cellupdate,
%   \chit@dbl@flip}
% \begin{enumerate}
% \item coordinates
% \item coordinates
% \item cell-size
% \end{enumerate}
% 
%    \begin{macrocode}
\def\chit@dbl@flip(#1,#2)#3{%
  \pgfmathparse{-#1}%
  \xdef\mc{\pgfmathresult}%
}
%    \end{macrocode}
% 
%   \begin{enumerate}
%   \item coordinates
%   \item coordinates
%   \item Number of columns
%   \item cell-size
%   \end{enumerate}
%
%    \begin{macrocode}
\def\chit@dbl@cellupdate(#1,#2)#3#4{%
  \pgfmathparse{ifthenelse(#1<-#4/2,#2,#4+#2)}%
  \xdef#2{\pgfmathresult}%
  \pgfmathparse{ifthenelse(#1<-#4/2,#4+#1,-(#3-.5)*#4)}%
  \xdef#1{\pgfmathresult}%
}
%    \end{macrocode}
%
%   \begin{enumerate}
%   \item List of list of keys
%   \item Number of columns
%   \item size of each cell
%   \end{enumerate}
% 
%   The stared version (\cs{doublechits*}) of this macro continues the
%   previously set chit table.
% 
%    \begin{macrocode}
\def\doublechits{%
  \@ifstar{\chits@resetfalse\@doublechits}{\chits@resettrue\@doublechits}}
%    \end{macrocode}
%
%    \begin{macrocode}
\def\@doublechits#1#2#3{%
  \chit@dbg{1}{Setting double-sided chits: #1}
  \ifchits@reset
    \pgfmathparse{-(#2-.5)*#3}
    \xdef\c{\pgfmathresult}
    \def\r{0}
  \fi
  
  \foreach[count=\ti from 0] \t/\x in #1{
    \ifx\t\empty\else%
      \foreach \u/\m in \t{
        \ifx\u\empty\else
          \ifx\m\@empty\def\m{1}\else%
            \ifx\u\m\def\m{1}\fi\fi
          \chit@dbg{2}{`\u'=`\m' (\c,\r)}
          \foreach \n in {1,...,\m}{%
            \ifx\u\chit@blank
              \chit@dbg{3}{Ignoring blank chit:\u}
            \else
              \chit@cellbg(\c,\r){#3}
              \chit[\u=\ti](\c,\r)
              \chit@dbl@flip(\c,\r){#3}
              \chit@celldblbg(\mc,\r){#3}
              \chit[\u\space flipped=\ti,zone turn=\t,zone mult=\n](\mc,\r)
              \chit@dbl@cellupdate(\c,\r){#2}{#3}
            \fi
          }
        \fi
      }
    \fi
  }
  \draw[dashed](0,-3*#3/4)--(0,\r-#3/4);%
  \draw[dashed,<-] (#3/5,-2*#3/3)--(#3/2,-2*#3/3) node[transform shape,anchor=west]{Back};%
  \draw[dashed,<-] (-#3/5,-2*#3/3)--(-#3/2,-2*#3/3) node[transform shape,anchor=east]{Front};%
  % \foreach \cc in {0,...,#2}{
  %   \draw[dashed] (\cc*#3,-3*#3/4)--(\cc*#3,\r-#3/4);
  %   \draw[dashed] (-\cc*#3,-3*#3/4)--(-\cc*#3,\r-#3/4);}
  % \pgfmathparse{#3/2}\edef\rmin{\pgfmathresult}%
  % \chit@dbg{0}{Drawing horizontal lines from `-\rmin, `\rmin', ..., `\r'}
  % \foreach \rr in {-\rmin,\rmin,...,\r}{
  %   \chit@dbg{0}{Horizontal line at `\rr'}
  %   \draw[dashed] (-#2*#3-#3/4,\rr)--(#2*#3+#3/4,\rr);}
  \@ifnextchar;{\@gobble}{}}  
%    \end{macrocode}
% \end{Macro}
%    
% \begin{Macro}{\doublechitgrid}
% \begin{enumerate}
% \item columns
% \item rows
% \item cell-size
% \end{enumerate}
%
%    \begin{macrocode}
\def\doublechitgrid#1#2#3{%
  \pgfmathparse{#3/2}\edef\rmin{\pgfmathresult}%
  \pgfmathparse{#2*#3-#3/2}\edef\rmax{\pgfmathresult}%
  \foreach \cc in {0,...,#1}{
    \draw[chit/grid lines] (\cc*#3,-3*#3/4)--(\cc*#3,\rmax+#3/4);
    \draw[chit/grid lines] (-\cc*#3,-3*#3/4)--(-\cc*#3,\rmax+#3/4);}
  %\chit@dbg{0}{Drawing horizontal lines from `-\rmin, `\rmin', ..., `\rmax'}
  \foreach \rr in {-\rmin,\rmin,...,\rmax}{
    %\chit@dbg{0}{Horizontal line at `\rr'}
    \draw[chit/grid lines] (-#1*#3-#3/4,\rr)--(#1*#3+#3/4,\rr);}  
}
%    \end{macrocode}
% \end{Macro}
% \iffalse
% </chit>
% --------------------------------------------------------------------
% \fi
