summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/wargame/source/hex/ridges.dtx
diff options
context:
space:
mode:
Diffstat (limited to 'macros/latex/contrib/wargame/source/hex/ridges.dtx')
-rw-r--r--macros/latex/contrib/wargame/source/hex/ridges.dtx139
1 files changed, 139 insertions, 0 deletions
diff --git a/macros/latex/contrib/wargame/source/hex/ridges.dtx b/macros/latex/contrib/wargame/source/hex/ridges.dtx
new file mode 100644
index 0000000000..3914ff6ce5
--- /dev/null
+++ b/macros/latex/contrib/wargame/source/hex/ridges.dtx
@@ -0,0 +1,139 @@
+% \iffalse
+% --------------------------------------------------------------------
+%<*hex>
+% \fi
+%
+% \subsubsection{Ridges}
+% \label{sec:impl:hex:ridges}
+%
+% A hex can be decorated with up to 6 ridges --- one for each edge of
+% the hexagon. The first thing is to set up the graphics style to use
+% for the ridges. We use the \spec{wave} decoration.
+%
+% \begin{macrocode}
+\tikzset{%
+ hex/ridges/.style={
+ line cap=round,
+ draw=pgfstrokecolor,
+ rounded corners=.25cm,
+ scale line widths,
+ decoration={
+ path has corners=true,
+ pre=waves,
+ post=waves,
+ pre length=-.1cm,
+ post length=0cm,
+ waves,
+ radius=.2cm,
+ segment length=.2cm},
+ decorate}}
+% \end{macrocode}
+%
+% To properly set up the ridges, we need to concatenate ridge paths in
+% order. To facilitate that, we define 6 \cs{if}s --- one for each
+% edge.
+%
+% \begin{macrocode}
+\newif\ifhex@r@ne
+\newif\ifhex@r@n
+\newif\ifhex@r@nw
+\newif\ifhex@r@sw
+\newif\ifhex@r@s
+\newif\ifhex@r@se
+% \end{macrocode}
+%
+% Next is the keys for each edge. These will set the above \cs{if}s
+% to \spec{true}. We put these into the family \spec{/hex/r} so that
+% we can parse them separately.
+%
+% \begin{macrocode}
+\tikzset{%
+ /hex/ridges/.search also={/tikz},
+ /hex/ridges/.cd,
+ north east/.is if=hex@r@ne,
+ north/.is if=hex@r@n,
+ north west/.is if=hex@r@nw,
+ south west/.is if=hex@r@sw,
+ south/.is if=hex@r@s,
+ south east/.is if=hex@r@se,
+ radius/.store in=\hex@r@r,
+ NE/.is if=hex@r@ne,
+ N/.is if=hex@r@n,
+ NW/.is if=hex@r@nw,
+ SW/.is if=hex@r@sw,
+ S/.is if=hex@r@s,
+ SE/.is if=hex@r@se,
+ r/.store in=\hex@r@r,
+}
+% \end{macrocode}
+%
+% \begin{Macro}{\hex@do@ridges}
+%
+% This is the macro that actually generates the ridge. We use the
+% same \textsc{pgf} filtered key parsing trick as above. Note that
+% the routine below is handcrafted since it is relatively simple.
+%
+% \begin{macrocode}
+\def\hex@do@ridges{%
+ \edef\hex@r@tmp{[
+ /hex/ridges/.cd,%
+ radius=0.8,%
+ /tikz/every hex ridges/.try,
+ \hex@ridges]}
+ \expandafter\scope\hex@r@tmp%
+ \hex@dbg{3}{Ridges: `\meaning\hex@ridges', `\meaning\hex@r@tmp'
+ ^^Jnorth east=\ifhex@r@ne yes\else no\fi
+ ^^Jnorth =\ifhex@r@n yes\else no\fi
+ ^^Jnorth west=\ifhex@r@nw yes\else no\fi
+ ^^Jsouth west=\ifhex@r@sw yes\else no\fi
+ ^^Jsouth =\ifhex@r@s yes\else no\fi
+ ^^Jsouth east=\ifhex@r@se yes\else no\fi
+ ^^Jradius =\hex@r@r
+ }
+ \def\hex@r@p{}
+ % Hand written algorithm
+ \ifhex@r@ne
+ \def\hex@r@p{(0:\hex@r@r)--(60:\hex@r@r)}
+ \fi
+ \ifhex@r@n
+ \hex@dbg{4}{Ridge along north edge: `\hex@r@p'}
+ \ifhex@r@ne\else
+ \xdef\hex@r@p{\hex@r@p ( 60:\hex@r@r)}
+ \fi
+ \xdef\hex@r@p{\hex@r@p --(120:\hex@r@r)}
+ \fi
+ \ifhex@r@nw
+ \ifhex@r@n\else
+ \xdef\hex@r@p{\hex@r@p (120:\hex@r@r)}
+ \fi
+ \xdef\hex@r@p{\hex@r@p --(180:\hex@r@r)}
+ \fi
+ \ifhex@r@sw
+ \ifhex@r@nw\else
+ \xdef\hex@r@p{\hex@r@p (180:\hex@r@r)}
+ \fi
+ \xdef\hex@r@p{\hex@r@p --(240:\hex@r@r)}
+ \fi
+ \ifhex@r@s
+ \ifhex@r@sw\else
+ \xdef\hex@r@p{\hex@r@p (240:\hex@r@r)}
+ \fi
+ \xdef\hex@r@p{\hex@r@p --(300:\hex@r@r)}
+ \fi
+ \ifhex@r@se
+ \ifhex@r@s\else
+ \xdef\hex@r@p{\hex@r@p (300:\hex@r@r)}
+ \fi
+ \xdef\hex@r@p{\hex@r@p --(360:\hex@r@r)}
+ \fi
+ \hex@dbg{3}{ Ridges path: \hex@r@p}
+ \draw[hex/ridges] \hex@r@p;
+ \endscope% End of ridges scope
+}
+% \end{macrocode}
+% \end{Macro}
+%
+% \iffalse
+%</hex>
+% --------------------------------------------------------------------
+% \fi