%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\def\filename{cwpuzzle.dtx}
\def\fileversion{1.16}
\def\filedate{2026/04/29}
\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
%%         Brechklinge 10
%%         69256 Mauer (Germany)
%% Mail:   gene@gerd-neugebauer.de
%%
%% Copyright (c) 1995-2026 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.
%% 
%<*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\\
%         Brechklinge 10\\
%         69256 Mauer (Germany)\\
%         Net: \texttt{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,\rmfamily,\rule}
% \DoNotIndex{\scriptsize,\sf,\sffamily,\small,\textsf,\texttt,\textwidth}
% \DoNotIndex{\the,\tiny,\unitlength,\uppercase,\xdef,\ProvidesPackage}
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%    \changes{1.3}{1996/10/28}{First public release.}
%    \changes{1.16}{2026/04/29}{Typos in documentation fixed.}
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%    \CheckSum{675}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%  \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}
%      cwpuzzle.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}
%
%    \newpage
%    \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}%
%    \medskip 
%
%    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{Crossword Puzzles in \LaTeX}
%
%    Now we want to typeset crossword puzzles with \LaTeX. The package
%    tries to simplify this task. A puzzle can be shown in two
%    modes. The first one is the puzzle mode. Here the appearance is
%    targeted towards a user who wants to solve the puzzle. Thus he
%    wants to see the unfilled cell field.
%
%    The other mode is the solution mode. Here the user wants to see
%    the solution in order to compare that his filled puzzle is
%    correct or find correct parts of the puzzle that he didn't got.
%
%    We can imagine that the creator wants to typeset the unfilled
%    puzzle on one side and the solution on the next side. To achieve
%    this it would be helpful to use the same source for both places
%    to avoid any potential differences. This can be done by placing
%    the puzzle in a separate file.
%
%
%    \subsection{Crossword Puzzles from Files}
%
%    First let us consider the case that we put a puzzle in a
%    file. For example we might have a file |p-1234.tex| for the
%    puzzle. For out example this file contains an environment 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}
%      \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{verbatim}
%
%    Here a crossword puzzle is defined. It contains empty cells and
%    cells with letters and cells with additional numbers to refer to
%    the clues. You are free to arrange the parts however you
%    want. Here the puzzle is above the clues. The clues are side by
%    side.
%
%    You can also place the clues above the crossword puzzle.
%    With minipages and options you can place them even in other
%    constellations.
%
%    In the main document we can now use this file twise -- one time
%    for the unsolved puzzle and one time for the puzzle solution:
%
%    \begin{verbatim}
%    Lorem ipsum dolor sit...
%
%    \PuzzleUnsolved
%    \input{p-1234.tex}
%
%    \newpage
%    Lorem ipsum dolor sit amet, consectetur adipiscing elit,...
%
%    \PuzzleSolution
%    \input{p-1234.tex}\end{verbatim}
%
%    The macros |\PuzzleUnsolved| and |\PuzzleSolution| switch into the
%    respective mode. In the first mode the letters are not shown but
%    the clues are shown. In the second mode it is just vice versa.
%
%    The same trick also works for the other puzzle types in the
%    |cwpuzzle| package.
%
%
%    \subsection{Layouting Crossword Puzzles}
%
%    The various building blocks for crossword puzzles are provided as
%    macros or environments. Some of them have defaults. But most of
%    the layout is left to you.
%
%    For instance the number puzzle from section~\ref{sec:numbered} is
%    produced with
%    \begin{verbatim}
%    \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\end{verbatim}
%
%    As you can see the environment |Puzzle| and the macros
%    |\PuzzleLetters| and |\PuzzleNumbers| from the |cwpuzzle| package
%    are used. They are combined with minipages and paragraphs.
%
%
%    \section{Input for Crossword Puzzles}
%
%    The package provides a large number of ways to configure the
%    behaviour. Those are mainly encapsulated in \TeX\ macros.
%
%    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 which is drawn with the \LaTeX\ macro
%     \verb/\oval/.
%    \end{CellLetter}%
%    \begin{CellLetter}{o}
%      The letter o produces an oval inside a frame. This 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 if
%    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 the name of
%    the color to use for the background.\medskip
%
%    \noindent
%    \begin{minipage}{.65\textwidth}\small
%    \begin{verbatim}
%      \definecolor{gray}{gray}{.9}
%      \PuzzleDefineColorCell{c}{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{c}{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.
%
%    \changes{1.10}{2020/05/23}{Font changing macros modernized}
%    \begin{verbatim}
%    \begin{Puzzle}{8}{6}
%      \Frame{2}{2}{4}{2}{\sffamily 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}{\sffamily 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 is 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 used 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 containing 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\sffamily\footnotesize
%    \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\sffamily\footnotesize
%    \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 containing the initial digits we
%    preceed the digit with an asterisk.
%
%    The hints are entered 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
%     \sffamily\footnotesize
%    \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
%    \sffamily\footnotesize
%    \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 [huge]
%      The puzzle is set in huge. The size of the cell and the font
%      size of the solution are adjusted accordingly.
%    \item [Huge]
%      The puzzle is set in Huge. 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.
%    \item [french]
%      The build in texts are switched to French 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 such 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 such 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 center the puzzle clues. 
%
%    \DescribeMacro{\PuzzleCluePost}
%    This macro contains the code to be inserted after the clues are
%    typeset in normal mode. It is initialized to center the puzzle clues. 
%
%    \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{\KakuroHintType}
%    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 needed 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.
%    \changes{1.10}{2020/05/23}{Font changing macros modernized}
%    \begin{macrocode}
\newcommand\PuzzleFont{\rmfamily\normalsize}
%    \end{macrocode}
%    \end{macro}
%    
%    \begin{macro}{\PuzzleNumberFont}
%    The macro |\PuzzleNumberFont| contains font changing
%    commands issued before the numbers in a puzzle are typeset.
%    \changes{1.10}{2020/05/23}{Font changing macros modernized}
%    \begin{macrocode}
\newcommand\PuzzleNumberFont{\sffamily\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|  process the character in
%    solution mode. Per default it converts the argument to upper
%    case and 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 which is 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. This 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]{\PuzzleClueWidth}%
}
%    \end{macrocode}
%    \end{macro}
%    
%    \begin{macro}{\PuzzleClueWidth}
%    The macro |\PuzzleClueWidth| contains the default width of the
%    PuzzleClue environment.
%    \changes{1.14}{2026/02/11}{PuzzleClueWidth introduced.}
%    \begin{macrocode}
\newcommand\PuzzleClueWidth{.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 such 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 to find the appropriate initialization macro.
%    \begin{macrocode}
\newcommand\Puzzle@TYPE{normal}
%    \end{macrocode}
%    \end{macro}
%    
%    \begin{macro}{\PuzzleSolution}
%    The macro |\PuzzleSolution| arranges everything such 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 such 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}
%    \changes{1.13}{2025/01/23}{Minor fix for the solution mode}
%    \changes{1.15}{2026/02/11}{Using macro |\PuzzleFont|}
%    \begin{macrocode}
\begingroup
  \catcode`\|=13
  \gdef\Sudoku{\begin{Puzzle}{9}{9}%
    \PuzzleFont
    \def\PuzzleContent{}
    \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 of 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}
%    \changes{1.10}{2020/05/23}{Font changing macros modernized}
%    \begin{macrocode}
\newcommand\KakuroNumberFont{\sffamily\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}
%    \changes{1.10}{2020/05/23}{Font changing macros modernized}
%    \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 draw 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}
%    \changes{1.10}{2020/05/23}{Font changing macros modernized}
%    \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{\rmfamily\normalsize}}
\DeclareOption{small}{\PuzzleUnitlength=16pt
  \def\PuzzleFont{\rmfamily\small}}
\DeclareOption{large}{\PuzzleUnitlength=24pt
  \def\PuzzleFont{\rmfamily\large}}
%    \end{macrocode}
%    \changes{1.14}{2026/01/11}{huge option added}
%    \begin{macrocode}
\DeclareOption{huge}{\PuzzleUnitlength=32pt
  \def\PuzzleFont{\rmfamily\huge}
  \def\PuzzleNumberFont{\large}
  \def\PuzzleClueFont{\large}
}
\DeclareOption{Huge}{\PuzzleUnitlength=38pt
  \def\PuzzleFont{\rmfamily\Huge}
  \def\PuzzleNumberFont{\Large}
  \def\PuzzleClueFont{\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: }%
}
%    \end{macrocode}
%    \changes{1.15}{2026/01/13}{french option added}
%    \begin{macrocode}
\DeclareOption{french}{%
  \renewcommand\PuzzleWordsText[1]{Mots de longueur #1 : }%
  \renewcommand\PuzzleLettersText{Les lettres suivantes sont utilisées : }%
}
\ProcessOptions\relax
%    \end{macrocode}
%
%    That's all.
%
%    \PrintChanges
%    \newpage
%    \PrintIndex
%
%    \Finale
%
\endinput
%
% Local Variables: 
% mode: latex
% TeX-master: t
% End: 
