diff options
Diffstat (limited to 'macros/latex/contrib/wargame/source/util/core.dtx')
-rw-r--r-- | macros/latex/contrib/wargame/source/util/core.dtx | 1340 |
1 files changed, 9 insertions, 1331 deletions
diff --git a/macros/latex/contrib/wargame/source/util/core.dtx b/macros/latex/contrib/wargame/source/util/core.dtx index 1d95aa38c6..8ee6f84c85 100644 --- a/macros/latex/contrib/wargame/source/util/core.dtx +++ b/macros/latex/contrib/wargame/source/util/core.dtx @@ -12,1342 +12,20 @@ %<*utils> %\fi % -% -% \iffalse -% -------------------------------------------------------------------- -% \fi -% -% \subsubsection{Miscellaneous macros} -% -% \begin{Macro}{\wg@dbg} -% Debugging support. The counter \cs{wargamedbglvl} sets the debug -% level. The package code then uses \cs{wg@dbg} to print out -% debugging messages. This macro takes two arguments --- the first -% is the \emph{least} debug level at which the message is printed, and -% the second is the message it self. -% -% \begin{macrocode} -\newcount\wargamedbglvl\wargamedbglvl=0 -\def\wg@dbg#1#2{% - \ifnum#1>\wargamedbglvl\relax\else\message{^^J#2}\fi} -% \end{macrocode} -% \end{Macro} -% -% \begin{Macro}{\wg@addto@macro} -% -% The macro \cs{wg@addto@macro}\marg{macro}\marg{other} adds the -% definition of the macro \meta{other} to the macro \meta{macro}. -% This uses the \cs{toks} trick of storing the \emph{tokens} of the -% definition of a \meta{macro} and \meta{other} into \spec{@} and -% expanding that token into the definition of \meta{macro}. -% Effectively, this means that the top-level definition of -% \meta{macro} and \meta{other} are expanded (i.e., macros used in -% the definition of either macro is \emph{not} expanded) and then -% that becomes the new definition of \meta{macro}. -% -% We will use this macro to do \emph{shallow} definitions of macros -% to contain keys and such. -% -% \begin{macrocode} -\long\def\wg@addto@macro#1#2{% - \begingroup - \toks@\expandafter\expandafter\expandafter{\expandafter#1#2}% - \xdef#1{\the\toks@}% - \endgroup} -% \end{macrocode} -% \end{Macro} -% -% -% \begin{Macro}{\wg@sub@nchor} -% Get anchor from sub node. We cannot use \cs{pgfpointanchor} since -% that returns the anchor coordinates in the global coordinate -% system. -% -% \begin{macrocode} -\def\wg@sub@nchor#1#2{% - \wg@dbg{3}{^^JGet `#2' in `#1'}% - \@ifundefined{pgf@sh@ns@#1}{% - \pgf@x=0cm\pgf@y=0cm}{% - \pgf@process{% - \csname pgf@sh@ma@#1\endcsname% MW - \csname pgf@sh@np@#1\endcsname% - \pgf@sh@reanchor{\csname pgf@sh@ns@#1\endcsname}{#2}}}% - \wg@dbg{10}{-> \the\pgf@x,\the\pgf@y}% -} -% \end{macrocode} -% \end{Macro} -% -% -% Scratch dimensions -% -% \begin{macrocode} -\newdimen\wg@tmpa -\newdimen\wg@tmpb -\newdimen\wg@tmpc -\newdimen\wg@tmpd -% \end{macrocode} -% -% -% Macro to easy restore a saved path -% -% \begin{macrocode} -\def\settosave#1{ - \pgfsyssoftpath@setcurrentpath{#1}} -% \end{macrocode} -% -% \iffalse -% -------------------------------------------------------------------- -% \fi -% -% \subsubsection{Pictures in compound nodes} -% -% \begin{Macro}{\wg@pic} -% The macro \cs{wg@pic} will render a \texttt{pic}. This is used by -% the \texttt{natoapp6cs}, \texttt{chit}, and \texttt{hex} node -% shapes extensively. -% -% The arguments are -% \begin{enumerate} -% \item Prefix -% \item Position -% \item Fixed options -% \item User options -% \item Picture. -% \end{enumerate} -% -% That is, the macro expects calls like -% \begin{Syntax} -% \cs{wg@pic}\oarg{options}\meta{picture}\cs{@endwg@pic}\marg{prefix}\marg{position}\marg{options} -% \end{Syntax} -% -% Note the \cs{@endwg@pic} at the end of the call to swallow up -% \meta{picture}. Typically this macro is used as -% -% \begin{Syntax} -% \cs{edef}\cs{args}\{\meta{something}\} -% \cs{expandafter}\cs{wg@pic}\cs{args}\cs{@endwg@pic}\marg{prefix}\parg{position}\marg{options} -% \end{Syntax} -% -% where \meta{something} typically expands to \oarg{user -% option}\meta{picture} -% -% First, the top-level macro \cs{wg@pic} that looks for user -% options. -% -% \begin{macrocode} -\def\wg@pic{% - \@ifnextchar[{\wg@@pic}{\wg@@pic[]}%] -} -% \end{macrocode} -% -% This macro then forwards to \cs{wg@@pic} to gobble up -% \meta{picture}. -% -% \begin{enumerate} -% \item User options -% \item Arguments -% \end{enumerate} -% -% \begin{macrocode} -\def\wg@@pic[#1]#2\@endwg@pic{% - \wg@dbg{2}{Options: `#1', picture: `#2'}% - \wg@@@pic{#1}{#2}% -} -% \end{macrocode} -% -% \begin{enumerate} -% \item User options -% \item Arguments -% \item Prefix -% \item Coordinates -% \item Fixed options -% \end{enumerate} -% -% \begin{macrocode} -\def\wg@@@pic#1#2#3#4#5{% - \ifx|#2|\wg@dbg{3}{No picture given}% - \else% - \wg@dbg{3}{^^JWG Pic: - ^^J User options: #1 - ^^J Picture: #2 - ^^J Prefix: #3 - ^^J Coordinates: #4 - ^^J Fixed options: #5}% - % \wg@dbg{2}{\string\pic[#5,#1] at (#4) {#3#2}}% - \pic[#5,#1] at (#4) {#3#2};% - \ifwg@s@ve% - \pgf@relevantforpicturesizetrue% - \begin{getbbl}% - \pic[draw=none,fill=none,transform shape] at (#4) {#3#2};% - \end{getbbl}% - \wg@dbg{5}{Clipping to local bounding box}% - \clip (L.south west) rectangle (L.north east);% - \pgf@relevantforpicturesizefalse \global\wg@s@vefalse% - \fi - \fi% - \wg@dbg{3}{End of WG Pic} -} -% \end{macrocode} -% \end{Macro} -% -% -% \begin{Macro}{\wg@pic@all} -% -% This macro sets all pictures in a list. -% -% \begin{enumerate} -% \item List -% \item Prefix -% \item Position -% \item Styles -% \end{enumerate} -% -% -% \begin{macrocode} -\def\wg@pic@all#1#2#3#4{% - \wg@dbg{2}{WG picture loop - ^^J List: \meaning#1 - ^^J Prefix: `#2' - ^^J Position: `#3' - ^^J Styles: `#4'} - \foreach \p in #1{% - \wg@dbg{2}{WG picture element: \meaning\p}% - \expandafter\wg@pic\p\@endwg@pic {#2}{#3}{#4}% - }% -} -% \end{macrocode} -% \end{Macro} -% -% \iffalse -% -------------------------------------------------------------------- -% \fi -% -% \subsubsection{Nodes in compound nodes} -% -% \begin{Macro}{\wg@node} -% The macro \cs{wg@node} will render a \texttt{node}. This can be -% used by the \texttt{natoapp6cs}, \texttt{chit}, and \texttt{hex} -% node shapes. -% -% The arguments are -% \begin{enumerate} -% \item Prefix -% \item Position -% \item Fixed options -% \item User options -% \item Body. -% \end{enumerate} -% -% That is, the macro expects calls like -% \begin{Syntax} -% \cs{wg@node}\oarg{options}\meta{body}\cs{@endwg@node}\marg{prefix}\marg{position}\marg{options} -% \end{Syntax} -% -% Note the \cs{@endwg@node} at the end of the call to swallow up -% \meta{body}. Typically this macro is used as -% -% \begin{Syntax} -% \cs{edef}\cs{args}\{\meta{something}\} -% \cs{expandafter}\cs{wg@node}\cs{args}\cs{@endwg@node}\marg{prefix}\parg{position}\marg{options} -% \end{Syntax} -% -% where \meta{something} typically expands to \oarg{user -% option}\meta{body} -% -% First, the top-level macro \cs{wg@node} that looks for user -% options. -% -% \begin{macrocode} -\def\wg@node{% - \@ifnextchar[{\wg@@node}{\wg@@node[]}%] -} -% \end{macrocode} -% -% This macro then forwards to \cs{wg@@node} to gobble up -% \meta{body}. -% -% \begin{enumerate} -% \item User options -% \item Arguments -% \end{enumerate} -% -% \begin{macrocode} -\def\wg@@node[#1]#2\@endwg@node{% - \wg@dbg{2}{Options: `#1', body: `#2'}% - \wg@@@node{#1}{#2}% -} -% \end{macrocode} -% -% \begin{enumerate} -% \item User options -% \item Arguments -% \item Prefix -% \item Coordinates -% \item Fixed options -% \end{enumerate} -% -% \begin{macrocode} -\def\wg@@@node#1#2#3#4#5{% - \ifx|#2|\wg@dbg{3}{No body given}% - \else% - \wg@dbg{3}{^^JWG Pic: - ^^J User options: #1 - ^^J Body: #2 - ^^J Prefix: #3 - ^^J Coordinates: #4 - ^^J Fixed options: #5}% - % \wg@dbg{2}{\string\pic[#5,#1] at (#4) {#3#2}}% - \node[#5,#1] at (#4) {#3#2};% - \fi% - \wg@dbg{3}{End of WG Node} -} -% \end{macrocode} -% \end{Macro} -% -% -% \begin{Macro}{\wg@node@all} -% -% This macro sets all pictures in a list. -% -% \begin{enumerate} -% \item List -% \item Prefix -% \item Position -% \item Styles -% \end{enumerate} -% -% -% \begin{macrocode} -\def\wg@node@all#1#2#3#4{% - \wg@dbg{2}{WG picture loop - ^^J List: \meaning#1 - ^^J Prefix: `#2' - ^^J Position: `#3' - ^^J Styles: `#4'} - \foreach \p in #1{% - \wg@dbg{2}{WG picture element: \meaning\p}% - \expandafter\wg@node\p\@endwg@node {#2}{#3}{#4}% - }% -} -% \end{macrocode} -% \end{Macro} -% -% \iffalse -% -------------------------------------------------------------------- -% \fi -% -% \subsubsection{Bounding boxes} -% -% Bounding box dimensions -% -% -% \begin{macrocode} -\newdimen\wg@bb@minx -\newdimen\wg@bb@miny -\newdimen\wg@bb@maxx -\newdimen\wg@bb@maxy -% \end{macrocode} -% -% -% -% Enable or disable bounding box tracking -% -% \begin{macrocode} -\newif\ifwg@notrelevantforpathsize\wg@notrelevantforpathsizefalse -% \end{macrocode} -% -% -% \begin{Macro}{wg@resetbb} -% Reset the bounding box tracking dimensions -% -% \begin{macrocode} -\def\wg@resetbb{% - \global\wg@bb@minx=16000pt\relax% - \global\wg@bb@miny=16000pt\relax% - \global\wg@bb@maxx=-16000pt\relax% - \global\wg@bb@maxy=-16000pt\relax% -} -% \end{macrocode} -% \end{Macro} -% -% \begin{Macro}{\old@pgf@protocolsize} -% Save PGF's bounding box algorithm -% -% \begin{macrocode} -\let\old@pgf@protocolsize\pgf@protocolsizes -% \end{macrocode} -% \end{Macro} -% -% \begin{Macro}{\wg@protocolsizes} -% Our bounding box algorithm -% -% \begin{macrocode} -\def\wg@protocolsizes#1#2{% - \old@pgf@protocolsize{#1}{#2} - \ifwg@notrelevantforpathsize\else% - \ifdim#1<\wg@bb@minx\global\wg@bb@minx#1\fi% - \ifdim#1>\wg@bb@maxx\global\wg@bb@maxx#1\fi% - \ifdim#2<\wg@bb@miny\global\wg@bb@miny#2\fi% - \ifdim#2>\wg@bb@maxy\global\wg@bb@maxy#2\fi% - \fi -} -% \end{macrocode} -% \end{Macro} -% -% % \begin{environment}{getbbl} -% Environment that tracks the local bounding box -% -% \begin{macrocode} -\newenvironment{getbbl}{% - \wg@resetbb% - \wg@notrelevantforpathsizefalse% - \global\let\pgf@protocolsizes\wg@protocolsizes}{% - \gdef\pgf@sh@ns@L{rectangle} - \gdef\pgf@sh@np@L{% - \def\southwest{\pgfqpoint{\the\wg@bb@minx}{\the\wg@bb@miny}}% - \def\northeast{\pgfqpoint{\the\wg@bb@maxx}{\the\wg@bb@maxy}}% - } - \gdef\pgf@sh@nt@L{{1}{0}{0}{1}{0pt}{0pt}} - \gdef\pgf@sh@pi@L{\pgfpictureid} - \global\let\pgf@protocolsizes\old@pgf@protocolsize -} -% \end{macrocode} -% \end{environment} -% -% \begin{environment}{getbb} -% Environment to track global bounding box -% -% \begin{macrocode} -\newenvironment{getbb}{% - \wg@resetbb% - \wg@notrelevantforpathsizefalse% - \global\let\pgf@protocolsizes\wg@protocolsizes}{% - \gdef\pgf@sh@ns@M{rectangle} - \gdef\pgf@sh@np@M{% - \def\southwest{\pgfqpoint{\the\wg@bb@minx}{\the\wg@bb@miny}}% - \def\northeast{\pgfqpoint{\the\wg@bb@maxx}{\the\wg@bb@maxy}}% - } - \gdef\pgf@sh@nt@M{{1}{0}{0}{1}{0pt}{0pt}} - % \pgfgettransform\pgf@temp% - % \xdef\pgf@sh@nt@M{\pgf@temp} - % \pgfgettransformentries{\wg@tmp@a}{\wg@tmp@b}{\wg@tmp@c}{\wg@tmp@d}{\pgf@temp}{\pgf@temp} - % \message{^^JTransform of M: \meaning\pgf@temp} - % \xdef\pgf@sh@nt@M{{\wg@tmp@a}{\wg@tmp@b}{\wg@tmp@c}{\wg@tmp@d}{0pt}{0pt}}% - % \message{^^JTransform of M: \meaning\pgf@sh@nt@M} - \gdef\pgf@sh@pi@M{\pgfpictureid} - \global\let\pgf@protocolsizes\old@pgf@protocolsize -} -% \end{macrocode} -% \end{environment} +% \input{util/misc.dtx} +% \input{util/compound.dtx} +% \input{util/bb.dtx} +% \input{util/tikz.dtx} +% \input{util/randomid.dtx} +% \input{util/icons.dtx} % % \iffalse -% -------------------------------------------------------------------- -% \fi -% -% \subsubsection{Other Tikz utilities} -% -% \begin{TikzKey}{tikz/reverseclip} -% -% A reverse clipping path. This is used to cut out stuff outside of -% path defined. -% -% \begin{macrocode} -\tikzstyle{reverseclip}=[insert path={(current bounding box.north east) -- - (current bounding box.south east) -- - (current bounding box.south west) -- - (current bounding box.north west) -- - (current bounding box.north east)}] -% \end{macrocode} -% \end{TikzKey} -% -% \begin{TikzKey}{tikz/clip even odd rule} -% A reverse clipping path -% -% \begin{macrocode} -\tikzset{ - clip even odd rule/.code={\pgfseteorule}, % Credit to Andrew Stacey -} -% \end{macrocode} -% \end{TikzKey} -% -% -% \begin{TikzKey}{tikz/invclip} -% -% Inverse clipping. This should be an option \emph{after} the path to -% do the inverse clipping by. This works by adding a \emph{large} -% (page) path to the current path, and then use that as clipping. -% -% \begin{macrocode} -\tikzset{ - invclip/.style={ - clip,insert path= - [clip even odd rule]{ - [reset cm](-\maxdimen,-\maxdimen)rectangle(\maxdimen,\maxdimen) - } - }, -} -% \end{macrocode} -% \end{TikzKey} -% -% \begin{TikzKey}{save clip} -% -% An option for use with sub-elements of NATO App 6(c) or chit -% nodes. This will save the current path as a clipping path for the -% next paths to be drawn in the sub-element -% -% \begin{macrocode} -\newif\ifwg@s@ve\wg@s@vefalse -\tikzset{ - save clip/.is choice, - save clip/true/.code={\global\wg@s@vetrue}, - save clip/false/.code={\global\wg@s@vefalse}, - save clip/.default={true}, - save clip/.initial={false}, -} -% \end{macrocode} -% \end{TikzKey} -% -% \begin{TikzKey}{scale line widths} -% -% Scales any line width specified in the node options. -% -% Use like -% -% \begin{verbatim} -% \tikzset{ -% some/.style={ -% scale line widths, -% line width=1pt} -% } -% \end{verbatim} -% -% Note that the order is important. -% -% \begin{macrocode} -\tikzset{ - scale line widths/.style={% - /utils/exec=\def\tikz@semiaddlinewidth##1{% - \pgfgettransformentries{% - \wg@jaca}{% - \wg@jacb}{% - \wg@jacc}{% - \wg@jacd}{% - \wg@tmp}{% - \wg@tmp}% - \pgfmathsetmacro{\wg@jac}{sqrt(abs(\wg@jaca*\wg@jacd-\wg@jacb*\wg@jacc))}% - \wg@dbg{4}{Scaling line width ##1 by \wg@jac} - \pgfmathsetmacro{\wg@lw}{\wg@jac*##1}% - \wg@dbg{4}{Scaled ##1 -> \wg@lw} - \tikz@addoption{\pgfsetlinewidth{\wg@lw pt}}% - \wg@dbg{4}{Added scaled option \wg@lw} - \pgfmathsetlength\pgflinewidth{\wg@lw pt} - \wg@dbg{4}{Did set line width \wg@lw pt} - }}, - relative line width/.style={% - /utils/exec=\def\tikz@semiaddlinewidth##1{% - \wg@dbg{4}{Relative line width #1 times ##1}% - \pgfmathsetmacro{\wg@lv}{#1*##1}% - \tikz@addoption{\pgfsetlinewidth{\wg@lw pt}}% - \pgfmathsetlength\pgflinewidth{\wg@lw pt}}} -} -% \end{macrocode} -% \end{TikzKey} -% -% \begin{TikzKey}{sub pic actions} -% -% This is key that propagates actions to sub pictures of pictures. -% The normal \texttt{pic actions} cannot be used as it causes an -% infinite loop. -% -% \begin{macrocode} -\tikzset{ - sub pic actions/.code={% - \tikz@picmode% - \edef\opts{% - \iftikz@mode@draw draw,\else draw=none,\fi - \iftikz@mode@fill fill\else fill=none\fi} - \wg@dbg{5}{^^JSub Mode: \meaning\tikz@picmode \meaning\opts} - \pgfset{/tikz/.cd} - \pgfkeysalsofrom{\opts} - }} -% \end{macrocode} -% \end{TikzKey} -% -% \begin{TikzKey}{wg/debug show} -% -% Show debugging information -% -% \begin{macrocode} -\tikzset{ - wg/debug show/.code={% - \extractcolorspec{pgfstrokecolor}{\wg@tmp@fg} - \def\wg@tmp@bg{none} - \@ifundefinedcolor{pgffillcolor}{}{ - \extractcolorspec{pgffillcolor}{\wg@tmp@bg}} - \begingroup - \tikz@mode - \wargamedbglvl=#1 - \wg@dbg{3}{Drawing with w/stroke `\wg@tmp@fg' - (\tikz@strokecolor,\iftikz@mode@draw\else not\space\fi drawing) - and fill `\wg@tmp@bg' (\tikz@fillcolor,\iftikz@mode@fill\else - not\space\fi filling)} - \endgroup - } -} -% \end{macrocode} -% \end{TikzKey} -% -% -% \iffalse -% -------------------------------------------------------------------- -% \fi -% -% \subsubsection{Random IDs} -% -% -% \begin{macrocode} -\def\wg@r@ndom@id{% - \def\wg@uuid{} - \foreach \i in {1,...,8}{% - \pgfmathparse{Hex(random(0,15))} - \xdef\wg@uuid{\wg@uuid\pgfmathresult}}} -% \end{macrocode} -% -% \iffalse %</utils> %\fi -% \iffalse -% ==================================================================== -% \fi -% -% \subsection{The \texttt{wgexport} class} -% \label{sec:impl:util} -% -% This document class is used for exporting game component to be used -% in a VASSAL module -% libraries. -% -% \iffalse -%<*exportcls> -%\fi -% -% Class identification and load \texttt{wargame} package -% -% \begin{macrocode} -\ProvidesClass{wgexport} -\PassOptionsToClass{multi=tikzpicture,varwidth=false}{standalone} -\DeclareOption{noterrainpic}{% - \PassOptionsToPackage{\CurrentOption}{wargame}} -\DeclareOption{terrainpic}{% - \PassOptionsToPackage{\CurrentOption}{wargame}} -\DeclareOption*{% - \PassOptionsToClass{\CurrentOption}{standalone}} -\ProcessOptions\relax -\LoadClass{standalone} -\RequirePackage{wargame} -% \end{macrocode} -% -% We need a few utilities before we get to the actual environment. -% First, we need a tools to write out literal left and right curly -% braces. We do a bit of catcode hackery to accomplish that. -% -% \begin{macrocode} -\begingroup -\catcode`\^^I=12 -\def\@tabchar{^^I} -\catcode`<=1 \catcode`>=2 -\catcode`{=12 \catcode`}=12 -\gdef\@lbchar<{> -\gdef\@rbchar<}> -\endgroup -% \end{macrocode} -% -% Above, we temporarily set the tab, and left and right curly brace -% characters to be regular letters (12), and the catcodes of less than -% and greater than to be those of left and right curly braces -% respectively. We then define the macros \cs{@tabchar}, -% \cs{@lbchar}, and \cs{@rbchar} to produce literal characters. -% \LaTeX already has \cs{@percentchar}. -% -% Everything we do should go inside this environment. The single -% optional argument is the file name stem of the output JSON file. -% -% \begin{macrocode} -\newenvironment{imagelist}[1][\jobname]{% - \newwrite\mk@out% - \def\mk@i{}% - \def\mk@w{\immediate\write\mk@out}% - \immediate\openout\mk@out=#1.json - \mk@w{[} -}{ - \mk@w{\mk@i \@lbchar "name":"End of list", "category": "<<eol>>", - "subcategory": "" \@rbchar } - \mk@w{]} - \immediate\closeout\mk@out -} -% \end{macrocode} -% -% -% Preceed all images (\textsf{tikzpicture}) with this command -% -% First argument is the name of the image. This can be anything. -% Note that for counters, if the name ends in \texttt{flipped} then it -% is considered the backside of a counter. -% -% Second argument is the type of image. Recognised types are -% -% \begin{itemize} -% \item \texttt{board} for boards -% \item \texttt{oob} for OOBs -% \item \texttt{chart} for charts -% \item \texttt{counter} for counters -% \item \texttt{front} for front page -% \end{itemize} -% -% Other types can be used, and the images will be exported, but the -% Python script pays no particular attention to those then. Use for -% example to prepare images for help or the like. -% -% The third argument is the sub type. This is most relevant for the -% counters. Sub types can be anything, but since the counters will -% receive different prototypes based on the sub type, it makes sense -% to divide into sub types a la -% -% \begin{itemize} -% \item factions -% \item common markers -% \end{itemize} -% -% The faction sub types should just be the name of the faction. -% E.g., Allies, Axis, Soviet, NATO, Warsaw Pact. Spaces should not -% matter. -% -% For common markers, there are a few names that are recognised -% specifically by the Python script. These are -% -% \begin{itemize} -% \item \texttt{common} -% \item \texttt{all} -% \item \texttt{marker} -% \item \texttt{markers} -% \end{itemize} -% -% Counters that has these sub-types will no be considered to belong -% to any faction. -% -% Note that the Python script uses the faction names to guess the -% players of the game, and uses them in several places. -% -% -% \begin{macrocode} -\def\info{% - \@ifstar{\@@info{,}}{\@@info{\@rbchar,}}} -\def\@@info#1#2#3#4{% - \chit@dbg{2}{Making image `#2' of type `#3'/`#4' on page \thepage}% - \mk@w{ \@lbchar}% - \mk@w{ \space "name": "#2",}% - \mk@w{ \space "category": "#3",}% - \mk@w{ \space "subcategory": "#4", }% - \mk@w{ \space "number": \thepage #1}% - \let\oldmk@i\mk@i% - \ifx#1,\relax\edef\mk@i{\mk@i\space\space}\fi} -\def\end@info{% - \let\mk@i\oldmk@i% - \mk@w{ \space \@rbchar,}} -% \end{macrocode} -% -% Make separate images for each counter (single sided). -% -% \begin{macrocode} -\newcommand\chitimages[2][]{% - \begingroup% - \let\chit@report\do@chit@report% - \let\natoapp@report\do@natoapp@report% - \chit@dbg{2}{chits to make images of `#2'}% - \foreach[count=\ti from 0] \t/\x in #2{% - \ifx\t\empty\else% Ignore empty rows - \chit@dbg{5}{^^JSubcategory: `\x' (default `#1')} - \ifx\t\x\def\x{#1}\fi% Take sub-category or default - \foreach \u/\m in \t{% - \ifx\u\empty\else% Ignore empty cells - \chit@dbg{2}{Next chit `\u' with possible multiplicity `\m'}% - \ifx\m\@empty\def\m{1}\fi% If not multiplicity defined - \ifx\u\m\def\m{1}\fi% If the same as unit - \chit@dbg{2}{Next chit `\u' multiplicity `\m'}% - %% We only make one copy of the chit, since we can duplicate - %% it in VASSAL - \info*{\u}{counter}{\x} - \begin{tikzpicture} - \chit[\u=\ti]% - \end{tikzpicture} - \end@info% - %% \foreach \n in {1,...,\m}{% Make a number of copies - %% \ifx\u\chit@blank% - %% \chit@dbg{3}{Ignoring blank chit:\u}% - %% \else% - %% \info{\u}{counter}{#2} - %% \begin{tikzpicture} - %% \chit[\u=\ti](\c,\r)% - %% \end{tikzpicture} - %% \fi% - %% }% - \fi% - }% - \chit@dbg{2}{End of inner loop}% - \fi% - }% - \chit@dbg{2}{End of outer loop}% - \endgroup% -} -% \end{macrocode} -% -% Make separate images for each counter (double sided). The back-side -% counters must be defined by append `\texttt{ flipped}' the front -% face name -% -% \begin{macrocode} -\newcommand\doublechitimages[2][]{% - \begingroup% - \let\chit@report\do@chit@report% - \let\natoapp@report\do@natoapp@report% - \foreach[count=\ti from 0] \t/\x in #2{% - \ifx\t\empty\else% Ignore empty rows - \chit@dbg{5}{^^JSubcategory: `\x' (default `#1')} - \ifx\t\x\def\x{#1}\fi% Take sub-category or default - \foreach \u/\m in \t{% - \ifx\u\empty\else% Ignore empty cells - \chit@dbg{2}{Next chit `\u' with possible multiplicity `\m'}% - \ifx\m\@empty\def\m{1}\fi% If not multiplicity defined - \ifx\u\m\def\m{1}\fi% If the same as unit - \chit@dbg{2}{Next chit `\u' multiplicity `\m'}% - %% Flipped chit - \edef\s{\u\space flipped}% - %% We only make one copy of the chit, since we can duplicate - %% it in VASSAL - \info*{\u}{counter}{\x}% - \begin{tikzpicture}% - \chit[\u=\ti]% - \end{tikzpicture}% - \end@info% - \info*{\s}{counter}{\x}% - \begin{tikzpicture}% - \chit[\s=\ti]% - \end{tikzpicture}% - \end@info% - %% \foreach \n in {1,...,\m}{% Make a number of copies - %% \ifx\u\chit@blank% - %% \chit@dbg{3}{Ignoring blank chit:\u}% - %% \else% - %% \info{\u}{counter}{#2} - %% \begin{tikzpicture} - %% \chit[\u=\ti](\c,\r)% - %% \end{tikzpicture} - %% \fi% - %% }% - \fi% - }% - \fi% - }% - \endgroup% -} -% \end{macrocode} -% -% Special for boards, we have the environment \textsf{boardimage}. -% Like \cs{info} we must specify the name and sub-category of the -% board, but the category is assumed to be \texttt{board} (though the -% optional argument can specify a different category). -% -% Within this environment some specific styles are defined that allows -% the user to specify VASSAL zones on the board. For this to work -% properly, the parent \textsf{tikzpicture} \emph{must} have the style -% \texttt{zoned}. This style will record the bounding box of the -% picture which we will need to calculate VASSAL coordinates later -% on. -% -% Other styles are \texttt{zone scope}, to be applied to -% \texttt{scope}s in the picture, and \texttt{zone path} to be applied -% to \texttt{path}s (or \cs{draw}, \cs{fill}, or the like) in the -% picture. These will record coordinates of these elements in side -% the picture. The Python script will then define VASSAL zones based -% on these coordinates. % -% For \texttt{zone scope} applied to a \texttt{scope}, what is -% recorded are +% \input{util/export.dtx} % -% \begin{itemize} -% \item The current coordinate transformation matrix -% \item The current translation -% \item The bounding box, within the current transformation and -% translation. -% \end{itemize} -% -% To define a zone in the board, simply enclose it in a -% -% \begin{verbatim} -% \begin{scope}[zone scope=name] -% ... -% \end{scope} -% \end{verbatim} -% -% The \meta{name} will be the name of the scope. If this contains the -% sub-string \texttt{hex} (upper, lower, or mixed case), then the zone -% will get a hex grid with numbering attached to it. -% -% If the \meta{name} contains the sub-string \texttt{turn} (any case), -% then it is assumed to be a turn track and a rectangular grid will be -% attached. The column and row separator will be set to \texttt{T}, -% so that it won't collide with the main zone. Similar if \meta{name} -% contains \texttt{oob}, except the separator is set to \texttt{O}. -% -% If \meta{name} contains the sub-string \texttt{pool}, then it is -% assumed to be a pool of counters, and \emph{no} grid is attached. -% -% For \texttt{zone path} applied to a \texttt{path}, what is recorded -% is the path coordinates (as straight line segments) in the global -% coordinate system. -% -% Both styles take one argument --- the name of the zone. If that -% name contains the sub-string \texttt{hex} anywhere in the name, then -% the zone is assumed to contain a hex grid. Otherwise, a rectangular -% grid (of fixed size) will be applied to it. -% -% The environment \texttt{boardimage} also records the coordinate -% options currently in use (keys \texttt{hex/first row is}, -% \texttt{hex/row direction is}, and so on), as well as the current -% label option (as defined by \texttt{every hex} or \texttt{every hex -% node}). -% -% All coordinates, and such are recorded in centimetres. It is worth -% remembering that the Tikz coordinate system has the $y$ axis point -% upward, while typical image software has the $y$ axis point down. -% \texttt{pdftocairo} typically assumes a 150 PPI (pixels-per-inch) -% resolution. -% -% That means that scaling factor becomes -% -% $$\frac{150\mathrm{pixel}}{2.54\mathrm{cm}}=59.055\frac{\mathrm{pixel}}{\mathrm{cm}}$$ -% % \iffalse -% Using definition in terms of printers feet - the one to use! -% -% PNG: 1674 x 1101 -% PDF: "lower left": [-0.02107,-0.02107], -% "upper right": [28.31705,18.60843] -% Width: 28.31705+0.02107 = 28.33812 -% Height: 18.60843+0.02107 = 18.62950 -% Pixel / cm: 1674 / 28.33812 = 59.07237318495369488166 -% 1101 / 18.62950 = 59.09981480984460130438 -% Average = 59.08609399739914809302 -% -% Calculated = 150 / 2.54 = 59.05511811023622047244 -% -% Using 1/72.27 -% -% "lower left": [-0.02109,-0.02109], -% "upper right": [28.321,18.61102] -% Width: 28.321+0.02109=28.34209 -% Height: 18.61102+0.02109=18.63211 -% Pixel / cm: 1674 / 28.34209 = 59.06409866033168337267 -% 1101 / 18.63211 = 59.09153606328000425072 -% Average = 59.07781736180584381169 +% EOF % \fi -% -% The information extracted is written to the -% \cs{jobname}\texttt{.json} file as a sub-object (with name given by -% the first optional argument) of the image object. In that way, we -% can later on easily get the information from our catalogue of -% images. -% -% Note, the styles \texttt{zoned}, \texttt{zone scope}, and -% \texttt{zone path} are defined in \texttt{wargame} to be dummies so -% that one can have them in the definition of the board without -% impact. -% -% Since we want to write all dimensions in centimetres, we need to be -% able to convert \texttt{pt} dimensions to centimetres. We make two -% macros to do that for us. -% -% The exact definition of 1pt is -% -% $$1\,\mathrm{pt} = \frac{249}{250}12"\frac{1}{864}=\frac{83}{6000}1" -% = 0.03513\overline{6}$$ -% -% \begin{macrocode} -% 2.54 / 72.27 = .03514598035145980351 -% \def\pt@to@cm#1{\pgfmathparse{#1 * 0.0351460}} -\def\pt@to@cm#1{\pgfmathparse{#1 * 0.0351367}} -\def\ptpoint@to@cm#1#2{% - \pt@to@cm{#1}\edef\x{\pgfmathresult}% - \pt@to@cm{#2}\edef\y{\pgfmathresult}} -% \end{macrocode} -% \begin{macrocode} -\def\mk@get@anchor#1#2{% - \pgfpointanchor{#1}{#2}% - \pgfgetlastxy\tmp@x\tmp@y% - \pt@to@cm{\tmp@x}\edef\tmp@x{\pgfmathresult} - \pt@to@cm{\tmp@y}\edef\tmp@y{\pgfmathresult} -} -\def\mk@get@global@anchor#1#2{% - \pgfpointanchor{#1}{#2}% - \pgfgetlastxy\tmp@x\tmp@y% - \pgfpointtransformed{\pgfpoint{\tmp@x}{\tmp@y}} - \pgf@xa=\pgf@x - \pgf@ya=\pgf@y - \pt@to@cm{\the\pgf@xa}\edef\tmp@x{\pgfmathresult} - \pt@to@cm{\the\pgf@ya}\edef\tmp@y{\pgfmathresult} -} -\def\get@bb#1{% - % \pgfpointanchor{#1}{south west}% - % \pgfgetlastxy\tmp@llx\tmp@lly% - % \pgfpointanchor{#1}{north east}% - % \pgfgetlastxy\tmp@urx\tmp@ury% - % \pt@to@cm{\tmp@llx}\edef\llx{\pgfmathresult} - % \pt@to@cm{\tmp@lly}\edef\lly{\pgfmathresult} - % \pt@to@cm{\tmp@urx}\edef\urx{\pgfmathresult} - % \pt@to@cm{\tmp@ury}\edef\ury{\pgfmathresult} - \mk@get@anchor{#1}{south west} - \edef\llx{\tmp@x} - \edef\lly{\tmp@y} - \mk@get@anchor{#1}{north east} - \edef\urx{\tmp@x} - \edef\ury{\tmp@y} -} -% \end{macrocode} -% \begin{macrocode} -\def\mk@transform{% - \pgfgettransformentries{\mxx}{\mxy}{\myx}{\myy}{\ptdx}{\ptdy} - \pt@to@cm{\ptdx}\edef\dx{\pgfmathresult} - \pt@to@cm{\ptdy}\edef\dy{\pgfmathresult} - \mk@w{ \mk@i "xx": \mxx,} - \mk@w{ \mk@i "xy": \mxy,} - \mk@w{ \mk@i "yx": \myx,} - \mk@w{ \mk@i "yy": \myy,} - \mk@w{ \mk@i "dx": \dx,} - \mk@w{ \mk@i "dy": \dy,} -} -% \end{macrocode} -% \begin{macrocode} -\def\mk@bb#1{% - \get@bb{#1} - \mk@w{ \mk@i "lower left": [\llx,\lly],} - \mk@w{ \mk@i "upper right": [\urx,\ury],} - \begingroup - % \pgftransforminvert - % \pgfpointanchor{#1}{south west}% - % \pgfgetlastxy\tmp@llx\tmp@lly% - % \pgfpointtransformed{\pgfpoint{\tmp@llx}{\tmp@lly}} - % \pgf@xa=\pgf@x - % \pgf@ya=\pgf@y - % % - % \pgfpointanchor{#1}{north east}% - % \pgfgetlastxy\tmp@urx\tmp@ury% - % \pgfgetlastxy\tmp@llx\tmp@lly% - % \pgfpointtransformed{\pgfpoint{\tmp@urx}{\tmp@ury}} - % \pgf@xb=\pgf@x - % \pgf@yb=\pgf@y - % \pt@to@cm{\the\pgf@xa}\edef\llx{\pgfmathresult} - % \pt@to@cm{\the\pgf@ya}\edef\lly{\pgfmathresult} - % \pt@to@cm{\the\pgf@xb}\edef\urx{\pgfmathresult} - % \pt@to@cm{\the\pgf@yb}\edef\ury{\pgfmathresult}x - \mk@get@global@anchor{#1}{south west} - \mk@w{ \mk@i "global lower left": [\tmp@x,\tmp@y],} - \mk@get@global@anchor{#1}{north east} - \mk@w{ \mk@i "global upper right": [\tmp@x,\tmp@y]} - \endgroup -} -\def\mk@pos#1(#2){% - \hex@dbg{10}{^^JMarking `#2' with `#1' - start} - \coordinate[transform shape] (tmp) at (#2) {}; - \mk@get@anchor{tmp}{center} - \hex@dbg{3}{^^JMarking `#2' with `#1' - `\tmp@x',\tmp@y'} - \tikzset{zone point={#1}{\tmp@x}{\tmp@y}} -} -% \end{macrocode} -% -% For the key \texttt{zone path} to work, we need to be able to record -% the path as it moves along. To that end, we make a custom -% decoration that will do that for us, and, once the path is finished, -% write the path to our JSON file. -% -% \begin{macrocode} -\pgfdeclaredecoration{record path construction}{initial}{% - \state{initial}[width=0pt,next state=more]{ - \begingroup - \pgf@decorate@inputsegment@first - \ptpoint@to@cm{\the\pgf@x}{\the\pgf@y} - \xdef\wg@path{[\x,\y]} - \endgroup - }% - \state{more}[width=\pgfdecoratedinputsegmentremainingdistance]{% - \begingroup - \pgf@decorate@inputsegment@last - \ptpoint@to@cm{\the\pgf@x}{\the\pgf@y} - \xdef\wg@path{\wg@path,[\x,\y]} - \endgroup - } - \state{final}{% - \begingroup - \pgf@decorate@inputsegment@last - \ptpoint@to@cm{\the\pgf@x}{\the\pgf@y} - \xdef\wg@path{\wg@path,[\x,\y]} - \endgroup - \mk@w{ \mk@i "zone path \wg@record@path@name": \@lbchar} - \mk@w{ \mk@i\space "path": [\wg@path] \@rbchar,} - } -}% -% \end{macrocode} -% -% Now we can make our environment -% -% The first thing we do is to use the \cs{info} macro to mark the -% image. Then we open our JSON file. We make a short-hand macro for -% writing to that file. The macro \cs{bd@i} records the current -% indention (which is important in JSON) -% -% \begin{macrocode} -\newenvironment{boardimage}[3][board]{% - \def\bd@n{#2} - \newcount\mk@point - \mk@point=0 - \let\oomk@i\mk@i% - \let\markpos\mk@pos% -% \end{macrocode} -% -% -% Then, to extract the label option, we make a dummy \texttt{node} -% with the styles \texttt{every hex} and \texttt{every hex node}, so -% we can extract that option. -% -% \begin{macrocode} - \info{dummy}{<<dummy>>}{}% - %\tikz{}% - \tikz{\scoped[every hex/.try,every hex node/.try]{% - \node[inner sep=0,outer sep=0]{% - \global\let\mk@label\hex@label}}}% -% \end{macrocode} -% -% The next thing we do is to make an object. The first things we put -% in are the units used (``cm''), and the grid options. -% -% \begin{macrocode} - \info*{#2}{#1}{#3}% - \mk@w{ \mk@i "zones": \@lbchar}% - \edef\mk@i{\mk@i\space} - %% Everything is made into centimeters - \mk@w{ \mk@i "units": "cm",} - \@ifundefined{mk@label}{}{\mk@w{ \mk@i "labels": "\mk@label",}} - %% Write out coordinate options as "coords" object - \mk@w{ \mk@i"coords": \@lbchar}% - \mk@w{ \mk@i "row": \@lbchar}% - \mk@w{ \mk@i\space "offset": \hex@coords@row@off,}% - \mk@w{ \mk@i\space "factor": \hex@coords@row@fac \@rbchar,}% - \mk@w{ \mk@i "column": \@lbchar}% - \mk@w{ \mk@i\space "offset": \hex@coords@col@off,}% - \mk@w{ \mk@i\space "factor": \hex@coords@col@fac,}% - \mk@w{ \mk@i\space "top short": "\hex@top@short@col",}% - \mk@w{ \mk@i\space "bottom short": "\hex@bot@short@col" \@rbchar}% - \mk@w{ \mk@i\@rbchar,}% -% \end{macrocode} -% -% We then monkey-patch \cs{boardframe} to also output coordinates to -% our JSON file. Note that this will probably be embedded in a -% different object. -% -% \begin{macrocode} - %% - \let\oldbo@rdframe\bo@rdframe% - \def\bo@rdframe[##1](##2)(##3){% - \oldbo@rdframe[##1](##2)(##3)% - \mk@w{ \mk@i"board frame": \@lbchar} - \mk@w{ \mk@i\space "lower left": [\llx,\lly],} - \mk@w{ \mk@i\space "upper right": [\urx,\ury],} - \mk@w{ \mk@i\space "margin": \margin,} - \mk@w{ \mk@i\space "width": \w,} - \mk@w{ \mk@i\space "height": \h \@rbchar,}}% -% \end{macrocode} -% -% Next, we make the style \texttt{zoned} to be applied to the -% \texttt{tikzpicture} environment. This records the bounding box of -% the full picture. -% -% \begin{macrocode} - \tikzset{ - zoned/.code={% Apply to whole picture - \pgfkeys{% - % This needs to be done in the picture! - /tikz/execute at end picture={% - \mk@w{ \mk@i "zoned": \@lbchar} - \mk@transform% - \mk@bb{current bounding box} - \mk@w{ \mk@i \@rbchar,} - } - } - }, -% \end{macrocode} -% -% The next style is the \texttt{zone scope}. At the start of the -% scope we record the current transformation matrix. Then we install -% a handler to extract the bounding box at the end of the scope. Note -% that we increase indention here. -% -% \begin{macrocode} - zone scope/.code={% - \mk@w{ \mk@i"zone scope ##1": \@lbchar} - \let\omk@i\mk@i - \edef\mk@i{\mk@i\space} - \mk@transform% - %\bd@w{ \@rbchar,} - \gdef\wg@export@box{##1}% - \pgfkeys{% - /tikz/local bounding box=wg export box, - /tikz/execute at end scope={ - \mk@bb{wg export box} - \let\mk@i\omk@i - \mk@w{ \mk@i\@rbchar,}}, - } % pgfkeys - }, % zone scope -% \end{macrocode} -% The next style gets the global coordinates of the current (0,0) -% point - f.ex. in a node - and outputs that -% \begin{macrocode} - zone point/.code n args={3}{ - \pgf@xa=##2 cm - \pgf@ya=##3 cm - \pgfpointtransformed{\pgfpoint{\pgf@xa}{\pgf@ya}} - % \pgfpointtransformed{\pgfpoint{0pt}{0pt}} - \pgf@xa=\pgf@x - \pgf@ya=\pgf@y - \pt@to@cm{\the\pgf@xa}\edef\px{\pgfmathresult} - \pt@to@cm{\the\pgf@ya}\edef\py{\pgfmathresult} - \advance\mk@point1 - \global\mk@point=\mk@point - \mk@w{ \mk@i "point\the\mk@point": \@lbchar "name": "##1", "type": "point", "coords": [\px,\py] - \@rbchar, } - %\message{^^JZone point \the\mk@point\space ##1: ##2,##3 -> \px,\py} - }, - zone oob point/.code n args={3}{ - \pgf@xa=##2 cm - \pgf@ya=##3 cm - \advance\pgf@xa.1cm - \advance\pgf@ya.1cm - \pgfpointtransformed{\pgfpoint{\pgf@xa}{\pgf@ya}} - % \pgfpointtransformed{\pgfpoint{0pt}{0pt}} - \pgf@xa=\pgf@x - \pgf@ya=\pgf@y - \pt@to@cm{\the\pgf@xa}\edef\px{\pgfmathresult} - \pt@to@cm{\the\pgf@ya}\edef\py{\pgfmathresult} - \advance\mk@point1 - \global\mk@point=\mk@point - \mk@w{ \mk@i "point\the\mk@point": \@lbchar "name": "##1", "type": "point", "coords": [\px,\py] - \@rbchar, } - %\message{^^JZone point \the\mk@point\space ##1: ##2,##3 -> \px,\py} - }, - zone global point/.code n args={3}{ - \advance\mk@point1 - \global\mk@point=\mk@point - \mk@w{ \mk@i "point\the\mk@point": \@lbchar "name": "##1", "type": "point", "coords": [\px,\py] - \@rbchar, } - }, -% \end{macrocode} -% -% The \texttt{zone path} style is a bit more simple, but only because -% the bulk of the work is done in a decoration. We need to be able to -% pass a name to that decoration, s we make a key for that. The user -% need not think about that though. -% -% \begin{macrocode} - /pgf/decoration/record path name/.store in=\wg@record@path@name, - zone path/.style={% - postaction={decorate,decoration={ - record path construction, - record path name=##1}} - } % zone path - }% tikzset -} -% \end{macrocode} -% -% That finishes the first part of the environment. At the end of the -% environment, we simple write the name of the picture, and close our -% JSON output. -% -% \begin{macrocode} -{% - \mk@w{ \mk@i "name": "\bd@n" }% - \let\mk@i\oomk@i% - \mk@w{ \mk@i\@rbchar}% - \end@info% -} -% \end{macrocode} -% -% -% TO BE DONE: We could add hooks to both the \texttt{hex} and -% \texttt{chit} shapes that would allow us to write out the settings -% for each of these. This would allow us to make data files that -% contain the information available in the \LaTeX{} code. For -% example, we could write a counters -% -% \begin{itemize} -% \item Left and right identifiers -% \item Upper left, upper right, lower left, and lower right -% identifiers. (some care must be taken if these contains graphics -% and not just text.) -% \item Factors -% \item NATO symbol -% \begin{itemize} -% \item Faction, command, echelon -% \item Mains -% \item Left, right, top, and bottom attributes and modifiers -% \item Below attribute -% \end{itemize} -% \end{itemize} -% -% If one then assumed that for example the upper left corner holds the -% start-up hex, then one could use that information. -% -% The code below exports the chit information to the JSON file. Not -% sure how to use it though. -% -% \begin{macrocode} -\tikzset{ - zone turn/.store in=\zone@turn, - zone mult/.store in=\zone@mult -} -\def\do@chit@report{% - \mk@w{ \mk@i "chit": \@lbchar} - \@ifundefined{id}{} {\mk@w{ \mk@i\space "id": "\id", }}% - \@ifundefined{chit@symbol}{} {\mk@w{ \mk@i\space "symbol": "true", }}% - \@ifundefined{chit@full}{} {\mk@w{ \mk@i\space "full": "\chit@full", }} - \@ifundefined{chit@factors}{} {\mk@w{ \mk@i\space "factors": "\chit@factors", }}% - \@ifundefined{chit@left}{} {\mk@w{ \mk@i\space "left": "\chit@left", }}% - \@ifundefined{chit@right}{} {\mk@w{ \mk@i\space "right": "\chit@right", }}% - \@ifundefined{chit@upper@left}{} {\mk@w{ \mk@i\space "upper left": "\chit@upper@left", }}% - \@ifundefined{chit@lower@left}{} {\mk@w{ \mk@i\space "lower left": "\chit@lower@left", }}% - \@ifundefined{chit@upper@right}{}{\mk@w{ \mk@i\space "upper right": "\chit@upper@right", }}% - \@ifundefined{chit@lower@right}{}{\mk@w{ \mk@i\space "lower right": "\chit@lower@right}", }% - \mk@w{ \mk@i\space "end": 0} - \@ifundefined{chit@symbol}{ - \mk@w{ \mk@i \@rbchar } - }{ - \mk@w{ \mk@i \@rbchar, }% NATOAPP6c will follow - }% -} -\def\do@natoapp@report{% - \mk@w{ \mk@i "natoapp6c": \@lbchar} - \@ifundefined{id}{}{\mk@w{ \mk@i\space "id": "\id", }} - \@ifundefined{natoapp@fac}{}{\mk@w{ \mk@i\space "faction": "\natoapp@fac", }} - \@ifundefined{natoapp@cmd}{}{\mk@w{ \mk@i\space "command": "\natoapp@cmd", }} - \@ifundefined{natoapp@ech}{}{\mk@w{ \mk@i\space "echelon": "\natoapp@ech", }} - \@ifundefined{natoapp@main}{}{\mk@w{ \mk@i\space "main": "\natoapp@main", }} - \@ifundefined{natoapp@left}{}{\mk@w{ \mk@i\space "left": "\natoapp@left", }} - \@ifundefined{natoapp@right}{}{\mk@w{ \mk@i\space "right": "\natoapp@right", }} - \@ifundefined{natoapp@upper}{}{\mk@w{ \mk@i\space "upper": "\natoapp@upper", }} - \@ifundefined{natoapp@lower}{}{\mk@w{ \mk@i\space "lower": "\natoapp@lower", }} - \@ifundefined{natoapp@below}{}{\mk@w{ \mk@i\space "below": "\natoapp@below", }} - \mk@w{ \mk@i\space "end": 0} - \mk@w{ \mk@i \@rbchar} -} -% \end{macrocode} -% \iffalse -%</exportcls> -%\fi -% + |