diff options
Diffstat (limited to 'macros/latex/contrib/wargame/source/hex/labels.dtx')
-rw-r--r-- | macros/latex/contrib/wargame/source/hex/labels.dtx | 160 |
1 files changed, 160 insertions, 0 deletions
diff --git a/macros/latex/contrib/wargame/source/hex/labels.dtx b/macros/latex/contrib/wargame/source/hex/labels.dtx new file mode 100644 index 0000000000..7767dcc661 --- /dev/null +++ b/macros/latex/contrib/wargame/source/hex/labels.dtx @@ -0,0 +1,160 @@ +% \iffalse +% -------------------------------------------------------------------- +%<*hex> +% \fi +% +% \subsubsection{Labels} +% \label{sec:impl:hex:label} +% +% Like terrains, we will set up some macros for dealing with labels. +% +% To process coordinates and turn them into labels, we set up two +% counters. +% +% \begin{macrocode} +\newcounter{hex@l@c} +\newcounter{hex@l@r} +% \end{macrocode} +% +% In case we want to invert the row axis, we set-up a key to set the +% maximum row number. +% +% \begin{macrocode} +\def\hex@max@row{-1} +\tikzset{ + max hex row/.store in=\hex@max@row, +} +% \end{macrocode} +% +% Again, we will make a separate namespace/family for the handling +% labels. We also define a counter which we will use to typeset +% alphabetic column numbers. +% +% First a graphics style. +% +% \begin{macrocode} +\tikzset{% + hex/label/.style={% + draw=none,% + shape=rectangle,% + anchor=north,% + color=gray,% + font=\sffamily\bfseries\scriptsize,% + inner sep=0}, +} +% \end{macrocode} +% +% Next, the choices of how to make a label. These are put in the +% \spec{/hex/label} family to make it easy to parse out only these +% keys. This uses some macros defined below. Note, this uses the +% macros \cs{hex@col} and \cs{hex@row} defined by the hex coordinate +% system. +% +% \begin{macrocode} +\tikzset{% + /hex/label/.search also={/tikz}, + /hex/label/.cd, + none/.code={\global\let\hex@l@text\@empty}, + auto/.is choice, + auto/none/.code={\global\let\hex@l@text\@empty}, + auto/numbers/.code={% + \hex@l@abs% + \xdef\hex@l@text{% + \hex@l@n@pad{\the\c@hex@l@c}% + \hex@l@n@pad{\the\c@hex@l@r}}}, + auto/alpha column/.code={% + \xdef\hex@l@text{% + \ifnum0>\hex@col\AlphAlph{-\hex@col}\else\AlphAlph{\hex@col}\fi% + \hex@row}}, + auto/alpha 2 column/.code={% + \hex@l@abs% + \advance\c@hex@l@c27\relax% + \xdef\hex@l@text{% + \AlphAlph{\value{hex@l@c}}% + \hex@l@n@pad{\hex@row}}}, + auto/inv y x plus 1/.code={% + \hex@dbg{3}{Inverse row, add one to column with arg `#1'} + \let\hex@l@text\@empty% + \ifnum\hex@max@row>0% + \pgfmathtruncatemacro{\hex@l@row}{\hex@max@row-\hex@row} + \pgfmathtruncatemacro{\hex@l@col}{1+\hex@col} + \xdef\hex@l@text{% + \hex@l@n@pad{\hex@l@col}% + \hex@l@n@pad{\hex@l@row}} + \else\message{Max row number not set}\fi}, + auto/x and y plus 1/.code={% + \hex@dbg{3}{Inverse row, add one to column with arg `#1'} + \pgfmathtruncatemacro{\hex@l@row}{1+\hex@row} + \pgfmathtruncatemacro{\hex@l@col}{1+\hex@col} + \xdef\hex@l@text{% + \hex@l@n@pad{\hex@l@col}% + \hex@l@n@pad{\hex@l@row}}}, + auto/.default=numbers, + %text/.store in=\hex@l@text, + text/.code={\gdef\hex@l@text{#1}}, + place/.store in=\hex@l@pos, + location/.forward to=/hex/label/place, + rotate/.store in=\hex@l@rot +} +% \end{macrocode} +% \begin{Macro}{\hex@l@abs} +% +% This takes the absolute value of row and column numbers. +% +% \begin{macrocode} +\def\hex@l@abs{ + \setcounter{hex@l@c}{\hex@col} + \setcounter{hex@l@r}{\hex@row} + \expandafter\ifnum\value{hex@l@c}<0\multiply\c@hex@l@c by-1\fi% + \expandafter\ifnum\value{hex@l@r}<0\multiply\c@hex@l@r by-1\fi% + % \hex@dbg{0}{\hex@col->\the\c@hex@l@c\space\hex@row->\the\c@hex@l@r} +} +% \end{macrocode} +% \end{Macro} +% +% \begin{Macro}{\hex@l@n@pad} +% This will pad a number with a 0 if the number is smaller than 10. +% +% \begin{macrocode} +\long\def\hex@l@n@pad#1{% + \ifnum#1<10 0\fi% + #1} +% \end{macrocode} +% \end{Macro} +% +% +% \begin{Macro}{\hex@do@label} +% +% This macro puts in the label. First, we reset label keys, then we +% read in the keys from the argument. If this results in the macro +% \cs{hex@l@text} to be non-empty, then we set the label via a +% \TikZ{} \spec{node}. +% +% \begin{macrocode} +\def\hex@do@label{% + \hex@dbg{1}{Hex label: `\meaning\hex@label'}% + \edef\hex@l@tmp{[% + /hex/label/.cd,% + rotate=0,% + place={(90:.8)},% + /tikz/hex/label/.try,% + /tikz/every hex label/.try,% + \hex@label]}% + \expandafter\scope\hex@l@tmp% + \hex@dbg{1}{Label: + ^^J Text: `\meaning\hex@l@text' + ^^J Location: `\meaning\hex@l@pos' + ^^J Rotation: `\meaning\hex@l@rot' + }% + \@ifundefined{hex@l@text}{\let\hex@l@text\empty}{}% + \ifx\hex@l@text\empty\else% + \node[rotate=\hex@l@rot] at \hex@l@pos {\hex@l@text};% + \fi% + \endscope% +} +% \end{macrocode} +% \end{Macro} +% \iffalse +%</hex> +% -------------------------------------------------------------------- +% \fi |