diff options
Diffstat (limited to 'macros/latex/contrib/wargame/source/hex/paths.dtx')
-rw-r--r-- | macros/latex/contrib/wargame/source/hex/paths.dtx | 416 |
1 files changed, 416 insertions, 0 deletions
diff --git a/macros/latex/contrib/wargame/source/hex/paths.dtx b/macros/latex/contrib/wargame/source/hex/paths.dtx new file mode 100644 index 0000000000..833a4a245a --- /dev/null +++ b/macros/latex/contrib/wargame/source/hex/paths.dtx @@ -0,0 +1,416 @@ +% \iffalse +% -------------------------------------------------------------------- +%<*hex> +% \fi +% +% \subsubsection{Edges, borders, roads, rivers, and so on} +% +% Styles of drawing edges, borders, rivers, roads, and railroads. +% +% \begin{macrocode} +% A decoration to extract outline of a path +\pgfdeclaredecoration{outline}{init} +{% + \state{init}[next state=tick,width=0pt]{ + \xdef\outlinerev{}} + \state{tick}[% + width=+\pgfdecorationsegmentlength]% + { + \pgfpathlineto{\pgfpointadd{\pgfpointorigin}{ + \pgfpointpolar{\pgfdecorationsegmentangle}{ + +\pgfdecorationsegmentamplitude}}} + \pgf@xa=\pgf@x + \pgf@ya=\pgf@y + \message{^^J\the\pgf@x,\the\pgf@y} + \pgfpointadd{\pgfpointorigin}{ + \pgfpointpolar{-\pgfdecorationsegmentangle}{ + \pgfdecorationsegmentamplitude}} + \pgfpointtransformed{\pgfpoint{\pgf@x}{\pgf@y}}% + \message{^^J\the\pgf@x,\the\pgf@y} + \xdef\outlinerev{\the\pgf@x/\the\pgf@y,\outlinerev} + \pgf@x=\pgf@xa + \pgf@y=\pgf@ya + }% + \state{final} + { + \pgfpathlineto{\pgfpointdecoratedpathlast} + \foreach \x/\y in \outlinerev{ + \ifx\x\empty\else + \ifx\y\empty\else + \pgf@xa=\x + \pgf@ya=\y + \pgf@nlt@lineto{\pgf@xa}{\pgf@ya} + \fi + \fi + } + }% +}% + +\tikzset{ + hex/road/.style={ + rounded corners=3\pgflinewidth,% .25cm, + color=black, + transform shape, + scale line widths, + thick}, + hex/railroad/.style={ + %scale line widths, + rounded corners=.25cm, + color=gray!50!black, + transform shape, + postaction={draw,decorate}, + decoration={ticks, + segment length=9\pgflinewidth, + amplitude=3\pgflinewidth,%.1cm + } + }, + hex/river/.style={ + color=blue, + scale line widths, + line width=3pt, + transform shape, + decorate, + decoration={random steps, + segment length=.3cm, + amplitude=.15cm, + pre=lineto, + post=lineto, + pre length=.05cm, + post length=.05cm}, + rounded corners=.08cm}, + hex/border/.style={ + color=gray, + rounded corners=3pt, + dashed, + transform shape, + scale line widths, + very thick + }, + every river/.style={}, + every road/.style={}, + every railroad/.style={}, + every border/.style={}, +} +% \end{macrocode} +% +% \begin{Macro}{\road,\railroad,\river,\border} +% +% \begin{macrocode} +\def\road{% + \hex@dbg{3}{Road} + \@ifnextchar[{\road@}{\road@[]}%] +} +\def\road@[#1]{\draw[hex/road,every hex road/.try,#1]} +\def\railroad{% + \hex@dbg{3}{Rail road} + \@ifnextchar[{\railroad@}{\railroad@[]}%] +} +\def\railroad@[#1]{\draw[hex/railroad,every hex railroad/.try,#1]} +\def\river{% + \hex@dbg{3}{River} + \@ifnextchar[{\river@}{\river@[]}%] +} +\def\river@[#1]{\draw[hex/river,every hex river/.try,#1]} +\def\border{% + \hex@dbg{3}{Border} + \@ifnextchar[{\border@}{\border@[]}%] +} +\def\border@[#1]{\draw[hex/border,every hex border/.try,#1]} +% \end{macrocode} +% \end{Macro} +% +% +% \iffalse +% -------------------------------------------------------------------- +% \fi +% +% \subsubsection{Other paths} +% +% \begin{Macro}{\shiftScalePath} +% Shifts and scales a path and defines a macro to contain the path +% +% \begin{Syntax} +% \cs{shiftScalePath}\marg{macro}\marg{relative-coordinates} +% \end{Syntax} +% +% where \meta{relative-coordinates} is a comma separated list of +% relative coordinates (to the lower-left and upper-right corners) +% +% \begin{Syntax} +% \meta{x}/\meta{y} +% \end{Syntax} +% +% Note, this requires that \cs{boardXmin},\cs{boardYmin} and +% \cs{boardXmax},\cs{boardYmax} is defined. This can be done using +% the \cs{boardframe} macro. +% +% \begin{macrocode} +\def\shiftScalePath#1#2{% + \let\tmp@path\@undefined% + \foreach \x/\y in {#2}{% + \pgfmathparse{\x*\boardW+\boardXmin}\xdef\tmp@x{\pgfmathresult}% + \pgfmathparse{\y*\boardH+\boardYmin}\xdef\tmp@y{\pgfmathresult}% + \@ifundefined{tmp@path}{\def\tmp@path{}}{\xdef\tmp@path{\tmp@path--}}% + \xdef\tmp@path{\tmp@path(\tmp@x,\tmp@y)}}% + \expandafter\xdef\csname #1\endcsname{\tmp@path}} +% \end{macrocode} +% \end{Macro} +% +% \iffalse +% -------------------------------------------------------------------- +% \fi +% +% \subsubsection{Move, attacks, retreats from hex to hex} +% +% \begin{Macro}{\hex@getscale} +% +% Get current scaling factor. +% +% \begin{macrocode} +\def\hex@getscale#1{% + \begingroup + \pgfgettransformentries{% + \scaleA}{% + \scaleB}{% + \scaleC}{% + \scaleD}{% + \whatevs}{% + \whatevs}% + \pgfmathsetmacro{#1}{sqrt(abs(\scaleA*\scaleD-\scaleB*\scaleC))}% + \expandafter + \endgroup + \expandafter\def\expandafter#1\expandafter{#1}% +} +% \end{macrocode} +% \end{Macro} +% +% Key to get the scale +% +% \begin{macrocode} +\tikzset{% + hex/get scale/.code={ + \hex@getscale{\hex@scale}}, +} +% \end{macrocode} +% +% Style for moves. Use like +% +% \begin{Syntax} +% \cs{path}[move] \meta{coordinates}; +% \end{Syntax} +% +% \begin{macrocode} +\tikzset{% + % Argument is colour + hex/move/.style={ + hex/get scale, + decorate, + decoration={ + markings, + mark=between positions 0 and 1 step 0.75*\hex@scale*\hex@dy with { + \node [single arrow, + single arrow head extend=3pt, + fill=#1, + inner sep=\hex@scale*.5mm, + minimum width=\hex@scale*2mm, + minimum height=\hex@scale*\hex@dy/2, + transform shape]{}; + } + }, + }, +% \end{macrocode} +% +% A short move style +% +% \begin{Syntax} +% \cs{path}[short move] \meta{coordinates}; +% \end{Syntax} +% +% +% \begin{macrocode} + % Argument is colour + hex/short move/.style={ + hex/get scale, + decorate, + decoration={ + markings, + mark=between positions 0 and 1 step 0.5*\hex@scale*\hex@dy with { + \node [single arrow, + single arrow head extend=3pt, + fill=#1, + inner sep=\hex@scale*.5mm, + minimum width=\hex@scale*2mm, + minimum height=\hex@scale*\hex@dy/3, + transform shape]{}; + } + }, + }, +% \end{macrocode} +% +% A short move style +% +% \begin{Syntax} +% \cs{path}[long move] \meta{coordinates}; +% \end{Syntax} +% +% +% \begin{macrocode} + % Argument is colour + hex/long move/.style={ + hex/get scale, + transform shape, + decorate, + decoration={ + markings, + mark=between positions 0 and -.7*\hex@scale*\hex@dy + step 2*\hex@scale*\hex@dy with { + \node [single arrow, + single arrow head extend=3pt, + fill=#1, + anchor=west, + inner sep=\hex@scale*.25mm, + outer sep=.3*\hex@scale*\hex@dy, + minimum width=\hex@scale*2mm, + minimum height=1.4*\hex@scale*\hex@dy, + transform shape]{}; + } + }, + }, +% \end{macrocode} +% +% A short move style +% +% \begin{Syntax} +% \cs{path}[move with start] \meta{coordinates}; +% \end{Syntax} +% +% +% \begin{macrocode} + % Argument is colour + hex/move with start/.style={ + hex/get scale, + decorate, + decoration={ + markings, + mark=at position 0 with { + \node [inner sep=0, + circle, + minimum size=\hex@scale*5mm, + fill=#1, + transform shape] {};}, + mark=between positions 0 and 1 step 0.75*\hex@scale*\hex@dy with { + \node [single arrow, + single arrow head extend=\hex@scale*3pt, + fill=#1, + inner sep=\hex@scale*1mm, + minimum width=\hex@scale*3mm, + minimum height=\hex@scale*\hex@dy/2, + transform shape]{}; + } + }, + }, + % Default fill colour is black + hex/move/.default=black, + hex/move with start/.default=black, + hex/short move/.default=black, + hex/long move/.default=black, + % Arguments are draw and fill color +% \end{macrocode} +% +% A move cost style +% +% \begin{Syntax} +% \cs{path}[move] ...(coordinate)node[hex/move cost]{} ...; +% \end{Syntax} +% +% \begin{macrocode} + hex/move cost/.style 2 args={ + minimum size=1mm, + inner sep=0.1mm, + circle, + fill=#2, + transform shape, + text=#1, + font=\sffamily\bfseries\Large}, + hex/move cost/.default={black}{none}, + % Argument is fill colour +% \end{macrocode} +% +% A short line style for retreates, advances, and so on +% +% \begin{Syntax} +% \cs{path}[short line] (start)--(end); +% \end{Syntax} +% +% \begin{macrocode} + hex/short line/.style={% + hex/get scale, + inherit options/.code={\csname tikz@options\endcsname}, + inherit options, + decorate, + decoration={ + markings, + mark=between positions \hex@scale*\hex@dy + and 1 step 2*\hex@scale*\hex@dy with { + \node [single arrow,draw=black,fill=#1, + single arrow head extend=\hex@scale*3pt, + inner sep=1mm, + minimum width=0.75*\hex@scale*\hex@dy, + minimum height=\hex@scale*\hex@dy, + transform shape]{}; + } + }, + }, +% \end{macrocode} +% +% An attack indication style +% +% \begin{Syntax} +% \cs{path}[attack] (start)--(end); +% \end{Syntax} +% +% \begin{macrocode} + % Argument is fill color + hex/attack/.style={ + hex/get scale, + inherit options/.code={\csname tikz@options\endcsname}, + inherit options, + decorate, + decoration={ + markings, + mark=between positions \hex@scale*\hex@dy + and 1 step 2*\hex@scale*\hex@dy with { + \node [regular polygon, + fill=#1, + draw=#1, + regular polygon sides=3, + inner sep=0, + minimum size=0.75*\hex@scale*\hex@dy, + rotate=-90, + transform shape]{}; + } + }, + }, +% \end{macrocode} +% +% Short hands +% +% \begin{Syntax} +% \cs{path}[attack] (start)--(end); +% \end{Syntax} +% +% \begin{macrocode} + % Default colour is red for attachs + hex/attack/.default=red!70!black, + %% + hex/retreat/.style={hex/short line=#1}, + hex/retreat/.default=white, + %% + hex/advance/.style={hex/short line=#1}, + hex/advance/.default={green!70!black}, +} +% \end{macrocode} +% \iffalse +%</hex> +% -------------------------------------------------------------------- +% \fi |