diff options
Diffstat (limited to 'macros/latex/contrib/wargame/source/chit/shape.dtx')
-rw-r--r-- | macros/latex/contrib/wargame/source/chit/shape.dtx | 544 |
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 |