summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/wargame/source/hex/labels.dtx
diff options
context:
space:
mode:
Diffstat (limited to 'macros/latex/contrib/wargame/source/hex/labels.dtx')
-rw-r--r--macros/latex/contrib/wargame/source/hex/labels.dtx160
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