% \iffalse
% --------------------------------------------------------------------
% <*chit>
% \fi
% 
% \subsubsection{The \texttt{chit} key namespace}
% \begin{TikzKey}{/chit/full,
%   /chit/symbol,
%   /chit/left,
%   /chit/right,
%   /chit/upper left,
%   /chit/upper right,
%   /chit/lower left,
%   /chit/lower right,
%   /chit/factors,
%   /chit/setup,
%   /chit/id}
%
%   The parts of a chit 
%   
%    \begin{macrocode}
\tikzset{%
  /chit/.search also={/tikz},
  /chit/.cd,
  full/.store in=\chit@full,               full/.initial=,%
  symbol/.store in=\chit@symbol,           symbol/.initial=,%
  left/.store in=\chit@left,               left/.initial=,%
  unique/.style={/chit/left={#1}},%
  right/.store in=\chit@right,             right/.initial=,%
  parent/.style={/chit/right={#1}},%
  upper left/.store in=\chit@upper@left,   upper left/.initial=,%
  upper right/.store in=\chit@upper@right, upper right/.initial=,%
  lower left/.store in=\chit@lower@left,   lower left/.initial=,%
  lower right/.store in=\chit@lower@right, lower right/.initial=,%
  factors/.store in=\chit@factors,         factors/.initial=,%
  setup/.store in=\chit@setup,             setup/.initial=,%
  id/.store in=\chit@id,                   id/.initial=,%
  frame/.store in=\chit@frame,             frame/.initial=,%
}
%    \end{macrocode}
% \end{TikzKey}
%
% \begin{TikzKey}{/tikz/chit/full,
%   /tikz/chit/symbol,
%   /tikz/chit/left,
%   /tikz/chit/right,
%   /tikz/chit/upper left,
%   /tikz/chit/upper right,
%   /tikz/chit/lower left,
%   /tikz/chit/lower right,
%   /tikz/chit/factors,
%   /tikz/chit/setup,
%   /tikz/chit/id}
%
% Styles of each element in a chit.  Users may override these at their
% own peril.  That is, it is OK to override them, but the user should
% be careful. 
% 
%    \begin{macrocode}
\tikzset{
  chit/symbol/.style={scale=.4,transform shape},
  chit/parts/.style={shape=rectangle,transform shape},
  chit/factors/.style={chit/parts,anchor=south},
  chit/left/.style={chit/parts,anchor=south,rotate=90},
  chit/right/.style={chit/parts,anchor=north,rotate=90},
  chit/upper left/.style={chit/parts,anchor=north west},
  chit/upper right/.style={chit/parts,anchor=north east},
  chit/lower left/.style={chit/parts,anchor=south west},
  chit/lower right/.style={chit/parts,anchor=south east},
  chit/setup/.style={chit/parts},
  chit/full/.style={chit/parts},
}
%    \end{macrocode}
% \end{TikzKey}
% 
% \iffalse
% --------------------------------------------------------------------
% \fi
% 
% \subsubsection{The \texttt{chit} styles}
% 
% \begin{TikzKey}{/tikz/chit}
%   This key sets up a node to make a chit.  The key takes a single
%   argument which in turn must contain key--value pairs in the
%   \texttt{/chit} (or \texttt{/tikz}) namespace(s).   We set the
%   \texttt{shape} parameter of the node, and calls the passed keys in
%   the \texttt{/chit} namespace to set-up elements of the chit. 
%
%    \begin{macrocode}
\tikzset{%
  chit/.code={%
    \pgfkeys{/tikz/transform shape,/tikz/shape=chit}
    \pgfkeys{/chit/.cd,#1}}}
%    \end{macrocode}
% \end{TikzKey}
%
% We define a counter to set-up unique names for chit nodes.
% 
%    \begin{macrocode}
\newcounter{chit@id}\setcounter{chit@id}{0}
%    \end{macrocode}
%
% \iffalse
% --------------------------------------------------------------------
% \fi
% \subsubsection{The \cs{chit} shape}
%
% \begin{Macro}{\chit@n@to,\@chit@n@to,\@@chit@n@to,\@chit@n@to@}
%
%   These macros puts the NATO App6(c) symbol into a chit.  The first
%   macro takes the identifier and position of the symbol, and then
%   scans for options.  If no options are given, then we go directly
%   to the rendering (\cs{@chit@n@to@}).  Otherwise, we may also need
%   to scan for an offset given as \parg{delta-x,delta-y}.
% 
%    \begin{macrocode}
\def\chit@n@to#1#2{%
  %% Without a following start square bracket '[' by-pass to final
  \chit@dbg{4}{Chit NATO App6(c) first step `#1' `#2'}
  \@ifnextchar[{%
    %\message{^^JStart square bracket}%
    \@chit@n@to{#1}{#2}}{%
    %\message{^^JNo start square bracket}%
    \@chit@n@to@{#1}{#2}}%]]
}
%    \end{macrocode}
%
% The following macro is called if we had no options.
% 
%    \begin{macrocode}
\def\@chit@n@to@#1#2#3\@end@chit@n@to{%
  \chit@dbg{4}{Chit NATO App6(c) w/o offset:
    ^^J  Options:  #3
    ^^J  ID:       #1
    ^^J  Position: #2}
  \node[chit/symbol,natoapp6c={#3,id=#1}] (#1) at (#2) {};
  \chit@dbg{4}{Chit NATO App6(c) ended}%
}
%    \end{macrocode}
%
% This is called if we had an option-like argument. Check if we have
% an offset
% 
%    \begin{macrocode}
\def\@chit@n@to#1#2[#3]{%
  \chit@dbg{4}{Chit NATO App6(c) second step `#1' `#2' `#3'}
  \@ifnextchar({\@@chit@n@to{#1}{#2}{#3}}{\@@chit@n@to{#1}{#2}{#3}(0,0)}%)
}
%    \end{macrocode}
%
% This called if we had option-like argument.
% 
%    \begin{macrocode}
\def\@@chit@n@to#1#2#3(#4)\@end@chit@n@to{%
  \chit@dbg{4}{Chit NATO App6(c) w/offset:
    ^^J  Options:  #3
    ^^J  ID:       #1
    ^^J  Position: #2
    ^^J  Offset:   #4}
  \node[chit/symbol,natoapp6c={#3,id=#1}] (#1) at ($(#2)+(#4)$) {};}
%    \end{macrocode}
% \end{Macro}
% 
% \begin{Macro}{\chit@tr@ns@nchor,\chit@nchor}
%
% Get anchor of sub-symbol element in chit.  We need to do this,
% because the symbol is translated and scaled.
% 
%    \begin{macrocode}
\def\chit@tr@ns@nchor#1{%
  \pgf@x=0.4\pgf@x%
  \pgf@y=0.4\pgf@y\advance\pgf@y#1}
%    \end{macrocode}
%    
%    \begin{macrocode}
\def\chit@nchor#1#2#3{%
  \wg@sub@nchor{#1}{#2}
  \chit@tr@ns@nchor{#3}}
\def\chit@report{}
\tikzset{
  zone turn/.style={},
  zone mult/.style={}
}
%    \end{macrocode}
% \end{Macro}
% 
% Now follows the actual \text{chit} shape.  This is rather long, so
% we will break it up a bit
%
%
% The first thing is we declare some saved anchors.  These are
% computed (and defined as internal macros) when the shape is
% instantised.  The anchors give the centre and north east corner of
% the node, the place to put the NATO App6(c) symbol and factors.   We
% also set a dimension for the margins (corner and factors elements). 
% 
%    \begin{macrocode}
\pgfdeclareshape{chit}{
  \savedanchor\center{\pgf@x=0cm\pgf@y=0cm}
  \savedanchor\northeast{\pgf@x=0.6cm\pgf@y=0.6cm}
  \savedanchor\symbol{\pgf@x=0cm\pgf@y=0.2cm}
  \savedanchor\factors{\pgf@x=0cm\pgf@y=-0.5cm}
  \saveddimen\margin{\pgf@x=0.04cm}
%    \end{macrocode}
%
% Next, we define some saved macros.  These are called (and declares
% internal macros) when the shape is instantised.  We define macros
% for the identifier, 
%
%
%    \begin{macrocode}
  \savedmacro\id{%
    \chit@dbg{4}{Chit ID: \meaning\chit@id}%
    \@ifundefined{chit@id}{\let\chit@id\pgfutil@empty}{}%
    \ifx\chit@id\pgfutil@empty%
      \wg@r@ndom@id%
      \edef\id{chit\wg@uuid}%
    \else%
      \edef\id{\chit@id}%
    \fi%
    \chit@dbg{4}{Chit ID stored: \meaning\chit@id}
  }
  \savedmacro\chitframeopt{%
    \let\chitframeopt\pgfutil@empty%
    \@ifundefined{chit@frame}{}{%
      \edef\chitframeopt{\chit@frame}}
    \n@to@pp@dbg{3}{Chit Frame options: \meaning\chitframeopt}%
  }
%    \end{macrocode}
%
% We define the regular anchors of the shape.  That is, the centre,
% corners, and edges.
% 
%    \begin{macrocode}
  \anchor{center}{\center}
  \anchor{north east}{\northeast}
  \anchor{north west}{\northeast\pgf@x=-\pgf@x}
  \anchor{south west}{\northeast\pgf@x=-\pgf@x\pgf@y=-\pgf@y}
  \anchor{south east}{\northeast\pgf@y=-\pgf@y}
  \anchor{north}     {\northeast\pgf@x=0cm}
  \anchor{south}     {\northeast\pgf@x=0cm\pgf@y=-\pgf@y}
  \anchor{east}      {\northeast\pgf@y=0cm}
  \anchor{west}      {\northeast\pgf@x=-\pgf@x\pgf@y=0cm}
%    \end{macrocode}
%
% Next, we want to be able to reference the symbol anchors too.  So we
% define these anchors from the embedded node anchors.  Note, these
% anchors will not exist if the chit is made with
% \texttt{full=}\meta{args}.
% 
%    \begin{macrocode}
  \anchor{symbol north east}{\chit@nchor{M\id symbol}{north east}{0.2cm}}
  \anchor{symbol north west}{\chit@nchor{M\id symbol}{north west}{0.2cm}}
  \anchor{symbol south east}{\chit@nchor{M\id symbol}{south east}{0.2cm}}
  \anchor{symbol south west}{\chit@nchor{M\id symbol}{south west}{0.2cm}}
  \anchor{symbol north}     {\chit@nchor{M\id symbol}{north}{0.2cm}}
  \anchor{symbol west}      {\chit@nchor{M\id symbol}{west}{0.2cm}}
  \anchor{symbol south}     {\chit@nchor{M\id symbol}{south}{0.2cm}}
  \anchor{symbol east}      {\chit@nchor{M\id symbol}{east}{0.2cm}}
  \anchor{symbol upper}     {\chit@nchor{M\id symbol}{upper}{0.2cm}}
  \anchor{symbol lower}     {\chit@nchor{M\id symbol}{lower}{0.2cm}}
  \anchor{symbol left}      {\chit@nchor{M\id symbol}{left}{0.2cm}}
  \anchor{symbol right}     {\chit@nchor{M\id symbol}{right}{0.2cm}}
  \anchor{symbol echelon}   {\chit@nchor{M\id symbol}{north}{0.2cm}}
  \anchor{symbol below}     {\chit@nchor{M\id symbol}{south}{0.1cm}}
%    \end{macrocode}
%
% Some anchors to sub-elements.  Some of them only exists if we have
% NATO App6(c) symbol in the chit.
% 
%    \begin{macrocode}
  \anchor{symbol}    {\symbol}
  \anchor{factors}   {\factors}
  \anchor{left} {\chit@nchor{M\id symbol}{west}{.2cm}\advance\pgf@x-\margin}
  \anchor{right}{\chit@nchor{M\id symbol}{east}{.2cm}\advance\pgf@x+\margin}
  \anchor{upper right} {%
    \northeast \advance\pgf@x-\margin \advance\pgf@y-\margin%
  }
  \anchor{upper left}{
    \northeast \advance\pgf@x-\margin \advance\pgf@y-\margin \pgf@x=-\pgf@x%
  }
  \anchor{lower right} {%
    \northeast \advance\pgf@x-\margin \advance\pgf@y-\margin \pgf@y=-\pgf@y%
  }
  \anchor{lower left}{
    \northeast \advance\pgf@x-\margin \advance\pgf@y-\margin%
    \pgf@x=-\pgf@x \pgf@y=-\pgf@y%
  }
%    \end{macrocode}
%
% Now for the actual path.  For the background path, we simply specify
% the frame.   This is so that this will get drawn (and possibly
% filled) using the appropriate options.
% 
%    \begin{macrocode}  
  \backgroundpath{%
    %% This is the outline of the chit only.  The rest of the chit is
    %% made on the foreground "path".
    \northeast%
    \wg@tmpa=\pgf@x\wg@tmpb=\pgf@y%
    \pgfpathmoveto{\pgfqpoint{\wg@tmpa}{\wg@tmpb}}%
    \wg@tmpa=-\wg@tmpa \pgfpathlineto{\pgfqpoint{\wg@tmpa}{\wg@tmpb}}%
    \wg@tmpb=-\wg@tmpb \pgfpathlineto{\pgfqpoint{\wg@tmpa}{\wg@tmpb}}%
    \wg@tmpa=-\wg@tmpa \pgfpathlineto{\pgfqpoint{\wg@tmpa}{\wg@tmpb}}%
    \pgfclosepath
  }
%    \end{macrocode}
%
% Finally, we make the foreground rendered path.   This is where we do
% the most stuff.   We do it in the \emph{behind} foreground path so
% that we can ensure things are drawn the way we want it.
%
% The first thing is to set-up the clipping to the chit frame. 
%
%    \begin{macrocode}
  \behindforegroundpath{%
    \chit@dbg{4}{%
      Chit foreground: \meaning\id
      ^^J  ID (set):    \meaning\chit@id
      ^^J  Symbol:      \meaning\chit@symbol
      ^^J  Full:        \meaning\chit@full
      ^^J  Factors:     \meaning\chit@factors
      ^^J  Left:        \meaning\chit@left
      ^^J  Right:       \meaning\chit@right
      ^^J  Upper left:  \meaning\chit@upper@left
      ^^J  Lower left:  \meaning\chit@lower@left
      ^^J  Upper right: \meaning\chit@upper@right
      ^^J  Lower right: \meaning\chit@lower@right}
    \chit@report{}
    \pgfscope
    %
    \northeast%
    \wg@tmpa=\pgf@x\wg@tmpb=\pgf@y%
    \pgfpathmoveto{\pgfqpoint{\wg@tmpa}{\wg@tmpb}}%
    \wg@tmpa=-\wg@tmpa \pgfpathlineto{\pgfqpoint{\wg@tmpa}{\wg@tmpb}}%
    \wg@tmpb=-\wg@tmpb \pgfpathlineto{\pgfqpoint{\wg@tmpa}{\wg@tmpb}}%
    \wg@tmpa=-\wg@tmpa \pgfpathlineto{\pgfqpoint{\wg@tmpa}{\wg@tmpb}}%
    \pgfclosepath
    \pgfusepath{clip}    
%    \end{macrocode}
%
% If we do not have the \texttt{symbol} key set, then we set the
% \texttt{full} key as a picture. 
% 
%    \begin{macrocode}
    \@ifundefined{chit@symbol}{%
      %% Draw full stuff
      \@ifundefined{chit@full}{}{%
        \center\wg@tmpa=\pgf@x\wg@tmpb=\pgf@y%
        \wg@pic@all{\chit@full}{}{\the\wg@tmpa,\the\wg@tmpb}{chit/full}}%
    }{%
%    \end{macrocode}
%
%  Otherwise, we put in a node with shape \texttt{natoapp6c} and pass
%  the \texttt{symbol} key--value pairs as options. 
%
%    \begin{macrocode}
      \edef\symid{\id symbol}%
      \symbol%
      \edef\args{{\symid}{\the\pgf@x,\the\pgf@y}\chit@symbol}%
      \chit@dbg{6}{Arguments to chit NATO symbol: \meaning\args}%
      \expandafter\chit@n@to\args\@end@chit@n@to%
      \chit@dbg{6}{After making NATO symbol in chit}%
%    \end{macrocode}
%
% Having made the NATO App6(c) symbol, which we gave the node name
% \meta{id}\texttt{symbol} where \meta{id} is the ID of this chit, we
% can make the rest of the chit elements.   These are the left and
% right elements, which are set west and east of the symbol,
% respectively; the factors; and the four corner elements.
%
% If the respective elements have not been specified, we do not make
% them.
%
% First the left and right elements.  Note that these uses the anchors
% of the embedded \texttt{natoapp6c} node for placement.
%
%    \begin{macrocode}
      % Put in left of symbol
      \@ifundefined{chit@left}{}{%
        \begin{scope}[]
          \pgfpointanchor{\symid}{west}%
          \wg@tmpa=\pgf@x\advance\wg@tmpa-\margin%
          \wg@tmpb=\pgf@y%
          \wg@pic@all{\chit@left}{}{\the\wg@tmpa,\the\wg@tmpb}{chit/left}%
        \end{scope}}%
      % Put in right of symbol
      \@ifundefined{chit@right}{}{%
        \begin{scope}[]
          \pgfpointanchor{\symid}{east}%
          \wg@tmpa=\pgf@x\advance\wg@tmpa+\margin%
          \wg@tmpb=\pgf@y%
          \wg@pic@all{\chit@right}{}{\the\wg@tmpa,\the\wg@tmpb}{chit/right}%
        \end{scope}}%
%    \end{macrocode}
%
% Next, we want to put in the corner elements.   But before we do
% that, we use our saved anchors and dimensions to calculate the
% coordinates.  Note that the corner elements are anchored to the
% corners (plus margin) of the chit frame. 
%
%    \begin{macrocode}
      % Get coordinates
      \northeast%
      \wg@tmpa=\pgf@x%
      \wg@tmpb=\pgf@y%
      \advance\wg@tmpa-\margin%
      \advance\wg@tmpb-\margin%
%    \end{macrocode}
%
% With the coordinates extracted, we set the four corner
% elements. Note, for the anchoring to work, we should specify
% pictures that have anchors (e.g., nodes).  If not, we must take care
% to give offsets or the like. 
%
%    \begin{macrocode}
      % Put in upper left corner
      \@ifundefined{chit@upper@left}{}{%
        \begin{scope}[]
          \wg@pic@all{\chit@upper@left}{}{-\the\wg@tmpa,\the\wg@tmpb}{%
            chit/upper left}%
        \end{scope}}
      % Put in upper right corner
      \@ifundefined{chit@upper@right}{}{%
        \begin{scope}[]
          \wg@pic@all{\chit@upper@right}{}{\the\wg@tmpa,\the\wg@tmpb}{%
            chit/upper right}%
        \end{scope}}
      % Put in lower left corner
      \@ifundefined{chit@lower@left}{}{%
        \begin{scope}[]
          \wg@pic@all{\chit@lower@left}{}{-\the\wg@tmpa,-\the\wg@tmpb}{%
            chit/lower left}%
        \end{scope}}
      % Put in lower right corner
      \@ifundefined{chit@lower@right}{}{%
        \begin{scope}[]
          \wg@pic@all{\chit@lower@right}{}{\the\wg@tmpa,-\the\wg@tmpb}{%
            chit/lower right}%
        \end{scope}}
%    \end{macrocode}
%
% Finally, we put in the unit factors.   They are put at the bottom of
% the chit frame (plus margin) and are typically anchored to the south
% anchor of the element.  Note, we can put in several factors if need
% be. 
%
%    \begin{macrocode}
      % Put in factors
      \@ifundefined{chit@factors}{}{%
        \advance\wg@tmpb-\margin%
        \begin{scope}[]
          \wg@pic@all{\chit@factors}{}{0,-\the\wg@tmpb}{chit/factors}%
        \end{scope}}%
    }%
    \endpgfscope%
    % Draw frame?
    \edef\tmp@opt{[\chitframeopt]}
    \expandafter\scope\tmp@opt
    \northeast%
    \wg@tmpa=\pgf@x\wg@tmpb=\pgf@y%
    \pgfpathmoveto{\pgfqpoint{\wg@tmpa}{\wg@tmpb}}%
    \wg@tmpa=-\wg@tmpa \pgfpathlineto{\pgfqpoint{\wg@tmpa}{\wg@tmpb}}%
    \wg@tmpb=-\wg@tmpb \pgfpathlineto{\pgfqpoint{\wg@tmpa}{\wg@tmpb}}%
    \wg@tmpa=-\wg@tmpa \pgfpathlineto{\pgfqpoint{\wg@tmpa}{\wg@tmpb}}%
    \pgfclosepath
    \pgfusepath{stroke}
    \endscope
  }
}
%    \end{macrocode}
%    
% \iffalse
% --------------------------------------------------------------------
% \fi
% \subsubsection{The \cs{chit} wrapper macro}
% 
% \begin{Macro}{\chit,\chit@,\chit@@}
%
%   The macro to make the chits.  This is a wrapper around a
%   \texttt{node} with shape \texttt{chit}.   The syntax of this macro
%   is 
%
%   \begin{Syntax}
%     \cs{chit}\oarg{chit options}\parg{position}\parg{identifier};
%   \end{Syntax}
%
%   Note that the trailing semi-colon is optional.  Here \meta{chit
%   options} are any key-value pairs in the \texttt{/chit} (and
%   \texttt{/tikz}) namespace. 
%   
%   The first macro parses for options. 
%
%    \begin{macrocode}
\def\chit{%
  \chit@dbg{5}{Chit}
  \@ifnextchar[{\chit@}{\chit@[]}%]
}
%    \end{macrocode}
% 
% Parse for coordinates. 
%
%    \begin{macrocode}
\def\chit@[#1]{%
  \chit@dbg{5}{Chit second: `#1'}
  \@ifnextchar({\chit@@{#1}}{\chit@@{#1}(0,0)}%)
}
%    \end{macrocode}
%
% Parse for name.
%
%    \begin{macrocode}
\def\chit@@#1(#2){%
  \@ifnextchar({\chit@@@{#1}{#2}}{\chit@@@{#1}{#2}()}%)
}
%    \end{macrocode}
%
% The work horse.  This simply makes a \cs{node} with the shape
% \texttt{chit}.   Note, we allow for a trailing semi-colon
% (\texttt{;}) to have a similar feel to other \TikZ{} macros. 
%
%    \begin{macrocode}
\def\chit@@@#1#2(#3){%
  \chit@dbg{5}{Chit final:
    ^^J  Options:    #1
    ^^J  Position:   #2
    ^^J  Name:       `#3'}
  \let\name\pgfutil@empty%
  \chit@dbg{1}{=== Before chit node}%
  \node[draw,chit={every chit/.try,id=#3,#1}] (tmp) at (#2) {};
  \chit@dbg{2}{=== After chit node}%
  \ifx|#3|\relax%
  \else%
    \chit@dbg{3}{=== Renaming chit to user defined name `#3'}%
    \pgfnoderename{#3}{tmp}%
  \fi%
  \@ifnextchar;{\@gobble}{}%
}
%    \end{macrocode}
% \end{Macro}
% \iffalse
% </chit>
% --------------------------------------------------------------------
% \fi
