summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/wargame/source/hex/split.dtx
diff options
context:
space:
mode:
Diffstat (limited to 'macros/latex/contrib/wargame/source/hex/split.dtx')
-rw-r--r--macros/latex/contrib/wargame/source/hex/split.dtx517
1 files changed, 517 insertions, 0 deletions
diff --git a/macros/latex/contrib/wargame/source/hex/split.dtx b/macros/latex/contrib/wargame/source/hex/split.dtx
new file mode 100644
index 0000000000..3996b8848f
--- /dev/null
+++ b/macros/latex/contrib/wargame/source/hex/split.dtx
@@ -0,0 +1,517 @@
+% \iffalse
+% --------------------------------------------------------------------
+%<*hex>
+% \fi
+%
+% \subsubsection{Board splitting}
+% \label{sec:impl:hex:split}
+%
+% \begin{Macro}{\splitboard}
+%
+% Calculates how to split a board into sheets of paper.
+%
+% \begin{Syntax}
+% \cs{splitboard}\oarg{options}
+% \end{Syntax}
+%
+% where options are
+%
+% \begin{itemize}
+% \item \spec{paper}=\meta{format}: Specifies the paper format. One
+% of \spec{a4}, \spec{a3}, \spec{letter}, \spec{tabloid}. Default
+% is \spec{a4}.
+% \item \spec{landscape}: Sets the paper format to be in landscape
+% mode (default is portrait).
+% \item \spec{margin}=\meta{size in centimetres}: Size of margins on
+% each sheet in centimetres \emph{without} unit. That is put
+% \spec{0.6} for 6mm, \emph{not} \spec{6mm}. Default is \spec{0.6}.
+% This should be \emph{slightly} larger (by roughly 5\%) than the
+% \emph{least} margin required by the printer used. \emph{Must} be
+% given \emph{before} \spec{paper} to have any effect.
+% \item \spec{ncol}=\meta{number of columns}: Sets the number of
+% columns of sheets.
+% \item \spec{nrow}=\meta{number of rows}: Set the number of rows of
+% sheets.
+% \item \spec{overlap}=\meta{size in centimetres}: Sets the size of
+% the overlap between sheets in centimetres \emph{without} unit.
+% That is put \spec{2} for 2cm, \emph{not} \spec{2cm}. Default is
+% \spec{2}.
+% \item \spec{image}=\meta{file name}: File name of the board image
+% (a PDF). Default is \spec{board}
+% \item \spec{output}=\meta{file name}: File name (without
+% \spec{.tex} ending) to write calculated split to.
+% \item \spec{standalone}: Boolean flag. If true, then output file
+% will be a standalone document (i.e., has a \cs{documentclass}).
+% \item \spec{scale}=\meta{scale}: Set scale of board.
+% \end{itemize}
+%
+% The macro will produce a file named \cs{jobname}\spec{\_out.tex}
+% which can be included in another document to generate the split
+% board PDF.
+%
+% To use, make, for example, the file \spec{calcsplit.tex} with the
+% content
+%
+% \begin{verbatim}
+% \documentclass[11pt]{standalone}
+% \usepackage{wargame}
+% \usepackage{mystyle}
+% \begin{document}
+% \splitboard{paper=letter,margin=.7,ncol=2,nrow=2,overlap=1}
+% \end{document}
+% \end{verbatim}
+%
+% to calculate the split of \spec{board.pdf} over $2\times2$ letter
+% paper sheets, with a non-printable margin of 7mm, and an overlap
+% between the segments of 1cm.
+%
+% The final split document can then be
+%
+% \begin{verbatim}
+% \documentclass[11pt]{article}
+% \usepackage[letterpaper,margin=7mm]{geometry}
+% \begin{document}
+% \input{calcsplit_out}
+% \end{document}
+% \end{verbatim}
+%
+%
+% If you need to scale down the board, define the style \spec{board
+% scale}. E.g.,
+%
+% \begin{verbatim}
+% \tikzset{board scale/.style={scale=.9}}
+% \end{verbatim}
+%
+% \end{Macro}
+%
+%
+% Styles used for drawing things.
+%
+% \begin{macrocode}
+\tikzset{%
+ % Margin must be <1cm
+ split/paper outline/.style={
+ shape=rectangle,
+ draw=red!50!black,
+ line width=.5mm},
+ split/effective outline/.style={
+ shape=rectangle,
+ draw=green!50!black,
+ dashed,
+ line width=.5mm},
+ split/board outline/.style={%
+ draw=magenta,
+ line width=.5mm,
+ dotted},
+}
+% \end{macrocode}
+%
+% A scratch dimension used
+%
+% \begin{macrocode}
+\newdimen\split@tmp
+% \end{macrocode}
+%
+% Get upper right and lower left corners of node. Argument is node name.
+%
+% \begin{macrocode}
+\def\split@getem#1{%
+ \draw (#1.north east);%
+ \pgfgetlastxy{\split@ulx}{\split@uly}%
+ \xdef\split@ulx{\split@ulx}%
+ \xdef\split@ulx{\split@ulx}%
+ \draw (#1.south west);%
+ \pgfgetlastxy{\split@lrx}{\split@lry}%
+ \xdef\split@lrx{\split@lrx}%
+ \xdef\split@lry{\split@lry}%
+}
+% \end{macrocode}
+%
+% Get board dimensions. Argument is node name.
+%
+% \begin{macrocode}
+\def\split@getboard#1{%
+ \split@getem{#1}%
+ \xdef\split@bulx{\split@ulx}%
+ \xdef\split@buly{\split@uly}%
+ \xdef\split@blrx{\split@lrx}%
+ \xdef\split@blry{\split@lry}%
+ \split@w{\@percentchar\space Board:
+ (\split@bulx,\split@buly)(\split@blrx,\split@blry)}}
+% \end{macrocode}
+%
+% Adjust placement of markers and cut lines.
+% \begin{enumerate}
+% \item Dimension to adjust
+% \item Overlap dimension (with units)
+% \end{enumerate}
+%
+% \begin{macrocode}
+\def\split@adj#1#2{%
+ \split@tmp=#2%
+ \divide\split@tmp by 2%
+ \advance\split@tmp by #1%
+ \edef\t{\the\split@tmp}}
+% \end{macrocode}
+%
+% Get initial offset in a direction.
+%
+% \begin{enumerate}
+% \item Number of segments in direction
+% \item Overlap in centimetres (without unit)
+% \item Effective size, in centimetres (without unit), of sheets in
+% direction
+% \item Full size, in centimetres (without unit), of board in
+% direction.
+% \end{enumerate}
+%
+% \begin{macrocode}
+\def\split@get@init#1#2#3#4{%
+ \pgfmathparse{((#1 * #3 - (#1 - 1) * #2) - #4)/2}%
+ \xdef\split@off{\pgfmathresult}%
+ \hex@dbg{2}{((#1 * #3 - (#1 - 1) * #2) - #4)/2 -> `\split@off'}}
+% \end{macrocode}
+%
+% Get initial offset of first segment.
+%
+% \begin{enumerate}
+% \item Number of rows
+% \item Number of columns
+% \item Overlap in centimetres (without unit)
+% \item Effective height, in centimetres (without unit), of sheets
+% \item Effective width, in centimetres (without unit), of sheets
+% \item Full height, in centimetres (without unit), of board
+% \item Full width, in centimetres (without unit), of board
+% \end{enumerate}
+%
+% \begin{macrocode}
+\def\split@getinit#1#2#3#4#5#6#7{%
+ \split@get@init{#1}{#3}{#4}{#6}\xdef\dy{\split@off cm}
+ \split@get@init{#2}{#3}{#5}{#7}\xdef\dx{\split@off cm}}
+% \end{macrocode}
+%
+% Get coordinates of a segment
+%
+% \begin{enumerate}
+% \item Column number
+% \item Row number
+% \item Overlap, in centimetres (without unit)
+% \end{enumerate}
+%
+% \begin{macrocode}
+\def\split@getcoords#1#2#3{%
+ \hex@dbg{2}{Getting coords `c#1r#2'}%
+ \split@getem{c#1r#2}%
+ \edef\sulx{\split@ulx}%
+ \edef\suly{\split@uly}%
+ \edef\slrx{\split@lrx}%
+ \edef\slry{\split@lry}%
+ \edef\mlx{\split@blrx}%
+ \edef\mrx{\split@bulx}%
+ \edef\mty{\split@buly}%
+ \edef\mby{\split@blry}%
+ \pgfmathparse{int(#1-1)}\edef\pc{\pgfmathresult}%
+ \pgfmathparse{int(#2-1)}\edef\pr{\pgfmathresult}%
+ \pgfmathparse{int(#1+1)}\edef\nc{\pgfmathresult}%
+ \pgfmathparse{int(#2+1)}\edef\nr{\pgfmathresult}%
+ \pgfutil@ifundefined{pgf@sh@ns@c\pc r#2}{}{% Left
+ \hex@dbg{3}{\space Getting left `c\pc r#2'}%
+ \split@getem{c\pc r#2}\split@adj{\split@ulx}{-#3}\edef\mlx{\t}}%
+ \pgfutil@ifundefined{pgf@sh@ns@c\nc r#2}{}{% Right
+ \hex@dbg{3}{\space Getting right `c\nc r#2'}%
+ \split@getem{c\nc r#2}\split@adj{\split@lrx}{#3}\edef\mrx{\t}}%
+ \pgfutil@ifundefined{pgf@sh@ns@c#1r\pr}{}{% Above
+ \hex@dbg{3}{\space Getting above `c#1 r\pr'}%
+ \split@getem{c#1r\pr}\split@adj{\split@lry}{#3} \edef\mty{\t}}%
+ \pgfutil@ifundefined{pgf@sh@ns@c#1r\nr}{}{% Below
+ \hex@dbg{3}{\space Getting below `c#1 r\nr'}%
+ \split@getem{c#1r\nr}\split@adj{\split@uly}{-#3}\edef\mby{\t}}%
+ \draw[fill=red] (\mlx,\mty) circle(.2);%
+ \draw[fill=green](\mrx,\mty) circle(.4);%
+ \draw[fill=blue] (\mlx,\mby) circle(.6);%
+ \draw[fill=cyan] (\mrx,\mby) circle(.8);%
+ \split@w{%
+ \@percentchar^^J%
+ \string\segment(\sulx,\suly)(\slrx,\slry){\mlx}{\mrx}{\mby}{\mty}
+ \@percentchar\space c#1r#2}
+}
+% \end{macrocode}
+%
+% Stream to write to
+%
+% \begin{macrocode}
+\newwrite\split@calcout
+% \end{macrocode}
+%
+% Short-hand for write outs.
+%
+% \begin{macrocode}
+\def\split@w{\immediate\write\split@calcout}
+% \end{macrocode}
+%
+% Open stream and set-up
+%
+% \begin{macrocode}
+\def\split@header#1{%
+ \immediate\openout\split@calcout=#1.tex
+ \ifsplit@standalone
+ \pgfmathparse{\split@margin*.95}\edef\tmp{\pgfmathresult}
+ \split@w{\@percentchar\@percentchar\space These are made with
+ `calcsplit' with `-jobname \jobname'}
+ \split@w{
+ ^^J\string\documentclass[twoside]{article}
+ ^^J\string\usepackage{geometry}
+ ^^J\string\geometry{papersize={\the\paperwidth,\the\paperheight},margin=\tmp cm}
+ ^^J\string\usepackage{wargame}
+ ^^J\string\setlength{\string\parindent}{0pt}
+ ^^J\string\setlength{\string\parskip}{0pt}
+ ^^J\string\begin{document}
+ ^^J\string\ignorespaces\@percentchar}
+ \fi
+ \split@w{\string\def\string\boardfile{\split@img}\@percentchar}
+ \split@w{\string\def\string\boardscale{\split@scale}\@percentchar}
+}
+% \end{macrocode}
+%
+% Write final stuff and close stream
+%
+% \begin{macrocode}
+\def\split@footer{%
+ \ifsplit@standalone
+ \split@w{^^J\string\end{document}}
+ \fi
+ \split@w{^^J\@percentchar\@percentchar End of `\jobname'^^J}
+ \immediate\closeout\split@calcout
+}
+% \end{macrocode}
+%
+% Initial calculations. This draws the board and then extracts the
+% dimensions of the board. It also defines some styles for drawing
+% the board segments.
+%
+% \begin{macrocode}
+\def\split@init#1{%
+ \node[scale=\split@scale,
+ inner sep=0pt,
+ outer sep=0pt,
+ anchor=north west,
+ transform shape](b){\includegraphics{#1}};
+ \split@getboard{b}
+ %x
+ \split@tmp=\split@blrx cm\advance\split@tmp by -\split@bulx%
+ \wg@pt@to@cm{\split@tmp}\edef\split@bw{\pgfmathresult}%
+ \pgfmathparse{abs(\split@bw)}\edef\split@bw{\pgfmathresult}%
+ %
+ \split@tmp=\split@buly cm\advance\split@tmp by -\split@blry%
+ \wg@pt@to@cm{\split@tmp}\edef\split@bh{\pgfmathresult}%
+ \pgfmathparse{abs(\split@bh)}\edef\split@bh{\pgfmathresult}%
+ %
+ \wg@pt@to@cm{\paperwidth}\edef\split@pw{\pgfmathresult}%
+ \wg@pt@to@cm{\paperheight}\edef\split@ph{\pgfmathresult}%
+ %
+ \wg@pt@to@cm{\textwidth}\edef\split@ew{\pgfmathresult}%
+ \wg@pt@to@cm{\textheight}\edef\split@eh{\pgfmathresult}%
+ %
+ \hex@dbg{1}{Board:
+ (\split@bulx,\split@buly)(\split@blrx,\split@blry) \split@bw x\split@bh
+ ^^JPaper: \split@pw x\split@ph
+ ^^JEffective: \split@ew x\split@eh
+ }
+ \tikzset{
+ split/paper size/.style={
+ shape=rectangle,
+ minimum width=\paperwidth,
+ minimum height=\paperheight,
+ split/paper outline,
+ },
+ split/effective size/.style={
+ shape=rectangle,
+ minimum width=\textwidth,
+ minimum height=\textheight,
+ split/effective outline},
+ split/board size/.style={
+ shape=rectangle,
+ minimum width=\split@bw cm,
+ minimum height=\split@bh cm,
+ split/board outline}}
+ \node[board/.try,split/board size,anchor=north west] {};
+}
+% \end{macrocode}
+%
+% Calculate effective sheet sizes from sheet dimensions and the
+% defined margin.
+%
+% \begin{macrocode}
+\def\split@text@dim#1{%
+ \textwidth=\paperwidth%
+ \textheight=\paperheight%
+ \advance\textwidth by -#1cm%
+ \advance\textwidth by -#1cm%
+ \advance\textheight by -#1cm%
+ \advance\textheight by -#1cm%
+ \global\textwidth=\textwidth%
+ \global\textheight=\textheight%
+}
+% \end{macrocode}
+%
+% Options for the \cs{splitboard} macro.
+%
+% \begin{macrocode}
+\newif\ifsplit@standalone\split@standalonetrue
+\tikzset{%
+ split/.search also={/tikz},%
+ split/.cd,%
+ margin/.store in=\split@margin,
+ paper/.is choice,%
+ paper/a4/.code={%
+ \hex@dbg{3}{A4 paper for split}%
+ \global\paperwidth=21cm%
+ \global\paperheight=29.7cm%
+ \split@text@dim{\split@margin}},
+ paper/a3/.code={%
+ \hex@dbg{3}{A3 paper for split}%
+ \global\paperheight=42cm%
+ \global\paperwidth=29.7cm%
+ \split@text@dim{\split@margin}},
+ paper/letter/.code={%
+ \hex@dbg{3}{Letter paper for split}
+ \paperheight=27.9cm,%
+ \paperwidth=21.6cm,%
+ \split@text@dim{\split@margin}},%
+ paper/tabloid/.code={%
+ \hex@dbg{3}{Tabloid paper for split}%
+ \paperheight=43.2cm,%
+ \paperwidth=27.9cm,%
+ \split@text@dim{\split@margin}},
+ landscape/.code={%
+ \hex@dbg{3}{Landscape option for split}
+ \split@tmp=\paperheight
+ \global\paperheight=\paperwidth
+ \global\paperwidth=\split@tmp
+ \split@tmp=\textheight
+ \global\textheight=\textwidth
+ \global\textwidth=\split@tmp},
+ standalone/.is if=split@standalone,
+ scale/.store in=\split@scale,
+ output/.store in=\split@out,
+ ncol/.store in=\split@ncol,
+ nrow/.store in=\split@nrow,
+ overlap/.store in=\split@ov, % Centimeter, no unit
+ image/.store in=\split@img,
+ paper/.default=a4, paper/.initial=a4,
+ margin/.default=.6, margin/.initial=.6,
+ ncol/.default=0, ncol/.initial=0,
+ nrow/.default=0, nrow/.initial=0,
+ overlap/.default=2, overlap/.initial=2,
+ image/.default=board, image/.initial=board,
+ output/.default=\jobname_out,
+ standalone/.default=true,
+ scale/.default=1,
+}
+% \end{macrocode}
+%
+% The actual macro. The argument is key-value pairs of options.
+%
+% \begin{macrocode}
+\def\splitboard#1{%
+ \pgfkeys{/tikz/split/.cd,%
+ standalone,%
+ output,%
+ margin,%
+ paper,%
+ image,%
+ overlap,%
+ scale,%
+ ncol,%
+ nrow,%
+ #1}
+ \hex@dbg{1}{%
+ Paper: `\the\paperwidth'x`\the\paperheight'
+ ^^JEffective: `\the\textwidth'x`\the\textheight'
+ ^^JNcols: `\split@ncol'
+ ^^JNrows: `\split@nrow'
+ ^^JOverlap: `\split@ov' cm}
+ \split@header{\split@out}
+ \begin{tikzpicture}
+ \split@init{\split@img}
+ \split@getinit{%
+ \split@nrow}{%
+ \split@ncol}{%
+ \split@ov}{\split@eh}{\split@ew}{\split@bh}{\split@bw}
+ \node[split/effective size,
+ above left=\dy and \dx of b.north west,
+ anchor=north west] (c1r1) {};
+ \node[split/paper size] at (c1r1) {};
+ %
+ \foreach \r [remember=\r as \pr (initially 0)] in {1,...,\split@nrow}{%
+ \ifnum\r>1
+ \hex@dbg{3}{Placing first column of row `\r'}
+ \node[split/effective size,
+ below=-\split@ov cm of c1r\pr.south west,anchor=north west] (c1r\r){};
+ \node[split/paper size] at (c1r\r) {};
+ \fi
+ \foreach \c [remember=\c as \pc (initially 1)] in {2,...,\split@ncol}{%
+ \ifnum\c>\split@ncol\else%
+ \ifnum\c>\pc
+ \hex@dbg{3}{Placing column `\c' (`\pc') of row `\r'}
+ \node[split/effective size,
+ right=-\split@ov cm of c\pc r\r.north east,anchor=north west]
+ (c\c r\r) {};
+ \node[split/paper size] at (c\c r\r) {};
+ \fi
+ \fi
+ }
+ }
+ \foreach \r [remember=\r as \pr (initially 0)] in {1,...,\split@nrow}{%
+ \foreach \c [remember=\c as \pc (initially 0)] in {1,...,\split@ncol}{%
+ \split@getcoords{\c}{\r}{\split@ov cm}}}
+ \end{tikzpicture}
+ \split@footer
+}
+% \end{macrocode}
+%
+% Macro used by the written file.
+%
+%
+% \begin{enumerate}
+% \item first coordinate (e.g., \spec{(hex ak:c=C,r=17)})
+% \item second coordinate (e.g., \spec{(hex ak:c=M,r=33)})
+% \item Crop mark left
+% \item Crop mark right
+% \item Crop mark bottom
+% \item Crop mark top
+% \end{enumerate}
+%
+% \begin{macrocode}
+\def\segment(#1)(#2)#3#4#5#6{%
+ \begin{tikzpicture}%
+ \begin{scope}
+ \clip (#1) rectangle (#2);
+ \node[scale=\boardscale,
+ inner sep=0pt,
+ outer sep=0pt,
+ anchor=north west,
+ transform shape]{\includegraphics{\boardfile}};
+ \end{scope}
+ \pgfinterruptboundingbox
+ \draw(#3,#6)--++( 0.0, 0.3);
+ \draw(#3,#6)--++(-0.3, 0.0);
+ \draw(#3,#5)--++( 0.0,-0.3);
+ \draw(#3,#5)--++(-0.3, 0.0);
+ \draw(#4,#6)--++( 0.0, 0.3);
+ \draw(#4,#6)--++( 0.3, 0.0);
+ \draw(#4,#5)--++( 0.0,-0.3);
+ \draw(#4,#5)--++( 0.3, 0.0);
+ \endpgfinterruptboundingbox
+ \end{tikzpicture}%
+ \cleardoublepage}%
+% \end{macrocode}
+%
+%
+%
+%
+% \iffalse
+%</hex>
+% --------------------------------------------------------------------
+% \fi