% \iffalse meta-comment
%%  File 'diagram.dtx'
%%
%% This file may be distributed and/or modified under the
%% conditions of the LaTeX Project Public License, either version
%% 1.2 of this license or (at your option) any later version.
%% The latest version of this license is in:
%%
%%    http://www.latex-project.org/lppl.txt
%%
%% and version 1.2 or later is part of all distributions of LaTeX
%% version 1999/12/01 or later.
%%
%%
% \fi
% \def\fileversion{v1.21}
% \def\docdate{2022/06/14}
% \CheckSum{4577}
% \changes{v0.1}{15 Februar 2004}{First Version}
% \changes{v0.2}{23 Februar 2004}{Added the documentation for the
% {\itshape information collecting} macros which may be used
% inside a environment.}
% \changes{v0.3}{21 May 2004}{Added list of commands which should
% not be indexed.}
% \changes{v0.4}{11 May 2005}{Added most missing user documentation.}
% \changes{v0.5}{25 May 2007}{Fixed wrong piece count when using
% imitators}
% \changes{v0.6}{01 June 2007}{Changed errneous code to parse given
% piececount.}
% \changes{v1.5}{09 March 2008}{Added license meta-comment to
% publish package on ctan.}
% \changes{v1.5.1}{08 Jun 2010}{Fixed font problem when writing
% producing piececounter in small diagrams.}
% \changes{v1.5.2}{13 Jun 2010}{Added some percent signs at line
% ends in @start@diagram and enddiagam to avoid accidently added
% spaces.}
% \changes{v1.5.3}{04 Oct 2010}{Changed switch, which is used to
% decide, whether infomration about computer proof is displayed
% to use standard boolean syntax. Symbols about computer
% proof are now created by standard commands and may
% therefore be changed by users.}
% \changes{v1.5.4}{03 Jun 2011}{Defined 2 different versions of
% @writename command, to be able to change it in other
% stylefiles for the part over the diagram without influencing
% the one used for the solution. Added commands to set white,
% black and neutral Circles within text.}
% \changes{v1.5.5}{01 July 2011}{Changed amount of lowering
% figurine pieces.}
% \changes{v1.5.6}{09 August 2011}{Added new command
% 'solpar' to allow use
% of 'putsol' inside a window environment.}
% \changes{v1.6}{30 April 2012}{Added boolean showcity and code
% to suppress display of city, when showcity is false. Added
% commands for academic titles, which allow to suppress their
% display.}
% \changes{v1.6.1}{24 September 2012}{Added new command piecedefs specify names
% of fairy pieces for rotated pieces.}
% \changes{v1.6.2}{11 November 2012}{Added boolean for allwhite problems.}
% \changes{v1.6.3}{12 November 2012}{Added boolean for board with switched field colors.}
% \changes{v1.6.4}{12 November 2012}{Added convenience command for 'allwhite' and 'switchcolors' booleans.}
% \changes{v1.6.5}{21 June 2013}{As suggested by Torsten Lin{\ss} and Thomas Brand added support for Equihopper and turned Equihopper (X)}
% \changes{v1.6.6}{06 July 2013}{Introduced new command to switch to the default diagram size.}
% \changes{v1.6.7}{17 August 2013}{Fixed issue '19a' with allwhite on quadratic fields.}
% \changes{v1.7.0}{17 August 2013}{Implemented Issue '32c': the command diagnum now allows to specify a prefix to be used for the following diagrams.}
% \changes{v1.8.0}{27 November 2013}{Implemented issue '03f/f2a': Added code to display a legend around the board, controlled by the boolean 'legend'.}
% \changes{v1.8.1}{17 August 2014}{Implemented issue '03f/83c': changed tex boolean solafterdiagram to latex boolean.}
% \changes{v1.9}{10 Januar 2015}{Implemented issue '03f/932': Renamed boardfont to cpd@boardfont due to a naming collision with another chess package. Changed all font definitions to newcommand instead of def.}
% \changes{v1.10}{26 January 2015}{Fixed issue: 03f/658:om: diagram.sty:
% evaluation of options 11pt and 12pt does not work.}
% \changes{v1.11}{30 January 2015}{Fixed issue 03f/e20:om: diagram.sty:
% piecedefs should be written after twins and before remarks.}
% \changes{v1.11.1}{16 March 2015}{Fixed issue 03f/b31:om: diagram.sty: label and ref don't respect diagnum prefix or diagnumbering setting.}
% \changes{v1.12}{06 January 2016}{Implemented issue: 03f/fc0:om: diagram.dtx: change  def x to  newcommand.\\
% Changed name of internal commands ds@left, ds@right, ds@upsidedown due to a naming collising with options from eurosym.sty.}
% \changes{v1.13}{04 April 2019}{Implemented issue: 03f/99b:om: diagram.dtx: added new command fen to allow entering forsyth-edwards-notation}
% \changes{v1.14}{02 September 2019}{Fixed issue with stereo- and space-diagrams.}
% \changes{v1.15}{28 December 2019}{Fixed frame issue with stereo- and space-diagrams.\\
% Added hook commands for begin/end diagram.}
% \changes{v1.16}{09 February 2020}{Fixed date display issue in
% figurine environment.\\
% Added hook commands to figurine environment.\\
% Fixed documentation bug: separation character in themes command is
% comma not semicolon.\\
% command diagnumbering fixed: boolean is changed to true globally.}
% \changes{v1.17}{27 December 2020}{Added generation of cpdparse.sty
% containing generic command for parsing lists.}
% \changes{v1.18}{04 February 2021}{03f/0be:om: Typo: above@newlne\\
% 03f/035:om: solnamestype has no effect}
% \changes{v1.19}{04 March 2021}{Minor fix in cl@arsol\\
% Added (empty) command gerne.}
% \changes{v1.20}{13 June 2022}{Introduced two booleans to better
% control displaying diagram number globally and locally.\\
% Removed the old boolean 'di@no'.}
% \changes{v1.21}{14 June 2022}{Impletemted issue: 03f/309:\\
% handle empty arguments in information collecting commands\\
% Fixed typo in @dia@fidealbum command.}
%
% \DoNotIndex{\@arabic,\def,\@idxitem,\@ifnextchar,\@ifstar,
% \@ne,\@ptsize,\ ,\advance,\AtEndOfPackage,\begin,\begingroup,
% \bfseries,\bgroup,\boolean,\box,\char,\chardef,\closeout,
% \count,\csname,\DeclareOption,\DocInput,\documentclass,
% \egroup,\else,\end,\endcsname,\endgroup,\endinput,\errmessage,
% \exhyphenpenalty,\expandafter,\fi,\font,\fonddimen,\gdef,\global,
% \hangafter,\hangindent,\hbox,\hfill,\hrule,\hsize,\hskip,\hss,\if,
% \ifcase,\ifdim,\iffalse,\ifmmode,\ifnum,\ifodd,\ifthenelse,
% \ifvmode,\ifx,\immediate,\index,\input,\itshape,\kern,\label,\let,
% \llap,\long,\loop,\lower,\mbox,\medskip,\multiply,\newboolean,\newbox,
% \newcount,\newcounter,\newdimen,\newif,\newindex,\newline,\newtoks,
% \newwrite,\noexpand,\noindent,\openout,\OptionNotUsed,\or,\p@,\par,
% \parindent,\parskip,\penalty,\printindex,\ProcessOptions,\ProvidesFile,
% \ProvidesPackage,\raise,\RecordChanges,\ref,\refstepcounter,\relax,
% \repeat,\RequirePackage,\rmfamily,\setboolean,\setbox,\setlength,
% \the,\textwidth,\unhbox,\usepackage,\vbox,\vfil,\vrule,\vskip,
% \vss,\vtop,\wd,\write,\xdef,\z@}
% 
% \title{Creating diagrams for chess problems\\{\large Version~\fileversion}}
% \author{Thomas Brand\\Bornheim\and Stefan H\"oning\\Neuss}
% \date{\docdate}
%
% \maketitle
%
% \begin{abstract}
% It have been more than ten years now, since we last published a documented
% version of the {\ttfamily diagram.sty}, which is mainly intended to
% be used for typesetting chess problems. Since 1994 I (Stefan H\"oning) made a
% couple of enhancements to the sourcecode of the style, without publishing and
% putting this into the documentation. We also needed to upgrade to \LaTeXe.
% The major change is the documentation language, which is english now.
%
% The style itself tries to collect very detailed information
% about a chess problem by providing a lot of commands,
% which you may use to specify the necessary information. There
% are different reasons for this.  One idea was to enable people
% to read \LaTeX-diagrams into databases with information as
% detailed as possible. Otherwise it should be easy to change the
% layout of a diagram by applying a changed style - not by
% changing the source.
% \end{abstract}
%
% \newpage
% \tableofcontents
% \newpage
%
% \newcommand{\explained}[1]{{\itshape#1}}
% \newcommand{\magazine}[1]{{\bfseries\itshape #1}}
% \newcommand{\Schwalbe}{\magazine{Die Schwalbe}}
%
% \section{Creating diagrams}
% \subsection{An introductary example}
% Let us first take a look at a simple example which should only
% show what you have to type into your \LaTeX-code to get nice
% looking diagrams.
%
% \bigskip
% %
% \begin{diagram}
%  \label{BSP1}
%  \author{Brand, Thomas}
%  \source{Problemkiste} \year{1992}
%  \dedic{Elmar Bartel gew.}
%  \pieces[2+3]{wKd1, wBe2, sKh8, sBe4, sTa4}
%  \stip{h\#7}
%  \sol{1.Ta3 Kc2!, 2.Tf3 e\x f3, 3.e3 f4, 4.e2 f5, 5.e1T f6, 
%       6.Th1! (Te7?) f7, 7.Th7 f8D\#}
% \end{diagram}
% \hfill
% \begin{diagram}
%  \label{BSP2}
%  \setboolean{legend}{true}
%  \author{Brand, Thomas}
%  \source{Problemkiste} \year{1992}
%  \fen{8/1k6/8/1B6/K6p/7N/8/8}
%  \stip{h\#5}
%  \sol{1.Ka8 Sg1, 2.h3 Ka5, 3.h2 Kb6, 4.h\x g1L+ Kc7, 5.La7 Lc6\#}
% \end{diagram}
%
% \putsol
%
% \bigskip
% To use the package you have to make it available to \LaTeX\ using 
% \verb+\usepackage{diagram}+ inside the preamble of your document.
%
% Then you may use the {\ttfamily diagram} environment to create
% the diagrams. For the above example I had to type the
% following:
%
% \begin{verbatim}
% \begin{diagram}
%  \author{Brand, Thomas}
%  \source{Problemkiste} \year{1992}
%  \dedic{Elmar Bartel gew.}
%  \pieces[2+3]{wKd1, wBe2, sKh8, sBe4, sTa4}
%  \stip{h\#7}
%  \sol{1.Ta3 Kc2!, 2.Tf3 e\x f3, 3.e3 f4, 4.e2 f5, 5.e1T f6, 
%       6.Th1! (Te7?) f7, 7.Th7 f8D\#}
% \end{diagram}
%%
% \hfill
%%
% \begin{diagram}
%  \setboolean{legend}{true}
%  \author{Brand, Thomas}
%  \source{Problemkiste} \year{1992}
%  \pieces[3+2]{wKa4, wLb5, wSh3, sKb7, sBh4}
%  \stip{h\#5}
%  \sol{1.Ka8 Sg1, 2.h3 Ka5, 3.h2 Kb6, 4.h\x g1L+ Kc7, 5.La7 Lc6\#}
% \end{diagram}
%
% \putsol
% \end{verbatim}
%
% \DescribeEnv{diagram}
% Any information which belongs to a problem should be put
% between \verb+\begin{diagram}+ and \verb+\end{diagram}+. The
% above examples contains information for \explained{authors,
% source, year of publication, stipulation, solution} and (in
% diagram \ref{BSP1}) a \explained{dedication}.
%
% This information is shown around a chessboard except the
% solution, which is collected and put into the output using the
% \verb+\putsol+ command.
%
% \subsection{Elements of a diagram}
% This section describes the elements which may be used inside a 
% {\ttfamily diagram} environment. For most of these elements
% there is no sense using them between \verb+\begin{diagram}+ and
% \verb+\end{diagram}+. Some of them will not work outside of the
% environment (like |\author|). In case you use these switches
% anywhere outside you will specify the information for all
% problems in your surrounding environment (which may be the
% complete document).
%
% \subsubsection{Collecting the problem information}
% \MakeShortVerb{\|}
% The following information is typically given with a problem:
% \begin{itemize}
% \item \DescribeMacro{\author}
% With the |\author| tag you specify one author or a list of authors.
% If you specify more than one author, you must separate them
% with ";~". Normally an author is given as \explained{"sirname,
% givenname"}. You may change the way, how the name is
% interpreted by \LaTeX\ using |\normalnames| and
% |\reversednames|. This \verb+\author+ command does only
% overwrite the default behaviour when used inside a diagram
% environment.
% \item \DescribeMacro{\Dr} \DescribeMacro{\Prof}
% \DescribeMacro{\ProfDr}
% Within the Authors command you should use the commands |\Dr|,
% |\Prof| and |\ProfDr| to specify these academic titles. So one
% may switch off the display of these titles --- like it is
% generally done inside \Schwalbe.
% \item \DescribeMacro{\pieces}
% With |\pieces| you specify the position to be displayed on the
% board. For each kind of piece you may specify a list of fields.
% Different lists of fields are separated by ",~". So the general
% syntax for specifying the position of a specific piece
% is:\newline
% [color][piece]\{rotation of piece\}[list of squares];\newline
% e.\,g. {\ttfamily wTa1h1} should be clear, {\ttfamily nKa4} is
% a neutral king on a4\newline
% {\bfseries w s n} may be used to specify the color of the
% piece.\newline
% {\bfseries K D T L S B C E X} may be used to specify the piece. A {\bfseries
% C} is used for an imitator, {\bfseries E} for an equihopper and {\bfseries X}
% for a rotated equihopper. You may {\itshape not} use an optional rotation
% with {\bfseries C, E} and {\bfseries X}.\newline
% {\bfseries R U L} may be used to specify an optional rotation:
% right, upside-down, left. So you may use {\ttfamily sDUc7} for
% a grashopper on c7 --- displayed as an upsidedown
% queen.\newline The characters used to specify color, piece and
% rotation may be changed using the |\DefinePieces| command.
%
% You may also optionally specify the number of pieces in your
% diagram, which then will be used to control your input
% automatically.
%
% There is also support for an imitator, which is typically
% displayed as a black filled circle. So {\ttfamily sCf4} will
% produce the symbol of an imitator. This is shown in
% diagram~\ref{bigdia}.
% \item \DescribeMacro{\fen}
% As an alternative notation it is possible to enter the position in
% \textit{Forsyth-Edwards-Notation}. This is possible for 8\,$\times$\,8 boards
% only.
%
% As an example: The position in diagram~\ref{BSP2} was created via\newline
% |\fen{8/1k6/8/1B6/K6p/7N/8/8}|.
% 
%
% As with the |\pieces| command, you may provide the number of white and
% black pieces as an optional parameter.
% \item \DescribeMacro{\stipulation} \DescribeMacro{\stip}
% is used to specify the stipulation of the problem, e.\,g.\ 
% |\stipulation{\#2}| may be used to specify a \explained{mate in
% two}. There is also an abbreviation |\stip| for this macro.
% \item \DescribeMacro{\city}
% may be used to specify the city and country, where the author
% or the authors live. I use this inside the original section of 
% \Schwalbe. You should separate multiple cities (for multiple
% authors) with ";~". There is also a boolean switch |showcity|,
% which contols, whether this information is displayed.
% \item \DescribeMacro{\specialdiagnum}
% May be used to suppress the default diagram numbering (which
% uses a counter) and instead directly providing a diagram
% "number" which may be an arbritary text. This may also be used to
% suppress displaying a diagram number by providing an empty argument
% \verb+{}+.
% \item \DescribeMacro{\sourcenr}
% May be used to specify the number which was used for the
% problem inside an originals section.
% \item \DescribeMacro{\source}
% May be used to specify the book or magazine where the problem
% was issued first.
% \item \DescribeMacro{\issue}
% May be used to specify e.\,g.\ the issue of a magazine where
% the problem was issued.
% \item \DescribeMacro{\pages}
% May be used to specify the page (or pages) where the problem
% was issued.
% \item \DescribeMacro{\day}
% \DescribeMacro{\month}\DescribeMacro{\months}
% \DescribeMacro{\year}
% May be used to specify the different parts of the date of
% publication of the problem. (E.\,g.\ for problems issued in the
% german magazine \Schwalbe\ you will typically only specify the
% |\month| and the |\year|. For problems issued in
% \magazine{feenschach} you may specify a period of months like 
% |\months{7-10}|.)
% \item \DescribeMacro{\tournament}\DescribeMacro{\award}
% May be used to specify an award and a tournament for the
% problem.
% \item \DescribeMacro{\dedication}\DescribeMacro{\dedic}
% May be used to specify a dedication which was given by the 
% author of the problem.
% \item \DescribeMacro{\condition}\DescribeMacro{\cond}
% May be used to specify the fairy conditions of a problem.
% Different conditions should be separated with ";~".
% \item \DescribeMacro{\twins}
% May be used to specify the different twins of a problem.
% Different twins should be separated with ";~".
% \item \DescribeMacro{\remark}\DescribeMacro{\rem}
% May be used to specify remarks to the problem. I typically use
% this to explain fairy pieces on the board. You may also use the 
% abbreviation |\rem|.
% \item \DescribeMacro{\piecedefs}
% May be used to explain rotated pieces. An example:\newline
% \verb+\piecedefs{{ws}{TL}{Turm-L\"aufer-J\"ager}; {wn}{SU}{Nachtreiter}}+
% will create\newline
% \hbox{\wTL\sTL = Turm-L\"aufer-J\"ager}\newline
% \hbox{\wSU\nSU = Nachtreiter}\newline
% under the diagram.
% \item \DescribeMacro{\solution}\DescribeMacro{\sol}
% |\solution| may be used to specify the solution of the problem.
% Normally this information is not used while displaying the
% board but it is only collected and may be put into your text
% using |\putsol|. There is also an abbreviation |\sol|.
% \item \DescribeMacro{\judgement}
% May be used to describe the judgement given for a problem,
% e.\,g. when you are working on an award or when you are
% selecting problems for a "best of \dots{}" book.
% \item \DescribeMacro{\comment}
% May be used to specify some comment on the problem (e.\,g. the
% authors original comment.)
% \item \DescribeMacro{\themes}
% May be used to specify themes displayed in the problem.
% Different themes should be separated with ",~". When creating a 
% theme index, the themes will automatically be used to create
% the register.
% \item \DescribeMacro{\genre}
% May be used to specify genre of the problem.
% Different genres should be separated with ",~".
% The values are intended to using \LaTeX\-import within the PDB.
% \end{itemize}
%
% When providing an empty argument to commands \verb+\award+,
% \verb+\after+, \verb+\dedic+, \verb+\correction+ and \verb+\version+
% only a warning is issued to the logfile. In previous
% versions of \verb+diagram.sty+ using empty arguments with the
% mentioned commands produced empty lines above the diagram.
%
%
% There are some commands which not only collect information but
% normally direct result in a change of the diagram. These are:
%
% \begin{itemize}
% \item \DescribeMacro{\verticalcylinder}
% does not display the outer vertical lines to symbolize a
% verticalcylindric board.
% \item \DescribeMacro{\horizontalcylinder}
% does not display the outer horizontal lines to symbolize a
% horizontalcylindric board.
% \item \DescribeMacro{\noframe}
% does completely suppress the outer frame e.\,g.\ to symbolize a
% torus board.
% \item \DescribeMacro{\noinnerframe}
% sometimes you need to suppress the inner frame instead of the
% outer frame which is achieved by using |\noinnerframe|. You may
% not use this together with |\noframe|.
% \item \DescribeMacro{\gridchess}
% displays lines to seperates fieldsections for gridchess.
% \end{itemize}
%
% \subsubsection{Modifying the layout of the diagram (and the
% solution)}
% There are a couple of switches which control the layout of
% the diagrams. These are typically used more generally, so you
% may specify these switches outside the {\ttfamily diagram}
% environment or use them in your own style, which depends on
% {\ttfamily cpd.sty}.
%
% There are some switches which control the layout of the
% information which is displayed above a diagram:
% \begin{itemize}
% \item \DescribeMacro{\diagleft}
% displayes the information left aligned
% \item \DescribeMacro{\diagcenter}
% displayes the information centered
% \item \DescribeMacro{\diagright}
% displayes the information right aligned
% \item \DescribeMacro{\widedias}
% is like |\diagcenter| but the information shown above the
% diagram may span the whole width of the page. So \LaTeX\ will
% not wrap long author names.
% \end{itemize}
%
% \DescribeMacro{\dianamestyle}
% \DescribeMacro{\solnamestyle}
% Using |\dianamestyle| (or |\solnamestyle|) you may specify how
% authornames are written above the boards (or before the
% solutions). You may use this only if you use |\reversednames|
% (which is the default). Otherwise it is not possible to
% distuingish between firstname and sirname. You must specify one
% of the following options as parameter to |\dianamestyle| (or
% |\solnamestyle|):
% \begin{description}
% \item[fullname]
% Writes the authorname as {\itshape firstname sirname}. This is
% the default.
% \item[sirname]
% Writes the {\itshape sirname} only.
% \item[short]
% Writes an abbreviation of the {\itshape firstname} and the
% {\itshape sirname}. The abbreviation is calculated as follows:
% \begin{itemize}
% \item The first letter of the {\itshape firstname} will be
% used.\newline
% |\author{Brand, Thomas}| will be displayed as {\bfseries T.
% Brand}
% \item When there is a combined {\itshape firstname} separated
% with a hyphen, each first letter will be used. (see
% below)\newline
% |\author{Reich, Hans-Peter}| will be displayed as {\bfseries
% H.-P. Reich}
% \item When specifying the author name, you may provide the
% abbreviation for the firstname using the form {\itshape
% sirname, firstname/abbreviation}.\newline
% |\author{Brand, Thomas/Th.}| will be displayed as {\bfseries
% Th.~Brand}
% \end{itemize}
% \item[noname]
% displayes nothing
% \end{description}
%
% \DescribeMacro{\diagnumbering}
% The same way you may specify |\pagenumbering| you may specify
% the format the diagrams are numbered using |\diagnumbering|
% and |\pagenumbering| you may specify {\ttfamily arabic, Roman, roman,
% Alph or alph}. The default used is {\ttfamily arabic}.
% This command also switches the display for diagram numbers on.
%
% \DescribeMacro{\setmonthstyle}
% You may also specify the way a month is displayed using
% |\setmonthstyle|.
%
% There are some boolean switches, which control whether a specific
% information is displayed. These are as follows:
% \begin{itemize}
% \item \DescribeMacro{piececounter}
% This is a \LaTeX\ boolean, which is used to specify whether the
% number of pieces is displayed below the board. So you may
% change its value using |\setboolean{piececounter}{true}| or
% |\setboolean{piececounter}{false}|.
% \item
% \DescribeMacro{showcomputer}
% \DescribeMacro{\nocomputer}\DescribeMacro{\showcomputer}
% There is a boolean value |computer|, which controls whether the
% infomration about a computer proof is displayed or not.  This
% value may be changed using |\setboolean{showcomputer}{true}| or
% |\setboolean{showcomputer}{false}| For backwards compatiblity
% we support the macros |\nocomputer| and |\showcomputer|.
% \item \DescribeMacro{showcity}
% This is a boolean switch, which controls whether the informated
% gathered using the |\city| command is displayed. The default of
% this value is |false|.
% \item \DescribeMacro{showacademictitle}
% This is a boolean switch, which controls whether academic
% titles |\Dr|, |\Prof| or |\ProfDr| --- typically used within
% the |\author| command --- are displayed. The default is |true|.
% \item \DescribeMacro{legend}
% This boolean controls whether a legend is displayed.  The default
% value of this value is |false|. When legends are displayed the
% distance between inner and outer frame is automatically adjusted.
% \end{itemize}
%
% \DescribeMacro{\notcomputerproofedsymbol}
% \DescribeMacro{\computerproofedsymbol}
% You may specify the text, which is used indicate, whether a
% problem is proofed by a computer. To specifiy the symbol for a
% problem, which is proofed, is created by
% |\computerproofedsymbol|.  To specifiy the symbol for a
% problem, which is not computer proofed, is created by
% |\notcomputerproofedsymbol|. You may redefine these commands by
% standard \LaTeX\ means (|\renewcommand|).

%
% \DescribeMacro{\selectelchfont}
% You may specify which font is used for the chesspieces. There
% are two possible fonts:
% \begin{description}
% \item[pk] for the font which was originally used in the german
% magazine \magazine{Problemkiste}
% \selectelchfont{pk}\hbox{\wK\wD\wT\wL\wS\wB\sK\sD\sT\sL\sS\sB}
% \item[fs] for the font which was first used (and was created
% for) the magazine \magazine{feenschach}
% \selectelchfont{fs}\hbox{\wK\wD\wT\wL\wS\wB\sK\sD\sT\sL\sS\sB}
% \end{description}
%
% \DescribeMacro{\diagramx}
% \DescribeMacro{\diagramxi}
% \DescribeMacro{\diagramxii}
% In analogy to the defaults for fontsizes of a document you may
% specify sizes of the fonts used in a diagram. The default will
% be set according to the fontsize specified as the
% |\documentclass| option.
% 
% \subsubsection{Other commands}
% \begin{itemize}
% \item \DescribeMacro{\label}
% This overrides the normal |\label| definition such that the 
% diagram number is displayed when using |\ref| instead of the 
% page number.
% \item \DescribeMacro{\diagnum} 
% This macro expects a number as a parameter. The number will be used to
% (re-)initialize the diagram number counter. With this command the output of
% diagram numbers also is switched on. It must be used outside the {\ttfamily
% diagram} environment.  As an optional parameter you may specify something,
% which will be used as prefix before the automatically updated diagram numbers.
% E.\,g.\ the command \verb+\diagnum[T-]{4}+ will produce the following diagram numbers for the
% following diagrams: \textbf{T-4}, \textbf{T-5}, \textbf{T-6}, \dots{}
% \end{itemize}
%
%
% \subsection{Special boards}
% \subsubsection{Changing the boardsize}
% \DescribeEnv{diagram[]}
% Instead of using a boardsize of $8\times8$ some fairy problems
% need smaller or larger boards. This can be achieved by
% specifying the rows and columns as an optional parameter to the
% |\begin{diagram}| environment. You first have to specify the
% columns and then the rows as the following examples shows.
%
% \bigskip
% \begin{diagram}[17x11]
% \label{bigdia}
% \pieces{wKUi{11}, sKRj9, sCc5b4}
% \end{diagram}
% \hspace{2em}
% \begin{minipage}[t]{7cm}
% \vspace*{-5cm}
% is created by
%
% \bigskip
% \begin{verbatim}
% \begin{diagram}[17x11]
% \label{bigdia}
% \pieces{wKUi{11}, sKRj9, sCc5b4}
% \end{diagram}
% \end{verbatim}
% \end{minipage}
%
% As you can see in the example, pieces are set using the
% |\pieces| macro. When using boards with more than 8 lines you
% have to continue with charachters {\bfseries i, j, k, \dots}\@
% In a board with more than 9 rows you have to specify the rows
% in curly braces \{ \} as shown in the example.
%
% \subsubsection{Stereo- and Space-Chess-Diagrams}
% \DescribeEnv{stereodiagram}
% \DescribeEnv{spacediagram[]}
% Other boards which are used from time to time are stereochess
% or spacechess boards (although there are quite few people which
% really have such boards!). To create these boards you just have
% to use either the |stereodiagram| or |spacediagram| environment
% instead of the normal |diagram| environment. Here is an
% example:
%
%
% \begin{stereodiagram}
% \author{Jensch, Gerhard W.}
% \sourcenr{3104.}
% \source{feenschach}
% \year{1980}
% \award{Preis}
% \pieces{wKf3, wTf6d5A, wLe3, wSf4A, sKe5, sTc4D, sLc4C, sSc6, sBb6c4A}
% \stip{\#9}
% \end{stereodiagram}
% \hfill
% \begin{spacediagram}
% \author{Dawson, T. R.}
% \sourcenr{6595.}
% \source{Fairy Chess Review}
% \month{12}
% \year{1945}
% \pieces{wKc1A, wLe1A, sKa1A, sBa2Aa1Ba2Bd3Be4Bd2Ce2D}
% \stip{\#2}
% \end{spacediagram}
%
% These diagrams have been produced by the following code:
%
% \begin{verbatim}
% \begin{stereodiagram}
% \author{Jensch, Gerhard W.}
% \sourcenr{3104.}
% \source{feenschach}
% \year{1980}
% \award{Preis}
% \pieces{wKf3, wTf6d5A, wLe3, wSf4A, sKe5, sTc4D, sLc4C, sSc6, sBb6c4A}
% \stip{\#9}
% \end{stereodiagram}
% \hfill
% \begin{spacediagram}
% \author{Dawson, T. R.}
% \sourcenr{6595}.
% \source{Fairy Chess Review}
% \month{12}
% \year{1945}
% \pieces{wKc1A, wLe1A, sKa1A, sBa2Aa1Ba2Bd3Be4Bd2Ce2D}
% \stip{\#2}
% \end{spacediagram}
% \end{verbatim}
%
% The main change is within the notation of the pieces, but
% people knowing space- or stereo-chess problems see that the
% notation is just one would expect.
%
% \DescribeMacro{\spacelayout}
% Sometimes one would like show the different planes of a
% space diagram from left to right. This may be switched using
% the |\spacelayout| command, which takes one parameter:
%
% \begin{description}
% \item[vertical] for planes organized bottom up
% \item[horizontal] for planes organized left to right
% \end{description}
%
% \noindent\begin{spacediagram}[4x2x3]
% \spacelayout{horizontal}
% \end{spacediagram}
% \hfill%
% \hbox{\vbox{%
% \hsize6cm
% Is produced by
%
% \begin{verbatim}
% \begin{spacediagram}[4x2x3]
% \spacelayout{horizontal}
% \end{spacediagram}
% \end{verbatim}
% }}
%
% \subsubsection{Cylindric boards / suppressing frames}
% \noindent\hbox{}%
% \DescribeMacro{\horizontalcylinder}
% \DescribeMacro{\verticalcylinder}
% \DescribeMacro{\noframe}
% \DescribeMacro{\noinnerframe}
% To stylize a cylindric board one typically does not show parts
% of the frame. When using |\verticalcylinder|\, the horizontal
% lines of the outer frame will not be drawn.
% |\horizontalcylinder|\, suppresses the drawing of the vertical
% lines of the outer frame. Using |\noframe|\, completely supresses
% the outer frame. |\noinnerframe|\, suppresses the innerframe. 
% In case of stereo- or space-chess-diagrams |\verticalcylinder|,
% |\horizontalcylinder|\, and |\noframe|\, suppresses the inner
% frame.
%
% \subsection{Change the coloring of the fields}
% \DescribeMacro{\allwhite}
% The \verb+allwhite+ boolean can be used to have all white squares.  Therefore
% dotted lines are produced to separate the squares.  For convenience we
% provide a command \verb+allwhite+ which switches the value of the
% \verb+allwhite+ boolean to true.
%
% \bigskip
% \begin{diagram}
% \allwhite
% \pieces{wKe1, wDd1, wTa1h1, wLf1c1, wSb1g1, sKe8, sDd8, sTa8h8, sLf8c8, sSb8g8}
% \end{diagram}
% \hfill
% \begin{minipage}[b]{7cm}
% \vspace*{-3cm}
% This was produced by:
%
% \begin{verbatim}
% \begin{diagram}
% \allwhite
% \pieces{wKe1, wDd1, wTa1h1, wLf1c1, wSb1g1, %
%     sKe8, sDd8, sTa8h8, sLf8c8, sSb8g8}
% \end{diagram}
% \end{verbatim}
% \end{minipage}
%
% \DescribeMacro{\switchcolors}
% The boolean \verb+switchcolors+ may be used to switch the coloring of white
% and black fields.  For convenience we provide a command \verb+switchcolors+
% which switches the value of the \verb+switchcolors+ boolean to true.
% 
% \bigskip
% \begin{diagram}
% \switchcolors
% \end{diagram}
%
%
% \subsubsection{figurine Notation}
% \DescribeEnv{figurine}
% Instead of using the |diagram|, |stereodiagram| or
% |spacediagram| environment one may use the |figurine|
% environment. This suppresses the diagram output and produces a
% figurine notation inside the current text.
%
% \subsubsection{Changes within the board}
% \DescribeMacro{\nofields}
% \DescribeMacro{\nosquares}
% You may remove single fields by using the |\nofields| or
% |\nosquares| command. Using this command does make sense for 
% empty black fields only. This command expects a list of squares
% separated by "',~"'. You may also use this command within a
% stereo- or space-diagram. In this case you must specify the
% fields the same way you do it inside the |\pieces| command.
%
% \DescribeMacro{\fieldframe}
% You may specify single fields, which should be surrounded by a
% frame. This is possible using the |\fieldframe| command. You
% must specify the list of fields which should have frames the
% same way you specify fields within the |\nofields| command.
%
% \DescribeMacro{\gridlines}
% A more general form of lines within diagrams is possible by
% using the |\gridlines| command. You may specify a list of
% horizontal or vertical lines within the diagram. Different
% lines should be separated by "',~"'. A single line must be
% specified as:
%
% [plane](v or h)(x-coordinate)(y-coordinate)(length in squares)
%
% You must specify a plane in case of stereo- or space-chess
% only. For a vertical line starting at the lower left corner of
% "'c2"' ending at the upper left corner of "'c8"' the command to
% use is: |\gridlines{v217}|\@. Concerning the coordinates and
% length specifications you should pay attention to put values
% greater 9 in curly braces \{ \}.
%
% \DescribeMacro{\fieldtext}
% Sometimes you need to show text on some squares. This is done
% using the |\fieldtext| command. The syntax for a single text
% is: \{Text\}(x-coordinate)(y-coordinate)
%
% Now an example how to use |\gridlines|, |\nofields| and
% |\fieldtext| to create some "'{\itshape Letter-Board}"' with text
% inside.
%
% \bigskip
% \begin{diagram}[9x7]
% \label{Buchstabenbrett}
% \noinnerframe
% \nofields{a2, b2, c2, a3, b3, c3, %
%  b5, c5, d5, b6, c6, d6, %
%  e1, e2, e3, e4, e5, e6, e7, %
%  g1, h1, h2, h2, g3, h3, g5, h5, g6, h6, g7, h7}
% \gridlines{h004, h013, h033, h143, h163, h074, %
%  v001, v034, v142, v312, v404, v461, %
%  h501, h571, h632, h642, h801, h871, %
%  v507, v603, v643, v803, v843, v907}
% \fieldtext{{It ...}c5, {works}b2}
% \end{diagram}
% \hfill
% \begin{minipage}[b]{10cm}
% \begin{verbatim}
% \begin{diagram}[9x7]
% \noinnerframe
% \nofields{a2, b2, c2, a3, b3, c3, %
%  b5, c5, d5, b6, c6, d6, %
%  e1, e2, e3, e4, e5, e6, e7, %
%  g1, h1, h2, h2, g3, h3, g5, h5, g6, h6, g7, h7}
% \gridlines{h004, h013, h033, h143, h163, h074, %
%  v001, v034, v142, v312, v404, v461, %
%  h501, h571, h632, h642, h801, h871, %
%  v507, v603, v643, v803, v843, v907}
% \fieldtext{{It ...}c5, {works}b2}
% \end{diagram}
% \end{verbatim}
% \end{minipage}
%
% 
% \subsection{Misc}
% \subsubsection{Chess pieces within normal text}
% Sometimes you may need symbols of chess pieces within your
% normal text, e.\,g. to show the {\itshape
% Viele-V\"ater-Stellung} {\wK}c8, {\wB}b6, {\sK}a8, {\sB}a7.
% This is possible by |{\wK}c8, {\wB}b6, {\sK}a8, {\sB}a7|.
% Additionally you may use some of these symbols:
% \begin{description}
% \item[\swL]
% \DescribeMacro{\swL}
% a white bishop on a black square
% \item[\ssL]
% \DescribeMacro{\ssL}
% a black bishop on a black square
% \item[\wNr]
% \DescribeMacro{\wNr}
% a white nightrider
% \item[\nNr]
% \DescribeMacro{\nNr}
% a neutral nightrider
% \item[\sNr]
% \DescribeMacro{\sNr}
% a black nightrider
% \item[\wGh]
% \DescribeMacro{\wGh}
% a white grashopper
% \item[\nGh]
% \DescribeMacro{\nGh}
% a neutral grashopper
% \item[\sGh]
% \DescribeMacro{\sGh}
% a black grashopper
% \item[\Imi]
% \DescribeMacro{\Imi}
% an imitator, you may also use the {\bfseries Circle} notation:
% \item[\wC]
% \DescribeMacro{\wC}
% a white circle
% \item[\nC]
% \DescribeMacro{\nC}
% a neutral circle
% \item[\sC]
% \DescribeMacro{\sC}
% a black circle
% \item[\wE]
% \DescribeMacro{\wE}
% a white equihopper
% \item[\sE]
% \DescribeMacro{\sE}
% a black equihopper
% \item[\nE]
% \DescribeMacro{\nE}
% a neutral equihopper
% \item[\wX]
% \DescribeMacro{\wX}
% a white rotated equihopper
% \item[\sX]
% \DescribeMacro{\sX}
% a black rotated equihopper
% \item[\nX]
% \DescribeMacro{\nX}
% a neutral rotated equihopper
% \end{description}
% \subsubsection{Other often used symbols}
% The style also defines commands for other symbols, which are
% often used within the declaration of twins or when writing a
% solution:
% \begin{description}
% \item[\set]
% \DescribeMacro{\set}
% setplay
% \item[\ra]
% \DescribeMacro{\ra}
% a left to right arrow
% \item[\lra]
% \DescribeMacro{\lra}
% a double ended arrow
% \item[\OO]
% \DescribeMacro{\OO}
% king side castling
% \item[\OOO]
% \DescribeMacro{\OOO}
% queen side castling
% \item[\x]
% \DescribeMacro{\x}
% for "'takes"'
% \item[\any]
% \DescribeMacro{\any}
% for any move (you may not simply use a \any\ within your
% text because \TeX\ handles this as a protected space)
% \end{description}
% \subsubsection{Internationalization}
% \DescribeMacro{\DefinePieces}
% This part is relevant for people who do not like the german
% notation for pieces and therefore want to change this within
% their sources. Using the german notation, you specify the color
% of a piece as {\bfseries w}, {\bfseries s} or {\bfseries n},
% the type of a piece as {\bfseries K}, {\bfseries D}, {\bfseries T},
% {\bfseries L}, {\bfseries S}, {\bfseries B} and a possible
% rotation of a piece as {\bfseries L}, {\bfseries R} or
% {\bfseries U}. To use another notation you may use the
% |\DefinePieces| command which takes 3 parameters. 
% \begin{enumerate}
% \item the letters used to specify the colors of the pieces
% using the order white, black, neutral
% \item the letters used to specify the type of a piece using the
% order king, queen, rook, bishop, knight, pawn. You may not
% use the characters {\bfseries C, E} and {\bfseries X}, because these are
% used for Circle, Equihopper and rotated Equihopper.
% \item the letters used to specify an optional rotation using
% the order left-turned, right-turned, upside-down. You must use
% capital letters for this.
% \end{enumerate}
%
% When using a |\DefinePieces| command, the commands are changed
% to its next usage (or to the end of the document). The command
% not only changes the pieces you may use within the |\pieces|
% command but also defines commands to be used within normal
% text, as the following example shows:
%
% \noindent|\DefinePieces{wbn}{KQRBNP}{LRU}|\newline
% |\wDU\bKR\bwB|\newline
% \DefinePieces{wbn}{KQRBNP}{LRU}
% creates \wDU\bKR\bwB
%
% \subsubsection{When writing books}
% \DescribeMacro{\develop}
% To simplify your writings you may use the macro
% |\develop|. This will create the following additional information during
% developement:
% \begin{itemize}
% \item when you use |\label| in your diagrams the label will be
% shown at the left upper corner of the diagram.
% \item The given label will also be shown inside the solution
% and also in any register entry.
% \item when you have specified a |\judgement| this information
% will be put into the solution.
% \end{itemize}
%
% Most books on chessproblems contain registers for authors,
% sometimes also on themes and sources. As you already collect
% all these information very detailed within the |diagram|
% environment the generation of registers is very simple.
%
% \DescribeMacro{\makeaindex}
% \DescribeMacro{\authorindex}
% To create a registers of authors you need to put the
% |\makeaindex| command inside the preamble of your document.
% This instructs latex to write an intermediate file containing
% information about authors and the numbers of the
% diagrams.\footnote{Normally registers contain page numbers but
% with chess problems normally people refer to the diagram
% numbers.} After a first \LaTeX\ run on your document, you need
% to convert the intermediate file. This may be done with the
% |makeindex| program, which will typically called like
%
% \noindent|makeindex -o <filename>.and <filename>.adx|
%
% The resulting register may be put into your document using the
% |\authorindex| command.
% 
%
% \DescribeMacro{\makesindex}
% \DescribeMacro{\sourceindex}
% \DescribeMacro{\maketindex}
% \DescribeMacro{\themeindex}
% Like an index for authors you may also create indices for
% sources and/or themes. For an source register you need to put
% |\makesindex| into your document preamble; for a theme register
% the command is |\maketindex|. The conversion commands for the
% intermediate files are
%
% \noindent|makeindex -o <filename>.snd <filename>.sdx|
% \newline for the source register and
%
% \noindent|makeindex -o <filename>.tnd <filename>.tdx|
% \newline for the theme register.
%
% The source register is inserted into the text using
% |\sourceindex| and the theme register using |\themeindex|.
%
% \subsubsection{Other useful stuff}
% \DescribeMacro{\solpar}
% In some environments --- like \verb+window+ --- the use of \verb+\par+ leads to unwanted
% effects. Therefore we use the command \verb+\solpar+ inside the
% definition of \verb+\@dia@solution+, which is used to display
% a single solution when using \verb+\putsol+. You may use
% \verb+\renewcommand{\solpar}+ to provide another definition of
% \verb+\solpar+ in such situations.
%
% \StopEventually{\PrintIndex\PrintChanges}
%
% \section{The documentation driver}
% The following code will generate the documentation. Since it is
% the first piece of code in the file, the documentation can be
% obtained by simply processing the file with \LaTeXe.
%    \begin{macrocode}
%<*driver>
\documentclass[a4paper]{article}
\usepackage{doc}
\usepackage{diagram}
\EnableCrossrefs
\CodelineIndex
\RecordChanges
\begin{document}
\DocInput{diagram.dtx}
\end{document}
%</driver>
%    \end{macrocode}
%
% \section{The implementation of the style}
% Specifies the preamble of our style file.
%    \begin{macrocode}
%<*style>
\ProvidesPackage{diagram}[2022/06/19]
%    \end{macrocode}
%
% \begin{macro}{\DefaultDiagramSize}
% The \verb+\DefaultDiagramSize+ may be used in code to switch to the
% default diagram size. As this depends on the documents default font
% size we use the same option and execute \textit{10pt} as default.
%    \begin{macrocode}
\newcommand*{\DefaultDiagramSize}{}
\DeclareOption{10pt}{\renewcommand*{\DefaultDiagramSize}{\diagramx}}
\DeclareOption{11pt}{\renewcommand*{\DefaultDiagramSize}{\diagramxi}}
\DeclareOption{12pt}{\renewcommand*{\DefaultDiagramSize}{\diagramxii}}
\ExecuteOptions{10pt}
%    \end{macrocode}
% \end{macro}

%    \begin{macrocode}
\ProcessOptions
\AtBeginDocument{\DefaultDiagramSize}
%    \end{macrocode}
%
%    \begin{macrocode}
\RequirePackage{ifthen}
\RequirePackage{calc}
\RequirePackage{pstricks}
%    \end{macrocode}
%%
%%
%%
% Now we declare some constants to unify its usage within the
% style file.
%    \begin{macrocode}
\chardef\f@ur=4
\chardef\@ight=8
\newcount\elchfont

\chardef\@pkelch=0
\chardef\@fselch=1

\newcount\dia@type

\newboolean{@textproblem}
\setboolean{@textproblem}{false}
\def\textproblem{\setboolean{@textproblem}{true}\let\@dia@stipulation=\relax}

\newboolean{@solafterdiagram}
\setboolean{@solafterdiagram}{false}
\def\solafterdiagram{\setboolean{@solafterdiagram}{true}\ignorespaces}

\newif\if@vframe\@vframetrue
\newif\if@hframe\@hframetrue
\newif\if@leaveOuter\@leaveOutertrue

\newif\if@shortform

\newif\ifspace@vertical
\def\spacehorizontal{\space@verticalfalse}

% \newif\ifdi@no
\newboolean{@cpd@numbering@global}
\newboolean{@cpd@numbering@local}
\newcounter{board@nr}
\renewcommand{\theboard@nr}{\thediag}
% \newif\iffigcnt
\newboolean{piececounter}
\newcount\r@w
\newcount\lin@
\newcount\pl@ne
\newcount\current@plane

\newcount\w@cnt
\newcount\b@cnt
\newcount\n@cnt
\newboolean{showcity}
\setboolean{showcity}{false}
\newboolean{showacademictitle}
\setboolean{showacademictitle}{true}
\newboolean{legend}
\setboolean{legend}{false}

\newcount\@blackfield
\newboolean{allwhite}
\setboolean{allwhite}{false}
\newcommand{\allwhite}{\setboolean{allwhite}{true}}
\newcounter{field@border}
\newcount\@whitefield
\newboolean{switchcolors}
\setboolean{switchcolors}{false}
\newcommand{\switchcolors}{\setboolean{switchcolors}{true}}
%    \end{macrocode}
%
% We have counters for each color to count the pieces on the
% board.
%    \begin{macrocode}
\newboolean{cpd@checkPieceCounts}
\newcounter{cpd@defWhitePieces}
\newcounter{cpd@defBlackPieces}
\newcounter{cpd@defNeutralPieces}

\newcounter{cpd@whitePieces}
\newcounter{cpd@blackPieces}
\newcounter{cpd@neutralPieces}

\newcounter{cpd@row}
\newcounter{cpd@line}

\newcommand{\cpd@stepcounterWhite}{\stepcounter{cpd@whitePieces}}
\newcommand{\cpd@stepcounterBlack}{\stepcounter{cpd@blackPieces}}
\newcommand{\cpd@stepcounterNeutral}{\stepcounter{cpd@neutralPieces}}
\global\let\cpd@stepcounterPieces\relax

\newcount\help@a
\newcount\help@b

\newbox\dia@box
\newbox\@cnt@box
\newdimen\@cnt@wd
\newbox\@stip@box

\newdimen\topdist\topdist\z@
\newbox\@test@box
\newdimen\@test@dimen
\newif\if@left

\newcount\brd@ff

\newdimen\dia@lineskip

\newdimen\board@width
\newdimen\bd@width
\newdimen\head@width
\newdimen\sq@width

\newdimen\grid@width
\newdimen\inner@frame
\newdimen\outer@frame
\newdimen\space@frame
\newdimen\v@frame@dist
\newdimen\h@frame@dist
\newdimen\space@frame@dist
\newdimen\v@space@dist
\newdimen\h@space@dist

\newbox\sq@box
\newbox\plane@box
%    \end{macrocode}
%
% We need a lot of token registers to register the information
% from within the |diagram| environment. These token registers
% are defined here. Initially each token register is defined to
% contain |\relax|, which serves as an {\itshape end-marker} when
% parsing lists.
%    \begin{macrocode}
\newtoks\typis@tk\typis@tk={\relax}
\newtoks\label@tk\label@tk={\relax}
\newtoks\sol@tk\sol@tk={\relax}
\newtoks\number@tk\number@tk={\relax}
\newtoks\aut@tk\aut@tk={\relax}
\newtoks\city@tk\city@tk={\relax}
\newtoks\sourcenr@tk\sourcenr@tk={\relax}
\newtoks\source@tk\source@tk={\relax}
\newtoks\day@tk\day@tk={\relax}
\newcount\from@month\from@month=\z@
\newcount\to@month\to@month=\z@
\newtoks\year@tk\year@tk={\relax}
\newtoks\issue@tk\issue@tk={\relax}
\newtoks\pages@tk\pages@tk={\relax}
\newtoks\tournament@tk\tournament@tk={\relax}
\newtoks\award@tk\award@tk={\relax}
\newtoks\after@tk\after@tk={\relax}
\newtoks\version@tk\version@tk={\relax}
\newtoks\correction@tk\correction@tk={\relax}
\newtoks\dedic@tk\dedic@tk={\relax}
\newtoks\fidealbum@tk\fidealbum@tk={\relax}
\newtoks\theme@tk\theme@tk={\relax}
\newtoks\twins@tk\twins@tk={\relax}
\newtoks\judgement@tk\judgement@tk={\relax}
\newtoks\comment@tk\comment@tk={\relax}
\newtoks\computer@tk\computer@tk={-}
\newtoks\nofields@tk\nofields@tk={\relax}
\newtoks\fieldframe@tk\fieldframe@tk={\relax}
\newtoks\gridlines@tk\gridlines@tk={\relax}
\newtoks\pieces@tk\pieces@tk={\relax}
\newtoks\fen@tk\fen@tk={\relax}
\newtoks\fieldtext@tk\fieldtext@tk={\relax}
\newtoks\text@tk\text@tk={\relax}
\newtoks\stipulation@tk\stipulation@tk={\relax}
\newtoks\condition@tk\condition@tk={\relax}
\newtoks\remark@tk\remark@tk={\relax}
\newtoks\piecedefs@tk\piecedefs@tk={\relax}
%    \end{macrocode}
%
% To remember, which information has been specified, we define
% \TeX-booleans for each command.
%    \begin{macrocode}
\newif\if@label\@labelfalse
\newif\if@number\@numberfalse
\newif\if@special\@specialfalse
\newif\ifauth@r\auth@rfalse
\newif\if@city\@cityfalse
\newif\if@sourcenr\@sourcenrfalse
\newif\if@source\@sourcefalse
\newif\if@date\@datefalse
\newif\if@day\@dayfalse
\newif\if@year\@yearfalse
\newif\if@issue\@issuefalse
\newif\if@pages\@pagesfalse
\newif\if@tournament\@tournamentfalse
\newif\if@award\@awardfalse
\newif\if@after\@afterfalse
\newif\if@version\@versionfalse
\newif\if@correction\@correctionfalse
\newif\if@dedication\@dedicationfalse
\newif\if@fidealbum\@fidealbumfalse
\newif\if@twins\@twinsfalse
\newif\if@theme\@themefalse
\newif\if@computer\@computerfalse
\newif\if@judgement\@judgementfalse
\newif\if@comment\@commentfalse
\newif\if@pieces\@piecesfalse
\newboolean{@cpd@fen}\setboolean{@cpd@fen}{false}%
\newif\if@fieldtext\@fieldtextfalse
\newif\if@nofields\@nofieldsfalse
\newif\if@gridlines\@gridlinesfalse
\newif\if@fieldframe\@fieldframefalse
\newif\if@stdgrid\@stdgridfalse
\newboolean{showcomputer}\setboolean{showcomputer}{true}%
\newcommand*{\computerproofedsymbol}{C+}
\newcommand*{\notcomputerproofedsymbol}{C-}
% \newif\if@show@computer\@show@computertrue
\newif\if@stipulation\@stipulationfalse
\newif\if@condition\@conditionfalse
\newif\if@remark\@remarkfalse
\newif\if@piecedefs\@piecedefsfalse
\newif\if@typis\@typisfalse
\newif\if@widedias\@widediasfalse
\newif\ifx@twins\x@twinsfalse
\newif\ifx@cond\x@condfalse
\newif\ifimitator\imitatorfalse
\newif\ifnormal@names\normal@namesfalse
\newif\ifs@lu
\newif\if@develop\@developfalse
\newif\if@notfirst
\newif\if@first
%    \end{macrocode}
%    \begin{macrocode}
\newwrite\s@lfd
\let\below@newline=\relax
% These are used by the "old" board creating mechanism
\newcount\@lines
\newcount\@rows
\newcount\lines@max
\newcount\rows@max
\newcount\planes@max
%    \end{macrocode}
%
% The following counters are used when creating the diagram
% itself.
%    \begin{macrocode}
\newcounter{cpd@rowsmax}
\newcounter{cpd@linesmax}
\newcounter{cpd@current@row}
\newcounter{cpd@current@line}
\newcounter{cpd@maxsquare}
\newcounter{cpd@helper}
\newcounter{cpd@current@square@index}
\newcounter{cpd@current@square@value}
%    \end{macrocode}
%
% Some boolean \TeX-switches used whithin stereo- or spacechess
% diagrams.
%    \begin{macrocode}
\newif\if@stereo\@stereofalse
\newif\if@space\@spacefalse
%    \end{macrocode}
%
% These boolean switches are used to control the output of
% registers.
%    \begin{macrocode}
\newif\if@aindex\@aindexfalse
\newif\if@sindex\@sindexfalse
\newif\if@tindex\@tindexfalse
\newif\ifds@label
%    \end{macrocode}
%
% \begin{macro}{\cpd@begindiagram@hook}
% \begin{macro}{\cpd@enddiagram@hook}
% We define hooks to be executed in |\begin{diagram}| and |\end{diagram}|.
%    \begin{macrocode}
\newcommand{\cpd@begindiagram@hook}{}
\newcommand{\cpd@enddiagram@hook}{}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
%
% \begin{macro}{\diagram}
% \begin{macro}{\@diagram}
% Defines the code executed in |\begin{diagram}|. In case no
% optional size is given, a normal 8$\times$8 board is generated.
%    \begin{macrocode}
\def\diagram{%
   \begingroup%
   \@ifnextchar [{\@diagram}{\@diagram[\@ight x\@ight]}%
}

\def\@cpd@initsize#1#2{%
   \setcounter{cpd@linesmax}{#1}%
   \setcounter{cpd@rowsmax}{#2}%
   \setcounter{cpd@maxsquare}{\value{cpd@rowsmax}*\value{cpd@linesmax}}%
}

\def\@diagram[#1x#2]{%
   \lines@max=#1%
   \rows@max=#2%
   \@cpd@initsize{#1}{#2}%
   \pl@ne=\z@%
   \current@plane=\z@%
   \let\put@sqs=\put@sqs@normal%
   \let\read@plane=\read@plane@normal%
   \@start@diagram%
}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
%
%    \begin{macrocode}
\def\stereodiagram{%
   \begingroup%
   \inner@frame=0.6pt%
   \@stereotrue%
   \@cpd@initsize{8}{8}%
   \let\put@sqs=\put@sqs@stereo%
   \let\read@plane=\read@plane@stereo%
   \@start@diagram%
}
\def\spacediagram{%
   \begingroup%
   \inner@frame=0.6pt%
   \@spacetrue%
   \@ifnextchar [{\@spacediagram}{\@spacediagram[5x5x5]}%
}

\def\@spacediagram[#1x#2x#3]{%
   \lines@max=#1%
   \rows@max=#2%
   \planes@max=#3%
   \@cpd@initsize{#1}{#2}%
   \let\put@sqs=\put@sqs@space%
   \let\read@plane=\read@plane@space%
   \@start@diagram%
}
\def\@start@diagram{%
   \init@vars%
   \let\author=\ds@author%
   \let\day=\ds@day%
   \let\month=\ds@month%
   \let\year=\ds@year%
   \let\label=\ds@label%
   \cpd@begindiagram@hook%
   \ignorespaces%
}

\def\showtypis#1{%
   \@typistrue%
   \typis@tk={#1}%
   \ignorespaces%
}

\def\enddiagram{%
   \let\author=\orig@author%
   \let\day=\orig@day%
   \let\month=\orig@month%
   \let\year=\orig@year%
   \let\label=\orig@label%
   \if@number%
   \else%
      \refstepcounter{board@nr}% so \label and \ref work properly
   \fi%
   %
   % Now \label@tk should be set, if wanted, so
   % we can generate the index entries
   %
   \@aindex%
   \@sindex%
   \@tindex%
   %
   % Now \@currentlabel will be set right, so we can use
   % the original label
   \if@label%
      \expandafter\@set@label\the\label@tk;%
   \fi%
   %
   % Now we know, if we have frames so we can setup our dimensions
   %
   \global\sq@width=\fontdimen\tw@\chessfont%
   \if@stereo%
      \bd@width=\@ight\sq@width%
      \board@width=\@ight\sq@width%
      \ifdim\h@frame@dist<\sq@width%
         \h@frame@dist=\sq@width%
      \fi%
      % We do already skip with \v@space@dist
      % So we use the additional skip \space@frame@dist here
      \v@frame@dist=\space@frame@dist%
      \ifdim\space@frame>\outer@frame%
         \outer@frame=\space@frame%
      \fi%
      \advance\bd@width\tw@\inner@frame%
      \advance\board@width\tw@\inner@frame%
      \advance\board@width\tw@\h@frame@dist%
      \advance\board@width\tw@\outer@frame%
   \else\if@space%
      \ifdim\h@frame@dist<1.5\sq@width%
         \h@frame@dist=1.5\sq@width%
      \fi%
      % We do already skip with \v@space@dist
      % So we use the additional skip \space@frame@dist here
      \v@frame@dist=\space@frame@dist%
      \ifdim\space@frame>\outer@frame%
         \outer@frame=\space@frame%
      \fi%
      \ifspace@vertical%
         \bd@width=\lines@max\sq@width%
         \board@width\bd@width%
         \advance\bd@width\tw@\inner@frame%
         \advance\board@width\tw@\inner@frame%
         \advance\board@width\tw@\h@frame@dist%
         \advance\board@width\tw@\outer@frame%
      \else%
         \bd@width=\lines@max\sq@width%
         \advance\bd@width\tw@\inner@frame%
         \ifdim\h@space@dist<1.5\sq@width%
            \h@space@dist=1.5\sq@width%
         \fi%
         %\h@space@dist=0.7\sq@width%
         % Now we can compute the width of the complete board
         \board@width\bd@width%
         \advance\board@width\h@space@dist%
         \multiply\board@width\planes@max%
         \advance\board@width\h@space@dist%
         \advance\board@width\tw@\outer@frame%
      \fi%
   \else%
      \ifthenelse{\boolean{legend}}{\v@frame@dist=1.5em\h@frame@dist=1.5em}{}%
      \bd@width=\lines@max\sq@width%
      \ifnum\lines@max>\@ight%
         % Make the board wider
         \board@width=\lines@max\sq@width%
      \else%
         % Make a normal width
         \board@width=\@ight\sq@width%
      \fi%
      \advance\bd@width\tw@\inner@frame%
      \advance\board@width\tw@\inner@frame%
      \advance\board@width\tw@\h@frame@dist%
      \advance\board@width\tw@\outer@frame%
   \fi\fi%
   \if@widedias%
      \head@width=\textwidth%
   \else%
      \head@width=\board@width%
   \fi%
   %
   % Now we should build the diagram itself
   %
   \ifthenelse{\boolean{@textproblem}}{%
      % Put the stipulation into the \sq@box
      \setbox\sq@box=\hbox{\vbox to \board@width{\hsize\board@width%
         \stipfont%
         \raggedright%
         \sloppy%
         \the\stipulation@tk%
         \vfil%
      }}%
   }{%
      \put@sqs% This builds up the \sq@box
      % Check, if the given number of pieces is reached
      \ifthenelse{\boolean{cpd@checkPieceCounts}}{%
        \ifthenelse{\value{cpd@defWhitePieces}=\value{cpd@whitePieces}}{}%
            {\errmessage{Wrong number of white pieces}}%
        \ifthenelse{\value{cpd@defBlackPieces}=\value{cpd@blackPieces}}{}%
            {\errmessage{Wrong number of black pieces}}%
         \ifthenelse{\value{cpd@defNeutralPieces}=\value{cpd@neutralPieces}}{}%
             {\errmessage{Wrong number of neutral pieces}}%
      }{}%
   }%
   %
   \global\setbox\dia@box=\hbox{\vbox{%
      \parindent\z@%
      \parskip\z@%
      \baselineskip11\p@\advance\baselineskip\dia@lineskip%
      \hsize\head@width%
      \centering%
      % diagram header
      \vskip\topdist%
      \vbox{\hsize\board@width\hbox{%
         \if@develop\if@label%
            \noindent\raggedright\llap{\labelfont\the\label@tk\ }%
         \fi\fi%
         \vbox{%
            \he@dpos\dia@above%
         }%
      }}%
      \vskip\tw@\p@%
      % diagram itself
      \vtop{\hsize\board@width%
         \hbox to \head@width{\hss\vbox{%
            \hsize\board@width%
            \ifthenelse{\boolean{@textproblem}}{%
               \box\sq@box%
            }{%
               \outer@henbox{\box\sq@box}%
            }%
         }\hss}%
         % diagram trailer
         \hbox to \head@width{\hss\vtop{%
            \hsize\board@width%
            \parskip\z@%
            \raggedright%
            \put@count%
            \dia@below%
         }\hss}%
      }%
   }}% End of \dia@box
   \do@dia@job%
   \cpd@enddiagram@hook%
   \endgroup%
}

\def\do@put@count{%
   \ \ (\arabic{cpd@whitePieces}+\arabic{cpd@blackPieces}%
   \ifthenelse{\value{cpd@neutralPieces}>0}{+\arabic{cpd@neutralPieces}}{})%
}

\def\put@count{%
   % First we build the box with the figure count
   \ifthenelse{\boolean{showcomputer}\OR\boolean{piececounter}}{%
     \global\setbox\@cnt@box=\hbox{%
        \stipfont%
        \ifthenelse{\boolean{showcomputer}}{%
           \ \ \if@computer\computerproofedsymbol\else\notcomputerproofedsymbol\fi%
        }{}%
        \ifthenelse{\boolean{piececounter}}{%
           \do@put@count%
        }{}%
      }%
      \@cnt@wd=\wd\@cnt@box%
      \hangindent-\@cnt@wd%
      \hangafter\m@ne%
      \noindent%
      \hbox to \z@{%
        \hbox to \board@width{\hfil\unhbox\@cnt@box}\hskip -\board@width%
      }%
   }{}%
}

\let\endstereodiagram=\enddiagram
\let\endspacediagram=\enddiagram
\def\figurine{%
   \begingroup%
   \init@vars%
   \let\author=\ds@author%
   \let\day=\ds@day%
   \let\month=\ds@month%
   \let\year=\ds@year%
   \let\label=\ds@label%
   \cpd@begindiagram@hook%
}

\def\endfigurine{%
   \let\author=\orig@author%
   \let\day=\orig@day%
   \let\month=\orig@month%
   \let\year=\orig@year%
   \let\label=\orig@label%
   \if@number%
   \else%
      \refstepcounter{board@nr}% so \label and \ref work properly
   \fi%
   %
   % Now \label@tk should be set, if wanted, so
   % we can generate the index entries
   %
   \@aindex%
   \@sindex%
   \@tindex%
   %
   % Now \@currentlabel will be set right, so we can use
   % the original label
   %
   \if@label%
      \expandafter\@set@label\the\label@tk;%
   \fi%
   %
   \@show@figurine%
   \cpd@enddiagram@hook%
   \endgroup%
}
%
\gdef\selectelchfont#1{%
   \global\elchfont\csname @#1elch\endcsname\defaultelchfont%
}
%    \end{macrocode}
%
% Here we define commands to change fonts used for text above
% and below the diagram. You may redefine to adjust the fonts to
% your needs.
% \begin{macro}{\authorfont}
% \begin{macro}{\cityfont}
% \begin{macro}{\sourcefont}
% \begin{macro}{\awardfont}
% \begin{macro}{\dedicfont}
% \begin{macro}{\stipfont}
% \begin{macro}{\remfont}
% \begin{macro}{\labelfont}
% \begin{macro}{\cpd@boardfont}
% \begin{macro}{\legendfont}
%    \begin{macrocode}
\newcommand*{\authorfont}{\bfseries}
\newcommand*{\cityfont}{\slshape}
\newcommand*{\sourcefont}{\bfseries\itshape}
\newcommand*{\awardfont}{\itshape}
\newcommand*{\dedicfont}{\itshape}
\newcommand*{\stipfont}{\rmfamily}
\newcommand*{\remfont}{\rmfamily}
\newcommand*{\labelfont}{\rmfamily}
\newcommand*{\cpd@boardfont}{\rmfamily}
\newcommand*{\legendfont}{\sffamily}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
% We have three different default sizes for diagrams. 
% The following commands switch fontsizes used for the chessfonts
% to typeset the diagrams.
% \begin{macro}{\diagramx}
% \begin{macro}{\diagramxi}
% \begin{macro}{\diagramxii}
%    \begin{macrocode}
\newcommand*{\diagramx}{
   \ifcase\elchfont\relax%
      \font\chessfont=pkelch12
      \font\chtextfont=pkelch10
   \else%
      \font\chessfont=fselch12
      \font\chtextfont=fselch10
   \fi%
   \dia@lineskip\z@
   \dia@type\z@
}

\newcommand*{\diagramxi}{
   \ifcase\elchfont\relax%
      \font\chessfont=pkelch14
      \font\chtextfont=pkelch11
   \else%
      \font\chessfont=fselch14
      \font\chtextfont=fselch11
   \fi%
   \dia@lineskip\@ne\p@
   \dia@type\@ne
}

\newcommand*{\diagramxii}{
   \ifcase\elchfont\relax%
      \font\chessfont=pkelch16
      \font\chtextfont=pkelch12
   \else%
      \font\chessfont=fselch16
      \font\chtextfont=fselch12
   \fi%
   \dia@lineskip\tw@\p@
   \dia@type\tw@
}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\defaultelchfont}
% |\defaultelchfont| is used to define the fontsize used to
% typeset the diagrams depending on the documentsize.
%    \begin{macrocode}
\def\defaultelchfont{%
   \ifcase\@ptsize\relax%
      \diagramx\or%
      \diagramxi\or%
      \diagramxii%
   \fi%
}
%    \end{macrocode}
% \end{macro}
%
%    \begin{macrocode}
\def\dianamestyle#1{\def\@dianame{\csname @#1\endcsname}}
\def\solnamestyle#1{\def\@solname{\csname @#1\endcsname}}
\newcommand*{\diagnum}[2][]{%
   \renewcommand*{\@dianumber@prefix}{#1}%
   \setcounter{board@nr}{#2}%
   \addtocounter{board@nr}{\m@ne}}
%    \end{macrocode}
%
% \begin{macro}{\ra}
% \begin{macro}{\lra}
% \begin{macro}{\rla}
% \begin{macro}{\x}
% \begin{macro}{\set}
% \begin{macro}{\OO}
% \begin{macro}{\OOO}
% \begin{macro}{\any}
% \begin{macro}{\further}
% Now we define a couple of abbreviations and special symbols
% often used when setting problem chess documents.
%    \begin{macrocode}
\def\ra{\mbox{$\rightarrow$}}
\def\lra{\mbox{$\leftrightarrow$}}
\let\rla=\lra
\newcommand{\x}{\mbox{\ifmmode\times\else$\times$\fi}}
\def\set{\kern -.05em\raise .1ex\hbox{*}}
\def\@O{0\raise.25ex\hbox{-}\kern -.1em\relax}
\def\OO{\@O0}
\def\OOO{\@O\@O0}
\def\any{\ifmmode\sim\else$\sim$\fi}
\def\further{\ifmmode\Rightarrow\else$\Rightarrow$\fi\ \ignorespaces}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
%    \begin{macrocode}
\def\spacelayout#1{\csname space@#1\endcsname}
\def\nodiagnumbering{%
    % \global\di@nofalse
    \setboolean{@cpd@numbering@global}{false}
}
\newcommand*{\@dianumber@prefix}{}
\def\diagnumbering#1{%
   \setboolean{@cpd@numbering@global}{true}%
   % \global\di@notrue%
   \diagnum{\@ne}%
   \gdef\thediag{\@dianumber@prefix\csname @#1\endcsname\c@board@nr}%
}
%    \end{macrocode}
%
% \begin{macro}{\diagcenter}
% \begin{macro}{\diagleft}
% \begin{macro}{\diagright}
% The macros |\diagcenter|, |\diagleft| and |\diagright| simply
% define the macro |\he@dpos| to the corresponding paragraph
% alignment.
%    \begin{macrocode}
\def\diagcenter{\def\he@dpos{\centering}}
\def\diagleft{\def\he@dpos{\raggedright}}
\def\diagright{\def\he@dpos{\raggedleft}}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\setmonthstyle}
% The implementation of |\setmonthstyle| does |\diagnumbering|
% define a command which uses the given parameter as a part of
% the command name.
%    \begin{macrocode}
\def\setmonthstyle#1{\def\write@month{\csname @#1\endcsname}}
%    \end{macrocode}
% \end{macro}
%
%    \begin{macrocode}
\def\specialdiagnum#1{%
   \ifthenelse{\equal{}{#1}}{%
       % We disable displaying the diagram number
       \setboolean{@cpd@numbering@local}{false}%
   }{%
       \setboolean{@cpd@numbering@local}{true}%
       \@specialtrue%
       \number@tk={#1}\@numbertrue%
       \def\thediag{#1}\def\@currentlabel{#1}%
       \ignorespaces%
   }
}
%    \end{macrocode}
%
% \begin{macro}{\ds@label}
% \begin{macro}{\ds@author}
% The macros |\ds@label| and |\ds@author| are defined internally
% and are made public within |\begin{diagram}|. This is because
% the macros |\label| and |\author| are normal \LaTeX-macros and
% I want to avoid to redefine these globally.
%    \begin{macrocode}
\def\ds@label{%
   \@ifstar{\ds@labelfalse\ds@xlabel}{\ds@labeltrue\ds@xlabel}%
}
\def\ds@author#1{%
   \aut@tk={#1}\auth@rtrue%
   \ignorespaces%
}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \begin{macro}{\ds@academictitle}
% \begin{macro}{\Dr}
% \begin{macro}{\Prof}
% \begin{macro}{\ProfDr}
%    \begin{macrocode}
\def\ds@academictitle#1{\ifthenelse{\boolean{showacademictitle}}{#1~}{}\ignorespaces}
\newcommand{\Dr}{\ds@academictitle{Dr.}}
\newcommand{\Prof}{\ds@academictitle{Prof.}}
\newcommand{\ProfDr}{\ds@academictitle{Prof.\,Dr.}}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
%    \begin{macrocode}
\def\city#1{%
   \city@tk={#1}\@citytrue%
   \ignorespaces%
}
\def\sourcenr#1{%
   \sourcenr@tk={#1}\@sourcenrtrue%
   \ignorespaces%
}
\def\source#1{%
   \source@tk={#1}\@sourcetrue%
   \ignorespaces%
}
\def\ds@day#1{%
   \day@tk={#1}\@daytrue\@datetrue%
   \ignorespaces%
}
\def\ds@month#1{%
   \from@month=#1\@datetrue%
   \ignorespaces%
}
\def\months#1{%
   \@months#1;%
   \ignorespaces%
}
\def\ds@year#1{%
   \year@tk={#1}\@yeartrue\@datetrue%
   \ignorespaces%
}
\def\issue#1{%
   \issue@tk={#1}\@issuetrue%
   \ignorespaces%
}
\def\pages#1{%
   \pages@tk={#1}\@pagestrue%
   \ignorespaces%
}
\def\tournament#1{%
   \tournament@tk={#1}\@tournamenttrue%
   \ignorespaces%
}
\def\award#1{%
   \ifthenelse{\equal{}{#1}}{%
       \message{^^JWARNING: ignoring empty 'award' argument.^^J}%
   }{%
       \award@tk={#1}\@awardtrue%
       \ignorespaces%
   }%
}
\def\version#1{%
    \ifthenelse{\equal{}{#1}}{%
        \message{^^JWARNING: ignoring empty 'version' argument.^^J}%
    }{%
        \version@tk={#1}\@versiontrue%
        \ignorespaces%
    }%
}
\def\after#1{%
    \ifthenelse{\equal{}{#1}}{%
        \message{^^JWARNING: ignoring empty 'after' argument.^^J}%
    }{%
        \after@tk={#1}\@aftertrue%
        \ignorespaces%
    }%
}
\def\correction#1{%
    \ifthenelse{\equal{}{#1}}{%
        \message{^^JWARNING: ignoring empty 'correction' argument.^^J}%
    }{%
        \correction@tk={#1}\@correctiontrue%
        \ignorespaces%
    }%
}
\def\dedication#1{%
    \ifthenelse{\equal{}{#1}}{%
        \message{^^JWARNING: ignoring empty 'correction' argument.^^J}%
    }{%
        \dedic@tk={#1}\@dedicationtrue%
        \ignorespaces%
    }%
}
\def\fidealbum#1{%
   \fidealbum@tk={#1}\@fidealbumtrue%
   \ignorespaces%
}
\def\pieces{%
   \@ifnextchar[%
   {\x@pieces}%
   {\@pieces}%
}
\def\x@pieces[#1]{%
   % We should parse the given piececounts
   \setboolean{cpd@checkPieceCounts}{true}%
   \@parseWhiteAndBlackCount#1+\e@list
   \@pieces%
}
\def\@parseWhiteAndBlackCount#1+#2+{%
   \setcounter{cpd@defWhitePieces}{#1}%
   \setcounter{cpd@defBlackPieces}{#2}%
   \futurelet\n@xt\cpd@checkNeutral%
}
\let\cpd@nextproc=\relax%
\def\cpd@checkNeutral{%
    \if\n@xt\relax%
        \let\cpd@nextproc=\relax%
    \else%
        \let\cpd@nextproc=\@parseNeutralCount%
    \fi%
    \cpd@nextproc%
}
\def\@parseNeutralCount#1+{%
   \setcounter{cpd@defNeutralPieces}{#1}%
}
\def\@pieces#1{%
   \pieces@tk={#1}\@piecestrue%
   \ignorespaces%
}
\newcommand{\fen}[2][]{%
   \ifthenelse{\equal{#1}{}}%
      {}% Do nothing
      {%
         \setboolean{cpd@checkPieceCounts}{true}%
         \@parseWhiteAndBlackCount#1+\e@list
      }%
   \fen@tk={#2}\setboolean{@cpd@fen}{true}%
   \ignorespaces%
}
\def\fieldtext#1{%
   \fieldtext@tk={#1}\@fieldtexttrue%
   \ignorespaces%
}
\def\nofields#1{%
   \nofields@tk={#1}\@nofieldstrue%
   \ignorespaces%
}
\let\nosquares\nofields
\def\gridlines#1{%
   \gridlines@tk={#1}\@gridlinestrue%
   \ignorespaces%
}
\def\fieldframe#1{%
   \fieldframe@tk={#1}\@fieldframetrue%
   \ignorespaces%
}
\def\stipulation#1{%
   \stipulation@tk={#1}\@stipulationtrue%
   \ignorespaces%
}
\def\condition{%
   \@ifstar{\x@condtrue\@condition}{\@condition}%
}
\def\@condition#1{%
   \condition@tk={#1}\@conditiontrue%
   \ignorespaces%
}
\def\twins{%
   \@ifstar{\x@twinstrue\@twins}{\@twins}%
}
\def\@twins#1{%
   \twins@tk={#1}\@twinstrue%
   \ignorespaces%
}
\def\remark#1{%
   \remark@tk={#1}\@remarktrue%
   \ignorespaces%
}
\def\piecedefs#1{%
   \piecedefs@tk={#1}\@piecedefstrue%
   \ignorespaces%
}
% \def\@piecedef#1{\csname#1\x@piecedef\endcsname\l@@klist}
% \newcommand{\piecedef}[3][ws]{%
%     \def\x@piecedef{#2}%
%     \let\@action=\@piecedef%
%     \hbox{\l@@klist#1\e@list%
%     \ = #3}%
% }
\def\Co#1{%
   \ifx#1+\@computertrue\computer@tk={+}\fi%
   \ignorespaces%
}
\long\def\solution#1{%
   \sol@tk={#1}\global\s@lutrue%
   \ignorespaces%
}
\def\themes#1{%
   \theme@tk={#1}\@themetrue%
   \ignorespaces%
}
\def\genre#1{%
   \relax% Currently not used within diagram.sty
}
\long\def\comment#1{%
   \comment@tk={#1}\@commenttrue%
   \ignorespaces%
}
\long\def\judgement#1{%
   \judgement@tk={#1}\@judgementtrue%
   \ignorespaces%
}
\def\noframe{%
   \@vframefalse\@hframefalse%
   \ignorespaces%
}
\def\noinnerframe{%
   \@leaveOuterfalse\@vframefalse\@hframefalse%
   \ignorespaces%
}
\def\verticalcylinder{%
   \@vframefalse%
   \ignorespaces%
}
\def\horizontalcylinder{%
   \@hframefalse%
   \ignorespaces%
}
\def\stdgrid{%
   \@stdgridtrue%
   \ignorespaces%
}
%    \end{macrocode}
%
% \begin{macro}{\gridchess}
% \begin{macro}{\magic}
% \begin{macro}{\tourn}
% \begin{macro}{\dedic}
% \begin{macro}{\stip}
% \begin{macro}{\cond}
% \begin{macro}{\rem}
% \begin{macro}{\sol}
% Here we define some abbreviations and synonyms for other
% macros.
%    \begin{macrocode}
\let\gridchess=\stdgrid
\let\magic=\fieldframe
\let\tourn=\tournament
\let\dedic=\dedication
\let\stip=\stipulation
\let\cond=\condition
\let\rem=\remark
\let\sol=\solution
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
%    \begin{macrocode}
\def\develop{%
   \@developtrue%
   \ignorespaces%
}
\def\showcomputer{%
   \setboolean{showcomputer}{true}%
   \ignorespaces%
}
\def\nocomputer{%
   \setboolean{showcomputer}{false}%
   \ignorespaces%
}
\def\putsol{\immediate\closeout\s@lfd\input\jobname.sol\cl@arsol}
\def\widedias{\@widediastrue\diagcenter}
\def\nowidedias{\@widediasfalse}
\def\normalnames{\normal@namestrue}
\def\reversednames{\normal@namesfalse}
\def\makeaindex{%
   \@dia@index%
   \newindex[thediag]{author}{adx}{and}{Autorenverzeichnis}%
   \@aindextrue\reversednames%
}

\def\makesindex{%
   \@dia@index%
   \newindex[thediag]{source}{sdx}{snd}{Quellenregister}%
   \@sindextrue%
}

\def\maketindex{%
   \@dia@index%
   \newindex[thediag]{theme}{tdx}{tnd}{Themenregister}%
   \@tindextrue%
}

\def\authorindex{{\let\@idxitem\@aidxitem\printindex[author]}}
\def\sourceindex{\printindex[source]}
\def\themeindex{\printindex[theme]}
\def\DefinePieces#1#2#3{%
   \@setPieceColor#1\@setPieceSpec#2\@setPieceRotation#3%
   \loop@rotation%
   \expandafter\xdef\csname\ds@black\ds@white\ds@bishop\endcsname{%
      \noexpand\ch@fig{20}%
   }%
   \expandafter\xdef\csname\ds@black\ds@black\ds@bishop\endcsname{%
      \noexpand\ch@fig{32}%
   }%
   \expandafter\xdef\csname\ds@white F\endcsname{{\chessfont\ }}
   \expandafter\xdef\csname\ds@black F\endcsname{{\chessfont\char144}}
   \expandafter\xdef\csname\ds@white Nr\endcsname{%
      \noexpand\ch@fig{109}%
   }%
   \expandafter\xdef\csname\ds@neutral Nr\endcsname{%
      \noexpand\ch@fig{115}%
   }%
   \expandafter\xdef\csname\ds@black Nr\endcsname{%
      \noexpand\ch@fig{121}%
   }%
   \expandafter\xdef\csname\ds@white Gh\endcsname{%
      \noexpand\ch@fig{112}%
   }%
   \expandafter\xdef\csname\ds@neutral Gh\endcsname{%
      \noexpand\ch@fig{118}%
   }%
   \expandafter\xdef\csname\ds@black Gh\endcsname{%
      \noexpand\ch@fig{124}%
   }%
   \expandafter\xdef\csname\ds@white C\endcsname{%
      \noexpand\ch@fig{145}%
   }%
   \expandafter\xdef\csname\ds@neutral C\endcsname{%
      \noexpand\ch@fig{151}%
   }%
   \expandafter\xdef\csname\ds@black C\endcsname{%
      \noexpand\ch@fig{157}%
   }%
}
\def\Imi{\ch@fig{157}}
\def\wE{\ch@fig{216}}
\def\nE{\ch@fig{222}}
\def\sE{\ch@fig{228}}
\def\wX{\ch@fig{180}}
\def\nX{\ch@fig{186}}
\def\sX{\ch@fig{192}}

%    \end{macrocode}
%
% \begin{macro}{\dia@above}
% The content of the box above a diagram is controlled by the
% macro |\dia@above|. It just delegates the information to a
% couple of other macros, which then generate the displayed
% information above the diagram.
%    \begin{macrocode}
\newboolean{above@newline}
\newcommand{\above@newline}{\ifthenelse{\boolean{above@newline}}{\linebreak}{\setboolean{above@newline}{true}}}
\def\dia@above{%
   \setboolean{above@newline}{false}%
   \@dia@number%
   \@dia@authors%
   \@dia@city%
   \@dia@after%
   \@dia@version%
   \@dia@source%
   \@dia@correction%
   \@dia@tournament%
   \@dia@award%
   \@dia@dedic%
   \@dia@fidealbum%
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\dia@below}
% As before, the macro |\dia@below| creates the displayed
% information below the chessboard - forwarding to a couple of other
% macros.
%    \begin{macrocode}
\def\dia@below{%
   \bgroup%
   \if@stipulation%
      \@dia@stipulation%
   \fi%
   \ifx@cond\else%
      \@dia@condition%
   \fi%
   \ifx@twins\else%
      \@dia@twins%
   \fi%
   \@dia@piecedefs%
   \@dia@remark%
   \ifthenelse{\boolean{@solafterdiagram}}{%
      \below@newline%
      \the\sol@tk%
   }{}%
   \noindent\hbox{}\newline\hbox{}%
   \egroup%
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@dia@number}
% The |\@dia@number| macro simply creates the diagram number in a
% single paragraph.
%    \begin{macrocode}
\def\@dia@number{%
   %\ifdi@no\above@newline{\authorfont\thediag}\fi%
   \ifthenelse{\boolean{@cpd@numbering@local}}{%
      \above@newline{\authorfont\thediag}%
   }{}%
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@dia@authors}
% This macro is used to create the list of authors specified
% within the |\author| macro inside the |diagram| environment.
% Depending on the \TeX-boolean |normal@names| we either simply
% display the registered author or parse the list of authors by
% using the generic |\@parseTokenList| macro.
%    \begin{macrocode}
\def\@dia@authors{%
   \ifauth@r%
      \ifnormal@names%
         \above@newline
         {\authorfont\the\aut@tk}%
      \else%
         \let\@action=\@dia@writename% Parse the list of authors
       \@parseTokenlist\aut@tk;
      \fi%
   \fi%
}
%    \end{macrocode}
% \end{macro}
%
%    \begin{macrocode}
\def\@show@city#1;{\if@notfirst\ \slash\ \else\@notfirsttrue\fi#1}

\def\p@rsecity#1; {\@show@city#1;\l@@klist}

\def\@dia@city{%
   \ifthenelse{\boolean{showcity}}{%
       \if@city%
          \above@newline%
          \bgroup%
          \cityfont\@notfirstfalse%
          \let\@action=\p@rsecity\@parseTokenlist\city@tk;%
          \egroup%
       \fi%
   }{}%
}

\def\@dia@after{%
   \if@after%
      \bgroup%
      \above@newline%
      \dedicfont\the\after@tk%
      \egroup%
   \fi%
}

\def\@dia@version{%
   \if@version%
      \above@newline%
      \bgroup%
      \dedicfont\the\version@tk%
      \egroup%
   \fi%
}

\def\@dia@date{%
   \ifnum\from@month>\z@%
      \if@day%
         \the\day@tk.\write@month\from@month%
      \else%
         \write@month\from@month%
      \fi%
      \ifnum\to@month>\z@--\write@month\to@month\fi%
      \if@day.\else/\fi%
   \fi%
   \if@year\the\year@tk\fi%
}

\def\@dia@source{%
   \if@source%
      \above@newline%
      \bgroup%
      \sourcefont%
      \if@sourcenr\the\sourcenr@tk\ \fi
      \the\source@tk%
      \if@date\ \ \fi\@dia@date%
      \if@issue\ \ \the\issue@tk\fi%
      \if@pages ,\ \the\pages@tk\fi%
      \egroup%
   \else%
      \if@tournament\else\if@date%
         \above@newline%
         \bgroup%
         \sourcefont%
         \@dia@date%
         \egroup%
      \fi\fi%
   \fi%
}

\def\@dia@correction{%
   \if@correction%
      \above@newline%
      \bgroup%
      \dedicfont\the\correction@tk%
      \egroup%
   \fi%
}

\def\@dia@tournament{%
   \if@tournament
      \above@newline%
      \bgroup%
      \awardfont%
      \the\tournament@tk
      \if@source\else\if@date%
         \ \ \@dia@date%
      \fi\fi%
      \egroup%
   \fi%
}

\def\@dia@award{%
   \if@award%
      \above@newline%
      \bgroup%
      \awardfont\the\award@tk%
      \egroup%
   \fi%
}

\def\@dia@dedic{%
   \if@dedication%
      \above@newline%
      \bgroup%
      \dedicfont\the\dedic@tk%
      \egroup%
   \fi%
}

\def\@show@album#1/#2;{#1 FIDE-Album #2}

\def\@dia@fidealbum{%
   \if@fidealbum%
      \above@newline%
      {\expandafter\@show@album\the\fidealbum@tk;}%
   \fi%
}

\def\@twinskip{\ \ }

\def\@dia@stipulation{%
   \if@stipulation%
      \bgroup%
      \stipfont%
      \the\stipulation@tk%
      \ifx@twins%
         \let\below@newline\@twinskip%
         \@dia@twins%
      \else\ifx@cond%
         \let\below@newline\@twinskip%
         \@dia@condition%
      \fi\fi%
      \egroup%
      \let\below@newline\newline%
   \else%
      \x@twinsfalse%
      \x@condfalse%
      \let\below@newline\relax%
   \fi%
}

\def\x@write@twin#1; {%
   \hskip1em#1%
   \@lefttrue\let\below@newline\newline%
   \let\@action\write@twins%
   \l@@klist%
}

\def\write@twins#1; {%
   \setbox\@test@box=\hbox{#1\if@left~~\fi}%
   \ifdim\wd\@test@box>4\sq@width%
      \below@newline%
      \@lefttrue%
      #1%
   \else%
      \if@left%
         \below@newline%
      \fi%
      \noindent\hbox to 4\sq@width{#1\hfil}%
      \if@left%
         \@leftfalse%
      \else%
         \@lefttrue%
      \fi%
   \fi%
   \let\below@newline\newline%
   \l@@klist%
}

\def\@dia@twins{%
   \if@twins%
      \bgroup%
      \@lefttrue%
      \remfont%
      \ifx@twins%
         \let\@action=\x@write@twin%
      \else%
         \let\@action=\write@twins%
      \fi%
      \@parseTokenlist\twins@tk;%
      \egroup%
      \let\below@newline\newline%
   \fi%
}

\def\@dia@condition{%
   \if@condition%
      \bgroup%
      \@lefttrue%
      \remfont%
      \ifx@cond%
         \let\@action=\x@write@twin%
      \else%
         \let\@action=\write@twins%
      \fi%
      \@parseTokenlist\condition@tk;%
      \egroup%
      \let\below@newline\newline%
   \fi%
}

\def\check@piecedef{%
    \ifx\next@piecedef\relax%
        \let\col@action=\relax%
    \else%
        \let\col@action=\@@piecedef%
    \fi%
    \col@action%
}
\def\@@piecedef#1{\csname#1\x@piecedef\endcsname\parse@piecedef}

\def\parse@piecedef{\futurelet\next@piecedef\check@piecedef}

\def\@piecedef#1#2#3{%
   \def\x@piecedef{#2}%
   \below@newline%
   \hbox{%
   \parse@piecedef#1\relax%
   \ = #3}%
}

\def\write@piecedefs#1; {%
   \@piecedef#1%
   \l@@klist%
}

\def\@dia@piecedefs{%
   \if@piecedefs%
      \bgroup%
      \@lefttrue%
      \let\below@newline\newline%
      \remfont\let\@action=\write@piecedefs%
      \@parseTokenlist\piecedefs@tk;%
      \egroup%
   \fi%
}

\def\@dia@remark{%
   \if@remark%
      \bgroup%
      \@lefttrue%
      \remfont\let\@action=\write@twins%
      \@parseTokenlist\remark@tk;%
      \egroup%
      \let\below@newline\newline%
   \fi%
}

\def\parse@params#1{%
   \ifcase\help@a\relax
      \label@tk={#1}\ifx\relax#1\else\@labeltrue\fi\or%
      \number@tk={#1}\ifx\relax#1\else\@numbertrue\fi\or%
      \aut@tk={#1}\ifx\relax#1\else\auth@rtrue\fi\or%
      \city@tk={#1}\ifx\relax#1\else\@citytrue\fi\or%
      \sourcenr@tk={#1}\ifx\relax#1\else\@sourcenrtrue\fi\or%
      \source@tk={#1}\ifx\relax#1\else\@sourcetrue\fi\or%
      \day@tk={#1}\ifx\relax#1\else\@daytrue\fi\or%
      \from@month=#1\or%
      \to@month=#1\or%
      \year@tk={#1}\ifx\relax#1\else\@yeartrue\fi\or%
      \issue@tk={#1}\ifx\relax#1\else\@issuetrue\fi\or%
      \pages@tk={#1}\ifx\relax#1\else\@pagestrue\fi\or%
      \tournament@tk={#1}\ifx\relax#1\else\@tournamenttrue\fi\or%
      \award@tk={#1}\ifx\relax#1\else\@awardtrue\fi\or%
      \after@tk={#1}\ifx\relax#1\else\@aftertrue\fi\or%
      \version@tk={#1}\ifx\relax#1\else\@versiontrue\fi\or%
      \correction@tk={#1}\ifx\relax#1\else\@correctiontrue\fi\or%
      \dedic@tk={#1}\ifx\relax#1\else\@dedicationtrue\fi\or%
      \theme@tk={#1}\ifx\relax#1\else\@themetrue\fi\or%
      \twins@tk={#1}\ifx\relax#1\else\@twinstrue\fi\or%
      \computer@tk={#1}\or%
      \comment@tk={#1}\ifx\relax#1\else\@commenttrue\fi\or%
      \judgement@tk={#1}\ifx\relax#1\else\@judgementtrue\fi\or%
      \sol@tk={#1}%
   \fi%
   \advance\help@a \@ne%
   \l@@klist%
}

\def\split@param#1{%
   \@labelfalse\@numberfalse\auth@rfalse\@cityfalse%
   \@sourcenrfalse\@sourcefalse\@dayfalse\@yearfalse%
   \@issuefalse\@pagesfalse\@tournamentfalse\@awardfalse%
   \@afterfalse\@versionfalse\@correctionfalse\@dedicationfalse%
   \@themefalse\@twinsfalse\@commentfalse\@judgementfalse%
   \help@a=\z@%
   \let\@action=\parse@params\l@@klist#1\e@list%
}
\newcommand{\solpar}{\par}
\def\@dia@solution{%
   \bgroup%
   \parindent\z@%
   \parskip\tw@\p@%
   {\bfseries%
      \noindent\if@label\showlabel{\the\label@tk}\fi%
      \the\number@tk) %
      \ifauth@r%
         \ifnormal@names%
            \the\aut@tk%
         \else%
            {\@notfirstfalse% We are the first one
            \def\name@sep{, }%
            \let\@action=\@sol@writename%
            \@parseTokenlist\aut@tk;}:%
         \fi%
         \newline%
      \fi%
   }%
   \if@develop\if@judgement\the\judgement@tk\solpar\fi\fi%
   \the\sol@tk\solpar%
   \if@comment\the\comment@tk\solpar\fi%
   \egroup%
}
\grid@width=0.6\p@
\inner@frame=0.6\p@
\outer@frame=1.2\p@
\space@frame=\outer@frame
\v@frame@dist=\tw@\p@%
\h@frame@dist=\tw@\p@%
\space@frame@dist=\z@
\v@space@dist=1em
\def\@show@figurine{%
   \noindent%
   \@figurine@number%
   \@figurine@author%
   \@figurine@city%
   \@figurine@after%
   \@figurine@correction%
   \@figurine@version%
   \@figurine@source%
   \@figurine@tournament%
   \@figurine@award%
   \@figurine@dedic%
   \@figurine@pieces%
   \@figurine@stip%
   \@figurine@twins%
   \@figurine@conditions%
   \@figurine@remarks%
   \@figurine@computer%
}
\def\@figurine@number{{\authorfont\thediag)}}

\def\p@rseauthor@figurine#1,#2; {%
   \if@notfirst, \else\@notfirsttrue\fi#2 #1%
   \l@@klist%
}

\def\@figurine@author{%
   {\ifauth@r%
      \authorfont\@notfirstfalse%
      \let\@action=\p@rseauthor@figurine%
      \@parseTokenlist\aut@tk;%
      \ \ %
   \fi}%
}

\def\@figurine@city{%
   {\if@city%
      \cityfont\@notfirstfalse%
      \let\@action=\p@rsecity\@parseTokenlist\city@tk;%
      \ \ \ %
   \fi}%
}

\def\@figurine@after{\if@after{\dedicfont\ \ \the\after@tk}\fi}

\def\@figurine@correction{%
   \if@correction{\dedicfont\ \ \the\correction@tk}\fi%
}

\def\@figurine@version{%
   \if@version{\dedicfont\ \ \the\version@tk}\fi%
}

\def\@figurine@source{%
   {\if@source%
      \sourcefont%
      \if@sourcenr\the\sourcenr@tk\ \fi%
      \the\source@tk%
      \if@date\ \ \fi\@dia@date%
      \if@issue , \the\issue@tk\fi%
      \if@pages , \the\pages@tk\fi%
   \fi}%
}

\def\@figurine@tournament{%
   \if@tournament{\awardfont\ \ \the\tournament@tk}\fi%
}

\def\@figurine@award{%
   \if@award{\awardfont\ \ \the\award@tk}\fi%
}

\def\@figurine@dedic{%
   \if@dedication{\awardfont\ \ \the\dedic@tk}\fi%
}
\def\show@squares#1\e@list{\ch@fig{\the\help@a}#1, }

\def\@figurine@pieces{%
   {\if@pieces%
      \let\@action=\p@rsepieces%
      \let\piece@job\show@squares%
      \@parseTokenlist\pieces@tk,%
   \fi}%
}
\def\@figurine@stip{%
   \if@stipulation{\stipfont\ \ \the\stipulation@tk}\fi%
}

\def\@figurine@conditions{%
   \if@condition{\remfont\ \ \the\condition@tk}\fi%
}

\def\@figurine@twins{%
   \if@twins{\remfont\ \ \the\twins@tk}\fi%
}

\def\@figurine@computer{%
   \ifthenelse{\boolean{showcomputer}}{%
      \if@computer\ \computerproofedsymbol\fi%
   }{}%
}

\def\@figurine@remarks{%
   \if@remark{\stipfont\ \ \the\remark@tk}\fi%
}
\def\do@dia@job{\@write@sol\ifvmode\noindent\fi\unhbox\dia@box}
\def\solhead#1{{\split@param{#1}\@dia@solution}}
\def\@write@sol{%
   \ifs@lu%
      \immediate\write\s@lfd{%
         \noexpand\solhead{%
            {\the\label@tk}%
            {\thediag}%
            {\the\aut@tk}%
            {\the\city@tk}%
            {\the\sourcenr@tk}%
            {\the\source@tk}%
            {\the\day@tk}%
            {\the\from@month}%
            {\the\to@month}%
            {\the\year@tk}%
            {\the\issue@tk}%
            {\the\pages@tk}%
            {\the\tournament@tk}%
            {\the\award@tk}%
            {\the\after@tk}%
            {\the\version@tk}%
            {\the\correction@tk}%
            {\the\dedic@tk}%
            {\the\theme@tk}%
            {\the\twins@tk}%
            {\the\computer@tk}%
            {\the\comment@tk}%
            {\the\judgement@tk}%
            {\the\sol@tk}%
         } %end of \solhead
      }%
   \fi
}
\def\@months#1-#2;{\from@month=#1\to@month=#2\@datetrue}
\def\@dia@writename#1; {\above@newline{\authorfont\@dianame#1; }\l@@klist}
\def\@sol@writename#1; {\sep@names\@solname#1; \l@@klist}
\def\name@sep{,\ }
\def\sep@names{\if@notfirst\name@sep\else\@notfirsttrue\fi}
\def\@checkshort#1/#2#3;{%
   \@shortformtrue%
   \ifx#2\e@list\relax%
      \@shortformfalse%
   \fi%
}
\def\short@christian#1#2-{%
   \if@notfirst -\else\@notfirsttrue\fi%
   #1.%
   \l@@klist%
}

\def\@write@christian#1/#2;{#1}

\def\write@christian#1;{%
   \@checkshort#1/\e@list;%
   \if@shortform\@write@christian#1;\else#1\fi%
}

\def\@write@short#1/#2;{#2}

\def\write@short#1;{%
   \@checkshort#1/\e@list;%
   \if@shortform%
      \@write@short#1;%
   \else%
      {\@notfirstfalse\let\@action\short@christian\l@@klist#1-\e@list}%
   \fi%
}
\def\@fullname#1, #2; {\write@christian#2; #1}
\def\@sirname#1, #2; {#1}
\def\@short#1, #2; {\write@short#2;\ #1}
\def\@noname#1, #2; {}
\def\@normalname#1; {#1}
\def\space@vertical{\space@verticaltrue}
\def\space@horizontal{\space@verticalfalse}
\def\cl@arsol{\immediate\openout\s@lfd=\jobname.sol\relax}
\def\getc@lor#1{%
   \if#1\ds@white%
     \help@a\z@\global%
     \let\cpd@stepcounterPieces\cpd@stepcounterWhite%
   \else\if#1\ds@neutral%
     \help@a=6\global%
     \let\cpd@stepcounterPieces\cpd@stepcounterNeutral%
   \else\if#1\ds@black%
     \help@a=12\global%
     \let\cpd@stepcounterPieces\cpd@stepcounterBlack%
   \else\errmessage{invalid color!}%
   \fi\fi\fi%
   \getpi@ce%
}

\def\get@text#1{\text@tk={#1}\read@square}

\def\getpi@ce#1{\if#1B\relax\else
   \if#1\ds@knight\advance\help@a\@ne%
   \else\if#1\ds@bishop\advance\help@a\tw@%
   \else\if#1\ds@rook\advance\help@a\thr@@%
   \else\if#1\ds@queen\advance\help@a\f@ur%
   \else\if#1\ds@king\advance\help@a 5%
   \else\if#1C%
      % An imitator should not count for any color.
      \let\cpd@stepcounterPieces\relax
      \advance\help@a 145%
   \else\if#1E%  Equihopper
      \advance\help@a 216%
   \else\if#1X%  Equihopper senkrecht
      \advance\help@a 180%
   \else%
      \errmessage{invalid piece!}%
   \fi\fi\fi\fi\fi\fi\fi\fi\fi%
   \futurelet\r@tate\chkr@tate%
}

\def\chkr@tate{%
   \if\r@tate \ds@rotation@upsidedown\advance\help@a 108\let\nextpr@c=\skipr@t\else%
   \if\r@tate \ds@rotation@left\advance\help@a 36\let\nextpr@c=\skipr@t\else%
   \if\r@tate \ds@rotation@right\advance\help@a 72\let\nextpr@c=\skipr@t\else%
   \let\nextpr@c\piece@job\fi\fi\fi\nextpr@c%
}
\def\skipr@t#1{\piece@job}
\def\l@@k{\futurelet\whatsnext\parsefi@lds}
\def\parsefi@lds{%
   \if\whatsnext\e@list%
      \let\nextpr@c\relax%
   \else
      \let\nextpr@c\read@square%
   \fi%
   \nextpr@c%
}

\def\set@current@square@index#1#2{%
  \setcounter{cpd@current@square@index}{#1+\value{cpd@linesmax}*#2}%
}
\def\set@current@square@value#1{%
  \expandafter%
    \xdef\csname cpd@square@\roman{cpd@current@square@index}\endcsname{#1}%
}
\def\get@current@square@value{%
  \setcounter{cpd@current@square@value}%
    {\csname cpd@square@\roman{cpd@current@square@index}\endcsname}%
}
\def\set@piece{%
   \ifnum\pl@ne=\current@plane%
      \cpd@stepcounterPieces%
      \set@current@square@index\lin@\r@w%
      \get@current@square@value%
      \ifthenelse{\value{cpd@current@square@value}=\m@ne}
        {\set@current@square@value{\the\help@a}}%
        {\ifthenelse{\value{cpd@current@square@value}=144}%
          {\set@current@square@value{\the\help@a+18}}%
          {\errmessage{Trying to set a piece to an occupied square}}}%
   \fi%
   \l@@k%
}
\def\cpd@fen@setpiece{%
   \ifnum\pl@ne=\current@plane%
      \cpd@stepcounterPieces%
      \set@current@square@index{\value{cpd@line}}{\value{cpd@row}}%
      \get@current@square@value%
      \ifthenelse{\value{cpd@current@square@value}=\m@ne}
        {\set@current@square@value{\the\help@a}}%
        {\ifthenelse{\value{cpd@current@square@value}=144}%
          {\set@current@square@value{\the\help@a+18}}%
          {\errmessage{Trying to set a piece to an occupied square}}}%
   \fi%
}
\def\set@nofield, {%
   \ifnum\pl@ne=\current@plane%
      \set@current@square@index\lin@\r@w%
      \get@current@square@value%
      \ifthenelse{\value{cpd@current@square@value}=\m@ne}%
        {}% This is an empty white square, nothing to do
        {\ifthenelse{\value{cpd@current@square@value}=144}%
          {\set@current@square@value{\m@ne}}%
          {\errmessage{Trying to set a piece to an occupied square}}}%
   \fi%
   \l@@klist%
}
\def\set@frame, {%
   \ifnum\pl@ne=\current@plane%
      \@vGrid{\the\lin@}{\the\r@w}\@ne%
      \@hGrid{\the\lin@}{\the\r@w}\@ne%
      \advance\lin@\@ne%
      \@vGrid{\the\lin@}{\the\r@w}\@ne%
      \advance\lin@\m@ne\advance\r@w\@ne%
      \@hGrid{\the\lin@}{\the\r@w}\@ne%
   \fi%
   \l@@klist%
}
\def\e@list{\relax}
\def\l@@klist{\futurelet\nextlist\ch@cklst}
\def\ch@cklst{%
   \ifx\nextlist\e@list%
      \let\nextpr@c=\relax%
   \else%
      \let\nextpr@c=\@action%
   \fi%
   \nextpr@c%
}
\def\@cpd@handle@fen#1{%
   \ifx#1/\relax%
      \ifthenelse{\value{cpd@line}=8}%
      {%
         \setcounter{cpd@line}{0}%
         \addtocounter{cpd@row}{\m@ne}%
      }%
      {%
         \errmessage{FEN: there is now row to end here}%
      }%
   \else\ifx#1K\relax%
      \let\cpd@stepcounterPieces\cpd@stepcounterWhite%
      \help@a=5%
      \cpd@fen@setpiece%
      \addtocounter{cpd@line}{\@ne}%
   \else\ifx#1Q\relax%
      \let\cpd@stepcounterPieces\cpd@stepcounterWhite%
      \help@a=4%
      \cpd@fen@setpiece%
      \addtocounter{cpd@line}{\@ne}%
   \else\ifx#1R\relax%
      \let\cpd@stepcounterPieces\cpd@stepcounterWhite%
      \help@a=3%
      \cpd@fen@setpiece%
      \addtocounter{cpd@line}{\@ne}%
   \else\ifx#1B\relax%
      \let\cpd@stepcounterPieces\cpd@stepcounterWhite%
      \help@a=2%
      \cpd@fen@setpiece%
      \addtocounter{cpd@line}{\@ne}%
   \else\ifx#1N\relax%
      \let\cpd@stepcounterPieces\cpd@stepcounterWhite%
      \help@a=1%
      \cpd@fen@setpiece%
      \addtocounter{cpd@line}{\@ne}%
   \else\ifx#1P\relax%
      \let\cpd@stepcounterPieces\cpd@stepcounterWhite%
      \help@a=0%
      \cpd@fen@setpiece%
      \addtocounter{cpd@line}{\@ne}%
   \else\ifx#1k\relax%
      \let\cpd@stepcounterPieces\cpd@stepcounterBlack%
      \help@a=17%
      \cpd@fen@setpiece%
      \addtocounter{cpd@line}{\@ne}%
   \else\ifx#1q\relax%
      \let\cpd@stepcounterPieces\cpd@stepcounterBlack%
      \help@a=16%
      \cpd@fen@setpiece%
      \addtocounter{cpd@line}{\@ne}%
   \else\ifx#1r\relax%
      \let\cpd@stepcounterPieces\cpd@stepcounterBlack%
      \help@a=15%
      \cpd@fen@setpiece%
      \addtocounter{cpd@line}{\@ne}%
   \else\ifx#1b\relax%
      \let\cpd@stepcounterPieces\cpd@stepcounterBlack%
      \help@a=14%
      \cpd@fen@setpiece%
      \addtocounter{cpd@line}{\@ne}%
   \else\ifx#1n\relax%
      \let\cpd@stepcounterPieces\cpd@stepcounterBlack%
      \help@a=13%
      \cpd@fen@setpiece%
      \addtocounter{cpd@line}{\@ne}%
   \else\ifx#1p\relax%
      \let\cpd@stepcounterPieces\cpd@stepcounterBlack%
      \help@a=12%
      \cpd@fen@setpiece%
      \addtocounter{cpd@line}{\@ne}%
   \else\ifx1#1\relax%
      \addtocounter{cpd@line}{1}%
   \else\ifx2#1\relax%
      \addtocounter{cpd@line}{2}%
   \else\ifx3#1\relax%
      \addtocounter{cpd@line}{3}%
   \else\ifx4#1\relax%
      \addtocounter{cpd@line}{4}%
   \else\ifx5#1\relax%
      \addtocounter{cpd@line}{5}%
   \else\ifx6#1\relax%
      \addtocounter{cpd@line}{6}%
   \else\ifx7#1\relax%
      \addtocounter{cpd@line}{7}%
   \else\ifx8#1\relax%
      \addtocounter{cpd@line}{8}%
   \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
}
\def\@cpd@parse@fen#1{\@cpd@handle@fen#1\l@@klist}
\def\p@rsepieces#1, {\getc@lor#1\e@list\l@@klist}
\def\p@rsetext#1, {\get@text#1\e@list\l@@klist}
\def\set@text{%
   \ifnum\pl@ne=\current@plane%
      \raise\r@w\sq@width\hbox to \z@{%
         \hskip\lin@\sq@width%
         \vbox to \sq@width{\vss%
         \hbox to \sq@width{%
           \hss%
           {\the\text@tk}%
           \hss%
         }\vss}%
         \hss%
      }%
   \fi%
   \l@@klist%
}
\def\p@rseauthor#1; {\sh@wauthor#1;\l@@klist}
\def\read@square#1#2{%
   \lin@=`#1\advance\lin@ by -`a\relax%
   \r@w=#2\advance\r@w by \m@ne%
   \read@plane%
}
\def\read@plane@normal{\plane@job}

\def\read@plane@stereo{\futurelet\plane@char\get@plane@stereo}

\def\get@plane@stereo{%
   \if\plane@char A%
      \pl@ne=\@ne\advance\r@w-\tw@\advance\lin@-\tw@%
      \let\@plane@job=\skip@plane%
   \else\if\plane@char B%
      \pl@ne=\tw@\advance\r@w-\tw@\advance\lin@-\tw@%
      \let\@plane@job=\skip@plane%
   \else\if\plane@char C%
      \pl@ne=\thr@@\advance\r@w-\tw@\advance\lin@-\tw@%
      \let\@plane@job=\skip@plane%
   \else\if\plane@char D%
      \pl@ne=\f@ur\advance\r@w-\tw@\advance\lin@-\tw@%
      \let\@plane@job=\skip@plane%
   \else%
      \pl@ne=\z@\let\@plane@job=\plane@job%
   \fi\fi\fi\fi%
   \@plane@job%
}

\def\skip@plane#1{\plane@job}

\def\read@plane@space#1{\pl@ne=`#1\advance\pl@ne by -`A\relax\plane@job}
\def\@vGrid#1#2#3{%
   \raise#2\sq@width\hbox to \z@{%
      \hskip#1\sq@width\hskip-.5\grid@width%
      \vrule height#3\sq@width width\grid@width\hss%
   }%
}

\def\@hGrid#1#2#3{%
   \raise#2\sq@width\hbox to \z@{%
      \hskip#1\sq@width%
      \vrule width#3\sq@width height .5\grid@width depth%
      .5\grid@width\hss%
   }%
}
\def\@selGrid#1#2, {%
   \ifnum\pl@ne=\current@plane%
      \if#1h%
         \@hGrid#2%
      \else\if#1v%
         \@vGrid#2%
      \else%
         \errmessage{Wrong GridSelector #1}%
      \fi\fi%
   \fi%
   \l@@klist%
}
\def\@stdgrid{%
   \setbox\plane@box=\vbox{\hbox{%
      \help@a=\tw@%
      \loop%
         \ifnum\help@a<\lines@max%
         \@vGrid{\the\help@a}{0}{\the\rows@max}%
         \advance\help@a\tw@%
      \repeat%
      \help@a=\tw@%
      \loop%
         \ifnum\help@a<\rows@max%
            \@hGrid{0}{\the\help@a}{\the\lines@max}%
            \advance\help@a\tw@%
      \repeat%
      \box\plane@box
   }}%
}
\def\ds@xlabel#1{%
   \label@tk={#1}\@labeltrue%
}

\def\@set@label#1;{\ifds@label\label{#1}\fi}
\def\init@vars{%
   \global\s@lufalse
   \ifthenelse{\boolean{@cpd@numbering@global}}{%
      \setboolean{@cpd@numbering@local}{true}%
   }{%
      \setboolean{@cpd@numbering@local}{false}%
   }%
   \setboolean{cpd@checkPieceCounts}{false}%
   \setcounter{cpd@defWhitePieces}{\z@}%
   \setcounter{cpd@defBlackPieces}{\z@}%
   \setcounter{cpd@defNeutralPieces}{\z@}%
   \setcounter{cpd@whitePieces}{\z@}%
   \setcounter{cpd@blackPieces}{\z@}%
   \setcounter{cpd@neutralPieces}{\z@}%
   \lin@\z@
}

\def\clear@board{%
   \ifthenelse{\boolean{allwhite}\and\boolean{switchcolors}}%
      {\errmessage{'allwhite' and 'switchcolors' do not make sense used together.}}%
      {\@whitefield=\m@ne\@blackfield=144}%
   \ifthenelse{\boolean{allwhite}}{\@blackfield=\m@ne}{}%
   \ifthenelse{\boolean{switchcolors}}{\@whitefield=144\@blackfield=\m@ne}{}%
   \setcounter{cpd@current@row}{0}%
   \whiledo{\value{cpd@current@row}<\value{cpd@rowsmax}}{%
      \setcounter{cpd@current@line}{0}%
      \whiledo{\value{cpd@current@line}<\value{cpd@linesmax}}{%
         \set@current@square@index{\value{cpd@current@line}}{\value{cpd@current@row}}%
         \setcounter{cpd@helper}{\the\current@plane+\value{cpd@current@line}+\value{cpd@current@row}}%
         \ifthenelse{\isodd{\value{cpd@helper}}}%
           {\set@current@square@value{\@whitefield}}%
           {\set@current@square@value{\@blackfield}}%
        \addtocounter{cpd@current@line}{\@ne}%
      }%
      \addtocounter{cpd@current@row}{\@ne}%
   }%
}

\def\put@row#1{%
   \lin@\z@%
   \help@b=#1%
   \advance\help@b\brd@ff%
   \hbox{%
      \ifthenelse{\boolean{legend}}{{%
         \advance\@rows`1%
         \llap{\raise .25\sq@width\hbox{\legendfont \char\@rows\ \ }}%
      }}{}%
      \if@stereo%
         \ifnum\current@plane>\z@%
            \ifnum\@rows=12%
               \llap{\raise .5\sq@width\hbox{\cpd@boardfont c6\ }}%
            \fi%
         \fi%
      \fi%
      \hbox to \z@{\vbox to \sq@width{}}%
      \set@current@square@index{\lin@}{#1}%
      \loop%
         \get@current@square@value%
         \ifthenelse{\value{cpd@current@square@value}=\m@ne}%
          {\wF}%
          {\char\value{cpd@current@square@value}}%
         % \ifnum\count\help@b=\m@ne\wF%
         % \else\char\count\help@b\fi%
         \advance\lin@\@ne%
         \addtocounter{cpd@current@square@index}{1}%
         % \advance\help@b\@ne%
      \ifnum\lin@<\lines@max\repeat%
   }%
}
% \def\put@line#1{%
%    \lin@\z@%
%    \help@b=#1%
%    \advance\help@b\brd@ff%
%    \hbox{%
%       \if@stereo%
%          \ifnum\current@plane>\z@%
%             \ifnum\@rows=12%
%                \llap{\raise .5\sq@width\hbox{\cpd@boardfont c6\ }}%
%             \fi%
%          \fi%
%       \fi%
%       \hbox to \z@{\vbox to \sq@width{}}%
%       \loop%
%          \ifnum\count\help@b=\m@ne\wF%
%          \else\char\count\help@b\fi%
%          \advance\lin@\@ne\advance\help@b\@ne%
%       \ifnum\lin@<\lines@max\repeat%
%    }%
% }
\def\@parseTokenlist#1#2{\expandafter\l@@klist\the#1#2 \e@list}
\def\@addToPlane#1{%
   \setbox\plane@box=\vbox{\hbox{%
      \@parseTokenlist#1,%
      \box\plane@box%
   }}%
}
\def\put@plane{%
   % We might want gridchess
     \if@stdgrid%
        \@stdgrid%
     \fi%
   % Let us first set the fieldframes
   \if@fieldframe%
      \let\@action\read@square%
      \let\plane@job\set@frame%
      \@addToPlane\fieldframe@tk%
   \fi%
   % Now we set text to all squares which are given using \fieldtext
   \if@fieldtext%
      \let\@action\p@rsetext%
      \let\plane@job\set@text%
      \@addToPlane\fieldtext@tk%
   \fi%
   % Then we should add the gridlines
   \if@gridlines%
      \let\@action\read@plane%
      \let\plane@job\@selGrid%
      \@addToPlane\gridlines@tk%
   \else%
      \if@stereo%
        \stereo@center%
     \fi%
   \fi%
   % In an 'allwhite' diagram we display dotted lines
   \ifthenelse{\boolean{allwhite}}{%
       \setbox\plane@box=\vbox{\hbox{%
           \psset{unit=\sq@width,linewidth=.4pt,linestyle=dotted,dotsep=.125}%
           \setcounter{field@border}{1}%
           \whiledo{\value{field@border}<\lines@max}{%
              \psline(\value{field@border},0)(\value{field@border},\rows@max)%
              \addtocounter{field@border}{\@ne}%
           }%
           \setcounter{field@border}{1}%
           \whiledo{\value{field@border}<\rows@max}{%
              \psline(0,\value{field@border})(\lines@max,\value{field@border})%
              \addtocounter{field@border}{\@ne}%
           }%
           \box\plane@box%
       }}%
   }{}%
   % Now we should clear the board
   \clear@board%
   % Let us now parse the list of pieces
   \ifthenelse{\boolean{@cpd@fen}}{%
      \ifthenelse{\value{cpd@rowsmax}=8}{}{\errmessage{FEN is only allowed for 8x8 boards.}}
      \ifthenelse{\value{cpd@linesmax}=8}{}{\errmessage{FEN is only allowed for 8x8 boards.}}
      \setcounter{cpd@row}{7}%
      \setcounter{cpd@line}{0}%
      \let\@action\@cpd@parse@fen%
      \@parseTokenlist\fen@tk\e@list%
   }{}%
   \if@pieces%
      \let\@action\p@rsepieces%
      \let\piece@job\l@@k\let\plane@job\set@piece%
      \@parseTokenlist\pieces@tk,%
   \fi%
   % Now we clear all fields, which are given using \nofields
   \if@nofields%
      \let\@action\read@square%
      \let\plane@job\set@nofield%
      \@parseTokenlist\nofields@tk,%
   \fi%
   % Now we can put the pieces to the board
   \global\setbox\plane@box=\hbox{%
      \vbox{\rlap{\box\plane@box}}%
      \vbox{%
         \chessfont%
         \baselineskip=\z@\lineskip=\z@%
         \@rows=\rows@max%
         % \multiply\@rows by \lines@max%
         \loop%
            \advance\@rows \m@ne%
            \put@row\@rows%
         \ifnum\@rows>\z@\repeat%
      }%
       % Put a legend if wanted
       \ifthenelse{\boolean{legend}}{%
          \vbox to \z@{%
             \vbox to \z@{\vss}%
             \llap{\hbox{\hspace*{\inner@frame}%
                \lin@\z@%
                \loop%
                   \hbox to \sq@width{\hfill{\advance\lin@`a\legendfont\char\lin@}\hfill}%
                   \advance\lin@\@ne%
                \ifnum\lin@<\lines@max\repeat%
             }}\vss}%
       }{}%
   }%
}
\def\put@sqs@normal{%
   \put@plane%
   \setbox\sq@box=\hbox{%
      \inner@henbox{\box\plane@box}%
   }%
}
\def\put@sqs@stereo{%
   \setbox\sq@box=\hbox{\hfil\vbox{%
      \current@plane=5%
      \vskip\v@space@dist%
      \loop%
         \advance\current@plane\m@ne%
         \ifnum\current@plane=\z@%
            \lines@max=\@ight%
            \rows@max=\@ight%
         \else%
            \lines@max=\f@ur%
            \rows@max=\f@ur%
         \fi%
         % Now we should clear the board
         \begingroup% We need this for inner loops!
            \clear@board%
            \put@plane%
         \endgroup%
         \hbox to \bd@width{%
            \hfil%
            \inner@henbox{\box\plane@box}%
            \ifcase\current@plane\or%
               \rlap{{\cpd@boardfont\ A}}\or%
               \rlap{{\cpd@boardfont\ B}}\or%
               \rlap{{\cpd@boardfont\ C}}\or%
               \rlap{{\cpd@boardfont\ D}}%
            \fi%
            \hfil%
         }%
         \vskip\v@space@dist%
      \ifnum\z@<\current@plane\repeat%
   }\hfil}%
}

\def\stereo@center{%
   \ifnum\current@plane=\z@%
      \setbox\plane@box=\vbox{\hbox{%
         \@hGrid\tw@\tw@\f@ur\@hGrid\tw@ 6\f@ur%
         \@vGrid\tw@\tw@\f@ur\@vGrid6\tw@\f@ur%
         \box\plane@box%
      }}%
   \fi%
}
\def\put@sqs@space@vertical{%
   \setbox\sq@box=\hbox{\hfil\vbox{%
      \current@plane=\planes@max%
      \vskip\v@space@dist%
      \loop%
         \advance\current@plane\m@ne%
         % Now we should clear the board
         \begingroup% We use inner loops!
         \clear@board%
         \put@plane%
         \hbox to \bd@width{%
            \inner@henbox{\box\plane@box}%
            \advance\current@plane`A%
            \rlap{{\cpd@boardfont\ \char\current@plane}}%
         }%
         \endgroup%
         \vskip\v@space@dist%
      \ifnum\z@<\current@plane\repeat%
   }\hfil}%
}

\def\put@sqs@space@horizontal{%
   \setbox\sq@box=\hbox{%
      \current@plane=\z@%
      \hskip\h@space@dist%
      \loop%
         % Now we should clear the board
         \begingroup% We use inner loops!
         \clear@board%
         \put@plane%
         \hbox to \bd@width{%
            \inner@henbox{\box\plane@box}%
            \advance\current@plane`A%
            \rlap{{\cpd@boardfont\ \char\current@plane}}%
         }%
         \endgroup%
         \hskip\h@space@dist%
         \advance\current@plane\@ne%
      \ifnum\planes@max>\current@plane%
      \repeat%
   }%
}

\def\put@sqs@space{%
   \ifspace@vertical%
      \put@sqs@space@vertical%
   \else%
      \put@sqs@space@horizontal%
   \fi%
}
\def\@inner@vframe{%
   \if@vframe%
      \vrule width \inner@frame%
   \else%
      \hskip\inner@frame%
   \fi%
}

\def\@inner@hframe{%
   \if@hframe%
      \hrule height \inner@frame%
   \else%
      \vskip\inner@frame%
   \fi%
}
\def\inner@v@frame@rule{%
   \if@stereo%
      \@inner@vframe%
   \else\if@space%
      \@inner@vframe%
   \else\if@leaveOuter%
      \vrule width \inner@frame%
   \else%
      \@inner@vframe%
   \fi\fi\fi%
}

\def\inner@h@frame@rule{%
   \if@stereo%
      \@inner@hframe%
   \else\if@space%
      \@inner@hframe%
   \else\if@leaveOuter%
      \hrule height \inner@frame%
   \else%
      \@inner@hframe%
   \fi\fi\fi%
}

\def\inner@henbox#1{%
   \hbox{%
      \inner@v@frame@rule%
      \vbox{\inner@h@frame@rule#1\inner@h@frame@rule}%
      \inner@v@frame@rule%
   }%
}
\def\@outer@vrule{\vrule width \outer@frame}

\def\@outer@hrule{\hrule height \outer@frame}
\def\outer@v@frame@rule{%
   \if@stereo%
      \@outer@vrule%
   \else\if@space%
      \@outer@vrule%
   \else\if@leaveOuter%
      \if@vframe\@outer@vrule\else\hskip\outer@frame\fi%
   \else%
      \@outer@vrule%
   \fi\fi\fi%
}

\def\outer@h@frame@rule{%
   \if@stereo%
      \@outer@hrule%
   \else\if@space%
      \@outer@hrule%
   \else\if@leaveOuter%
      \if@hframe\@outer@hrule\else\vskip\outer@frame\fi%
   \else%
      \@outer@hrule%
   \fi\fi\fi%
}

\def\outer@henbox#1{%
   \outer@h@frame@rule%
   \hbox{%
      \outer@v@frame@rule%
      \ifspace@vertical%
         \hskip\h@frame@dist%
      \fi%
      \vbox{%
         \ifspace@vertical%
            \vskip\v@frame@dist%
         \else%
            \vskip\v@space@dist%
         \fi%
         #1%
         \ifspace@vertical%
            \vskip\v@frame@dist%
         \else%
            \vskip\v@space@dist%
         \fi%
      }%
      \ifspace@vertical%
         \hskip\h@frame@dist%
      \fi%
      \outer@v@frame@rule%
   }%
   \outer@h@frame@rule%
}
\def\ch@fig#1{%
   \ifvmode\noindent\fi%
   \hbox{\chtextfont\lower.1\fontdimen\tw@\chtextfont\hbox{\char#1}}%
}
\def\@dia@index{%
   \@ifundefined{newindex}%
   {\errmessage{You should add documentstyle-option 'index'}}{}%
}

\def\showlabel#1{%
   \if@develop%
      \raise1ex\hbox{\labelfont#1}\penalty\exhyphenpenalty%
   \fi%
}

\def\@aidxitem#1, #2, #3{%
   \par\medskip#1, \write@christian#2; \dotfill #3%
}

\def\dia@index#1\@sep#2[#3]{\index[#3]{#2|showlabel{#1}}}

\def\parse@aindex#1; {%
   \expandafter\dia@index\the\label@tk\@sep#1[author]\l@@klist%
}

\def\@aindex{%
   \if@aindex%
      \ifnormal@names%
         \errmessage{Cannot create index entries with normalnames}%
      \else\ifauth@r%
         \let\@action=\parse@aindex\@parseTokenlist\aut@tk;%
      \fi\fi%
   \fi%
}

\def\x@sindex#1\@sep{\expandafter\dia@index\the\label@tk\@sep#1[source]}

\def\@sindex{%
   \if@sindex\if@source%
      \expandafter\x@sindex\the\source@tk\@sep%
   \fi\fi%
}

\def\parse@tindex#1, {%
   \expandafter\dia@index\the\label@tk\@sep#1[theme]\l@@klist%
}

\def\@tindex{%
   \if@tindex\if@theme%
      \let\@action=\parse@tindex\@parseTokenlist\theme@tk,%
   \fi\fi%
}
\def\@setPieceColor#1#2#3{%
   \gdef\ds@white{#1}\gdef\ds@black{#2}\gdef\ds@neutral{#3}%
}

\def\@setPieceSpec#1#2#3#4#5#6{%
   \gdef\ds@king{#1}\gdef\ds@queen{#2}\gdef\ds@rook{#3}%
   \gdef\ds@bishop{#4}\gdef\ds@knight{#5}\gdef\ds@pawn{#6}%
}

\def\@setPieceRotation#1#2#3{%
   \gdef\ds@rotation@left{#1}\gdef\ds@rotation@right{#2}\gdef\ds@rotation@upsidedown{#3}%
}
\def\loop@rotation{%
   \bgroup%
      \n@cnt\z@%
      \help@a\z@%
      \loop%
         \ifcase\n@cnt%
            \def\@theRotation{}%
         \or%
            \def\@theRotation{\ds@rotation@left}%
         \or%
            \def\@theRotation{\ds@rotation@right}%
         \or%
            \def\@theRotation{\ds@rotation@upsidedown}%
         \fi%
         \loop@color%
         \advance\n@cnt\@ne%
         \advance\help@a by 36\relax%
      \ifnum\n@cnt<\f@ur\repeat%
   \egroup%
}

\def\loop@color{%
   \bgroup%
      \w@cnt\z@%
      \loop%
         \ifcase\w@cnt%
            \def\@theColor{\ds@white}%
         \or%
            \def\@theColor{\ds@neutral}%
         \or%
            \def\@theColor{\ds@black}%
         \fi%
         \loop@piece%
         \advance\w@cnt\@ne%
         \advance\help@a by 6%
      \ifnum\w@cnt<\thr@@\repeat%
   \egroup%
}

\def\loop@piece{%
   \bgroup%
      \b@cnt\z@%
      \loop%
         \ifcase\b@cnt%
            \def\@thePiece{\ds@pawn}%
         \or%
            \def\@thePiece{\ds@knight}%
         \or%
            \def\@thePiece{\ds@bishop}%
         \or%
            \def\@thePiece{\ds@rook}%
         \or%
            \def\@thePiece{\ds@queen}%
         \or%
            \def\@thePiece{\ds@king}%
         \fi%
         \expandafter\xdef\csname%
         \@theColor\@thePiece\@theRotation\endcsname{%
            \noexpand\ch@fig{\the\help@a}%
         }
         \advance\b@cnt\@ne%
         \advance\help@a by \@ne%
      \ifnum\b@cnt<6\repeat%
   \egroup%
}
\elchfont\@fselch

\defaultelchfont%
\diagnum{\@ne}
%% \figcnttrue
\setboolean{piececounter}{true}
\def\@dianame{\@fullname}
\def\@solname{\@fullname}
\space@verticaltrue
\diagnumbering{arabic}
\def\write@month{\@arabic}%
\diagleft
\cl@arsol
\let\orig@author=\author
\let\orig@day=\day
\let\orig@month=\month
\let\orig@year=\year
\let\orig@label=\label
\DefinePieces{wsn}{KDTLSB}{LRU}
\newdimen\normalboardwidth
\def\setboardwidth{%
   \normalboardwidth=\@ight\fontdimen\tw@\chessfont%
   \advance\normalboardwidth\tw@\inner@frame%
   \advance\normalboardwidth\tw@\h@frame@dist%
   \advance\normalboardwidth\tw@\outer@frame%
}

\setboardwidth

%</style>
%    \end{macrocode}
%
% \section{The implementation of cpdparse.sty}
%
% The following contains the style file \emph{cpdparse.sty}, which
% implements generic parsing of lists.
%
%    \begin{macrocode}
%<*cpdparse>
\ProvidesPackage{cpdparse}[2020/12/27]
%    \end{macrocode}
%
%    \begin{macrocode}
\def\cpd@parse@list{\futurelet\cpd@parse@lookahead\cpd@parse@check}
\def\cpd@parse@check{%
   \ifx\cpd@parse@lookahead\relax\relax%
      \let\cpd@parse@next=\relax%
   \else%
      \let\cpd@parse@next=\cpd@parse@action%
   \fi%
   \cpd@parse@next%
}
%    \end{macrocode}
%
%</cpdparse>
%
%
% \Finale
