From e04f51964a118d051dbb48fe2af3892a4455dc82 Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Sat, 21 Feb 2015 23:04:31 +0000 Subject: havannah (21feb15) git-svn-id: svn://tug.org/texlive/trunk@36348 c570f23f-e606-0410-a88d-b1316a301751 --- Master/texmf-dist/doc/latex/havannah/README | 4 + Master/texmf-dist/doc/latex/havannah/havannah.pdf | Bin 0 -> 225361 bytes .../texmf-dist/source/latex/havannah/havannah.dtx | 961 +++++++++++++++++++++ .../texmf-dist/source/latex/havannah/havannah.ins | 34 + Master/texmf-dist/tex/latex/havannah/havannah.sty | 396 +++++++++ Master/tlpkg/bin/tlpkg-ctan-check | 2 +- Master/tlpkg/tlpsrc/collection-games.tlpsrc | 1 + Master/tlpkg/tlpsrc/havannah.tlpsrc | 0 8 files changed, 1397 insertions(+), 1 deletion(-) create mode 100644 Master/texmf-dist/doc/latex/havannah/README create mode 100644 Master/texmf-dist/doc/latex/havannah/havannah.pdf create mode 100644 Master/texmf-dist/source/latex/havannah/havannah.dtx create mode 100644 Master/texmf-dist/source/latex/havannah/havannah.ins create mode 100644 Master/texmf-dist/tex/latex/havannah/havannah.sty create mode 100644 Master/tlpkg/tlpsrc/havannah.tlpsrc diff --git a/Master/texmf-dist/doc/latex/havannah/README b/Master/texmf-dist/doc/latex/havannah/README new file mode 100644 index 00000000000..b768815ed44 --- /dev/null +++ b/Master/texmf-dist/doc/latex/havannah/README @@ -0,0 +1,4 @@ +The havannah package defines macros for typesetting diagrams of board +positions in the games of Havannah and Hex. It requires tikz. + +This material is subject to the LATEX Project Public License. diff --git a/Master/texmf-dist/doc/latex/havannah/havannah.pdf b/Master/texmf-dist/doc/latex/havannah/havannah.pdf new file mode 100644 index 00000000000..800c807e375 Binary files /dev/null and b/Master/texmf-dist/doc/latex/havannah/havannah.pdf differ diff --git a/Master/texmf-dist/source/latex/havannah/havannah.dtx b/Master/texmf-dist/source/latex/havannah/havannah.dtx new file mode 100644 index 00000000000..def78c19960 --- /dev/null +++ b/Master/texmf-dist/source/latex/havannah/havannah.dtx @@ -0,0 +1,961 @@ +% \iffalse +%<*driver> + +\ProvidesFile{havannah.dtx} +\documentclass{ltxdoc} +\usepackage{havannah} +\usepackage[scaled=0.92]{helvet} +\usepackage{lstdoc} +\usepackage{mathpazo} +\usetikzlibrary{decorations.pathmorphing} +\EnableCrossrefs +\CodelineIndex +\RecordChanges +\begin{document} + \DocInput{havannah.dtx} + \PrintChanges + \PrintIndex +\end{document} + +% +% \fi +% +% \newcommand\package{\texttt} +% +% \title{The \LaTeX\ \package{havannah} package} +% \author{Marcin Ciura\thanks{\texttt{mciura@gmail.com}}} +% \date{2015-02-21} +% \maketitle +% +% \begin{abstract} +% The \package{havannah} package defines macros for typesetting +% diagrams of board positions in the games of Havannah and Hex. +% \end{abstract} +% +% \begin{center} +% \begin{HavannahBoard}[board size=8,coordinate style=little golem] +% \HGame{ +% i12,h13,l7,m4,h12,g12,g11,f11,f10,e10,i13,h14,i14,h15,e9, +% d9,a8,d8,e8,d7,d4,e6,f5,c4,h10,e7,c3,b3,b2,a2,a1,f8,g7, +% h9,i7,i9,i10,g9,k9,j7,j11,g10,j9,h11,j8,i8,k7,l8,k10,i11, +% k6,j6,l4,d5,m3,c6,c5,b6,a4,b7,c8,b8,c9,b9,c10,j5,n1,j4, +% l5,j3,m5,m6,n3,n4,o2,j2,o1} +% \end{HavannahBoard} +% +% A Havannah game between Maciej Celuch and Mirko Rahn\\ +% played on \texttt{http://www.littlegolem.net} from 2009-07-05 to 2009-07-29 +% \end{center} +% +% \section{Usage} +% +% Put |\usepackage{havannah}| in the preamble of your document. +% +% This package defines four environments, three commands, +% and several hooks that allow for the customization of its output. +% +% \DescribeEnv{HavannahBoard} +% The |HavannahBoard| environment typesets a Havannah board. +% It accepts the following keys: +% \begin{itemize} +% \item |board size|: an integer from 1 to 13, default: |10|, +% \item |coordinate style|: |little golem |or| classical|, +% default: |classical|, +% \item |hex height|: a length, default: |17.5pt|, +% \item |show coordinates|: a Boolean, default: |true|, +% \item |show hexes|: a Boolean, default: |true|. +% \end{itemize} +% Sample effects of setting these keys are shown below. +% +% \vbox{\begin{lstsample}{}{} +% \begin{HavannahBoard}[board size=2] +% \end{HavannahBoard} +% +% \begin{HavannahBoard}[board size=3] +% \end{HavannahBoard} +% +% \begin{HavannahBoard}[board size=4] +% \end{HavannahBoard} +% \end{lstsample}} +% +% \noindent\hrulefill +% +% \vbox{\begin{lstsample}{}{} +% \begin{HavannahBoard}[board size=3,coordinate style=little golem] +% \HGame{d3,c2} +% \end{HavannahBoard} +% \begin{HavannahBoard}[board size=3,coordinate style=classical] +% \HGame{d3,c2} +% \end{HavannahBoard} +% \end{lstsample}} +% +% \noindent\hrulefill +% +% \vbox{\begin{lstsample}{}{} +% \begin{HavannahBoard}[board size=3,coordinate style=little golem] +% \HGame{d3,c2} +% \end{HavannahBoard} +% \begin{HavannahBoard}[ +% board size=3,coordinate style=little golem,hex height=1cm] +% \HGame{d3,c2} +% \end{HavannahBoard} +% \end{lstsample}} +% +% \noindent\hrulefill +% +% \vbox{\begin{lstsample}{}{} +% \begin{HavannahBoard}[board size=3,coordinate style=little golem] +% \HGame{d3,c2} +% \end{HavannahBoard} +% \begin{HavannahBoard}[ +% board size=3,coordinate style=little golem,show coordinates=false] +% \HGame{d3,c2} +% \end{HavannahBoard} +% \end{lstsample}} +% +% \noindent\hrulefill +% +% \vbox{\begin{lstsample}{}{} +% \begin{HavannahBoard}[board size=3,coordinate style=little golem] +% \HGame{d3,c2} +% \end{HavannahBoard} +% \begin{HavannahBoard}[ +% board size=3,coordinate style=little golem,show hexes=false] +% \HGame{d3,c2} +% \end{HavannahBoard} +% \end{lstsample}} +% +% \noindent\hrulefill +% +% \DescribeEnv{HexBoard} +% The |HexBoard| environment typesets a Hex board. +% It accepts the following keys: +% \begin{itemize} +% \item |board size|: an integer from 1 to 26, default: 11, +% \item |top left color|: either |white| or |black|, +% default: |black|, +% \item |hex height|: a length, default: |17.5pt|, +% \item |show coordinates|: a Boolean, default: |true|, +% \item |show hexes|: a Boolean, default: |true|. +% \end{itemize} +% Sample effects of setting these keys are show below. +% +% \vbox{\begin{lstsample}{}{} +% \begin{HexBoard}[board size=2] +% \end{HexBoard} +% +% \begin{HexBoard}[board size=3] +% \end{HexBoard} +% +% \begin{HexBoard}[board size=4] +% \end{HexBoard} +% \end{lstsample}} +% +% \noindent\hrulefill +% +% \vbox{\begin{lstsample}{}{} +% \begin{HexBoard}[board size=3] +% \HGame{a3,c2} +% \end{HexBoard} +% +% \begin{HexBoard}[board size=3, +% top left color=white] +% \HGame{a3,c2} +% \end{HexBoard} +% \end{lstsample}} +% +% \noindent\hrulefill +% +% \vbox{\begin{lstsample}{}{} +% \begin{HexBoard}[board size=3] +% \HGame{a3,c2} +% \end{HexBoard} +% +% \begin{HexBoard}[board size=3, +% hex height=1cm] +% \HGame{a3,c2} +% \end{HexBoard} +% \end{lstsample}} +% +% \noindent\hrulefill +% +% \vbox{\begin{lstsample}{}{} +% \begin{HexBoard}[board size=3] +% \HGame{a3,c2} +% \end{HexBoard} +% +% \begin{HexBoard}[board size=3, +% show coordinates=false] +% \HGame{a3,c2} +% \end{HexBoard} +% \end{lstsample}} +% +% \noindent\hrulefill +% +% \vbox{\begin{lstsample}{}{} +% \begin{HexBoard}[board size=3] +% \HGame{a3,c2} +% \end{HexBoard} +% +% \begin{HexBoard}[board size=3, +% show hexes=false] +% \HGame{a3,c2} +% \end{HexBoard} +% \end{lstsample}} +% +% \noindent\hrulefill +% +% \DescribeEnv{InnerHavannahBoard} +% The |InnerHavannahBoard| environment typesets a Havannah board +% inside a |tikzpicture| environment. It is useful for drawing +% multiple diagrams in one picture. +% In addition to the keys of |HavannahBoard|, it accepts the following keys: +% \begin{itemize} +% \item |prefix|: to be put before cell names. +% \item |x|: the x coordinate of the lower corner of the board. +% \item |y|: the y coordinate of the lower corner of the bowrd. +% \end{itemize} +% An example of its use is shown below. +% +% \vbox{\begin{lstsample}{}{} +% \begin{tikzpicture} +% \begin{InnerHavannahBoard}[board size=4,prefix=A,x=0,y=0] +% \end{InnerHavannahBoard} +% \begin{InnerHavannahBoard}[board size=4,prefix=B,x=7cm,y=0] +% \end{InnerHavannahBoard} +% \draw (Ad4)..controls (Ae7) and (Bg5)..(Bd4); +% \HStoneGroup[color=white]{Ad4,Bd4} +% \end{tikzpicture} +% \end{lstsample}} +% +% \DescribeEnv{InnerHexBoard} +% The |InnerHexBoard| environment typesets a Hex board +% inside a |tikzpicture| environment. It accepts the same set +% of extra keys as |InnerHavannahBoard|: |prefix|, |x|, and |y|. +% +% \DescribeMacro{HLetterCordinates} +% \DescribeMacro{HCoordinateStyle} +% \DescribeMacro{HDrawHex} +% You can use \cs{renewcommand} to redefine three hooks +% that change the look and feel of |HavannahBoard| or |HexBoard|. +% They are: +% \begin{itemize} +% \item \cs{HLetterCoordinates}: a comma-separated list, default:\\ +% |{a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z}|, +% \item \cs{HCoordinateStyle}: a one-argument macro, default:\\ +% |{\sffamily#1}|, +% \item \cs{HDrawHex}: a |tikz| command, default:\\ +% |{\shadedraw[shading=radial,inner color=gray!30,|\\ +% |outer color=gray!70]}|. Note that the default shading is a heavy task +% for some printers so you might want to use a simpler command instead, +% for instance |\draw[fill=gray!35]|. +% \end{itemize} +% Sample results of redefining them are shown below. +% +% \vbox{\begin{lstsample}{}{} +% \begin{HavannahBoard}[board size=3,coordinate style=little golem] +% \HGame{d3,c2} +% \end{HavannahBoard} +% \renewcommand\HLetterCoordinates{1 ,2 ,3 ,4 ,5 } +% \begin{HavannahBoard}[board size=3,coordinate style=little golem] +% \HGame{4 3,3 2} +% \end{HavannahBoard} +% \end{lstsample}} +% +% \noindent\hrulefill +% +% \vbox{\begin{lstsample}{}{} +% \begin{HavannahBoard}[board size=3,coordinate style=little golem] +% \end{HavannahBoard} +% \renewcommand\HCoordinateStyle[1]{\Large\bfseries#1} +% \begin{HavannahBoard}[board size=3,coordinate style=little golem] +% \end{HavannahBoard} +% \end{lstsample}} +% +% \noindent\hrulefill +% +% \vbox{\begin{lstsample}{}{} +% \begin{HavannahBoard}[board size=3,coordinate style=little golem] +% \end{HavannahBoard} +% \renewcommand\HDrawHex{\draw[ +% decorate,decoration={random steps,segment length=1pt}]} +% \begin{HavannahBoard}[board size=3,coordinate style=little golem] +% \end{HavannahBoard} +% \end{lstsample}} +% +% \noindent\hrulefill +% +% \DescribeMacro{HGame} +% The \cs{HGame} macro can only be used inside a +% |HavannahBoard| or |HexBoard| environment. +% It accepts the following keys: +% \begin{itemize} +% \item |first move label|: a text, default: |1|, +% \item |first player|: either |white| or |black|, default: +% |white| inside |HavannahBoard| and |black| inside |HexBoard|. +% \item |numbered moves|: a Boolean, default: |true|, +% \item |relative stone size|: a number, default: |0.75|. +% \end{itemize} +% Their effects are shown below. +% +% \vbox{\begin{lstsample}{}{} +% \begin{HavannahBoard}[board size=3,coordinate style=little golem] +% \HGame{c3,e1,e3,c2,a1,d3,c5,d4,c4,b2,a3,d2,b4} +% \end{HavannahBoard} +% \begin{HavannahBoard}[board size=3,coordinate style=little golem] +% \HGame[first move label=S]{ +% c3,e1,e3,c2,a1,d3,c5,d4,c4,b2,a3,d2,b4} +% \end{HavannahBoard} +% \end{lstsample}} +% +% \noindent\hrulefill +% +% \vbox{\begin{lstsample}{}{} +% \begin{HavannahBoard}[board size=3,coordinate style=little golem] +% \HGame{c3,e1,e3,c2,a1,d3,c5,d4,c4,b2,a3,d2,b4} +% \end{HavannahBoard} +% \begin{HavannahBoard}[board size=3,coordinate style=little golem] +% \HGame[first player=black]{ +% c3,e1,e3,c2,a1,d3,c5,d4,c4,b2,a3,d2,b4} +% \end{HavannahBoard} +% \end{lstsample}} +% +% \noindent\hrulefill +% +% \vbox{\begin{lstsample}{}{} +% \begin{HexBoard}[board size=3] +% \HGame{b2,b1,c1,a3,b3} +% \end{HexBoard} +% +% \begin{HexBoard}[board size=3,top left color=white] +% \HGame[first player=white]{ +% b2,b1,c1,a3,b3} +% \end{HexBoard} +% \end{lstsample}} +% +% \noindent\hrulefill +% +% \vbox{\begin{lstsample}{}{} +% \begin{HavannahBoard}[board size=3,coordinate style=little golem] +% \HGame{c3,e1,e3,c2,a1,d3,c5,d4,c4,b2,a3,d2,b4} +% \end{HavannahBoard} +% \begin{HavannahBoard}[board size=3,coordinate style=little golem] +% \HGame[numbered moves=false]{ +% c3,e1,e3,c2,a1,d3,c5,d4,c4,b2,a3,d2,b4} +% \end{HavannahBoard} +% \end{lstsample}} +% +% \noindent\hrulefill +% +% \vbox{\begin{lstsample}{}{} +% \begin{HavannahBoard}[board size=3,coordinate style=little golem] +% \HGame{c3,e1,e3,c2,a1,d3,c5,d4,c4,b2,a3,d2,b4} +% \end{HavannahBoard} +% \begin{HavannahBoard}[board size=3,coordinate style=little golem] +% \HGame[relative stone size=0.9]{ +% c3,e1,e3,c2,a1,d3,c5,d4,c4,b2,a3,d2,b4} +% \end{HavannahBoard} +% \end{lstsample}} +% +% \noindent\hrulefill +% +% \DescribeMacro{HStoneGroup} +% The \cs{HStoneGroup} macro can only be used inside a +% |HavannahBoard| or |HexBoard| environment. +% It puts a group of stones of the same color on the board. +% It accepts the following keys: +% \begin{itemize} +% \item |color|: |white|, |black|, or |transparent|, +% there is no default -- the value must be specified, +% \item |label|: a text, default: empty string, +% \item |relative stone size|: a number, default: |0.75|. +% \end{itemize} +% The effects of |color| and |label| are shown below. +% The effect of |relative stone size| is the same as for +% \cs{HGame} and will not be shown. +% +% \vbox{\begin{lstsample}{}{} +% \begin{HavannahBoard}[board size=6,coordinate style=little golem] +% \HStoneGroup[color=black,label=$\mathcal F$]{ +% a5,b5,c5,d6,d7,d8,c8,e8,f8,g8,h7,i7,j7} +% \HStoneGroup[color=white,label=$\mathcal B$]{ +% a1,b2,c3,d3,e3,e2,f2,f1} +% \HStoneGroup[color=transparent,label=$\mathcal R$]{ +% h6,g6,g5,g4,h3,i2,j2,j3,j4,i5} +% \end{HavannahBoard} +% \end{lstsample}} +% +% \DescribeMacro{HMoveNumberStyle} +% \DescribeMacro{HWhiteStone} +% \DescribeMacro{HBlackStone} +% \DescribeMacro{HTransparentStone} +% \DescribeMacro{HBeforeOddMove} +% \DescribeMacro{HBeforeEvenMove} +% \DescribeMacro{HBeforeStone} +% There are five hooks that can be redefined via \cs{renewcommand} +% to change the appearance of \cs{HGame} and \cs{HStoneGroup}. +% They are: +% \begin{itemize} +% \item \cs{HMoveNumberStyle}: a one-argument macro, +% influences \cs{HGame}, default:\\ +% |{\sffamily#1}|, +% \item \cs{HWhiteStone}: a |tikz| command, +% influences \cs{HGame} and \cs{HStoneGroup}, default:\\ +% |{\node[circle,draw,inner sep=0.6pt,fill=white,|\\ +% |minimum size=\HStoneDiameter]}|, +% \item \cs{HBlackStone}: a |tikz| command, +% influences \cs{HGame} and \cs{HStoneGroup}, default:\\ +% |{\node[circle,draw,inner sep=0.6pt,fill=black,text=white|\\ +% |minimum size=\HStoneDiameter]}|, +% \item \cs{HTransparentStone}: a |tikz| command, +% influences \cs{HStoneGroup}, default:\\ +% |{\node[circle,draw,inner sep=0.6pt,|\\ +% |minimum size=\HStoneDiameter]}|, +% \item \cs{HBeforeOddMove}, \cs{BeforeEvenMove}: macros expanded +% before placing stones, for example \cs{pause} when animating +% games in |beamer|, influence \cs{HGame}, default: |{}|, +% \item \cs{HBeforeStone}: a macro expanded before placing stones, +% influences \cs{HStoneGroup}, default: |{}|. +% \end{itemize} +% Sample effects of redefining some of them are shown below. +% +% \vbox{\begin{lstsample}{}{} +% \begin{HavannahBoard}[board size=3,coordinate style=little golem] +% \HGame{c3,e1,e3,c2,a1,d3,c5,d4,c4,b2,a3,d2,b4} +% \end{HavannahBoard} +% \renewcommand\HMoveNumberStyle[1]{\footnotesize\romannumeral#1} +% \begin{HavannahBoard}[board size=3,coordinate style=little golem] +% \HGame{c3,e1,e3,c2,a1,d3,c5,d4,c4,b2,a3,d2,b4} +% \end{HavannahBoard} +% \end{lstsample}} +% +% \noindent\hrulefill +% +% \vbox{\begin{lstsample}{}{} +% \begin{HavannahBoard}[board size=3,coordinate style=little golem] +% \HGame{c3,e1,e3,c2,a1,d3,c5,d4,c4,b2,a3,d2,b4} +% \end{HavannahBoard} +% \renewcommand\HDrawHex{\draw} +% \renewcommand\HWhiteStone{\node[ +% circle,shading=ball,ball color=white,inner sep=0.6pt, +% minimum size=\HStoneDiameter]} +% \renewcommand\HBlackStone{\node[ +% circle,shading=ball,ball color=black,inner sep=0.6pt,text=white, +% minimum size=\HStoneDiameter]} +% \begin{HavannahBoard}[board size=3] +% \HGame{c3,e1,e3,c2,a1,d3,c5,d4,c4,b2,a3,d2,b4} +% \end{HavannahBoard} +% \end{lstsample}} +% +% \noindent\hrulefill +% +% \DescribeMacro{HHexGroup} +% The \cs{HHexGroup} macro can only be used inside a +% |HavannahBoard| or |HexBoard| environment. +% It puts a group of hexes on the board, +% which presumably is typeset with| show hexes=false|. +% It is recommended to use it inside the |HexBoard| environment +% due to the simplicity of its coordinate system. +% It accepts the following keys: +% \begin{itemize} +% \item |label|: a text, default: empty string, +% \end{itemize} +% An example of its use is shown below. +% +% \vbox{\begin{lstsample}{}{} +% \begin{HexBoard}[ +% board size=9,show coordinates=false,show hexes=false] +% \HHexGroup +% {a1,b1,c1,d1,e1,f1,g1,h1,a2,b2,c2,e2,f2,g2,a3,b3,c3,d3,e3,f3,b4,c4,d4} +% \draw [dotted] (a1)--(a2); \draw [dotted] (b1)--(a2); +% \draw [dotted] (c1)--(c2); \draw [dotted] (d1)--(c2); +% \draw [dotted] (e1)--(e2); \draw [dotted] (f1)--(e2); +% \draw [dotted] (g1)--(g2); \draw [dotted] (h1)--(g2); +% \draw [dotted] (c2)--(b3); \draw [dotted] (e2)--(e3); +% \draw [dotted] (a2)..controls(a3)..(b3); +% \draw [dotted] (a2)..controls(b2)..(b3); +% \draw [dotted] (g2)..controls(f3)..(e3); +% \draw [dotted] (g2)..controls(f2)..(e3); +% \draw [dotted] (b3)..controls(b4)..(c4); +% \draw [dotted] (b3)..controls(c3)..(c4); +% \draw [dotted] (e3)..controls(d4)..(c4); +% \draw [dotted] (e3)..controls(d3)..(c4); +% \HStoneGroup[color=black]{a,b,c,d,e,f,g,h,i,c4} +% \end{HexBoard} +% \end{lstsample}} +% +% \StopEventually +% +% \section{Implementation} +% \begin{macrocode} +%<*package> +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{havannah}[2010/06/06 LaTeX havannah package] +\RequirePackage{tikz} +% \end{macrocode} +% +% The naming schema used in the \package{havannah} package +% is \cs{HFooBar} for redefinable hooks, +% and \cs{h@foo@bar} for internal macros. +% +% Start with defining default expansions for the hooks. +% \begin{macrocode} +\newcommand\HLetterCoordinates{% + a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z} +\newcommand\HCoordinateStyle[1]{\sffamily#1} +\newcommand\HMoveNumberStyle[1]{\sffamily#1} +\newcommand\HDrawHex{\shadedraw[ + shading=radial,inner color=gray!30,outer color=gray!70]} +\newcommand\HWhiteStone{\node[ + circle,draw=black,inner sep=0.6pt,fill=white, + minimum size=\HStoneDiameter]} +\newcommand\HBlackStone{\node[ + circle,draw=black,inner sep=0.6pt,fill=black,text=white, + minimum size=\HStoneDiameter]} +\newcommand\HTransparentStone{\node[ + circle,draw=black,inner sep=0.6pt, + minimum size=\HStoneDiameter]} +\newcommand\HBeforeOddMove{} +\newcommand\HBeforeEvenMove{} +\newcommand\HBeforeStone{} +% \end{macrocode} +% +% The \cs{h@draw@hex} macro draws a hexagonal cell. +% The cell is |3\h@one@third@hex@wd| wide and |2\h@half@hex@ht| high. +% It has two horizontal and four slanted edges. +% The \cs{h@draw@hex} macro takes one argument: +% the coordinates of the center of the cell. +% It uses the \cs{HDrawHex} hook to style the cell. +% \begin{macrocode} +\newcommand{\h@draw@hex}[1]{% + \HDrawHex (#1) + ++(-2\h@one@third@hex@wd,0)-- + ++(\h@one@third@hex@wd,-\h@half@hex@ht)-- + ++(2\h@one@third@hex@wd,0)-- + ++(\h@one@third@hex@wd,\h@half@hex@ht)-- + ++(-\h@one@third@hex@wd,\h@half@hex@ht)-- + ++(-2\h@one@third@hex@wd,0)-- + cycle; +} +% \end{macrocode} +% +% Define \package{pgfkeys} paths. +% \begin{macrocode} +\newif\ifh@numbered@moves +\newif\ifh@show@coordinates +\newif\ifh@show@hexes +\pgfkeys{% + /h@havannah@board/.cd, + board size/.store in=\hv@board@size, + coordinate style/.is choice, + coordinate style/classical/.code={% + \def\h@draw@board{\h@draw@classical@board}}, + coordinate style/little golem/.code={% + \def\h@draw@board{\h@draw@little@golem@board}}, + hex height/.store in=\h@hex@height, + prefix/.store in=\h@prefix, + show coordinates/.is if=h@show@coordinates, + show hexes/.is if=h@show@hexes, + x/.store in=\h@xx, + y/.store in=\h@yy, + board size=10, + coordinate style=classical, + hex height=17.5pt, + prefix=, + show coordinates=true, + show hexes=true, + x=0, + y=0, +% + /h@hex@board/.cd, + top left color/.is choice, + top left color/white/.code={% + \def\h@top@left@color{\HWhiteStone}% + \def\h@bottom@left@color{\HBlackStone}% + }, + top left color/black/.code={% + \def\h@top@left@color{\HBlackStone}% + \def\h@bottom@left@color{\HWhiteStone}% + }, + board size/.store in=\hx@board@size, + hex height/.store in=\h@hex@height, + prefix/.store in=\h@prefix, + relative stone size/.store in=\h@relative@stone@size, + show coordinates/.is if=h@show@coordinates, + show hexes/.is if=h@show@hexes, + x/.store in=\h@xx, + y/.store in=\h@yy, + top left color=black, + board size=11, + hex height=17.5pt, + relative stone size=0.75, + show coordinates=true, + show hexes=true, +% + /h@game/.cd, + first move label/.store in=\h@first@move@label, + first player/.is choice, + first player/white/.code={% + \def\h@odd@player{\HWhiteStone}% + \def\h@even@player{\HBlackStone}% + }, + first player/black/.code={% + \def\h@odd@player{\HBlackStone}% + \def\h@even@player{\HWhiteStone}% + }, + numbered moves/.is if=h@numbered@moves, + relative stone size/.store in=\h@relative@stone@size, + first move label=1, + numbered moves=true, + relative stone size=0.75, +% + /h@stone@group/.cd, + color/.is choice, + color/white/.code={\def\h@player{\HWhiteStone}}, + color/black/.code={\def\h@player{\HBlackStone}}, + color/transparent/.code={\def\h@player{\HTransparentStone}}, + label/.store in=\h@label, + relative stone size/.store in=\h@relative@stone@size, + relative stone size=0.75, +% + /h@hex@group/.cd, + label/.store in=\h@label, +} +% \end{macrocode} +% +% The |InnerHavannahBoard| environment first sets the values of +% \cs{hv@board@size}, \cs{h@draw@board}, \cs{h@hex@height}, +% and \cs{h@show@coordinatestrue} or \cs{h@show@coordinatesfalse}. +% Then it computes \cs{h@half@hex@ht}, \cs{h@one@third@hex@wd}, +% and \cs{h@board@diagonal}, and executes \cs{h@draw@board}. +% \begin{macrocode} +\newcount\h@board@diagonal +\newdimen\h@half@hex@ht +\newdimen\h@one@third@hex@wd +\newenvironment{InnerHavannahBoard}[1][]{% + \def\h@odd@player{\HWhiteStone}% + \def\h@even@player{\HBlackStone}% + \pgfqkeys{/h@havannah@board}{#1}% + \setlength\h@half@hex@ht{\h@hex@height}% + \divide\h@half@hex@ht by 2 + \setlength\h@one@third@hex@wd{0.577350269\h@half@hex@ht}% + \h@board@diagonal=\hv@board@size + \multiply\h@board@diagonal by 2 + \advance\h@board@diagonal by -1 + \h@draw@board +} +% \end{macrocode} +% +% There is nothing to be done at the end of |InnerHavannahBoard|. +% \begin{macrocode} +{} +% \end{macrocode} +% +% The |HavannahBoard| environment just wraps |InnerHavannahBoard| +% inside a |tikzpicture|. +% \begin{macrocode} +\newenvironment{HavannahBoard}[1][]{% + \begin{tikzpicture} + \begin{InnerHavannahBoard}[#1,prefix=,x=0,y=0] +} +% \end{macrocode} +% Finally, |HavannahBoard| closes the |InnerHavannahBoard| and +% |tikzpicture| environments. +% \begin{macrocode} +{ \end{InnerHavannahBoard} + \end{tikzpicture} +} +% \end{macrocode} +% +% The \cs{h@draw@classical@board} and \cs{h@draw@little@golem@board} +% macros differ enough that a common routine would be of little help. +% They both draw a rhombus of hexes with two corners cut. +% The edges of adjacent hexes are drawn twice. +% +% The following counters are shared by both macros. +% \begin{macrocode} +\newcount\h@l +\newcount\h@a@corner +\newcount\h@b@corner +% \end{macrocode} +% +% The \cs{h@draw@classical@board} macro is a bit simpler +% than the other one. +% \begin{macrocode} +\newcommand\h@draw@classical@board{% + \h@l=0 + \h@b@corner=\hv@board@size + \foreach \h@letter in \HLetterCoordinates {% + \global\advance\h@l by 1 + \ifnum \h@l > \h@board@diagonal + \breakforeach + \else + \global\advance\h@b@corner by 1 + \h@a@corner=\hv@board@size + \foreach \h@n in {1,...,\h@board@diagonal} {% + \global\advance\h@a@corner by 1 + \ifnum \h@l < \h@a@corner + \ifnum \h@n < \h@b@corner + \coordinate (\h@prefix\h@letter\h@n) at + (\h@xx+3*\h@n\h@one@third@hex@wd-3*\h@l\h@one@third@hex@wd, + \h@yy+\h@n\h@half@hex@ht+\h@l\h@half@hex@ht); + \ifh@show@hexes + \h@draw@hex{\h@prefix\h@letter\h@n}% + \fi + \fi + \fi + }% + \ifh@show@coordinates + \ifnum \h@l < \hv@board@size\relax + \node at + (\h@xx-3*\h@l\h@one@third@hex@wd,\h@yy+\h@l\h@half@hex@ht) + {\HCoordinateStyle{\h@letter}}; + \else + \node at + (\h@xx-3*\hv@board@size\h@one@third@hex@wd, + \h@yy+2*\h@l\h@half@hex@ht-\hv@board@size\h@half@hex@ht) + {\HCoordinateStyle{\h@letter}}; + \fi + \fi + \fi + }% + \ifh@show@coordinates + \foreach \h@n in {1,...,\h@board@diagonal} {% + \ifnum \h@n < \hv@board@size + \node at + (\h@xx+3*\h@n\h@one@third@hex@wd,\h@yy+\h@n\h@half@hex@ht) + {\HCoordinateStyle{\h@n}}; + \else + \node at + (\h@xx+3*\hv@board@size\h@one@third@hex@wd, + \h@yy+2*\h@n\h@half@hex@ht-\hv@board@size\h@half@hex@ht) + {\HCoordinateStyle{\h@n}}; + \fi + }% + \fi +} +% \end{macrocode} +% +% The \cs{h@draw@little@golem@board} macro is more complicated +% since the numbered rows in Little Golem change direction in the middle. +% \begin{macrocode} +\newcommand\h@draw@little@golem@board{% + \h@a@corner=\hv@board@size + \h@b@corner=\hv@board@size + \multiply\h@b@corner by 3 + \h@l=0 + \foreach \h@letter in \HLetterCoordinates {% + \global\advance\h@l by 1 + \ifnum \h@l > \h@board@diagonal + \breakforeach + \else + \global\advance\h@a@corner by 1 + \global\advance\h@b@corner by -1 + \foreach \h@n in {1,...,\h@board@diagonal} {% + \ifnum \h@n < \h@a@corner + \ifnum \h@n < \h@b@corner + \ifnum \h@l < \hv@board@size + \coordinate (\h@prefix\h@letter\h@n) at + (\h@xx+3*\h@l\h@one@third@hex@wd, + \h@yy+2*\hv@board@size\h@half@hex@ht+ + 2*\h@n\h@half@hex@ht-\h@l\h@half@hex@ht); + \ifh@show@hexes + \h@draw@hex{\h@prefix\h@letter\h@n}% + \fi + \else + \coordinate (\h@prefix\h@letter\h@n) at + (\h@xx+3*\h@l\h@one@third@hex@wd, + \h@yy+2*\h@n\h@half@hex@ht+\h@l\h@half@hex@ht); + \ifh@show@hexes + \h@draw@hex{\h@prefix\h@letter\h@n}% + \fi + \fi + \fi + \fi + } + \ifh@show@coordinates + \ifnum \h@l < \hv@board@size + \node at + (\h@xx+3*\h@l\h@one@third@hex@wd, + \h@yy+2*\hv@board@size\h@half@hex@ht-\h@l\h@half@hex@ht) + {\HCoordinateStyle{\h@letter}}; + \else + \node at + (\h@xx+3*\h@l\h@one@third@hex@wd,\h@yy+\h@l\h@half@hex@ht) + {\HCoordinateStyle{\h@letter}}; + \fi + \fi + \fi + }% + \ifh@show@coordinates + \foreach \h@n in {1,...,\h@board@diagonal} {% + \ifnum \h@n < \hv@board@size + \node at + (\h@xx, + \h@yy+2*\h@n\h@half@hex@ht+ + \h@board@diagonal\h@half@hex@ht+\h@half@hex@ht) + {\HCoordinateStyle{\h@n}}; + \node at + (\h@xx+3*\h@board@diagonal\h@one@third@hex@wd+ + 3*\h@one@third@hex@wd, + \h@yy+2*\h@n\h@half@hex@ht+ + \h@board@diagonal\h@half@hex@ht+\h@half@hex@ht) + {\HCoordinateStyle{\h@n}}; + \else + \node at + (\h@xx+3*\h@n\h@one@third@hex@wd- + 3*\hv@board@size\h@one@third@hex@wd, + \h@yy+\h@n\h@half@hex@ht+3*\hv@board@size\h@half@hex@ht) + {\HCoordinateStyle{\h@n}}; + \node at + (\h@xx-3*\h@n\h@one@third@hex@wd+ + 9*\hv@board@size\h@one@third@hex@wd, + \h@yy+\h@n\h@half@hex@ht+3*\hv@board@size\h@half@hex@ht) + {\HCoordinateStyle{\h@n}}; + \fi + }% + \fi +} +% \end{macrocode} +% +% The |InnerHexBoard| environment is similar to |InnerHavannahBoard| +% but simpler, as it typesets an entire cross-product of coordinates, +% without cutting the corners. +% \begin{macrocode} +\newenvironment{InnerHexBoard}[1][]{% + \def\h@odd@player{\HBlackStone}% + \def\h@even@player{\HWhiteStone}% + \pgfqkeys{/h@hex@board}{#1}% + \tracingcommands=1 + \setlength\h@half@hex@ht{\h@hex@height}% + \divide\h@half@hex@ht by 2 + \setlength\h@one@third@hex@wd{0.577350269\h@half@hex@ht}% + \HStoneDiameter=\h@relative@stone@size\h@half@hex@ht + \multiply\HStoneDiameter by 2 + \h@l=0 + \foreach \h@letter in \HLetterCoordinates {% + \global\advance\h@l by 1 + \ifnum \h@l > \hx@board@size + \breakforeach + \else + \foreach \h@n in {1,...,\hx@board@size} {% + \coordinate (\h@letter\h@n) at + (3*\h@l\h@one@third@hex@wd+3*\h@n\h@one@third@hex@wd, + \h@l\h@half@hex@ht-\h@n\h@half@hex@ht); + \ifh@show@hexes + \h@draw@hex{\h@letter\h@n}% + \fi + }% + \coordinate (\h@letter) at + (3*\h@l\h@one@third@hex@wd, + 2\h@half@hex@ht-2\h@half@hex@ht+\h@l\h@half@hex@ht); + \coordinate (-\h@letter) at + (3*\hx@board@size\h@one@third@hex@wd+ + 3\h@one@third@hex@wd+3*\h@l\h@one@third@hex@wd, + -\hx@board@size\h@half@hex@ht- + \h@half@hex@ht+\h@l\h@half@hex@ht); + \ifh@show@coordinates + \h@top@left@color at (\h@letter) + {\HCoordinateStyle{\h@letter}}; + \h@top@left@color at (-\h@letter) + {\HCoordinateStyle{\h@letter}}; + \fi + \fi + }% + \ifh@show@coordinates + \foreach \h@n in {1,...,\hx@board@size} {% + \coordinate (\h@n) at + (3*\h@n\h@one@third@hex@wd,-1*\h@n\h@half@hex@ht); + \coordinate (-\h@n) at + (3*\hx@board@size\h@one@third@hex@wd+3\h@one@third@hex@wd+ + 3*\h@n\h@one@third@hex@wd, + \hx@board@size\h@half@hex@ht+\h@half@hex@ht-\h@n\h@half@hex@ht); + \h@bottom@left@color at (\h@n) + {\HCoordinateStyle{\h@n}}; + \h@bottom@left@color at (-\h@n) + {\HCoordinateStyle{\h@n}}; + }% + \fi +} +{} +% \end{macrocode} +% +% The |HexBoard| environment just wraps |InnerHexBoard| +% inside a |tikzpicture|. +% \begin{macrocode} +\newenvironment{HexBoard}[1][]{% + \begin{tikzpicture} + \begin{InnerHexBoard}[#1,prefix=,x=0,y=0] +} +% \end{macrocode} +% Finally, |HexBoard| closes the |InnerHexBoard| and +% |tikzpicture| environments. +% \begin{macrocode} +{ \end{InnerHexBoard} + \end{tikzpicture} +} +% \end{macrocode} +% +% The \cs{HGame} macro +% \begin{macrocode} +\newcount\h@move@number +\newdimen\HStoneDiameter +\newcommand\HGame[2][]{% + \pgfqkeys{/h@game}{#1}% + \HStoneDiameter=\h@relative@stone@size\h@half@hex@ht + \multiply\HStoneDiameter by 2 + \h@move@number=0 + \ifh@numbered@moves + \def\h@label{\HMoveNumberStyle{\h@first@move@label}% + \global\def\h@label{\HMoveNumberStyle{\the\h@move@number}}} + \else + \def\h@label{} + \fi + \foreach \h@coord in {#2} {% + \global\advance\h@move@number by 1 + \ifodd\h@move@number + \HBeforeOddMove + \h@odd@player at (\h@coord) {\h@label}; + \else + \HBeforeEvenMove + \h@even@player at (\h@coord) {\h@label}; + \fi + } +} +% \end{macrocode} +% +% The \cs{HStoneGroup} +% \begin{macrocode} +\newcommand\HStoneGroup[2][]{% + \let\h@player\empty + \let\h@label\empty + \pgfqkeys{/h@stone@group}{#1}% + \ifx\h@player\empty + \errmessage{No color specified for HStoneGroup} + \fi + \HStoneDiameter=\h@relative@stone@size\h@half@hex@ht + \multiply\HStoneDiameter by 2 + \foreach \h@coord in {#2} {% + \HBeforeStone + \h@player at (\h@coord) {\h@label}; + }% +} +% \end{macrocode} +% +% The \cs{HHexGroup} +% \begin{macrocode} +\newcommand\HHexGroup[2][]{% + \let\h@label\empty + \pgfqkeys{/h@hex@group}{#1}% + \foreach \h@coord in {#2} {% + \node at (\h@coord) {\h@label}; + \h@draw@hex{\h@coord}% + }% +} +% \end{macrocode} +% +% That's all, folks. +% \begin{macrocode} +% +% \end{macrocode} +% +% \Finale diff --git a/Master/texmf-dist/source/latex/havannah/havannah.ins b/Master/texmf-dist/source/latex/havannah/havannah.ins new file mode 100644 index 00000000000..c7d4dddce10 --- /dev/null +++ b/Master/texmf-dist/source/latex/havannah/havannah.ins @@ -0,0 +1,34 @@ +%% +%% Copyright (C) 2012-2015 by Marcin Ciura +%% +%% This file may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License, either +%% version 1.2 of this license or (at your option) any later +%% version. The latest version of this license is in: +%% +%% http://www.latex-project.org/lppl.txt +%% +%% and version 1.2 or later is part of all distributions of +%% LaTeX version 1999/12/01 or later. +%% +\input docstrip.tex +\keepsilent +\preamble + +This is a generated file. + +Copyright (C) 2012-2015 by Marcin Ciura + +This file may be distributed and/or modified under the +conditions of the LaTeX Project Public License, either +version 1.2 of this license or (at your option) any later +version. The latest version of this license is in: + + http://www.latex-project.org/lppl.txt + +and version 1.2 or later is part of all distributions of +LaTeX version 1999/12/01 or later. + +\endpreamble +\generate{\file{havannah.sty}{\from{havannah.dtx}{package}}} +\endbatchfile diff --git a/Master/texmf-dist/tex/latex/havannah/havannah.sty b/Master/texmf-dist/tex/latex/havannah/havannah.sty new file mode 100644 index 00000000000..7f3ab204848 --- /dev/null +++ b/Master/texmf-dist/tex/latex/havannah/havannah.sty @@ -0,0 +1,396 @@ +%% +%% This is file `havannah.sty', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% havannah.dtx (with options: `package') +%% +%% This is a generated file. +%% +%% Copyright (C) 2012-2015 by Marcin Ciura +%% +%% This file may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License, either +%% version 1.2 of this license or (at your option) any later +%% version. The latest version of this license is in: +%% +%% http://www.latex-project.org/lppl.txt +%% +%% and version 1.2 or later is part of all distributions of +%% LaTeX version 1999/12/01 or later. +%% +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{havannah}[2010/06/06 LaTeX havannah package] +\RequirePackage{tikz} +\newcommand\HLetterCoordinates{% + a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z} +\newcommand\HCoordinateStyle[1]{\sffamily#1} +\newcommand\HMoveNumberStyle[1]{\sffamily#1} +\newcommand\HDrawHex{\shadedraw[ + shading=radial,inner color=gray!30,outer color=gray!70]} +\newcommand\HWhiteStone{\node[ + circle,draw=black,inner sep=0.6pt,fill=white, + minimum size=\HStoneDiameter]} +\newcommand\HBlackStone{\node[ + circle,draw=black,inner sep=0.6pt,fill=black,text=white, + minimum size=\HStoneDiameter]} +\newcommand\HTransparentStone{\node[ + circle,draw=black,inner sep=0.6pt, + minimum size=\HStoneDiameter]} +\newcommand\HBeforeOddMove{} +\newcommand\HBeforeEvenMove{} +\newcommand\HBeforeStone{} +\newcommand{\h@draw@hex}[1]{% + \HDrawHex (#1) + ++(-2\h@one@third@hex@wd,0)-- + ++(\h@one@third@hex@wd,-\h@half@hex@ht)-- + ++(2\h@one@third@hex@wd,0)-- + ++(\h@one@third@hex@wd,\h@half@hex@ht)-- + ++(-\h@one@third@hex@wd,\h@half@hex@ht)-- + ++(-2\h@one@third@hex@wd,0)-- + cycle; +} +\newif\ifh@numbered@moves +\newif\ifh@show@coordinates +\newif\ifh@show@hexes +\pgfkeys{% + /h@havannah@board/.cd, + board size/.store in=\hv@board@size, + coordinate style/.is choice, + coordinate style/classical/.code={% + \def\h@draw@board{\h@draw@classical@board}}, + coordinate style/little golem/.code={% + \def\h@draw@board{\h@draw@little@golem@board}}, + hex height/.store in=\h@hex@height, + prefix/.store in=\h@prefix, + show coordinates/.is if=h@show@coordinates, + show hexes/.is if=h@show@hexes, + x/.store in=\h@xx, + y/.store in=\h@yy, + board size=10, + coordinate style=classical, + hex height=17.5pt, + prefix=, + show coordinates=true, + show hexes=true, + x=0, + y=0, + /h@hex@board/.cd, + top left color/.is choice, + top left color/white/.code={% + \def\h@top@left@color{\HWhiteStone}% + \def\h@bottom@left@color{\HBlackStone}% + }, + top left color/black/.code={% + \def\h@top@left@color{\HBlackStone}% + \def\h@bottom@left@color{\HWhiteStone}% + }, + board size/.store in=\hx@board@size, + hex height/.store in=\h@hex@height, + prefix/.store in=\h@prefix, + relative stone size/.store in=\h@relative@stone@size, + show coordinates/.is if=h@show@coordinates, + show hexes/.is if=h@show@hexes, + x/.store in=\h@xx, + y/.store in=\h@yy, + top left color=black, + board size=11, + hex height=17.5pt, + relative stone size=0.75, + show coordinates=true, + show hexes=true, + /h@game/.cd, + first move label/.store in=\h@first@move@label, + first player/.is choice, + first player/white/.code={% + \def\h@odd@player{\HWhiteStone}% + \def\h@even@player{\HBlackStone}% + }, + first player/black/.code={% + \def\h@odd@player{\HBlackStone}% + \def\h@even@player{\HWhiteStone}% + }, + numbered moves/.is if=h@numbered@moves, + relative stone size/.store in=\h@relative@stone@size, + first move label=1, + numbered moves=true, + relative stone size=0.75, + /h@stone@group/.cd, + color/.is choice, + color/white/.code={\def\h@player{\HWhiteStone}}, + color/black/.code={\def\h@player{\HBlackStone}}, + color/transparent/.code={\def\h@player{\HTransparentStone}}, + label/.store in=\h@label, + relative stone size/.store in=\h@relative@stone@size, + relative stone size=0.75, + /h@hex@group/.cd, + label/.store in=\h@label, +} +\newcount\h@board@diagonal +\newdimen\h@half@hex@ht +\newdimen\h@one@third@hex@wd +\newenvironment{InnerHavannahBoard}[1][]{% + \def\h@odd@player{\HWhiteStone}% + \def\h@even@player{\HBlackStone}% + \pgfqkeys{/h@havannah@board}{#1}% + \setlength\h@half@hex@ht{\h@hex@height}% + \divide\h@half@hex@ht by 2 + \setlength\h@one@third@hex@wd{0.577350269\h@half@hex@ht}% + \h@board@diagonal=\hv@board@size + \multiply\h@board@diagonal by 2 + \advance\h@board@diagonal by -1 + \h@draw@board +} +{} +\newenvironment{HavannahBoard}[1][]{% + \begin{tikzpicture} + \begin{InnerHavannahBoard}[#1,prefix=,x=0,y=0] +} +{ \end{InnerHavannahBoard} + \end{tikzpicture} +} +\newcount\h@l +\newcount\h@a@corner +\newcount\h@b@corner +\newcommand\h@draw@classical@board{% + \h@l=0 + \h@b@corner=\hv@board@size + \foreach \h@letter in \HLetterCoordinates {% + \global\advance\h@l by 1 + \ifnum \h@l > \h@board@diagonal + \breakforeach + \else + \global\advance\h@b@corner by 1 + \h@a@corner=\hv@board@size + \foreach \h@n in {1,...,\h@board@diagonal} {% + \global\advance\h@a@corner by 1 + \ifnum \h@l < \h@a@corner + \ifnum \h@n < \h@b@corner + \coordinate (\h@prefix\h@letter\h@n) at + (\h@xx+3*\h@n\h@one@third@hex@wd-3*\h@l\h@one@third@hex@wd, + \h@yy+\h@n\h@half@hex@ht+\h@l\h@half@hex@ht); + \ifh@show@hexes + \h@draw@hex{\h@prefix\h@letter\h@n}% + \fi + \fi + \fi + }% + \ifh@show@coordinates + \ifnum \h@l < \hv@board@size\relax + \node at + (\h@xx-3*\h@l\h@one@third@hex@wd,\h@yy+\h@l\h@half@hex@ht) + {\HCoordinateStyle{\h@letter}}; + \else + \node at + (\h@xx-3*\hv@board@size\h@one@third@hex@wd, + \h@yy+2*\h@l\h@half@hex@ht-\hv@board@size\h@half@hex@ht) + {\HCoordinateStyle{\h@letter}}; + \fi + \fi + \fi + }% + \ifh@show@coordinates + \foreach \h@n in {1,...,\h@board@diagonal} {% + \ifnum \h@n < \hv@board@size + \node at + (\h@xx+3*\h@n\h@one@third@hex@wd,\h@yy+\h@n\h@half@hex@ht) + {\HCoordinateStyle{\h@n}}; + \else + \node at + (\h@xx+3*\hv@board@size\h@one@third@hex@wd, + \h@yy+2*\h@n\h@half@hex@ht-\hv@board@size\h@half@hex@ht) + {\HCoordinateStyle{\h@n}}; + \fi + }% + \fi +} +\newcommand\h@draw@little@golem@board{% + \h@a@corner=\hv@board@size + \h@b@corner=\hv@board@size + \multiply\h@b@corner by 3 + \h@l=0 + \foreach \h@letter in \HLetterCoordinates {% + \global\advance\h@l by 1 + \ifnum \h@l > \h@board@diagonal + \breakforeach + \else + \global\advance\h@a@corner by 1 + \global\advance\h@b@corner by -1 + \foreach \h@n in {1,...,\h@board@diagonal} {% + \ifnum \h@n < \h@a@corner + \ifnum \h@n < \h@b@corner + \ifnum \h@l < \hv@board@size + \coordinate (\h@prefix\h@letter\h@n) at + (\h@xx+3*\h@l\h@one@third@hex@wd, + \h@yy+2*\hv@board@size\h@half@hex@ht+ + 2*\h@n\h@half@hex@ht-\h@l\h@half@hex@ht); + \ifh@show@hexes + \h@draw@hex{\h@prefix\h@letter\h@n}% + \fi + \else + \coordinate (\h@prefix\h@letter\h@n) at + (\h@xx+3*\h@l\h@one@third@hex@wd, + \h@yy+2*\h@n\h@half@hex@ht+\h@l\h@half@hex@ht); + \ifh@show@hexes + \h@draw@hex{\h@prefix\h@letter\h@n}% + \fi + \fi + \fi + \fi + } + \ifh@show@coordinates + \ifnum \h@l < \hv@board@size + \node at + (\h@xx+3*\h@l\h@one@third@hex@wd, + \h@yy+2*\hv@board@size\h@half@hex@ht-\h@l\h@half@hex@ht) + {\HCoordinateStyle{\h@letter}}; + \else + \node at + (\h@xx+3*\h@l\h@one@third@hex@wd,\h@yy+\h@l\h@half@hex@ht) + {\HCoordinateStyle{\h@letter}}; + \fi + \fi + \fi + }% + \ifh@show@coordinates + \foreach \h@n in {1,...,\h@board@diagonal} {% + \ifnum \h@n < \hv@board@size + \node at + (\h@xx, + \h@yy+2*\h@n\h@half@hex@ht+ + \h@board@diagonal\h@half@hex@ht+\h@half@hex@ht) + {\HCoordinateStyle{\h@n}}; + \node at + (\h@xx+3*\h@board@diagonal\h@one@third@hex@wd+ + 3*\h@one@third@hex@wd, + \h@yy+2*\h@n\h@half@hex@ht+ + \h@board@diagonal\h@half@hex@ht+\h@half@hex@ht) + {\HCoordinateStyle{\h@n}}; + \else + \node at + (\h@xx+3*\h@n\h@one@third@hex@wd- + 3*\hv@board@size\h@one@third@hex@wd, + \h@yy+\h@n\h@half@hex@ht+3*\hv@board@size\h@half@hex@ht) + {\HCoordinateStyle{\h@n}}; + \node at + (\h@xx-3*\h@n\h@one@third@hex@wd+ + 9*\hv@board@size\h@one@third@hex@wd, + \h@yy+\h@n\h@half@hex@ht+3*\hv@board@size\h@half@hex@ht) + {\HCoordinateStyle{\h@n}}; + \fi + }% + \fi +} +\newenvironment{InnerHexBoard}[1][]{% + \def\h@odd@player{\HBlackStone}% + \def\h@even@player{\HWhiteStone}% + \pgfqkeys{/h@hex@board}{#1}% + \tracingcommands=1 + \setlength\h@half@hex@ht{\h@hex@height}% + \divide\h@half@hex@ht by 2 + \setlength\h@one@third@hex@wd{0.577350269\h@half@hex@ht}% + \HStoneDiameter=\h@relative@stone@size\h@half@hex@ht + \multiply\HStoneDiameter by 2 + \h@l=0 + \foreach \h@letter in \HLetterCoordinates {% + \global\advance\h@l by 1 + \ifnum \h@l > \hx@board@size + \breakforeach + \else + \foreach \h@n in {1,...,\hx@board@size} {% + \coordinate (\h@letter\h@n) at + (3*\h@l\h@one@third@hex@wd+3*\h@n\h@one@third@hex@wd, + \h@l\h@half@hex@ht-\h@n\h@half@hex@ht); + \ifh@show@hexes + \h@draw@hex{\h@letter\h@n}% + \fi + }% + \coordinate (\h@letter) at + (3*\h@l\h@one@third@hex@wd, + 2\h@half@hex@ht-2\h@half@hex@ht+\h@l\h@half@hex@ht); + \coordinate (-\h@letter) at + (3*\hx@board@size\h@one@third@hex@wd+ + 3\h@one@third@hex@wd+3*\h@l\h@one@third@hex@wd, + -\hx@board@size\h@half@hex@ht- + \h@half@hex@ht+\h@l\h@half@hex@ht); + \ifh@show@coordinates + \h@top@left@color at (\h@letter) + {\HCoordinateStyle{\h@letter}}; + \h@top@left@color at (-\h@letter) + {\HCoordinateStyle{\h@letter}}; + \fi + \fi + }% + \ifh@show@coordinates + \foreach \h@n in {1,...,\hx@board@size} {% + \coordinate (\h@n) at + (3*\h@n\h@one@third@hex@wd,-1*\h@n\h@half@hex@ht); + \coordinate (-\h@n) at + (3*\hx@board@size\h@one@third@hex@wd+3\h@one@third@hex@wd+ + 3*\h@n\h@one@third@hex@wd, + \hx@board@size\h@half@hex@ht+\h@half@hex@ht-\h@n\h@half@hex@ht); + \h@bottom@left@color at (\h@n) + {\HCoordinateStyle{\h@n}}; + \h@bottom@left@color at (-\h@n) + {\HCoordinateStyle{\h@n}}; + }% + \fi +} +{} +\newenvironment{HexBoard}[1][]{% + \begin{tikzpicture} + \begin{InnerHexBoard}[#1,prefix=,x=0,y=0] +} +{ \end{InnerHexBoard} + \end{tikzpicture} +} +\newcount\h@move@number +\newdimen\HStoneDiameter +\newcommand\HGame[2][]{% + \pgfqkeys{/h@game}{#1}% + \HStoneDiameter=\h@relative@stone@size\h@half@hex@ht + \multiply\HStoneDiameter by 2 + \h@move@number=0 + \ifh@numbered@moves + \def\h@label{\HMoveNumberStyle{\h@first@move@label}% + \global\def\h@label{\HMoveNumberStyle{\the\h@move@number}}} + \else + \def\h@label{} + \fi + \foreach \h@coord in {#2} {% + \global\advance\h@move@number by 1 + \ifodd\h@move@number + \HBeforeOddMove + \h@odd@player at (\h@coord) {\h@label}; + \else + \HBeforeEvenMove + \h@even@player at (\h@coord) {\h@label}; + \fi + } +} +\newcommand\HStoneGroup[2][]{% + \let\h@player\empty + \let\h@label\empty + \pgfqkeys{/h@stone@group}{#1}% + \ifx\h@player\empty + \errmessage{No color specified for HStoneGroup} + \fi + \HStoneDiameter=\h@relative@stone@size\h@half@hex@ht + \multiply\HStoneDiameter by 2 + \foreach \h@coord in {#2} {% + \HBeforeStone + \h@player at (\h@coord) {\h@label}; + }% +} +\newcommand\HHexGroup[2][]{% + \let\h@label\empty + \pgfqkeys{/h@hex@group}{#1}% + \foreach \h@coord in {#2} {% + \node at (\h@coord) {\h@label}; + \h@draw@hex{\h@coord}% + }% +} +\endinput +%% +%% End of file `havannah.sty'. diff --git a/Master/tlpkg/bin/tlpkg-ctan-check b/Master/tlpkg/bin/tlpkg-ctan-check index b619b9ffae8..0cddedb691c 100755 --- a/Master/tlpkg/bin/tlpkg-ctan-check +++ b/Master/tlpkg/bin/tlpkg-ctan-check @@ -252,7 +252,7 @@ my @TLP_working = qw( gsemthesis gtl gtrcrd gu guitar guitarchordschemes guitlogo hacm handout hands hanging hanoi happy4th har2nat hardwrap harmony harnon-cv harpoon - harvard harveyballs harvmac hatching hausarbeit-jura + harvard harveyballs harvmac hatching hausarbeit-jura havannah hc he-she hep hepnames hepparticles hepthesis hepunits here heuristica hexgame hf-tikz hfbright hfoldsty diff --git a/Master/tlpkg/tlpsrc/collection-games.tlpsrc b/Master/tlpkg/tlpsrc/collection-games.tlpsrc index 0920c463982..bce88746f1e 100644 --- a/Master/tlpkg/tlpsrc/collection-games.tlpsrc +++ b/Master/tlpkg/tlpsrc/collection-games.tlpsrc @@ -15,6 +15,7 @@ depend egameps depend gamebook depend go depend hanoi +depend havannah depend hexgame depend horoscop depend labyrinth diff --git a/Master/tlpkg/tlpsrc/havannah.tlpsrc b/Master/tlpkg/tlpsrc/havannah.tlpsrc new file mode 100644 index 00000000000..e69de29bb2d -- cgit v1.2.3