summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/wargame/source/chit/shape.dtx
diff options
context:
space:
mode:
Diffstat (limited to 'macros/latex/contrib/wargame/source/chit/shape.dtx')
-rw-r--r--macros/latex/contrib/wargame/source/chit/shape.dtx544
1 files changed, 544 insertions, 0 deletions
diff --git a/macros/latex/contrib/wargame/source/chit/shape.dtx b/macros/latex/contrib/wargame/source/chit/shape.dtx
new file mode 100644
index 0000000000..8ad0614cb8
--- /dev/null
+++ b/macros/latex/contrib/wargame/source/chit/shape.dtx
@@ -0,0 +1,544 @@
+% \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