summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/gene/crossword/cwpuzzle.dtx
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/latex/contrib/gene/crossword/cwpuzzle.dtx
Initial commit
Diffstat (limited to 'macros/latex/contrib/gene/crossword/cwpuzzle.dtx')
-rw-r--r--macros/latex/contrib/gene/crossword/cwpuzzle.dtx2177
1 files changed, 2177 insertions, 0 deletions
diff --git a/macros/latex/contrib/gene/crossword/cwpuzzle.dtx b/macros/latex/contrib/gene/crossword/cwpuzzle.dtx
new file mode 100644
index 0000000000..3442440ea4
--- /dev/null
+++ b/macros/latex/contrib/gene/crossword/cwpuzzle.dtx
@@ -0,0 +1,2177 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\def\filename{cwpuzzle.dtx}
+\def\fileversion{1.9}
+\def\filedate{2014/01/12}
+\let\docversion=\fileversion
+\let\docdate=\filedate
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%\iffalse
+\typeout{%
+%% Purpose:
+ Package: cwpuzzle \filedate\space\fileversion\space
+ for typesetting crossword puzzles and more.
+}%
+%%
+%% Documentation:
+%% The documentation can be generated from the original file
+%% cwpuzzle.dtx with the doc style/package. LaTeX the file
+%% cwpuzzle.dtx to get the full documentation in dvi format.
+%%
+%%
+%% Author: Gerd Neugebauer
+%% Im Lerchelsöhl 5
+%% 64521 Groß-Gerau
+%% Mail: gene@gerd-neugebauer.de
+%%
+%% Copyright (c) 1995-2014 Gerd Neugebauer
+%%
+%% cwpuzzle.dtx is distributed in the hope that it will be useful,
+%% but WITHOUT ANY WARRANTY. No author or distributor accepts
+%% responsibility to anyone for the consequences of using it or for
+%% whether it serves any particular purpose or works at all, unless
+%% he says so in writing.
+%%
+%% Everyone is granted permission to copy, modify and redistribute
+%% cwpuzzle.dtx, provided this copyright notice is preserved and
+%% any modifications are indicated.
+%%
+%%
+%% This style is still under development and may be replaced with a
+%% new version which provides an enhanced functionality.
+%%
+%<*driver>
+\documentclass{ltxdoc}
+\usepackage{xcolor}
+\usepackage{cwpuzzle}
+\EnableCrossrefs
+\CodelineIndex
+\RecordChanges
+\setcounter{IndexColumns}2
+\begin{document}
+ \DocInput{cwpuzzle.dtx}
+ \newpage
+ \PrintChanges
+\end{document}
+%</driver>
+%\fi
+%
+% \title{A \LaTeX\ Package for Typesetting\\ Crossword
+% Puzzles and More\thanks{This file documents \filename\ version
+% \fileversion\ as of \filedate.}}
+% \author{Gerd Neugebauer\\
+% Im Lerchels\"ohl 5\\
+% 64521 Gro\ss{}-Gerau (Germany)\\
+% Net: {\tt gene@gerd-neugebauer.de}}
+%
+% \date{{\footnotesize Documentation date: \docdate}}
+%
+% \maketitle
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% \DoNotIndex{\ ,\|,\",\',\.,\,,\[,\\,\],\^,\`,\~,\@,\@dottedtocline}
+% \DoNotIndex{\@empty,\@namedef,\@nameuse,\advance,\begin,\begingroup}
+% \DoNotIndex{\catcode,\csname,\def,\else,\end,\endcsname,\endgroup}
+% \DoNotIndex{\fi,\filedate,\footnotesize,\framebox,\gdef,\global}
+% \DoNotIndex{\hfill,\if,\ifx,\large,\let,\makebox,\mbox,\newcommand}
+% \DoNotIndex{\newcount,\newdimen,\newenvironment,\newif,\noindent}
+% \DoNotIndex{\normalsize,\null,\par,\put,\raggedright,\raggedleft}
+% \DoNotIndex{\relax,\renewcommand,\RequirePackage,\rm,\rule}
+% \DoNotIndex{\scriptsize,\sf,\small,\textsf,\textwidth}
+% \DoNotIndex{\the,\tiny,\unitlength,\uppercase,\xdef,\ProvidesPackage}
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% \changes{1.3}{1996/10/28}{First public release.}
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% \CheckSum{640}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% \CharacterTable
+%% {Upper-case \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
+%% Lower-case \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
+%% Digits \0\1\2\3\4\5\6\7\8\9
+%% Exclamation \! Double quote \" Hash (number) \#
+%% Dollar \$ Percent \% Ampersand \&
+%% Acute accent \' Left paren \( Right paren \)
+%% Asterisk \* Plus \+ Comma \,
+%% Minus \- Point \. Solidus \/
+%% Colon \: Semicolon \; Less than \<
+%% Equals \= Greater than \> Question mark \?
+%% Commercial at \@ Left bracket \[ Backslash \\
+%% Right bracket \] Circumflex \^ Underscore \_
+%% Grave accent \` Left brace \{ Vertical bar \|
+%% Right brace \} Tilde \~}
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% \MakeShortVerb{|}
+%
+% \begin{abstract}
+% cpwuzzle.dtx provides a package to typeset crossword puzzles.
+% The leading philosophy is that the puzzle and the solution are
+% typeset from the same source.
+%
+% The package can be used to produce several types of puzzles like
+% the classical crossword puzzle, a number puzzle, and fill-in
+% puzzles. In addition to the block separated puzzles the thick
+% line delimited puzzles are supported as well.
+% \end{abstract}
+%
+% \tableofcontents
+% \newpage
+%
+% \section{About Crossword Puzzles}
+%
+% Crossword puzzles are can be a an amusing but also a challenging
+% hobby. Unfortunately at the time of this writing I am not aware
+% of any good package to typeset crossword puzzles with \LaTeX.
+% Thus I decided to make one which at least fits my needs.
+%
+% There are several types of crossword puzzles among. This
+% package can only be used to typeset several of them. The basic
+% assumption in this package is that puzzles are rectangular
+% arrangements of boxes. Some of these boxes are black and others
+% are prepared to take single letters.
+% Each word in the grid is enclosed in black boxes or the outside.
+%
+% Optionally there may be rectangular regions left blank inside the
+% puzzle. They can be used to place ads or other informative texts
+% inside the puzzle.
+%
+% \subsection{Classical Crossword Puzzles}\label{sec:classical}
+%
+% \PuzzleUnsolved
+% \begin{minipage}{.35\textwidth}%
+% \begin{Puzzle}{5}{3}%
+% |* |* |[1]E|X |* |.
+% |[2]A|[3]S|T |* |[4]T|.
+% |* |[5]P|A |R |T |.
+% \end{Puzzle}%
+% \end{minipage}%
+% \begin{minipage}{.6\textwidth}
+% \begin{PuzzleClues}{Across}%
+% \Clue{1}{EX}{unit of measure}%
+% \Clue{2}{AST}{\(\ast\)}%
+% \Clue{5}{PART}{sectioning unit}%
+% \end{PuzzleClues}%
+% \begin{PuzzleClues}{Down}%
+% \Clue{1}{ETA}{\(\eta\)}%
+% \Clue{3}{SP}{unit of measure}%
+% \Clue{4}{TT}{non-proportional font}%
+% \end{PuzzleClues}%
+% \end{minipage}\medskip
+%
+% The ``classical'' type of a crossword puzzle words are marked
+% with numbers and each word is accompanied with a clue which
+% should help (or confuse) the reader. Those clues are listed after
+% the frame of the puzzle.
+%
+% \subsection{Number Crossword Puzzles}\label{sec:numbered}
+%
+% \begin{minipage}{.35\textwidth}%
+% \begin{Puzzle}{5}{3}%
+% |* |* |[6]E|[1]X|* |.
+% |[5]A|[2]S|[7]T|* |[7]T|.
+% |* |[4]P|[5]A|[3]R|[7]T|.
+% \end{Puzzle}%
+% \end{minipage}%
+% \begin{minipage}{.6\textwidth}
+% \PuzzleLetters{AEPRSTX}\medskip\par
+% \PuzzleNumbers{XSRPAET}%
+% \end{minipage}\medskip
+%
+% The ``number puzzle'' variant contains only numbers instead of
+% letters. Different numbers denote different letters. There are no
+% clues. The reader is assumed to find a complete list of letters
+% by filling appropriate words into the grid. Sometimes a word is
+% already entered into the grid to ease the start.
+%
+% \subsection{Fill-In Crossword Puzzles}\label{sec:fill-in}
+%
+% \begin{minipage}{.35\textwidth}%
+% \begin{Puzzle}{5}{3}%
+% |* |* |E |X |* |.
+% |A |S |T |* |T |.
+% |* |P |A |R |T |.
+% \end{Puzzle}%
+% \end{minipage}%
+% \begin{minipage}{.6\textwidth}
+% \begin{PuzzleWords}{2}
+% \Word{EX}%
+% \Word{SP}%
+% \Word{TT}%
+% \end{PuzzleWords}%
+% \begin{PuzzleWords}{3}
+% \Word{AST}%
+% \Word{ETA}%
+% \end{PuzzleWords}%
+% \begin{PuzzleWords}{4}
+% \Word{PART}%
+% \end{PuzzleWords}%
+% \end{minipage}\medskip
+%
+% The ``fill-in puzzle'' variant consists of a frame containing
+% only black and white boxes. Additionally a list of words is given
+% which have to be put into the frame until none is left and the
+% frame is completed.
+%
+% \subsection{Line delimited Crossword Puzzles}\label{sec:line-delimited}
+%
+% The crossword puzzles we have seen before had the property that
+% words are either delimited by the outer border or by a solid
+% block. In addition line delimited puzzles are common. In this
+% case a thicker line is drawn to indicate the end of a line.\medskip
+%
+% \noindent
+% \begin{minipage}{.35\textwidth}%
+% \begin{Puzzle}{5}{3}%
+% |[1] c |[2] c |[3][l]e |[4] x |[5] p |.
+% |[6] l | o |[][o]t |[7][l]m| u |.
+% | o |[][fl]s|[8][l]a | l |[][o]t |.
+% \end{Puzzle}%
+% \end{minipage}%
+% \begin{minipage}{.6\textwidth}
+% \begin{PuzzleClues}{Across}%
+% \Clue{1}{CC}{unit of measure}%
+% \Clue{3}{EXP}{math function}%
+% \Clue{6}{LOT}{list of tables}%
+% \Clue{7}{MU}{$\mu$}%
+% \Clue{8}{ALT}{key}%
+% \end{PuzzleClues}%
+% \begin{PuzzleClues}{Down}%
+% \Clue{1}{CLO}{class option}%
+% \Clue{2}{COS}{math function}%
+% \Clue{3}{ETA}{\(\eta\)}%
+% \Clue{4}{XML}{all in angle brackets}%
+% \Clue{5}{PUT}{\LaTeX\ place picture element}%
+% \end{PuzzleClues}%
+% \end{minipage}
+%
+% In the example above we can see another feature. This feature is
+% that two letters are circled. This can be used to indicate
+% letters for a solution word of the crossword puzzle.
+%
+%
+%
+% \subsection{Solutions}
+%
+% \PuzzleSolution
+% \begin{minipage}{.35\textwidth}%
+% \begin{Puzzle}{5}{3}%
+% |* |* |[1]E|X |* |.
+% |[2]A|[3]S|T |* |[4]T|.
+% |* |[5]P|A |R |T |.
+% \end{Puzzle}%
+% \end{minipage}%
+% \begin{minipage}{.6\textwidth}
+% \end{minipage}\medskip
+%
+% Often it is not only desirable to typeset the unsolved crossword
+% puzzle but also the solution. This means that all the letters
+% have to be filled in. This should be possible with the same
+% source as the questions to avoid typos or redundancies leading to
+% additional work.
+%
+% Several variants of solutions come to mind. Primarily the
+% solution should show the letters and suppress any clues. One
+% major distinction is also whether or not the numbers of the words
+% should be shown in the solution as well.\medskip
+%
+% \noindent
+% \PuzzleSolution[true]%
+% \begin{minipage}{.35\textwidth}%
+% \begin{Puzzle}{5}{3}%
+% |* |* |[1]E|X |* |.
+% |[2]A|[3]S|T |* |[4]T|.
+% |* |[5]P|A |R |T |.
+% \end{Puzzle}%
+% \end{minipage}%
+% \begin{minipage}{.6\textwidth}
+% \end{minipage}%
+%
+% Finally there are the lists of letters in numbered puzzles. In
+% the solution they will show the letters in them as well.\medskip
+%
+% \noindent
+% \PuzzleSolution[false]%
+% \begin{minipage}{.35\textwidth}%
+% \begin{Puzzle}{5}{3}%
+% |* |* |[6]E|[1]X|* |.
+% |[5]A|[2]S|[7]T|* |[7]T|.
+% |* |[4]P|[5]A|[3]R|[7]T|.
+% \end{Puzzle}%
+% \end{minipage}%
+% \begin{minipage}{.6\textwidth}
+% \PuzzleLetters{AEPRSTX}\medskip\par
+% \PuzzleNumbers{XSRPAET}%
+% \end{minipage}
+%
+%
+% \section{Input of Crossword Puzzles}
+%
+% The basic idea behind this package is that a crossword puzzle is
+% specified in a separate file. The actual appearance of the puzzle
+% is controlled by several options. Thus it should be possible to
+% produce the unsolved and the solved puzzle from the same
+% source. Before we describe the various options we will have a
+% look at the basic environments and macros used to specified a
+% crossword puzzle.
+%
+% \DescribeEnv{Puzzle}%
+% This package provides the environment |Puzzle| which typesets the
+% frame of a crossword puzzle. This environment takes two
+% arguments. These arguments are the number of columns and the
+% number of the rows of the puzzle. This means that essentially
+% only rectangular puzzles can be typeset.
+%
+% The example from section~\ref{sec:classical} has been entered as
+% follows:
+% \begin{verbatim}
+% \begin{Puzzle}{5}{3}%
+% |* |* |[1]E|X |* |.
+% |[2]A|[3]S|T |* |[4]T|.
+% |* |[5]P|A |R |T |.
+% \end{Puzzle}
+% \end{verbatim}
+% In this example we can see that inside the |Puzzle| environment
+% there is one special character. This is the bar \verb/|/. This
+% bar is an active character in \TeX. Thus you can think of it
+% like a macro.
+%
+% The \verb/|/ macro takes three arguments. The first two arguments
+% are optional, i.e. enclosed in brackets if present. The first
+% optional argument denotes the number for numbered boxes. The
+% second optional argument specifies the formatting of the cell.
+%
+% The third argument is either empty |{}| or it consists of a
+% single character. This argument describes the action to be
+% performed.
+%
+% \begin{itemize}
+% \item If this argument is a letter then it is simply shown
+% in the solution and suppressed in the unsolved crossword puzzle.
+%
+% \item If this argument is an asterisk |*| then a black box is
+% produced.
+%
+% \item If this argument is a dot |.| then this marks the end of
+% the current row. The next box is typeset at the beginning of the
+% following row.
+%
+% \item If this argument is empty |{}| then a white box is
+% typeset. This box does not contain a letter, nor does it have a
+% frame. This macro can be used to leave room for larger boxed with
+% ads. Alternatively this can be used to disable certain boxes to
+% make a non-rectangular crossword puzzle.
+% \end{itemize}
+%
+% \begin{verbatim}
+% \begin{Puzzle}{5}{5}
+% |{} |{} |[1]S|.
+% |{} |[2]M|I |[3]D|.
+% |[4]T|I |M |E |S |.
+% |{} |[5]N|E |G |.
+% |{} |{} |Q |.
+% \end{Puzzle}
+% \end{verbatim}
+% \PuzzleUnsolved
+% \begin{minipage}{.35\textwidth}%
+% \begin{Puzzle}{5}{5}%
+% |{} |{} |[1]S|.
+% |{} |[2]M|I |[3]D|.
+% |[4]T|I |M |E |S |.
+% |{} |[5]N|E |G |.
+% |{} |{} |Q |.
+% \end{Puzzle}%
+% \end{minipage}%
+% \begin{minipage}{.6\textwidth}
+% \begin{PuzzleClues}{\textbf{Across: }}%
+% \Clue{2}{MID}{\(\mid\)}%
+% \Clue{4}{TIMES}{\(\times\)}%
+% \Clue{5}{NEG}{\(\neg\)}%
+% \end{PuzzleClues}%
+% \begin{PuzzleClues}{\textbf{Down: }}%
+% \Clue{1}{SIMEQ}{\(\simeq\)}%
+% \Clue{2}{MIN}{log-like function}%
+% \Clue{3}{DEG}{log-like function}%
+% \end{PuzzleClues}%
+% \end{minipage}%
+%
+% Note that white-space is ignored after the arguments but not
+% between the bar and the arguments.
+% \bigskip
+%
+% The formatting of the cell is controlled by the second optional
+% argument of the \verb/|/ macro. This optional argument may
+% contain a list of several characters. Each of these characters is
+% interpreted from left to right. The following list describes the
+% meaning of the built-in characters.\medskip
+%
+% \PuzzleUnsolved
+% \newenvironment{CellLetter}[1]{\par\noindent
+% \begin{minipage}{.25\textwidth}
+% \let\PuzzlePre\relax
+% \let\PuzzlePost\relax
+% \begin{Puzzle}{1}{1}|[8][#1]X
+% \end{Puzzle}\tt\quad
+% \char`\|[8][#1]X
+% \end{minipage}%
+% \begin{minipage}{.7\textwidth}
+% }{\end{minipage}\smallskip}%
+% \begin{CellLetter}{f}
+% The letter f produces a simple frame around the cell. This is
+% the default if nothing is specified.
+% \end{CellLetter}%
+% \begin{CellLetter}{.}
+% The character . produces no additional rendering it can be used
+% to overwrite the default rendering which is to place a frame
+% around the cell.
+% \end{CellLetter}%
+% \begin{CellLetter}{*}
+% The character * produces a black box. This is the same effect
+% which can be achieved by providing the character * to be filled
+% into the cell for the solution.
+% \end{CellLetter}%
+% \begin{CellLetter}{O}
+% The letter O produces an oval as drawn with the \LaTeX\ macro
+% \verb/\oval/.
+% \end{CellLetter}%
+% \begin{CellLetter}{o}
+% The letter o produces an oval inside a frame. T is is an
+% abbreviation for the two letters fO.
+% \end{CellLetter}%
+% \begin{CellLetter}{t}
+% The letter t produces a frame with a thicker line at the top.
+% The thickness of this line is controlled by the macro
+% |\PuzzleThickline|.
+% \end{CellLetter}%
+% \begin{CellLetter}{T}
+% The letter T produces a thicker line at the top of the cell.
+% The thickness of this line is controlled by the macro
+% |\PuzzleThickline|.
+% \end{CellLetter}%
+% \begin{CellLetter}{b}
+% The letter b produces a frame with a thicker line at the bottom.
+% The thickness of this line is controlled by the macro
+% |\PuzzleThickline|.
+% \end{CellLetter}%
+% \begin{CellLetter}{B}
+% The letter B produces a thicker line at the bottom of the cell.
+% The thickness of this line is controlled by the macro
+% |\PuzzleThickline|.
+% \end{CellLetter}%
+% \begin{CellLetter}{l}
+% The letter l produces a frame with a thicker line at the left
+% side of the cell. The thickness of this line is controlled by
+% the macro |\PuzzleThickline|.
+% \end{CellLetter}%
+% \begin{CellLetter}{L}
+% The letter L produces a thicker line at the left side of the
+% cell. The thickness of this line is controlled by the macro
+% |\PuzzleThickline|.
+% \end{CellLetter}%
+% \begin{CellLetter}{r}
+% The letter r produces a frame with a thicker line at the right
+% side of the cell. The thickness of this line is controlled by
+% the macro |\PuzzleThickline|.
+% \end{CellLetter}%
+% \begin{CellLetter}{R}
+% The letter R produces a thicker line at the right side of the
+% cell. The thickness of this line is controlled by the macro
+% |\PuzzleThickline|.
+% \end{CellLetter}%
+% \begin{CellLetter}{/}
+% The character / produces a line crossing the cell from lower
+% left to upper right.
+% \end{CellLetter}%
+% \begin{CellLetter}{,}
+% The character , produces a line crossing the cell from upper
+% left to lower right.
+% \end{CellLetter}%
+% \begin{CellLetter}{S}
+% The character S produces the solution, i.e. the content of the
+% cell is typeset. No decorations are placed around. For this
+% purpose it should be combined with some other formatting
+% characters.
+% \end{CellLetter}%
+%
+% Whenever you try to use an undefined specification for the cell
+% frame a warning is printed and the letter is ignored.
+%
+% \DescribeMacro{\PuzzleDefineCell}
+% You can define additional cell renderings of your own. For this
+% purpose the macro |\PuzzleDefineCell| is provided. It takes two
+% arguments. The first argument contains the key under which the
+% rendering should be addressed in the optional second argument of
+% the macro \verb/|/. The second argument contains the replacement
+% text like in |\newcommand|. This replacement text can make use of
+% two arguments. They are addressed with |#1| and |#2|. The first
+% one contains the x coordinate of the cell to be rendered. The
+% second one its y coordinate.
+%
+% The following example shows for instance the definition of a new
+% cell type addressed by the key + which draws a thick frame around
+% the cell.
+% \begin{verbatim}
+% \PuzzleDefineCell{+}{
+% \PuzzleThicklines
+% \put(#1,#2){\framebox(1,1){}}
+% }
+% \end{verbatim}
+%
+%
+% Finally we show how to define a cell type consisting of a colored
+% box. The box itself is drawn with the help of the macro
+% |\colorbox|. Thus it is necessary to load the package
+% \texttt{color} which defines this macro.
+%
+% The two invocations show the combination with the f specifier.
+% The specifier f is the default and used only if the user does not
+% provide the optional argument. Thus we need to provide the f we
+% we want to have it additionally.\medskip
+%
+% \noindent
+% \begin{minipage}{.65\textwidth}\small
+% \begin{verbatim}
+% \definecolor{gray}{gray}{.9}
+% \PuzzleDefineCell{c}{{%
+% \put(#1,#2){\makebox(1,1){%
+% \fboxsep=0pt
+% \colorbox{gray}{\makebox(1,1){}}}}
+% }}
+% \begin{Puzzle}{2}{2}
+% |[1][cf]X | {} |.
+% |{} |[2][c]X |.
+% \end{Puzzle}
+% \end{verbatim}
+% \end{minipage}\hfill
+% \begin{minipage}{.30\textwidth}
+% \definecolor{gray}{gray}{.9}
+% \PuzzleDefineCell{c}{{%
+% \fboxsep=0pt
+% \put(#1,#2){\makebox(1,1){\colorbox{gray}{\makebox(1,1){}}}}
+% }}
+% \begin{Puzzle}{2}{2}
+% |[1][cf]X | {} |.
+% |{} |[2][c]X |.
+% \end{Puzzle}
+% \end{minipage}
+%
+% \DescribeMacro{\DefineColorCell}
+% The macro |\DefineColorCell| simplifies this task by
+% encapsulating the definition above. It has two arguments. The
+% first one is the key character and the second one is th name of
+% the color to use for the background.\medskip
+%
+% \noindent
+% \begin{minipage}{.65\textwidth}\small
+% \begin{verbatim}
+% \definecolor{gray}{gray}{.9}
+% \PuzzleDefineColorCell{g}{gray}
+% \begin{Puzzle}{2}{2}
+% |{} |[1][cf]X |.
+% |[2][c]X |{} |.
+% \end{Puzzle}
+% \end{verbatim}
+% \end{minipage}\hfill
+% \begin{minipage}{.30\textwidth}
+% \definecolor{gray}{gray}{.9}
+% \PuzzleDefineColorCell{g}{gray}
+% \begin{Puzzle}{2}{2}
+% |{} |[1][cf]X |.
+% |[2][c]X |{} |.
+% \end{Puzzle}
+% \end{minipage}
+%
+% \DescribeMacro{\Frame}
+% The macro |\Frame| can be used to typeset ads or other text into
+% larger boxes inside the frame of the crossword puzzle. For this
+% purpose five arguments are required. The first two arguments are
+% used to specify the lower left corner of the frame. The lower
+% left corner has the coordinates 0,0 and the numbers increase
+% upwards and to the right.
+%
+% The third argument is the width of the frame and the fourth
+% argument is the height of the frame measured in number of boxes.
+% Finally, the fifth argument contains the text to be typeset. Per
+% default it is typeset in a mini-page of the appropriate width
+% centered horizontally and vertically.
+%
+% \begin{verbatim}
+% \begin{Puzzle}{8}{6}
+% \Frame{2}{2}{4}{2}{\sf Crossword\\Puzzle}
+% |[1]E|* |[2]N |U |L |[3]L |* |[4]V|.
+% |[5]T|[6]R|I |A |N |G |[7]L|E |.
+% |A |U |{} |{} |{} |{} |[8]C|C |.
+% |* |L |{} |{} |{} |{} |E |* |.
+% |[9]B|E |T |[10]A|* |[11]L|I |M |.
+% |F |* |[12]L|A |B |E |L |* |.
+% \end{Puzzle}
+% \end{verbatim}
+%
+% \PuzzleUnsolved\noindent
+% \begin{minipage}{.5\textwidth}\PuzzleUnitlength=18pt
+% \begin{Puzzle}{8}{6}%
+% \Frame{2}{2}{4}{2}{\sf Crossword\\Puzzle}%
+% |[1]E|* |[2]N|U|L|[3]L|* |[4]V|.
+% |[5]T|[6]R|I|A|N|G|[7]L|E|.
+% |A|U|{}|{}|{}|{}|[8]C|C|.
+% |* |L|{}|{}|{}|{}|E|* |.
+% |[9]B|E|T|[10]A|* |[11]L|I|M|.
+% |F|* |[12]L|A|B|E|L|* |.
+% \end{Puzzle}%
+% \end{minipage}%
+% \begin{minipage}{.47\textwidth}
+% \begin{PuzzleClues}{\textbf{Across: }}%
+% \Clue{2}{NULL}{empty}%
+% \Clue{5}{TRIANGLE}{\(\triangle\)}%
+% \Clue{8}{CC}{carbon copy (letter.sty)}%
+% \Clue{9}{BETA}{\(\beta\)}%
+% \Clue{11}{LIM}{limes}%
+% \Clue{12}{LABEL}{mark it}%
+% \end{PuzzleClues}%
+% \begin{PuzzleClues}{\textbf{Down: }}%
+% \Clue{1}{ETA}{\(\eta\)}%
+% \Clue{2}{NI}{\(\ni\)}%
+% \Clue{3}{LG}{logarithm}%
+% \Clue{4}{VEC}{\(\vec{}\)}%
+% \Clue{6}{RULE}{black rectangle}%
+% \Clue{7}{LCEIL}{\(\lceil\)}%
+% \Clue{9}{BF}{bold face}%
+% \Clue{10}{AA}{\AA}%
+% \Clue{11}{LE}{\(\le\)}%
+% \end{PuzzleClues}%
+% \end{minipage}%
+%
+% \DescribeEnv{PuzzleClues}
+% The clues in the classical crossword puzzle are typeset with the
+% use of the environment |PuzzleClues|. This environment takes one
+% argument which is typeset before the clues. The environment takes
+% roughly the half of the text width and make a mini-page with this
+% width. Thus two invocations of this environment are typeset side
+% by side.
+%
+% Alternatively if the solution is typeset then the environment
+% |PuzzleClues| has no effect.
+%
+% \begin{verbatim}
+% \begin{PuzzleClues}{\textbf{Across}}%
+% \Clue{1}{EX}{unit of measure}%
+% \Clue{2}{AST}{\(\ast\)}%
+% \Clue{5}{PART}{sectioning unit}%
+% \end{PuzzleClues}%
+% \begin{PuzzleClues}{\textbf{Down}}%
+% \Clue{1}{ETA}{\(\eta\)}%
+% \Clue{3}{SP}{unit of measure}%
+% \Clue{4}{TT}{nonproportional font}%
+% \end{PuzzleClues}%
+% \end{verbatim}
+%
+% \DescribeMacro{Clue}
+% The environment |PuzzleClues| defines one local macro. This macro
+% is named |\Clue| and takes three arguments. The first argument is
+% the number of the word. This should correspond to the number in
+% the puzzle frame. The second argument is the word itself.
+% Currently this not used at all. Finally the third argument is the
+% clue for the word.
+%
+% If the unsolved puzzle is typeset then the first and the third
+% argument are used. Otherwise all arguments are silently absorbed.
+%
+% \DescribeMacro{\PuzzleLetters}
+% The macro |\PuzzleLetters| can be used to typeset the list of
+% used letters in numbered crossword puzzles. It has one argument
+% which are the used letters (preferably in alphabetical order.
+%
+% \DescribeMacro{\PuzzleNumbers}
+% The macro |\PuzzleNumbers| can be used to generate a numbered
+% list of boxes for the numbered crossword puzzles. The user is
+% supposed to collect the found letters here.
+%
+% \DescribeEnv{PuzzleWords}
+% The environment |PuzzleWords| can be sued to typeset the list of
+% words for a fill-in puzzle. It takes one argument. This is the
+% length of the words listed. For each length there should be an
+% invocation of this environment. The words in this environment are
+% supposed to be ordered alphabetically.
+%
+% \DescribeMacro{\Word}
+% The macro |\Word| is defined inside the environment
+% |PuzzleWords|. It takes one argument which is the word itself.
+%
+% \begin{verbatim}
+% \begin{PuzzleWords}{2}
+% \Word{EX}%
+% \Word{SP}%
+% \Word{TT}%
+% \end{PuzzleWords}%
+% \begin{PuzzleWords}{3}
+% \Word{AST}%
+% \Word{ETA}%
+% \end{PuzzleWords}%
+% \begin{PuzzleWords}{4}
+% \Word{PART}%
+% \end{PuzzleWords}%
+% \end{verbatim}
+%
+%
+% \section{Other Grid-based Puzzles}
+%
+% In addition to the crossword puzzles other puzzles based on a
+% grid can also be typeset with this package. The basic principle
+% is the same. Just some minor simplifications have been provided.
+%
+% \subsection{Sudoku}
+%
+% A Sudoku is a puzzle on a $9\times9$ grid. It is filled with nine
+% numbers. Each number occurs only once in each row, each column
+% and each of the nine $3\times3$ boxes. Initially some of the
+% numbers are shown. The goal is to fill in all missing digits.
+% \medskip
+%
+% \begin{Sudoku}
+% | 7|*2| 4| 1| 3| 5| 6|*9| 8|.
+% |*3| 8|*1|*9| 7|*6|*5| 4|*2|.
+% | 9| 6| 5|*8| 2|*4| 1| 3| 7|.
+% | 2|*9| 6| 7| 1| 8| 3|*5| 4|.
+% |*5| 1| 8|*2| 4|*3| 9| 7|*6|.
+% | 4|*7| 3| 6| 5| 9| 8|*2| 1|.
+% | 6| 3| 9|*4| 8|*7| 2| 1| 5|.
+% |*8| 4|*2|*5| 9|*1|*7| 6|*3|.
+% | 1|*5| 7| 3| 6| 2| 4|*8| 9|.
+% \end{Sudoku}
+%
+% \DescribeEnv{Sudoku}
+% The input for a Sudoku is given in a specialized environment.
+% Since the size is fixed there is no need to specify a size. We
+% separate the cells with a pipe symbol and mark the end of a line
+% with a dot. To mark those cells contianing the hints we preceed
+% the number with an asterisk.
+%
+% The Sudoku shown above is typeset from the following source:
+%
+% \begin{verbatim}
+% \begin{Sudoku}
+% | 7|*2| 4| 1| 3| 5| 6|*9| 8|.
+% |*3| 8|*1|*9| 7|*6|*5| 4|*2|.
+% | 9| 6| 5|*8| 2|*4| 1| 3| 7|.
+% | 2|*9| 6| 7| 1| 8| 3|*5| 4|.
+% |*5| 1| 8|*2| 4|*3| 9| 7|*6|.
+% | 4|*7| 3| 6| 5| 9| 8|*2| 1|.
+% | 6| 3| 9|*4| 8|*7| 2| 1| 5|.
+% |*8| 4|*2|*5| 9|*1|*7| 6|*3|.
+% | 1|*5| 7| 3| 6| 2| 4|*8| 9|.
+% \end{Sudoku}
+% \end{verbatim}
+%
+% As for crossword puzzles the macro |\PuzzleSolution| can be used
+% to switch to solution mode. Then all numbers are shown. The
+% parameters to modify the appearance of a puzzle work here as well. \medskip
+%
+% {\PuzzleSolution\PuzzleUnitlength=14pt\footnotesize\sf
+% \begin{Sudoku}
+% | 7|*2| 4| 1| 3| 5| 6|*9| 8|.
+% |*3| 8|*1|*9| 7|*6|*5| 4|*2|.
+% | 9| 6| 5|*8| 2|*4| 1| 3| 7|.
+% | 2|*9| 6| 7| 1| 8| 3|*5| 4|.
+% |*5| 1| 8|*2| 4|*3| 9| 7|*6|.
+% | 4|*7| 3| 6| 5| 9| 8|*2| 1|.
+% | 6| 3| 9|*4| 8|*7| 2| 1| 5|.
+% |*8| 4|*2|*5| 9|*1|*7| 6|*3|.
+% | 1|*5| 7| 3| 6| 2| 4|*8| 9|.
+% \end{Sudoku}}
+%
+% Since the characters in the solution are numbers only we can use
+% the following definition to colorize the cells in the solution.
+%
+% \begin{verbatim}
+% \def\PuzzleSolutionContent#1{\fboxsep=0pt
+% \def\myColor{}%
+% \ifcase#1
+% \def\myColor{white}%0
+% \or\def\myColor{red}%1
+% \or\def\myColor{green}%2
+% \or\def\myColor{yellow}%3
+% \or\def\myColor{orange}%4
+% \or\def\myColor{lime}%5
+% \or\def\myColor{purple}%6
+% \or\def\myColor{violet}%7
+% \or\def\myColor{teal}%8
+% \or\def\myColor{brown}%9
+% \else\def\myColor{white}%*
+% \fi
+% \colorbox{\myColor}{\makebox(1,1){#1}}}
+% \end{verbatim}
+%
+% With the help of the package \textsf{xcolor} for the predefined
+% colors we get the following output: \medskip
+%
+% {\def\PuzzleSolutionContent#1{\fboxsep=0pt
+% \def\myColor{}\ifcase#1
+% \def\myColor{white}\or\def\myColor{red}\or\def\myColor{green}\or\def\myColor{yellow}\or\def\myColor{orange}\or\def\myColor{lime}\or\def\myColor{purple}\or\def\myColor{violet}\or\def\myColor{teal}\or\def\myColor{brown}\else\def\myColor{white}\fi
+% \colorbox{\myColor}{\makebox(1,1){#1}}}
+% \PuzzleSolution\PuzzleUnitlength=14pt\footnotesize\sf
+% \begin{Sudoku}
+% | 7|*2| 4| 1| 3| 5| 6|*9| 8|.
+% |*3| 8|*1|*9| 7|*6|*5| 4|*2|.
+% | 9| 6| 5|*8| 2|*4| 1| 3| 7|.
+% | 2|*9| 6| 7| 1| 8| 3|*5| 4|.
+% |*5| 1| 8|*2| 4|*3| 9| 7|*6|.
+% | 4|*7| 3| 6| 5| 9| 8|*2| 1|.
+% | 6| 3| 9|*4| 8|*7| 2| 1| 5|.
+% |*8| 4|*2|*5| 9|*1|*7| 6|*3|.
+% | 1|*5| 7| 3| 6| 2| 4|*8| 9|.
+% \end{Sudoku}}
+%
+% Note that this definition has to be restricted to a local block
+% if you have solutions for other puzzle types in the same
+% document.
+%
+%
+% \subsection{Kakuro}
+%
+% In a Kakuro the cells are filled with digits. Each ``word''
+% consists of different digits; i.e. a number can not be repeated
+% in a consecutive horizontal or vertical sequence of numbers.
+%
+% The hints for the ``words'' are the sums of the digits.
+%
+% \begin{Kakuro}{6}{9}
+% | - |<:13> |<:37> | - |<:41> |<:7> | - |.
+% |<4:> |* 3 | 1 |<14:> | 8 | 6 | - |.
+% |<13:> | 9 |* 7 |<3:20>| 2 | 1 | - |.
+% |<11:> | 1 | 2 | 3 | 5 | - | - |.
+% | - |<23:> | 6 |* 8 | 9 | - | - |.
+% | - |<29:3>| 8 | 9 | 7 | 5 | - |.
+% |<11:> | 2 | 9 |<6:> |* 4 | 2 | - |.
+% |<5:> |* 1 | 4 |<7:> | 6 | 1 | - |.
+% | - | - | - | - | - | - | - |.
+% \end{Kakuro}
+%
+% \DescribeEnv{Kakuro}
+% The input for a Kakuro is given in a specialized environment. It
+% takes the width and the height as arguments.
+% We separate the cells with a pipe symbol and mark the end of a line
+% with a dot. To mark those cells contianing the initial digits we
+% preceed the digit with an asterisk.
+%
+% The hints are enteres in angle brackets. They contain the
+% horizontal and vertical sums separated by a colon. The sums can
+% be empty if none should be typeset.
+%
+% The Kakuro shown above is typeset from the following source:
+%
+% \begin{verbatim}
+% \begin{Kakuro}{6}{9}
+% | - |<:13> |<:37> | - |<:41> |<:7> | - |.
+% |<4:> |* 3 | 1 |<14:> | 8 | 6 | - |.
+% |<13:> | 9 |* 7 |<3:20>| 2 | 1 | - |.
+% |<11:> | 1 | 2 | 3 | 5 | - | - |.
+% | - |<23:> | 6 |* 8 | 9 | - | - |.
+% | - |<29:3>| 8 | 9 | 7 | 5 | - |.
+% |<11:> | 2 | 9 |<6:> |* 4 | 2 | - |.
+% |<5:> | 1 | 4 |<7:> | 6 | 1 | - |.
+% | - | - | - | - | - | - | - |.
+% \end{Kakuro}
+% \end{verbatim}
+%
+% As for crossword puzzles the macro |\PuzzleSolution| can be used
+% to switch to solution mode. Then all numbers are shown.
+%
+% \begin{minipage}{.25\textwidth}
+% {\PuzzleSolution
+% \PuzzleUnitlength=14pt
+% \footnotesize\sf
+% \begin{Kakuro}{6}{9}
+% | - |<:13> |<:37> | - |<:41> |<:7> | - |.
+% |<4:> |* 3 | 1 |<14:> | 8 | 6 | - |.
+% |<13:> | 9 |* 7 |<3:20>| 2 | 1 | - |.
+% |<11:> | 1 | 2 | 3 | 5 | - | - |.
+% | - |<23:> | 6 |* 8 | 9 | - | - |.
+% | - |<29:3>| 8 | 9 | 7 | 5 | - |.
+% |<11:> | 2 | 9 |<6:> |* 4 | 2 | - |.
+% |<5:> | 1 | 4 |<7:> | 6 | 1 | - |.
+% | - | - | - | - | - | - | - |.
+% \end{Kakuro}}
+% \end{minipage}\hfill
+% \begin{minipage}{.7\textwidth}\footnotesize
+% \begin{verbatim}
+% \PuzzleSolution
+% \PuzzleUnitlength=14pt
+% \footnotesize\sf
+% \begin{Kakuro}{6}{9}
+% | - |<:13> |<:37>| - |<:41>|<:7> | - |.
+% |<4:> |* 3 | 1 |<14:> | 8 | 6 | - |.
+% |<13:>| 9 |* 7 |<3:20>| 2 | 1 | - |.
+% |<11:>| 1 | 2 | 3 | 5 | - | - |.
+% | - |<23:> | 6 |* 8 | 9 | - | - |.
+% | - |<29:3>| 8 | 9 | 7 | 5 | - |.
+% |<11:>| 2 | 9 |<6:> |* 4 | 2 | - |.
+% |<5:> | 1 | 4 |<7:> | 6 | 1 | - |.
+% | - | - | - | - | - | - | - |.
+% \end{Kakuro}
+% \end{verbatim}
+% \end{minipage}
+%
+%
+% \section{Parameters and Options}
+%
+% The package cwpuzzle can be controlled by a rich set of macros.
+% In addition some settings can be performed with style options. The
+% following style options are recognized:
+% \begin{description}
+% \item [numbered]
+% The solution numbering is turned on.
+% \item [nocenter]
+% The puzzle is not typeset in a centered paragraph of its own.
+% \item [unboxed]
+% The clues are not enclosed in mini-pages and centered on the
+% page.
+% \item [normalsize]
+% The puzzle is set in normalsize. This is the default.
+% \item [small]
+% The puzzle is set in small. The size of the cell and the font
+% size of the solution are adjusted accordingly.
+% \item [large]
+% The puzzle is set in large. The size of the cell and the font
+% size of the solution are adjusted accordingly.
+% \item [german]
+% \item [ngerman]
+% The build in texts are switched to german variants. The
+% defaults are English. This options is also in effect when given
+% to the document class. The style inherits it from there.
+% \end{description}
+%
+% The style options can be passed to the style in the usual way:
+% \begin{verbatim}
+% \usepackage[nocenter,unboxed,small]{cwpuzzle}
+% \end{verbatim}
+%
+% The fine tuning can be achieved with the help of several macros.
+% Those macros are described below.
+%
+% \DescribeMacro{\PuzzleUnitlength}
+% The length |\PuzzleUnitlength| determines the width and height of
+% each single box in the frame of a crossword puzzle. The default
+% value is |20pt|.
+%
+% \DescribeMacro{\PuzzleBlackBox}
+% The macro |\PuzzleBlackBox| contains the commands to produce the
+% black boxes. It has to produce at most of width and height of
+% |\PuzzleUnitlength|. Per default it just produces a black
+% rectangle of this size.
+%
+% The following list shows some variants which can be achieved by
+% redefining the macro |\PuzzleBlackBox|.\medskip
+%
+% \noindent
+% \unitlength=\PuzzleUnitlength
+% \framebox(1,1){\rule{.75\PuzzleUnitlength}{.75\PuzzleUnitlength}}
+% \hfill
+% \begin{minipage}{.9\textwidth}
+% \begin{verbatim}
+% \renewcommand{\PuzzleBlackBox}{\rule{.75\PuzzleUnitlength}%
+% {.75\PuzzleUnitlength}}
+% \end{verbatim}
+% \end{minipage}
+%
+% \noindent
+% \framebox(1,1){\framebox(.75,.75){\framebox(.5,.5){}}}
+% \hfill
+% \begin{minipage}{.9\textwidth}
+% \begin{verbatim}
+% \renewcommand{\PuzzleBlackBox}{\framebox(.75,.75){%
+% \framebox(.5,.5){}}}
+% \end{verbatim}
+% \end{minipage}
+%
+% Additional effects can be achieved by using shades of gray (with
+% the |graphics| package).
+%
+% \DescribeMacro{\PuzzleFont}
+% The macro |\PuzzleFont| contains the font changing
+% command issued before the frame of the crossword puzzle.
+%
+% \DescribeMacro{\PuzzleNumberFont}
+% The macro |\PuzzleNumberFont| contains the font changing
+% command issued before a number in the frame of the crossword
+% puzzle is typeset.
+%
+% \DescribeMacro{\PuzzleClueFont}
+% The macro |\PuzzleClueFont| contains the font changing
+% command issued before the clues are typeset.
+%
+% \DescribeMacro{\PuzzleWordsText}
+% The macro |\PuzzleWordsText| contains the text which is typeset
+% at the beginning of the environment |PuzzleWords|. It has one
+% argument which contains the length of the words listed.
+%
+% \DescribeMacro{\PuzzleLettersText}
+% The macro |\PuzzleLettersText| contains the text which is typeset
+% at the beginning of the macro |\PuzzleLetters|.
+%
+% \DescribeMacro{\PuzzleSolution}
+% The macro |\PuzzleSolution| arranges everything that the
+% following puzzles are typeset in the ``solution'' mode, i.e. the
+% letters are shown and the clues are suppressed.
+%
+% This macros has one optional argument which has to be |true| or
+% |false|. This argument determines whether or not the numbers
+% should also be shown in the solution. The default is |false|
+% which means that the numbers are suppressed in the solution.
+%
+% \DescribeMacro{\PuzzleUnsolved}
+% The macro |\PuzzleUnsolved| arranges everything that the
+% following puzzles are typeset in the ``unsolved'' mode, i.e. the
+% letters are suppressed and the clues are shown.
+%
+% \DescribeMacro{\PuzzlePutNumber}
+% The macro |\PuzzlePutNumber| is a configuration macro which
+% typesets the number in a cell. The first argument is the x
+% coordinate. The second argument is the y coordinate. The third
+% argument is the number to be typeset. The coordinates are integer
+% numbers. The coordinate (0,0) is the lower left corner.
+%
+% \DescribeMacro{\PuzzleHook}
+% The macro |\PuzzleHook| is called at the end of the |Puzzle|
+% environment. It can be used to place additional graphical
+% elements in the puzzle frame.
+%
+% The following example shows a crossword puzzle which we have seen
+% before and the definition for the |\PuzzleHook|.\medskip
+%
+% \PuzzleUnsolved
+% \begin{minipage}{.35\textwidth}%
+% \newcommand\PuzzleHook{%
+% \put(0,2){\line(1,-1){2}}
+% \put(0,3){\line(1,1){2}}
+% \put(5,2){\line(-1,-1){2}}
+% \put(5,3){\line(-1,1){2}}
+% }
+% \begin{Puzzle}{5}{5}%
+% |{} |{} |[1]S|.
+% |{} |[2]M|I |[3]D|.
+% |[4]T|I |M |E |S |.
+% |{} |[5]N|E |G |.
+% |{} |{} |Q |.
+% \end{Puzzle}%
+% \end{minipage}%
+% \begin{minipage}{.6\textwidth}
+% \begin{verbatim}
+% \newcommand\PuzzleHook{
+% \put(0,2){\line(1,-1){2}}
+% \put(0,3){\line(1,1){2}}
+% \put(5,2){\line(-1,-1){2}}
+% \put(5,3){\line(-1,1){2}}
+% }
+% \end{verbatim}
+% \end{minipage}
+%
+% \DescribeMacro{\PuzzleLineThickness}
+% The macro |\PuzzleLineThickness| contains the width of the line
+% used to frame the cells.
+%
+% \DescribeMacro{\PuzzlePre}
+% This macro contains the code to be inserted before a puzzle is
+% typeset. It is initialized to begin a new paragraph and center the
+% puzzle.
+%
+% \DescribeMacro{\PuzzlePost}
+% This macro contains the code to be inserted after a puzzle is
+% typeset. It is initialized to end the paragraph and center the
+% puzzle.
+%
+% \DescribeMacro{\PuzzleCluePre}
+% This macro contains the code to be inserted before the clues are
+% typeset in normal mode. It is initialized to end the paragraph
+% and center the puzzle.
+%
+% \DescribeMacro{\PuzzleCluePost}
+% This macro contains the code to be inserted after the clues are
+% typeset in normal mode. It is initialized to end the paragraph
+% and center the puzzle.
+%
+% \DescribeMacro{\PuzzleContent}
+% This macro contains the content of a cell during formatting this
+% cell. This enables the cell formating macro to access it.
+%
+% \DescribeMacro{\PuzzleSolutionContent}
+% This macro processes the letter in solution mode. It takes one
+% argument, the letter. This macro can be redefinied to achieve
+% special effects for the solution.
+%
+% \DescribeMacro{\SudokuLinethickness}
+% This macro contains the thickness of the thick lines in a sudoku.
+%
+% \DescribeMacro{\KakuroNumberFont}
+% This macro contains the definition of the font switching macros
+% used when typesetting a Kakuro hint.
+%
+% \DescribeMacro{\KakuroHintTypeKakuroNumberFont}
+% This macro contains the cell type used when typesetting a Kakuro
+% hint. It can be used to redefine the appearance.
+%
+%
+%
+% \section{Further Plans}
+%
+% \subsection{General}
+%
+% Maybe I will add a mode for further variants of crossword puzzles
+% sometimes.
+%
+% Maybe I can add support for further languages if someone provides
+% the appropriate texts. Contributions are welcome.
+%
+%
+% \subsection{The Related Program}
+%
+% There is a related program written in Perl/Tk. This program can be
+% used to manually construct crossword puzzles and save them in a
+% format suitable for this package.
+% Other features include the creation of a proper frame and filling
+% with words.
+%
+% Right now I have not prepared a distribution of this program yet
+% since this program requires dictionaries which I can not
+% distribute legally.
+%
+% The crossword examples in this documentation have been computed
+% with the help of the |cwp| program.
+%
+%
+% \StopEventually{}
+% \newpage
+%
+%
+% \section{The Implementation}
+%
+% The crossword puzzle is basically implemented with the \LaTeX{}
+% picture environment. This gives us enough flexibility and
+% provides an high enough abstraction such that we do not have to
+% fiddle around with to many low level details.
+%
+% The natural unit in a crossword puzzle is a box which is empty
+% or black. Thus the |unitlength| is set to the width (and height)
+% of such a box.
+%
+%
+% \subsection{Basic Definitions and Parameters}
+%
+% First we identify this package.
+%
+% \begin{macrocode}
+\ProvidesPackage{cwpuzzle}[\filedate gene]
+% \end{macrocode}
+% Next we load the package amssymb beended for the triangles used
+% in Kakuros
+% \begin{macrocode}
+\RequirePackage{amssymb}
+% \end{macrocode}
+%
+% The dimen register |\PuzzleUnitlength| stores the height and
+% width of a box of the puzzle. The default is |20pt| which is
+% also shown in this documentation.
+% \begin{macrocode}
+\newdimen\PuzzleUnitlength
+\PuzzleUnitlength=20pt
+% \end{macrocode}
+%
+% \begin{macro}{\PuzzleClueFont}
+%
+% The macro |\PuzzleClueFont| contains font changing
+% commands issued before the clues are typeset.
+% \begin{macrocode}
+\newcommand\PuzzleClueFont{\footnotesize}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\PuzzleFont}
+%
+% The macro |\PuzzleFont| contains font changing
+% commands issued before the puzzle is typeset.
+% \begin{macrocode}
+\newcommand\PuzzleFont{\rm\normalsize}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\PuzzleNumberFont}
+% The macro |\PuzzleNumberFont| contains font changing
+% commands issued before the numbers in a puzzle are typeset.
+% \begin{macrocode}
+\newcommand\PuzzleNumberFont{\sf\scriptsize}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\PuzzleHook}
+% Puzzles are typeset with the \LaTeX{} picture environment. At the
+% end of this environment the macro |\PuzzleHook| is
+% called. The package produces an empty default. Users may want to
+% use this place to typeset additional elements on top of the
+% puzzle.
+%
+% The puzzle uses a |\unitlength| of |\PuzzleUnitlength|. Thus it
+% is rather easy to address the boxes in the puzzle.
+%
+% \begin{macrocode}
+\let\PuzzleHook=\relax
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{The Frame of the Crossword Puzzle}
+%
+% To describe the coordinates where the next box should be typeset
+% we need two counters for the coordinates. These counters are now
+% allocated (even though we could use temporary counters from
+% \LaTeX).
+% \begin{macrocode}
+\newcount\Puzzle@X
+\newcount\Puzzle@Y
+% \end{macrocode}
+%
+% \begin{macrocode}
+\begingroup
+\catcode`\|=13
+\gdef\Puzzle@@solution{
+ \let|=\Puzzle@Box@@solution
+ \let\Frame=\Puzzle@Frame@@solution
+}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\gdef\Puzzle@@normal{
+ \let|=\Puzzle@Box@@normal
+ \let\Frame=\Puzzle@Frame@@normal
+}
+\endgroup
+% \end{macrocode}
+%
+% \begin{environment}{Puzzle}
+% The environment |Puzzle| typesets the frame of a crossword
+% puzzle. It is implemented utilizing a |picture| environment. The
+% unitlength is set to the |\PuzzleUnitlength|. Thus the navigation
+% is fairly easy. The basic unit is width and height of a single
+% box.
+%
+% The macros which are local to the environment are activated. Thus
+% we avoid collisions with other packages where the same macro names
+% might be used.
+%
+% Finally the counter which contain the x and the y coordinate have
+% to be initialized.
+%
+% The last action in the |picture| environment is the expansion of
+% the macro |\PuzzleHook|. This can be used to include additional
+% material in the |picture| environment. Primarily I have use this
+% to include the ads. But now there is the macro |\Frame| for this
+% purpose.
+% \begin{macrocode}
+\newenvironment{Puzzle}[2]{\PuzzlePre
+ \catcode`\|=13
+ \@nameuse{Puzzle@@\Puzzle@TYPE}%
+ \unitlength=\PuzzleUnitlength
+ \linethickness{\PuzzleLineThickness}%
+ \Puzzle@Y=#2
+ \begin{picture}(#1,#2)
+ \Puzzle@Box@@normal.
+}{%
+ \PuzzleHook
+ \end{picture}\PuzzlePost
+}
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{macro}{\PuzzleLineThickness}
+% The macro |\PuzzleLineThickness| contains the width of the line
+% used to frame the cells.
+% \changes{1.5}{2006/08/11}{New}
+% \begin{macrocode}
+\newcommand\PuzzleLineThickness{.25pt}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\PuzzlePre}
+% This macro contains the code to be inserted before a puzzle is
+% typeset. It is initialized to begin a new paragraph and center the
+% puzzle.
+% \changes{1.5}{2006/08/11}{New}
+% \begin{macrocode}
+\newcommand\PuzzlePre{%
+ \par\noindent\mbox{}\hfill
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\PuzzlePost}
+% This macro contains the code to be inserted after a puzzle is
+% typeset. It is initialized to end the paragraph and center the
+% puzzle.
+% \changes{1.5}{2006/08/11}{New}
+% \begin{macrocode}
+\newcommand\PuzzlePost{%
+ \hfill\null\par\noindent
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\Puzzle@Frame@@normal}
+% The macro |Puzzle@Frame| is used to place additional
+% rectangular regions into the puzzle frame. This frame can contain
+% arbitrary text which is typeset in a centered environment.
+%
+% This macro takes five arguments. The first two arguments are the
+% coordinates of the upper left corner of the frame. The
+% coordinates are logical coordinates starting from the lower left
+% corner of the puzzle. The next two arguments are the width and the
+% height of the frame given in the number of boxes covered. Finally
+% the fifth argument contains the text which should appear in this
+% frame.
+% \begin{macrocode}
+\newcommand\Puzzle@Frame@@normal[5]{\put(#1,#2){\framebox(#3,#4){%
+ \begin{minipage}{#3\unitlength}\begin{center} #5
+ \end{center}\end{minipage}}}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\Puzzle@Frame@@solution}
+% For the solution the framed ads are simply ignored.
+% \begin{macrocode}
+\newcommand\Puzzle@Frame@@solution[5]{}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\PuzzleBlackBox}
+% The macro |\PuzzleBlackBox| is called to typeset the black boxes.
+% It should produce a box of at most width and height of
+% |\PuzzleUnitlength|.
+% \begin{macrocode}
+\newcommand\PuzzleBlackBox{\rule{\PuzzleUnitlength}{\PuzzleUnitlength}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\Puzzle@Box@@normal}
+% The macro |\Puzzle@Box@@normal| performs all tasks when a box
+% should be typeset in ``normal'' mode. The arguments are evaluated
+% and the appropriate type of box typeset or other actions performed.
+% \changes{1.4}{1996/11/25}{Minor bug fix. Using
+% \texttt{\char`\\ifx}
+% instead of \texttt{\char`\\if}.}
+% \changes{1.5}{2006/08/10}{Reimplemented to cope with two optional
+% arguments.}
+% \begin{macrocode}
+\newcommand\Puzzle@Box@@normal[1][]{%
+ \def\Puzzle@tmp@{#1}%
+ \Puzzle@Box@@normal@
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\Puzzle@Box@@normal@}
+% The macro |\Puzzle@Box@@normal@| performs all tasks when a box
+% should be typeset in ``normal'' mode. The arguments are evaluated
+% and the appropriate type of box typeset or other actions performed.
+% \changes{1.5}{2006/08/10}{Extracted from
+% \texttt{\char`\\Puzzle@Box@@normal}.}
+% \changes{1.7}{2009/06/09}{\texttt{\char`\\PuzzleContent} added to
+% transport the letter to the formatting macro.}
+% \begin{macrocode}
+\newcommand\Puzzle@Box@@normal@[2][f]{%
+ \def\PuzzleContent{#2}%
+ \def\Puzzle@tmp{#2}%
+ \if\Puzzle@tmp.
+ \Puzzle@X=0
+ \advance\Puzzle@Y-1
+ \else
+ \ifx\Puzzle@tmp\@empty
+ \else
+ \if\Puzzle@tmp*
+ \Puzzle@Cell@Loop *#1{}%
+ \else
+ \Puzzle@Cell@Loop #1{}%
+ \fi
+ \fi
+ \ifx\@empty\Puzzle@tmp@\else
+ \PuzzlePutNumber{\Puzzle@X}{\Puzzle@Y}{\Puzzle@tmp@}%
+ \fi
+ \advance\Puzzle@X 1
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\PuzzlePutNumber}
+% The macro |\PuzzlePutNumber| is a configuration macro which
+% typesets the number in a cell. The first argument is the x
+% coordinate. The second argument is the y coordinate. The third
+% argument is the number to be typeset.
+% \changes{1.5}{2006/08/10}{New}
+% \begin{macrocode}
+\def\PuzzlePutNumber#1#2#3{%
+ \put(#1,#2){\makebox(1,.95)[tl]{\PuzzleNumberFont\,#3}}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\Puzzle@Cell@Loop}
+% The macro |\Puzzle@Cell@Loop| processes its arguments until an
+% empty argument is found. For each argument it is tried to invoke
+% the corresponding cell drawing macro.
+% \changes{1.5}{2006/08/09}{New}
+% \begin{macrocode}
+\def\Puzzle@Cell@Loop#1{%
+ \def\Puzzle@tmp{#1}%
+ \ifx\Puzzle@tmp\@empty
+ \let\Puzzle@tmp\relax
+ \else
+ \expandafter\ifx\csname Puzzle@Cell@@#1\endcsname\relax
+ \typeout{cwpuzzle: Cell type #1 is undefined. I am ignoring it}%
+ \else
+ \csname Puzzle@Cell@@#1\endcsname{\Puzzle@X}{\Puzzle@Y}%
+ \fi
+ \let\Puzzle@tmp\Puzzle@Cell@Loop
+ \fi
+ \Puzzle@tmp
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\Puzzle@Box@@solution}
+% The macro |\Puzzle@Box@@solution| performs all tasks when a box
+% should be typeset in ``solution'' mode. The arguments are evaluated
+% and the appropriate type of box typeset or other actions performed.
+% \changes{1.4}{1996/11/25}{Minor bug fix. Using \texttt{\char`\\ifx} instead of \texttt{\char`\\if}.}
+% \changes{1.5}{2006/08/10}{Reimplemented to cope with two optional arguments.}
+% \begin{macrocode}
+\newcommand\Puzzle@Box@@solution[1][]{%
+ \def\Puzzle@tmp@{#1}%
+ \Puzzle@Box@@solution@
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\Puzzle@Box@@solution@}
+% The macro |\Puzzle@Box@@solution@| performs all tasks when a box
+% should be typeset in ``solution'' mode. The arguments are evaluated
+% and the appropriate type of box typeset or other actions performed.
+% \changes{1.5}{2006/08/10}{Reimplemented to cope with two optional arguments.}
+% \changes{1.9}{2014/01/12}{Macro PuzzleSolutionContent introduced as extension point}
+% \begin{macrocode}
+\newcommand\Puzzle@Box@@solution@[2][f]{%
+ \def\Puzzle@tmp{#2}%
+ \if\Puzzle@tmp.
+ \Puzzle@X=0
+ \advance\Puzzle@Y-1
+ \else
+ \ifx\Puzzle@tmp\@empty
+ \else
+ \if\Puzzle@tmp*
+ \Puzzle@Cell@Loop *#1{}%
+ \else
+ \Puzzle@Cell@Loop #1{}%
+ \put(\Puzzle@X,\Puzzle@Y){\PuzzleSolutionContent{#2}}%
+ \fi
+ \fi
+ \def\Puzzle@tmp{#1}%
+ \ifx\Puzzle@tmp\@empty\else
+ \ifPuzzle@SolutionNumbered
+ \PuzzlePutNumber{\Puzzle@X}{\Puzzle@Y}{\Puzzle@tmp@}%
+ \fi
+ \fi
+ \advance\Puzzle@X 1
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\PuzzleSolutionContent}
+% The macro |\PuzzleSolutionContent| procees the character in
+% solution mode. Per default it converts the argument to upper
+% caseand sets it in a box of size $1\times1$.
+% \changes{1.9}{2014/01/12}{Macro PuzzleSolutionContent introduced as extension point}
+% \begin{macrocode}
+\def\PuzzleSolutionContent#1{\makebox(1,1){\uppercase{#1}}}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Predefined Cell Types}
+% In this section a series of frame types are defined.
+%
+% \begin{macro}{\PuzzleDefineCell}
+% The macro |\PuzzleDefineCell| is a user command to define a new
+% cell type. The first argument contains the key under which the
+% cell type should be addressed. This key should be expandable and
+% should result into a single letter. Special effects can be
+% achieved with keys constituted of non letters or several
+% characters.
+%
+% The second argument contains the code to be stored for the key
+% given.
+% \changes{1.5}{2006/08/08}{New}
+% \begin{macrocode}
+\newcommand\PuzzleDefineCell[2]{
+ \global\@namedef{Puzzle@Cell@@#1}##1##2{#2}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\PuzzleDefineColorCell}
+%
+% \changes{1.5}{2006/08/11}{New}
+% \begin{macrocode}
+\newcommand\PuzzleDefineColorCell[2]{
+ \global\@namedef{Puzzle@Cell@@#1}##1##2{%
+ \fboxsep=0pt
+ \put(##1,##2){\makebox(1,1){\colorbox{#2}{\makebox(1,1){}}}}
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\PuzzleThickine}
+% The parameter |\PuzzleThickine| contains the expansion text to
+% be inserted. whenever a thick line is required. This means that
+% this macro arranges everything that a thick line is drawn.
+% Usually it contains an invocation to |\linethickness|. It can
+% be redefined to achieve other effects like even thicker lines
+% or colored lines. Note that the macro is used inside a group in
+% the predefined cell types.
+% \begin{macrocode}
+\def\PuzzleThickline{\linethickness{2pt}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\Puzzle@Cell@@T}
+% The letter T produces a thicker line at the top of the cell.
+% The thickness of this line is controlled by the macro
+% |\PuzzleThickline|.
+% \changes{1.5}{2006/08/08}{New}
+% \begin{macrocode}
+\PuzzleDefineCell{T}{{%
+ \advance#2 1
+ \PuzzleThickline
+ \put(#1,#2){{\line(1,0){1}}}
+}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\Puzzle@Cell@@t}
+% The letter t produces a frame with a thicker line at the top.
+% The thickness of this line is controlled by the macro
+% |\PuzzleThickline|.
+% \changes{1.5}{2006/08/08}{New}
+% \begin{macrocode}
+\PuzzleDefineCell{t}{{%
+ \put(#1,#2){\framebox(1,1){}}
+ \advance#2 1
+ \PuzzleThickline
+ \put(#1,#2){{\line(1,0){1}}}
+}}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\Puzzle@Cell@@B}
+% The letter B produces a thicker line at the bottom of the cell.
+% The thickness of this line is controlled by the macro
+% |\PuzzleThickline|.
+% \changes{1.5}{2006/08/10}{New}
+% \begin{macrocode}
+\PuzzleDefineCell{B}{{%
+ \PuzzleThickline
+ \put(#1,#2){{\line(1,0){1}}}
+}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\Puzzle@Cell@@b}
+% The letter b produces a frame with a thicker line at the bottom.
+% The thickness of this line is controlled by the macro
+% |\PuzzleThickline|.
+% \changes{1.5}{2006/08/10}{New}
+% \begin{macrocode}
+\PuzzleDefineCell{b}{{%
+ \put(#1,#2){\framebox(1,1){}}
+ \PuzzleThickline
+ \put(#1,#2){{\line(1,0){1}}}
+}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\Puzzle@Cell@@l}
+% The letter l produces a frame with a thicker line at the left
+% side of the cell. The thickness of this line is controlled by
+% the macro |\PuzzleThickline|.
+% \changes{1.5}{2006/08/10}{New}
+% \begin{macrocode}
+\PuzzleDefineCell{l}{{%
+ \put(#1,#2){\framebox(1,1){}}
+ \PuzzleThickline
+ \put(#1,#2){{\line(0,1){1}}}
+}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\Puzzle@Cell@@L}
+% The letter L produces a thicker line at the left side of the
+% cell. The thickness of this line is controlled by the macro
+% |\PuzzleThickline|.
+% \changes{1.5}{2006/08/10}{New}
+% \begin{macrocode}
+\PuzzleDefineCell{L}{{%
+ \PuzzleThickline
+ \put(#1,#2){{\line(0,1){1}}}
+}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\Puzzle@Cell@@r}
+% The letter r produces a frame with a thicker line at the right
+% side of the cell. The thickness of this line is controlled by
+% the macro |\PuzzleThickline|.
+% \changes{1.5}{2006/08/10}{New}
+% \begin{macrocode}
+\PuzzleDefineCell{r}{{%
+ \put(#1,#2){\framebox(1,1){}}
+ \advance #1 1
+ \PuzzleThickline
+ \put(#1,#2){{\line(0,1){1}}}
+}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\Puzzle@Cell@@R}
+% The letter R produces a thicker line at the right side of the
+% cell. The thickness of this line is controlled by the macro
+% |\PuzzleThickline|.
+% \changes{1.5}{2006/08/10}{New}
+% \begin{macrocode}
+\PuzzleDefineCell{R}{{%
+ \advance #1 1
+ \PuzzleThickline
+ \put(#1,#2){{\line(0,1){1}}}
+}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\Puzzle@Cell@@f}
+% The letter f produces a simple frame around the cell. This is
+% the default if nothing is specified.
+% \changes{1.5}{2006/08/08}{New}
+% \begin{macrocode}
+\PuzzleDefineCell{f}{{%
+ \put(#1,#2){\framebox(1,1){}}
+}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\Puzzle@Cell@@S}
+% The letter S produces the solution without any other formatting
+% around it.
+% \changes{1.7}{2009/06/09}{New}
+% \begin{macrocode}
+\PuzzleDefineCell{S}{{%
+ \put(#1,#2){\makebox(1,1){\expandafter\uppercase{\PuzzleContent}}}
+}}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\Puzzle@Cell@@.}
+% The character . produces no additional rendering it can be used
+% to overwrite the default rendering which is to place a frame
+% around the cell.
+% \changes{1.5}{2006/08/11}{New}
+% \begin{macrocode}
+\PuzzleDefineCell{.}{}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\Puzzle@Cell@@O}
+% The letter O produces an oval as drawn with the \LaTeX\ macro
+% \verb/\oval/.
+% \changes{1.5}{2006/08/11}{New}
+% \begin{macrocode}
+\PuzzleDefineCell{O}{{%
+ \put(\the#1.5,\the#2.5){\oval(1,1){}}
+}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\Puzzle@Cell@@o}
+% The letter o produces an oval inside a frame. T is is an
+% abbreviation for the two letters fO.
+% \changes{1.5}{2006/08/08}{New}
+% \begin{macrocode}
+\PuzzleDefineCell{o}{{%
+ \put(#1,#2){\framebox(1,1){}}
+ \put(\the#1.5,\the#2.5){\oval(1,1){}}
+}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\Puzzle@Cell@@*}
+% The letter * produces a solid black box.
+% \changes{1.5}{2006/08/08}{New}
+% \begin{macrocode}
+\PuzzleDefineCell{*}{%
+ \put(#1,#2){\framebox(1,1){\PuzzleBlackBox}}
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\Puzzle@Cell@@/}
+% The character / produces a line crossing the cell from lower
+% left to upper right.
+% \changes{1.5}{2006/08/08}{New}
+% \begin{macrocode}
+\PuzzleDefineCell{/}{{%
+ \put(#1,#2){{\line(1,1){1}}}
+}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\Puzzle@Cell@@,}
+% The character , produces a line crossing the cell from upper
+% left to lower right.
+% \changes{1.5}{2006/08/11}{New}
+% \begin{macrocode}
+\PuzzleDefineCell{,}{{%
+ \advance#2 1
+ \put(#1,#2){{\line(1,-1){1}}}
+}}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{Clues}
+%
+% \begin{macro}{\Puzzle@Clue@@normal}
+% The first and the third argument are shown as clue. This macro is
+% used for unsolved puzzles.
+% \begin{macrocode}
+\newcommand\Puzzle@Clue@@normal[3]{\textsf{#1} #3 }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\Puzzle@Clue@@solution}
+% In solutions clues are simply suppressed. Thus all three
+% arguments are discarded.
+% \begin{macrocode}
+\newcommand\Puzzle@Clue@@solution[3]{}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{environment}{Puzzle@Clues@@normal}
+% The environment |Puzzle@Clues@@normal| is mapped to |PuzzleClues|
+% in ``normal'' mode. It typesets its contents in a mini-page of
+% approximately half text width.
+% \begin{macrocode}
+\newenvironment{Puzzle@Clues@@normal}[1]{%
+ \let\Clue\Puzzle@Clue@@normal
+ \PuzzleCluePre
+ \PuzzleClueFont{#1}%
+}{\PuzzleCluePost }
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{macro}{\PuzzleCluePre}
+% The macro |\PuzzleCluePre| contains the code which is inserted
+% before the clues are typeset in normal mode.
+% \begin{macrocode}
+\newcommand\PuzzleCluePre{%
+ \null\hfill
+ \begin{minipage}[t]{.45\textwidth}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\PuzzleCluePost}
+% The macro |\PuzzleCluePost| contains the code which is inserted
+% after the clues are typeset in normal mode.
+% \begin{macrocode}
+\newcommand\PuzzleCluePost{
+ \end{minipage}\hfill\null
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{environment}{Puzzle@Clues@@solution}
+% The environment |Puzzle@Clues@@solution| is mapped to |PuzzleClues|
+% in ``solution'' mode. It just suppresses any output.
+% \begin{macrocode}
+\newenvironment{Puzzle@Clues@@solution}[1]{%
+ \let\Clue\Puzzle@Clue@@solution
+}{}
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{macro}{\PuzzleWordsText}
+% The macro |\PuzzleWordsText| is the text typeset at the beginning
+% of the environment |PuzzleWords|. It takes one argument which is
+% the length of the words listed.
+% \begin{macrocode}
+\newcommand\PuzzleWordsText[1]{Words of length #1: }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{environment}{Puzzle@Words@@normal}
+% The environment |Puzzle@Words@@normal| will be mapped to the
+% environment |PuzzleWords| in ``normal'' mode. It just arranges
+% that words are typeset after the |\PuzzleWordsText| has shown the
+% length of the words. Finally a new paragraph is started.
+% \begin{macrocode}
+\newenvironment{Puzzle@Words@@normal}[1]{%
+ \PuzzleWordsText{#1}%
+ \let\Word\relax
+}{\par}
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{environment}{Puzzle@Words@@solution}
+% The environment |Puzzle@Words@@solution| will be mapped to the
+% environment |PuzzleWords| in ``solution'' mode. It arranges
+% things that the contents is silently ignored.
+% \begin{macrocode}
+\newenvironment{Puzzle@Words@@solution}[1]{%
+ \newcommand\Word[1]{}%
+}{}
+% \end{macrocode}
+% \end{environment}
+%
+% \subsection{Numbers}
+%
+% \begin{macro}{\PuzzleNumbers}
+% The macro |\PuzzleNumbers| will produce a list of boxes with
+% numbers for letters. It is intended for numbered crossword puzzles.
+% \begin{macrocode}
+\newcommand\PuzzleNumbers[1]{\begingroup
+ \@nameuse{Puzzle@@\Puzzle@TYPE}%
+ \Puzzle@Y=0
+ \Puzzle@X=1
+ \unitlength=\PuzzleUnitlength
+ \Puzzle@Numbers#1.\endgroup}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\Puzzle@Numbers}
+% The macro |\Puzzle@Numbers| loops through the arguments until it
+% finds a dot. For each argument it produces a box, either with the
+% numbers or with the letters or both, depending on the current
+% settings.
+%
+% The loop is implemented via recursion. The box is typeset by the
+% \verb/|/ macro which takes care of the current settings. For this
+% purpose this character has to be made active temporarily.
+% \begin{macrocode}
+\begingroup
+\catcode`\|=13
+\gdef\Puzzle@Numbers#1{%
+ \if#1.
+ \let\next\relax
+ \else
+ \begin{picture}(1,1)
+ \xdef\X{\the\Puzzle@X}%
+ \Puzzle@X=0
+ |[\X]{#1}%
+ \end{picture}%
+ \let\next\Puzzle@Numbers
+ \advance\Puzzle@X 1
+ \fi
+ \next
+}
+\endgroup
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\PuzzleLettersText}
+% The macro |\PuzzleLettersText| contains the text typeset at the
+% beginning of the |\PuzzleLetters| environment.
+% \begin{macrocode}
+\newcommand\PuzzleLettersText{The following letters are used: }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\PuzzleLetters}
+% The macro |\PuzzleLetters| is intended to show the letters used
+% in a numbered crossword puzzle. The argument is the (sorted) list
+% of characters used.
+% \begin{macrocode}
+\newcommand\PuzzleLetters[1]{\PuzzleLettersText #1\par}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\Puzzle@TYPE}
+% The macro |\Puzzle@TYPE| contains the type of the puzzle. It is
+% used find the appropriate initialization macro.
+% \begin{macrocode}
+\newcommand\Puzzle@TYPE{normal}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\PuzzleSolution}
+% The macro |\PuzzleSolution| arranges everything that the
+% following puzzles are typeset in the ``solution'' mode, i.e. the
+% letters are shown and the clues are suppressed.
+%
+% This macros has one optional argument which has to be |true| or
+% |false|. This argument determines whether or not the numbers
+% should also be shown in the solution. The default is |false|
+% which means that the numbers are suppressed in the solution.
+% \begin{macrocode}
+\newcommand\PuzzleSolution[1][false]{%
+ \@nameuse{Puzzle@SolutionNumbered#1}%
+ \let\Kakuro@HINT\Kakuro@nohint
+ \let\PuzzleClues\Puzzle@Clues@@solution
+ \let\endPuzzleClues\endPuzzle@Clues@@solution
+ \let\PuzzleWords\Puzzle@Words@@solution
+ \let\endPuzzleWords\endPuzzle@Words@@solution
+ \def\Puzzle@TYPE{solution}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\PuzzleUnsolved}
+% The macro |\PuzzleUnsolved| arranges everything that the
+% following puzzles are typeset in the ``unsolved'' mode, i.e. the
+% letters are suppressed and the clues are shown.
+% \begin{macrocode}
+\newcommand\PuzzleUnsolved{%
+ \let\Kakuro@HINT\Kakuro@hint
+ \let\PuzzleClues\Puzzle@Clues@@normal
+ \let\endPuzzleClues\endPuzzle@Clues@@normal
+ \let\PuzzleWords\Puzzle@Words@@normal
+ \let\endPuzzleWords\endPuzzle@Words@@normal
+ \xdef\Puzzle@TYPE{normal}}
+% \end{macrocode}
+% \end{macro}
+%
+% The boolean |Puzzle@SolutionNumbered| determines whether or
+% not the solution should contain numbers. Initially it is set to
+% ``false''.
+%
+% \begin{macrocode}
+\newif\ifPuzzle@SolutionNumbered
+\Puzzle@SolutionNumberedfalse
+% \end{macrocode}
+%
+% \subsection{Sudoku}
+%
+% The challenge for the sudoku is to implement a convenient input syntax.
+%
+% \begin{environment}{Sudoku}
+% The environemnt |Sudoku| is used to typeset the puzzle.
+% The implementation defines the begin and end macro separately.
+% \changes{1.8}{2009/09/13}{New}
+% \begin{macrocode}
+\begingroup
+\catcode`\|=13
+\gdef\Sudoku{\begin{Puzzle}{9}{9}%
+ \let\Puzzle@pipe=|%
+ \def\PPa{\Puzzle@pipe[][fS]}%
+ \def|##1{\ifx##1*\let\next\PPa\else\Puzzle@pipe{##1}\let\next\relax\fi\next}
+}
+\endgroup
+% \end{macrocode}
+%
+% The macro |\endSudoku| contains the code to be expanded at the
+% end of the environment. It draws the field with the $3\times3$
+% boxes.
+% \changes{1.8}{2009/09/13}{New}
+% \begin{macrocode}
+\gdef\endSudoku{%
+ \multiput(0,0)(1,0)9{\framebox(1,1){}}
+ \multiput(0,1)(1,0)9{\framebox(1,1){}}
+ \multiput(0,2)(1,0)9{\framebox(1,1){}}
+ \multiput(0,3)(1,0)9{\framebox(1,1){}}
+ \multiput(0,4)(1,0)9{\framebox(1,1){}}
+ \multiput(0,5)(1,0)9{\framebox(1,1){}}
+ \multiput(0,6)(1,0)9{\framebox(1,1){}}
+ \multiput(0,7)(1,0)9{\framebox(1,1){}}
+ \multiput(0,8)(1,0)9{\framebox(1,1){}}
+ \linethickness{\SudokuLinethickness}%
+ \put(0,0){\framebox(9,9){}}
+ \put(3,0){\framebox(3,9){}}
+ \put(0,3){\framebox(9,3){}}
+\end{Puzzle}}
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{macro}{\SudokuLinethickness}
+% The macro |\SudokuLinethickness| contains the thickness od thick
+% lines in a Sudoku.
+% \changes{1.8}{2009/09/13}{New}
+% \begin{macrocode}
+\newcommand\SudokuLinethickness{2pt}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{Kakuro}
+%
+% \begin{macro}{\KakuroNumberFont}
+% The macro |\KakuroNumberFont| is used to typeset the hints, i.e.
+% the horizontal and vertical sums.
+% \changes{1.8}{2009/09/13}{New}
+% \begin{macrocode}
+\newcommand\KakuroNumberFont{\sf\tiny}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\Kakuro@cell}
+% The macro |\Kakuro@cell| is used to typeset the cells. It
+% analyzes the argument and acts accordingly.
+% \changes{1.8}{2009/09/13}{New}
+% \begin{macrocode}
+\def\Kakuro@cell#1{%
+ \ifx#1. \def\next{\Puzzle@pipe.}%
+ \else\ifx#1< \let\next\Kakuro@HINT
+ \else\ifx#1* \let\next\Kakuro@always
+ \else\ifx#1- \let\next\Kakuro@empty
+ \else\Puzzle@pipe#1 \let\next\relax
+ \fi\fi\fi\fi
+ \next
+}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\Kakuro@always}
+% The macro |\Kakuro@always| is used to draw a cell with an inital number.
+% \changes{1.8}{2009/09/13}{New}
+% \begin{macrocode}
+\def\Kakuro@always{\Puzzle@pipe[][fS]}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\Kakuro@empty}
+% The macro |\Kakuro@empty| is used to drae an empty cell.
+% \changes{1.8}{2009/09/13}{New}
+% \begin{macrocode}
+\def\Kakuro@empty{\Puzzle@pipe{}}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\Kakuro@hint}
+% The macro |\Kakuro@hint| is used to draw hints.
+% \changes{1.8}{2009/09/13}{New}
+% \begin{macrocode}
+\def\Kakuro@hint#1:#2>{%
+ \def\x{#2}%
+ \ifx\x\empty\else
+ \put(\Puzzle@X,\Puzzle@Y){\makebox(1,.8)[r]{\parbox{.95\unitlength}{\raggedright\KakuroNumberFont
+ $\blacktriangledown$\\#2}}}
+ \fi
+ \def\x{#1}%
+ \ifx\x\empty\else
+ \put(\Puzzle@X,\Puzzle@Y){\makebox(1,1.2){\parbox{.95\unitlength}{\raggedleft\KakuroNumberFont
+ #1 $\blacktriangleright$\\\mbox{}}}}
+ \fi
+ \Puzzle@pipe[][\KakuroHintType]{ }}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\Kakuro@nohint}
+% The macro |\Kakuro@nohint| is used to suppress hints in solution mode.
+% \changes{1.8}{2009/09/13}{New}
+% \begin{macrocode}
+\def\Kakuro@nohint#1:#2>{%
+ \Puzzle@pipe[][,]{ }}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\Kakuro@HINT}
+% The macro |\Kakuro@HINT| contains the definition to be used to
+% typeset hints. This indirection is needed to suppress hints in
+% solution mode.
+% \changes{1.8}{2009/09/13}{New}
+% \begin{macrocode}
+\let\Kakuro@HINT\Kakuro@hint
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{environment}{Kakuro}
+% The environemnt |Kakuro| is used to typeset the puzzle.
+% The implementation defines the begin and end macro separately to
+% cope with catcode changes.
+% \changes{1.8}{2009/09/13}{New}
+% \begin{macrocode}
+\begingroup
+\catcode`\|=13
+\gdef\Kakuro#1#2{\begin{Puzzle}{#1}{#2}%
+ \catcode`\|=13
+ \let\Puzzle@pipe=|
+ \let|=\Kakuro@cell
+}
+\endgroup
+% \end{macrocode}
+%
+% The macro |\endKakuro| contains the code to be expanded at the
+% end of the environment.
+% \changes{1.8}{2009/09/13}{New}
+% \begin{macrocode}
+\def\endKakuro{\end{Puzzle}}
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{macro}{\KakuroHintType}
+% The macro |\KakuroHintType| contains the cell type for
+% typesetting hint cells. It can be used to achieve a different
+% look and feel.
+% \changes{1.8}{2009/09/13}{New}
+% \begin{macrocode}
+\def\KakuroHintType{,}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{Initialization}
+%
+% Finally we arrange that the default behavior is to typeset an
+% unsolved crossword puzzle.
+%
+% \begin{macrocode}
+\PuzzleUnsolved
+% \end{macrocode}
+%
+% Now, that everything is in place we can arrange some package
+% options.
+% \changes{1.6}{2006/08/12}{Several style options defined}
+% \begin{macrocode}
+\DeclareOption{numbered}{\Puzzle@SolutionNumberedtrue}
+\DeclareOption{nocenter}{\let\PuzzlePre=\relax
+ \let\PuzzlePost=\relax}
+\DeclareOption{unboxed}{\let\PuzzleCluePre=\relax
+ \let\PuzzleCluePost=\relax}
+\DeclareOption{normalsize}{\PuzzleUnitlength=20pt
+ \def\PuzzleFont{\rm\normalsize}}
+\DeclareOption{small}{\PuzzleUnitlength=16pt
+ \def\PuzzleFont{\rm\small}}
+\DeclareOption{large}{\PuzzleUnitlength=24pt
+ \def\PuzzleFont{\rm\large}}
+\DeclareOption{german}{%
+ \renewcommand\PuzzleWordsText[1]{Worte der L\"ange #1: }%
+ \renewcommand\PuzzleLettersText{Benutzte Buchstaben: }%
+}
+\DeclareOption{ngerman}{%
+ \renewcommand\PuzzleWordsText[1]{Worte der L\"ange #1: }%
+ \renewcommand\PuzzleLettersText{Benutzte Buchstaben: }%
+}
+\ProcessOptions\relax
+% \end{macrocode}
+%
+% That's all.
+%
+% \PrintChanges
+% \newpage
+% \PrintIndex
+%
+% \Finale
+%
+\endinput
+%
+% Local Variables:
+% mode: latex
+% TeX-master: t
+% End: