diff options
-rw-r--r-- | Master/texmf-dist/doc/latex/chess-problem-diagrams/README | 47 | ||||
-rw-r--r-- | Master/texmf-dist/doc/latex/chess-problem-diagrams/diagram.pdf | bin | 0 -> 313514 bytes | |||
-rw-r--r-- | Master/texmf-dist/doc/latex/chess-problem-diagrams/fonts.zip | bin | 0 -> 80343 bytes | |||
-rw-r--r-- | Master/texmf-dist/source/latex/chess-problem-diagrams/diagram.dtx | 3062 | ||||
-rw-r--r-- | Master/texmf-dist/source/latex/chess-problem-diagrams/diagram.ins | 6 | ||||
-rw-r--r-- | Master/texmf-dist/tex/latex/chess-problem-diagrams/diagram.sty | 2074 | ||||
-rwxr-xr-x | Master/tlpkg/bin/tlpkg-ctan-check | 3 | ||||
-rw-r--r-- | Master/tlpkg/tlpsrc/chess-problem-diagrams.tlpsrc | 2 | ||||
-rw-r--r-- | Master/tlpkg/tlpsrc/collection-games.tlpsrc | 1 |
9 files changed, 5194 insertions, 1 deletions
diff --git a/Master/texmf-dist/doc/latex/chess-problem-diagrams/README b/Master/texmf-dist/doc/latex/chess-problem-diagrams/README new file mode 100644 index 00000000000..7d0b098a2be --- /dev/null +++ b/Master/texmf-dist/doc/latex/chess-problem-diagrams/README @@ -0,0 +1,47 @@ +%% 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. + +diagram --- A package for typesetting chessproblems +Version 1.5 / Stefan Hoening 2008 + +CONTENTS + +- README (this file) +- diagram.dtx +- diagram.ins +- diagram.pdf +- fonts.zip + +The font sources by Elmar Bartel are published under conditions of the +GNU General Public License. + +INSTALLATION + +Install the fonts provided as metafont sources into your +tex installation. + +Run TeX/LaTeX on diagram.ins to unpack the dtx. +Put the extracted 'diagram.sty' into tex/latex/diagram. + +DOCUMENTATION + +diagram.pdf. This file may be created from the documentation using +the provided Makefile. + +DESCRIPTION + +This packages provides macros to typeset problem chess diagrams including +fairy chess problems (mostly using rotated images of pieces) and other boards. + +REQUIREMENTS + +The macro package uses tex fonts provided within the fonts.zip archive. +You need to install these fonts before you can use the package. + diff --git a/Master/texmf-dist/doc/latex/chess-problem-diagrams/diagram.pdf b/Master/texmf-dist/doc/latex/chess-problem-diagrams/diagram.pdf Binary files differnew file mode 100644 index 00000000000..d75c00955bd --- /dev/null +++ b/Master/texmf-dist/doc/latex/chess-problem-diagrams/diagram.pdf diff --git a/Master/texmf-dist/doc/latex/chess-problem-diagrams/fonts.zip b/Master/texmf-dist/doc/latex/chess-problem-diagrams/fonts.zip Binary files differnew file mode 100644 index 00000000000..c8aa7454ca3 --- /dev/null +++ b/Master/texmf-dist/doc/latex/chess-problem-diagrams/fonts.zip diff --git a/Master/texmf-dist/source/latex/chess-problem-diagrams/diagram.dtx b/Master/texmf-dist/source/latex/chess-problem-diagrams/diagram.dtx new file mode 100644 index 00000000000..a55dea75b74 --- /dev/null +++ b/Master/texmf-dist/source/latex/chess-problem-diagrams/diagram.dtx @@ -0,0 +1,3062 @@ +% \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{1.5} +% \def\docdate{2008/03/09} +% \CheckSum{3968} +% \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.} +% +% \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} +% \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 +% +% \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} +% \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{\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} may be used to specify the piece.\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{\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 ";~". +% \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. +% \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{\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. +% \end{itemize} +% +% 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 +% thorus 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{\nocomputer} +% is used to suppress the display whether a problem has been +% computerproved or not. +% \end{itemize} +% +% \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. +% \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 +% lines 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{\vtop{% +% \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. +% +% \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[\sNr] +% \DescribeMacro{\sNr} +% a black nightrider +% \item[\wGh] +% \DescribeMacro{\wGh} +% a white grashopper +% \item[\sGh] +% \DescribeMacro{\sGh} +% a black grashopper +% \item[\Imi] +% \DescribeMacro{\Imi} +% an imitator +% \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 a capital {\bfseries C}, because this is used for circles. +% \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|. +% +% \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}[2008/03/09] +\DeclareOption{10pt}{\AtBeginDocument{\diagramx}} +\DeclareOption{11pt}{\AtBeginDocument{\diagramxi}} +\DeclareOption{12pt}{\AtBeginDocument{\diagramxii}} +\ExecuteOptions{10pt} +\ProcessOptions +\RequirePackage{ifthen} +\RequirePackage{calc} +% \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 + +\newif\if@textproblem\@textproblemfalse +\def\textproblem{\@textproblemtrue\let\@dia@stipulation=\relax} + +\newif\if@solafterdiagram\@solafterdiagramfalse +\def\solafterdiagram{\@solafterdiagramtrue\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 +\newcounter{board@nr} +% \newif\iffigcnt +\newboolean{piececounter} +\newcount\r@w +\newcount\lin@ +\newcount\pl@ne +\newcount\current@plane + +\newcount\w@cnt +\newcount\b@cnt +\newcount\n@cnt +% \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} + +\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\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} +% \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 +\newif\if@fieldtext\@fieldtextfalse +\newif\if@nofields\@nofieldsfalse +\newif\if@gridlines\@gridlinesfalse +\newif\if@fieldframe\@fieldframefalse +\newif\if@stdgrid\@stdgridfalse +\newif\if@show@computer\@show@computertrue +\newif\if@stipulation\@stipulationfalse +\newif\if@condition\@conditionfalse +\newif\if@remark\@remarkfalse +\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}{\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\@diagram[#1x#2]{% + \lines@max=#1% + \rows@max=#2% + \setcounter{cpd@linesmax}{#1}% + \setcounter{cpd@rowsmax}{#2}% + \setcounter{cpd@maxsquare}{\value{cpd@rowsmax}*\value{cpd@linesmax}}% + \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% + \@stereotrue% + \let\put@sqs=\put@sqs@stereo% + \let\read@plane=\read@plane@stereo% + \@start@diagram% +} +\def\spacediagram{% + \begingroup% + \@spacetrue% + \@ifnextchar [{\@spacediagram}{\@spacediagram[5x5x5]}% +} + +\def\@spacediagram[#1x#2x#3]{% + \lines@max=#1% + \rows@max=#2% + \planes@max=#3% + \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 + \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% + \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 + % + \if@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% + }}% + \else% + \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}}% + }{}% + \fi% + % + \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% + \if@textproblem% + \box\sq@box% + \else% + \outer@henbox{\box\sq@box}% + \fi% + }\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% + \endgroup% +} + +\def\put@count{% + % First we build the box with the figure count + \ifthenelse{\boolean{piececounter}}{% + \global\setbox\@cnt@box=\hbox{% + \if@show@computer% + \ \ C\if@computer +\else --\fi% + \fi% + \ \ (\arabic{cpd@whitePieces}+\arabic{cpd@blackPieces}% + \ifthenelse{\value{cpd@neutralPieces}>0}{+\arabic{cpd@neutralPieces}}{})% + }% + \@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 +} + +\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% + \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}{\boardfont} +% \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*{\boardfont}{\rmfamily} +% \end{macrocode} +% \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}} +\def\diagnum#1{\c@board@nr=#1\advance\c@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 +\def\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} +\def\diagnumbering#1{% + \di@notrue\diagnum{\@ne}% + \gdef\thediag{\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{% + \@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{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{% + \award@tk={#1}\@awardtrue% + \ignorespaces% +} +\def\version#1{% + \version@tk={#1}\@versiontrue% + \ignorespaces% +} +\def\after#1{% + \after@tk={#1}\@aftertrue% + \ignorespaces% +} +\def\correction#1{% + \correction@tk={#1}\@correctiontrue% + \ignorespaces% +} +\def\dedication#1{% + \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% +} +\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\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% +} +\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{% + \@show@computertrue% + \ignorespaces% +} +\def\nocomputer{% + \@show@computerfalse% + \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@black Nr\endcsname{% + \noexpand\ch@fig{121}% + }% + \expandafter\xdef\csname\ds@white Gh\endcsname{% + \noexpand\ch@fig{112}% + }% + \expandafter\xdef\csname\ds@black Gh\endcsname{% + \noexpand\ch@fig{124}% + }% +} +\def\Imi{\ch@fig{157}} +% \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} +\def\dia@above{% + \@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@remark% + \if@solafterdiagram% + \below@newline% + \the\sol@tk% + \fi% + \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{% + {\authorfont\thediag\par}% +} +% \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% + \bgroup% + \authorfont% + \ifnormal@names% + \the\aut@tk% + \else% + {\def\name@sep{\par}% + \@notfirstfalse% + \let\@action=\@writename% Parse the list of authors + \@parseTokenlist\aut@tk;} + \fi% + \egroup% + \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{% + \if@city% + \bgroup% + \cityfont\@notfirstfalse% + \let\@action=\p@rsecity\@parseTokenlist\city@tk;% + \par% + \egroup% + \fi% +} + +\def\@dia@after{% + \if@after% + \bgroup% + \dedicfont\the\after@tk\par% + \egroup% + \fi% +} + +\def\@dia@version{% + \if@version% + \bgroup% + \dedicfont\the\version@tk\par% + \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% + \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% + \par% + \egroup% + \else% + \if@tournament\else\if@date% + \bgroup% + \sourcefont% + \@dia@date% + \par% + \egroup% + \fi\fi% + \fi% +} + +\def\@dia@correction{% + \if@correction% + \bgroup% + \dedicfont\the\correction@tk% + \par% + \egroup% + \fi% +} + +\def\@dia@tournament{% + \if@tournament + \bgroup% + \awardfont% + \the\tournament@tk + \if@source\else\if@date% + \ \ \@dia@date% + \fi\fi% + \par% + \egroup% + \fi% +} + +\def\@dia@award{% + \if@award% + \bgroup% + \awardfont\the\award@tk% + \par% + \egroup% + \fi% +} + +\def\@dia@dedic{% + \if@dedication% + \bgroup% + \dedicfont\the\dedic@tk% + \par% + \egroup% + \fi% +} + +\def\@show@album#1/#2;{#1 FIDE-Album #2} + +\def\@dia@fidealbum{% + \if@fidealbum{% + \expandafter\@show@album\the\fidealbum@tk;% + \par% + }\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\@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% +} +\def\@dia@solution{% + \bgroup% + \parindent\z@% + \parskip\tw@\p@% + {\bf + \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=\@writename% + \@parseTokenlist\aut@tk;}:% + \fi% + \par% + \fi% + }% + \if@develop\if@judgement\the\judgement@tk\par\fi\fi% + \the\sol@tk\par% + \if@comment\the\comment@tk\par\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@year% + \ \ % + \if@day% + \ifnum\from@month>\z@% + \the\day@tk.% + \write@month\from@month% + \ifnum\to@month>\z@% + -\write@month\to@month% + \fi% + .% + \fi% + \else% + \write@month\the\from@month% + \ifnum\to@month>\z@% + -\write@month\the\to@month% + \fi% + /% + \fi% + \the\year@tk% + \fi% + \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{% + \if@show@computer + \if@computer\ (Co)\fi% + \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\@writename#1; {\sep@names\@dianame#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; {\hbox{\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} +\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% + \errmessage{invalid piece!}% + \fi\fi\fi\fi\fi\fi\fi% + \futurelet\r@tate\chkr@tate% +} + +\def\chkr@tate{% + \if\r@tate \ds@upsidedown\advance\help@a 108\let\nextpr@c=\skipr@t\else + \if\r@tate \ds@left\advance\help@a 36\let\nextpr@c=\skipr@t\else + \if\r@tate \ds@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\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\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 + \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{% + % Now the new style + \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{-1}}% + {\set@current@square@value{144}}% + \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{% + \if@stereo% + \ifnum\current@plane>\z@% + \ifnum\@rows=12% + \llap{\raise .5\sq@width\hbox{\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{\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% + % Now we should clear the board + \clear@board% + % Let us now parse the list of pieces + \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 -\lines@max% + % \put@line\@rows% + % Remove \put@line in future versions + \advance\@rows \m@ne% + \put@row\@rows% + \ifnum\@rows>\z@\repeat% + }% + }% +} +\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{{\boardfont\ A}}\or% + \rlap{{\boardfont\ B}}\or% + \rlap{{\boardfont\ C}}\or% + \rlap{{\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{{\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{{\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.3\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@left{#1}\gdef\ds@right{#2}\gdef\ds@upsidedown{#3}% +} +\def\loop@rotation{% + \bgroup% + \n@cnt\z@% + \help@a\z@% + \loop% + \ifcase\n@cnt% + \def\@theRotation{}% + \or% + \def\@theRotation{\ds@left}% + \or% + \def\@theRotation{\ds@right}% + \or% + \def\@theRotation{\ds@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} +% +% \Finale diff --git a/Master/texmf-dist/source/latex/chess-problem-diagrams/diagram.ins b/Master/texmf-dist/source/latex/chess-problem-diagrams/diagram.ins new file mode 100644 index 00000000000..0c2928c9feb --- /dev/null +++ b/Master/texmf-dist/source/latex/chess-problem-diagrams/diagram.ins @@ -0,0 +1,6 @@ +\input docstrip.tex +\askforoverwritefalse +\generate{% + \file{diagram.sty}{\from{diagram.dtx}{style}}% +} +\endbatchfile diff --git a/Master/texmf-dist/tex/latex/chess-problem-diagrams/diagram.sty b/Master/texmf-dist/tex/latex/chess-problem-diagrams/diagram.sty new file mode 100644 index 00000000000..d23dfded10e --- /dev/null +++ b/Master/texmf-dist/tex/latex/chess-problem-diagrams/diagram.sty @@ -0,0 +1,2074 @@ +%% +%% This is file `diagram.sty', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% diagram.dtx (with options: `style') +%% +%% IMPORTANT NOTICE: +%% +%% For the copyright see the source file. +%% +%% Any modified versions of this file must be renamed +%% with new filenames distinct from diagram.sty. +%% +%% For distribution of the original source see the terms +%% for copying and modification in the file diagram.dtx. +%% +%% This generated file may be distributed as long as the +%% original source files, as listed above, are part of the +%% same distribution. (The sources need not necessarily be +%% in the same archive or directory.) +%% 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. +%% +%% +%% +%% +\ProvidesPackage{diagram}[2008/03/09] +\DeclareOption{10pt}{\AtBeginDocument{\diagramx}} +\DeclareOption{11pt}{\AtBeginDocument{\diagramxi}} +\DeclareOption{12pt}{\AtBeginDocument{\diagramxii}} +\ExecuteOptions{10pt} +\ProcessOptions +\RequirePackage{ifthen} +\RequirePackage{calc} +%% +%% +%% +\chardef\f@ur=4 +\chardef\@ight=8 +\newcount\elchfont + +\chardef\@pkelch=0 +\chardef\@fselch=1 + +\newcount\dia@type + +\newif\if@textproblem\@textproblemfalse +\def\textproblem{\@textproblemtrue\let\@dia@stipulation=\relax} + +\newif\if@solafterdiagram\@solafterdiagramfalse +\def\solafterdiagram{\@solafterdiagramtrue\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 +\newcounter{board@nr} +\newboolean{piececounter} +\newcount\r@w +\newcount\lin@ +\newcount\pl@ne +\newcount\current@plane + +\newcount\w@cnt +\newcount\b@cnt +\newcount\n@cnt +\newboolean{cpd@checkPieceCounts} +\newcounter{cpd@defWhitePieces} +\newcounter{cpd@defBlackPieces} +\newcounter{cpd@defNeutralPieces} + +\newcounter{cpd@whitePieces} +\newcounter{cpd@blackPieces} +\newcounter{cpd@neutralPieces} + +\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 +\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\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} +\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 +\newif\if@fieldtext\@fieldtextfalse +\newif\if@nofields\@nofieldsfalse +\newif\if@gridlines\@gridlinesfalse +\newif\if@fieldframe\@fieldframefalse +\newif\if@stdgrid\@stdgridfalse +\newif\if@show@computer\@show@computertrue +\newif\if@stipulation\@stipulationfalse +\newif\if@condition\@conditionfalse +\newif\if@remark\@remarkfalse +\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 +\newwrite\s@lfd +\let\below@newline=\relax +\newcount\@lines +\newcount\@rows +\newcount\lines@max +\newcount\rows@max +\newcount\planes@max +\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} +\newif\if@stereo\@stereofalse +\newif\if@space\@spacefalse +\newif\if@aindex\@aindexfalse +\newif\if@sindex\@sindexfalse +\newif\if@tindex\@tindexfalse +\newif\ifds@label +\def\diagram{% + \begingroup% + \@ifnextchar [{\@diagram}{\@diagram[\@ight x\@ight]}% +} + +\def\@diagram[#1x#2]{% + \lines@max=#1% + \rows@max=#2% + \setcounter{cpd@linesmax}{#1}% + \setcounter{cpd@rowsmax}{#2}% + \setcounter{cpd@maxsquare}{\value{cpd@rowsmax}*\value{cpd@linesmax}}% + \pl@ne=\z@% + \current@plane=\z@% + \let\put@sqs=\put@sqs@normal% + \let\read@plane=\read@plane@normal% + \@start@diagram% +} +\def\stereodiagram{% + \begingroup% + \@stereotrue% + \let\put@sqs=\put@sqs@stereo% + \let\read@plane=\read@plane@stereo% + \@start@diagram% +} +\def\spacediagram{% + \begingroup% + \@spacetrue% + \@ifnextchar [{\@spacediagram}{\@spacediagram[5x5x5]}% +} + +\def\@spacediagram[#1x#2x#3]{% + \lines@max=#1% + \rows@max=#2% + \planes@max=#3% + \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 + \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% + \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 + % + \if@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% + }}% + \else% + \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}}% + }{}% + \fi% + % + \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% + \if@textproblem% + \box\sq@box% + \else% + \outer@henbox{\box\sq@box}% + \fi% + }\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% + \endgroup% +} + +\def\put@count{% + % First we build the box with the figure count + \ifthenelse{\boolean{piececounter}}{% + \global\setbox\@cnt@box=\hbox{% + \if@show@computer% + \ \ C\if@computer +\else --\fi% + \fi% + \ \ (\arabic{cpd@whitePieces}+\arabic{cpd@blackPieces}% + \ifthenelse{\value{cpd@neutralPieces}>0}{+\arabic{cpd@neutralPieces}}{})% + }% + \@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 +} + +\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% + \endgroup% +} +\gdef\selectelchfont#1{% + \global\elchfont\csname @#1elch\endcsname\defaultelchfont% +} +\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*{\boardfont}{\rmfamily} +\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@ +} +\def\defaultelchfont{% + \ifcase\@ptsize\relax% + \diagramx\or% + \diagramxi\or% + \diagramxii% + \fi% +} +\def\dianamestyle#1{\def\@dianame{\csname @#1\endcsname}} +\def\solnamestyle#1{\def\@solname{\csname @#1\endcsname}} +\def\diagnum#1{\c@board@nr=#1\advance\c@board@nr\m@ne} +\def\ra{\mbox{$\rightarrow$}} +\def\lra{\mbox{$\leftrightarrow$}} +\let\rla=\lra +\def\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} +\def\spacelayout#1{\csname space@#1\endcsname} +\def\nodiagnumbering{\global\di@nofalse} +\def\diagnumbering#1{% + \di@notrue\diagnum{\@ne}% + \gdef\thediag{\csname @#1\endcsname\c@board@nr}% +} +\def\diagcenter{\def\he@dpos{\centering}} +\def\diagleft{\def\he@dpos{\raggedright}} +\def\diagright{\def\he@dpos{\raggedleft}} +\def\setmonthstyle#1{\def\write@month{\csname @#1\endcsname}} +\def\specialdiagnum#1{% + \@specialtrue% + \number@tk={#1}\@numbertrue\def\thediag{#1}\def\@currentlabel{#1}% + \ignorespaces% +} +\def\ds@label{% + \@ifstar{\ds@labelfalse\ds@xlabel}{\ds@labeltrue\ds@xlabel}% +} +\def\ds@author#1{% + \aut@tk={#1}\auth@rtrue% + \ignorespaces% +} +\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{% + \award@tk={#1}\@awardtrue% + \ignorespaces% +} +\def\version#1{% + \version@tk={#1}\@versiontrue% + \ignorespaces% +} +\def\after#1{% + \after@tk={#1}\@aftertrue% + \ignorespaces% +} +\def\correction#1{% + \correction@tk={#1}\@correctiontrue% + \ignorespaces% +} +\def\dedication#1{% + \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% +} +\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\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% +} +\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% +} +\let\gridchess=\stdgrid +\let\magic=\fieldframe +\let\tourn=\tournament +\let\dedic=\dedication +\let\stip=\stipulation +\let\cond=\condition +\let\rem=\remark +\let\sol=\solution +\def\develop{% + \@developtrue% + \ignorespaces% +} +\def\showcomputer{% + \@show@computertrue% + \ignorespaces% +} +\def\nocomputer{% + \@show@computerfalse% + \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@black Nr\endcsname{% + \noexpand\ch@fig{121}% + }% + \expandafter\xdef\csname\ds@white Gh\endcsname{% + \noexpand\ch@fig{112}% + }% + \expandafter\xdef\csname\ds@black Gh\endcsname{% + \noexpand\ch@fig{124}% + }% +} +\def\Imi{\ch@fig{157}} +\def\dia@above{% + \@dia@number% + \@dia@authors% + \@dia@city% + \@dia@after% + \@dia@version% + \@dia@source% + \@dia@correction% + \@dia@tournament% + \@dia@award% + \@dia@dedic% + \@dia@fidealbum% +} +\def\dia@below{% + \bgroup% + \if@stipulation% + \@dia@stipulation% + \fi% + \ifx@cond\else% + \@dia@condition% + \fi% + \ifx@twins\else% + \@dia@twins% + \fi% + \@dia@remark% + \if@solafterdiagram% + \below@newline% + \the\sol@tk% + \fi% + \noindent\hbox{}\newline\hbox{}% + \egroup% +} +\def\@dia@number{% + {\authorfont\thediag\par}% +} +\def\@dia@authors{% + \ifauth@r% + \bgroup% + \authorfont% + \ifnormal@names% + \the\aut@tk% + \else% + {\def\name@sep{\par}% + \@notfirstfalse% + \let\@action=\@writename% Parse the list of authors + \@parseTokenlist\aut@tk;} + \fi% + \egroup% + \fi% +} +\def\@show@city#1;{\if@notfirst\ \slash\ \else\@notfirsttrue\fi#1} + +\def\p@rsecity#1; {\@show@city#1;\l@@klist} + +\def\@dia@city{% + \if@city% + \bgroup% + \cityfont\@notfirstfalse% + \let\@action=\p@rsecity\@parseTokenlist\city@tk;% + \par% + \egroup% + \fi% +} + +\def\@dia@after{% + \if@after% + \bgroup% + \dedicfont\the\after@tk\par% + \egroup% + \fi% +} + +\def\@dia@version{% + \if@version% + \bgroup% + \dedicfont\the\version@tk\par% + \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% + \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% + \par% + \egroup% + \else% + \if@tournament\else\if@date% + \bgroup% + \sourcefont% + \@dia@date% + \par% + \egroup% + \fi\fi% + \fi% +} + +\def\@dia@correction{% + \if@correction% + \bgroup% + \dedicfont\the\correction@tk% + \par% + \egroup% + \fi% +} + +\def\@dia@tournament{% + \if@tournament + \bgroup% + \awardfont% + \the\tournament@tk + \if@source\else\if@date% + \ \ \@dia@date% + \fi\fi% + \par% + \egroup% + \fi% +} + +\def\@dia@award{% + \if@award% + \bgroup% + \awardfont\the\award@tk% + \par% + \egroup% + \fi% +} + +\def\@dia@dedic{% + \if@dedication% + \bgroup% + \dedicfont\the\dedic@tk% + \par% + \egroup% + \fi% +} + +\def\@show@album#1/#2;{#1 FIDE-Album #2} + +\def\@dia@fidealbum{% + \if@fidealbum{% + \expandafter\@show@album\the\fidealbum@tk;% + \par% + }\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\@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% +} +\def\@dia@solution{% + \bgroup% + \parindent\z@% + \parskip\tw@\p@% + {\bf + \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=\@writename% + \@parseTokenlist\aut@tk;}:% + \fi% + \par% + \fi% + }% + \if@develop\if@judgement\the\judgement@tk\par\fi\fi% + \the\sol@tk\par% + \if@comment\the\comment@tk\par\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@year% + \ \ % + \if@day% + \ifnum\from@month>\z@% + \the\day@tk.% + \write@month\from@month% + \ifnum\to@month>\z@% + -\write@month\to@month% + \fi% + .% + \fi% + \else% + \write@month\the\from@month% + \ifnum\to@month>\z@% + -\write@month\the\to@month% + \fi% + /% + \fi% + \the\year@tk% + \fi% + \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{% + \if@show@computer + \if@computer\ (Co)\fi% + \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\@writename#1; {\sep@names\@dianame#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; {\hbox{\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} +\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% + \errmessage{invalid piece!}% + \fi\fi\fi\fi\fi\fi\fi% + \futurelet\r@tate\chkr@tate% +} + +\def\chkr@tate{% + \if\r@tate \ds@upsidedown\advance\help@a 108\let\nextpr@c=\skipr@t\else + \if\r@tate \ds@left\advance\help@a 36\let\nextpr@c=\skipr@t\else + \if\r@tate \ds@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\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\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 + \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{% + % Now the new style + \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{-1}}% + {\set@current@square@value{144}}% + \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{% + \if@stereo% + \ifnum\current@plane>\z@% + \ifnum\@rows=12% + \llap{\raise .5\sq@width\hbox{\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{\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% + % Now we should clear the board + \clear@board% + % Let us now parse the list of pieces + \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 -\lines@max% + % \put@line\@rows% + % Remove \put@line in future versions + \advance\@rows \m@ne% + \put@row\@rows% + \ifnum\@rows>\z@\repeat% + }% + }% +} +\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{{\boardfont\ A}}\or% + \rlap{{\boardfont\ B}}\or% + \rlap{{\boardfont\ C}}\or% + \rlap{{\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{{\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{{\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.3\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@left{#1}\gdef\ds@right{#2}\gdef\ds@upsidedown{#3}% +} +\def\loop@rotation{% + \bgroup% + \n@cnt\z@% + \help@a\z@% + \loop% + \ifcase\n@cnt% + \def\@theRotation{}% + \or% + \def\@theRotation{\ds@left}% + \or% + \def\@theRotation{\ds@right}% + \or% + \def\@theRotation{\ds@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 + +\endinput +%% +%% End of file `diagram.sty'. diff --git a/Master/tlpkg/bin/tlpkg-ctan-check b/Master/tlpkg/bin/tlpkg-ctan-check index a218f2dbedc..5f33828d101 100755 --- a/Master/tlpkg/bin/tlpkg-ctan-check +++ b/Master/tlpkg/bin/tlpkg-ctan-check @@ -46,7 +46,8 @@ my @WorkingTLP = qw( cbcoptic cbfonts ccaption cclicenses cd cdpbundl cellspace changebar changepage changes chappg chapterfolder chem-journal chembst chemcompounds - chemstyle cherokee chessboard chessfss chletter circ + chemstyle cherokee chess-problem-diagrams chessboard chessfss + chletter circ citeref cjhebrew cjk classicthesis clefval cleveref clock clrscode cm-super diff --git a/Master/tlpkg/tlpsrc/chess-problem-diagrams.tlpsrc b/Master/tlpkg/tlpsrc/chess-problem-diagrams.tlpsrc new file mode 100644 index 00000000000..aae9b5771d6 --- /dev/null +++ b/Master/tlpkg/tlpsrc/chess-problem-diagrams.tlpsrc @@ -0,0 +1,2 @@ +name chess-problem-diagrams +category Package diff --git a/Master/tlpkg/tlpsrc/collection-games.tlpsrc b/Master/tlpkg/tlpsrc/collection-games.tlpsrc index 397713968f1..6ea36e0167f 100644 --- a/Master/tlpkg/tlpsrc/collection-games.tlpsrc +++ b/Master/tlpkg/tlpsrc/collection-games.tlpsrc @@ -6,6 +6,7 @@ depend backgammon depend bridge depend cchess depend chess +depend chess-problem-diagrams depend chessboard depend chessfss depend egameps |