rcpt@rwc.urc.tue.nl (Piet Tutelaers) (12/04/90)
Today I have put a new version (1.1) of my (La)TeX chess package on the ftp-server `sol.cs.ruu.nl' (131.211.80.5) of the Department of Computer Science of the Utrecht University, the Netherlands. The main improvements over my previous version (1.0) are: - improved chess.sty o TeXcode cleaned up o problems with castling solved o renamed internal macro `\\' because LaTeX uses that o better hooks to adapt chess.sty to non-english languages o added torture tests for chess.sty (torture-test.ltx and torture-test.tex) - improved (and hopefully accepted) TUGboat article - improved chessdiag.mf - other minor enhancements. If you already have my previous version there is no need to rush out and get the new version because I have included chess.sty together with the torture-tests at the end of this message. For those who still want to download the new package I have included a message containing the instructions how to do it via ftp and/or E-mail. Happy (La)TeX chesswriting, --Piet ==================== getting chess.tar.Z =============================== How to get chess.tar.Z (includes chess.README) from the archive at Dept. of Computer Science, Utrecht University: NOTE: In the following I have assumed your mail address is john@highbrow.edu. Of course you must substitute your own address for this. This should be a valid internet or uucp address. For bitnet users name@host.BITNET usually works. by FTP: (please restrict access to weekends or evening/night (i.e. between about 20.00 and 0900 UTC). ftp archive.cs.ruu.nl [131.211.80.5] user name: anonymous or ftp password: your own email address (e.g. john@highbrow.edu) don't forget to set binary mode if the file is a tar/arc/zoo archive, compressed or in any other way contains binary data. get TEX/chess.tar.Z by mail-server: send the following message to mail-server@cs.ruu.nl (or uunet!mcsun!hp4nl!ruuinf): begin path john@highbrow.edu send TEX/chess.tar.Z end The path command can be deleted if we receive a valid from address in your message. If this is the first time you use our mail server, we suggest you first issue the request: send HELP ================ improved chess.sty + torture-tests ===== shar-file ===== #! /bin/sh # This is a shell archive. Remove anything before this line, then unpack # it by saving it into a file and typing "sh file". To overwrite existing # files, type "sh file -c". You can also feed this as standard input via # unshar, or by typing "sh <file", e.g.. If this archive is complete, you # will see the following message at the end: # "End of shell archive." # Contents: chess.sty torture-test.ltx torture-test.tex # Wrapped by rcpt@rwc.urc.tue.nl on Mon Dec 3 21:55:24 1990 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f chess.sty -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"chess.sty\" else echo shar: Extracting \"chess.sty\" \(11701 characters\) sed "s/^X//" >chess.sty <<'END_OF_chess.sty' X% X% chess.sty X% --------- X% Style for writing about chess games X% Author : Piet Tutelaers (UUCP: rcpt@urc.tue.nl) X% Version: 1.1 (17 Nov 1990) X% Improvements over version 1.0: X% -TeX code cleaned up (thanks to TeX-wizzard Victor Eijkhout) X% -moving a King does not generate a castling move when this X% King already moved X% -renamed internal macro `\\' because LaTeX uses that X% -better hooks for foreign languages (look for lines marked with X% %%FOREIGN%%) X% Torture test: X% If you change something in the chess.sty style check if everything X% else is still working with torture-test.ltx (LaTeX) or X% torture-test.tex (plain TeX). X% Known problems: X% -The analysis mode can not be used within arguments of macros X% not: \centerline{|21.N5*f3|} but: |\centerline{21.N5*f3}| X% Version: 1.0 (5 Jan 1990) X% X X\def\@set[#1#2](#3){%arguments: [a-h1-8](<letter>) X \expandafter\xdef\csname#1#2\endcsname{#3}} X X\def\@get#1[#2#3]{%arguments:\cs[a-h1-8] X \edef#1{\csname#2#3\endcsname}} X X\font\Chess=chess20 X X\newcount\@c % column X\newcount\@r % row X\newcount\@sum % row+column X X\def\@col{\ifcase\@c\or a\or b\or c\or d\or e\or f\or g\or h\fi} X X\def\@showchar{ X \@get\piece[\@col\the\@r] X \if\piece E \ifodd\@sum 0\else Z\fi\else X \if\piece P \ifodd\@sum P\else O\fi\else X \if\piece p \ifodd\@sum p\else o\fi\else X \if\piece R \ifodd\@sum R\else S\fi\else X \if\piece B \ifodd\@sum B\else A\fi\else X \if\piece N \ifodd\@sum N\else M\fi\else X \if\piece r \ifodd\@sum r\else s\fi\else X \if\piece b \ifodd\@sum b\else a\fi\else X \if\piece n \ifodd\@sum n\else m\fi\else X \if\piece K \ifodd\@sum K\else J\fi\else X \if\piece Q \ifodd\@sum Q\else L\fi\else X \if\piece k \ifodd\@sum k\else j\fi\else X \if\piece q \ifodd\@sum q\else l\fi\else X \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi} X X\def\@showrow#1{ X \@r=#1\@c=1 X \@sum=\@r\advance\@sum by\@c X \loop X \@showchar X \ifnum\@c<8 \advance\@c by1\advance\@sum by1 X \repeat X} X X\def\showboard{ X\vbox{\offinterlineskip X \hrule height1pt X \hbox{\vrule width1pt\Chess X \vbox{\hbox{\@showrow8} X \hbox{\@showrow7} X \hbox{\@showrow6} X \hbox{\@showrow5} X \hbox{\@showrow4} X \hbox{\@showrow3} X \hbox{\@showrow2} X \hbox{\@showrow1}}% X \vrule width1pt} X \hrule height1pt} X} X X% inner loop needs extra { ... } X X\def\@emptyboard{ X \@r=1 X \loop X {\@c=1 X \loop X \@set[\@col\the\@r](E) X \ifnum\@c<8 \advance\@c by1 X \repeat} X \ifnum\@r<8 \advance\@r by 1 X \repeat X} X X\def\@initboard{ X% empty squares X \@r=3 X \loop X {\@c=1 X \loop X \@set[\@col\the\@r](E) X \ifnum\@c<8 \advance\@c by1 X \repeat} X \ifnum\@r<6 \advance\@r by 1 X \repeat X% pawns X \@c=1 X \loop X \@set[\@col2](P)\@set[\@col7](p) X \ifnum\@c<8 \advance\@c by1 X \repeat X% pieces X \@set[a1](R)\@set[h1](R) X \@set[a8](r)\@set[h8](r) X \@set[b1](N)\@set[g1](N) X \@set[b8](n)\@set[g8](n) X \@set[c1](B)\@set[f1](B) X \@set[c8](b)\@set[f8](b) X \@set[d1](Q)\@set[e1](K) X \@set[d8](q)\@set[e8](k) X} X X% X% The next part defines a user friendly notation for chess moves. X% Moves works only in chess-environment: \begin{chess} ... \end{chess} X% in LaTeX, or \chess ... \endchess in plain TeX. X% Some examples: |21. Nf3-e5, Ke8*f8 22. 0-0-0+, Bh8*a1| X% : |21.: Ke8*f8 22. Bh8*a1, 0-0| X% : |21 Nfe5 K*f8 22 0-0-0! B*a1| X% : |21: K*f8 22 B*a1 0-0| X% X X\font\Fig=chessfig10 X X\gdef\@king{{\Fig K}} X\gdef\@queen{{\Fig Q}} X\gdef\@rook{{\Fig R}} X\gdef\@bishop{{\Fig B}} X\gdef\@knight{{\Fig N}} X\gdef\@dash{--} X\gdef\@capt{$\times$} X\gdef\@dots{~$\ldots$,} X\gdef\@dot{\char46} X X%%FOREIGN%% change the following character codes to your language of coice X%% English % English % Dutch % German % French .... X\chardef\king@=`K % King % Koning % K"onig % Roi X\chardef\queen@=`Q % Queen % Dame % Dame % Dame X\chardef\rook@=`R % Rook % Toren % Turm % Tour X\chardef\bishop@=`B % Bishop % Loper % L"aufer % Fou X\chardef\knight@=`N % kNight % Paard % Springer % Cavalier X%%FOREIGN%% end X X\catcode`|=\active X{\catcode`:=\active\catcode`.=\active\catcode`*=\active\catcode`-=\active X \catcode\king@=\active\catcode\queen@=\active\catcode\rook@=\active X \catcode\bishop@=\active\catcode\knight@=\active X \gdef\@notation{\begingroup\let|=\endgroup X \catcode`:=\active\catcode`.=\active\catcode`*=\active\catcode`-=\active X \catcode\king@=\active\catcode\queen@=\active\catcode\rook@=\active X \catcode\bishop@=\active\catcode\knight@=\active X%%FOREIGN%% choose the same characters as above X \letK=\@king\letQ=\@queen\letR=\@rook\letB=\@bishop\letN=\@knight X%%Dutch \letK=\@king\letD=\@queen\letT=\@rook\letL=\@bishop\letP=\@knight X%%German\letK=\@king\letD=\@queen\letT=\@rook\letL=\@bishop\letS=\@knight X%%French\letR=\@king\letD=\@queen\letT=\@rook\letF=\@bishop\letC=\@knight X%%FOREIGN%% that's all X \let-=\@dash\let*=\@capt\let:=\@dots\let.=\@dot X } X% X% Provide a chess environment in which the `|' character is active, because X% the `|' is used by LaTeX in the `tabular' environment! X% X \gdef\chess{\catcode`|=\active\let|=\@notation} X \global\let\endchess\relax X} X\catcode`|=12 X X% X% Next part provides a ply (half move) generator X% X X\newif\ifWhite \newif\ifFigure \newif\ifcapture X X% X% next newif's needed for castling X% X\newif\ifKnotmoved \newif\ifknotmoved X\newif\ifcastling \newif\ifoo X X% X% Globals for special pawn moves (en passant capture and promotion) X% X X\newif\ifenpassant \newif\ifpromotion X X\def\@color#1{ % Color of a piece 0: none, -1: black, 1: white X \if #1E0\else X \ifnum`#1=\uccode`#11\else-1\fi\fi} X X% X% No checking is done for validity of moves, only legal moves behave well!! X% X X\def\@ply#1#2#3#4#5 {% Syntax: [a-h][1-8][a-h][1-8]{QRBN} X \@get\piece[#1#2]\@get\capture[#3#4]\Figuretrue X \if\capture E\capturefalse\else\capturetrue\fi X \ifWhite X \if\piece P\Figurefalse X \if#46 X \if\eprow#3\capturetrue\enpassanttrue\fi X \xdef\eprow{x} X \else X \xdef\eprow{x} X \if#22 X \if#44\xdef\eprow{#3}\fi X \else X \if#48\promotiontrue\fi X \fi X \fi X \else X \if\piece K% check for possible castling X \ifKnotmoved X \if#3g\if#41\castlingtrue\ootrue\fi X \else\if#3c\if#41\castlingtrue\oofalse\fi\fi X \fi X \global\Knotmovedfalse X \fi X \fi X \fi X \ifcastling X \@set[#1#2](E)\@set[#3#4](K) X \ifoo 0\@dash0#5\@set[f1](R)\@set[h1](E) X \else 0\@dash0\@dash0#5\@set[d1](R)\@set[a1](E)\fi X \castlingfalse X \else X \ifFigure{\Fig\piece}\fi X #1#2\ifcapture\@capt\else\@dash\fi#3#4 X \ifpromotion{\Fig#5}\else#5\fi X \@set[#1#2](E) X \ifpromotion\@set[#3#4](#5)\else\@set[#3#4](\piece)\fi X \ifenpassant\@set[#3#2](E)\enpassantfalse\fi X \fi X \global\Whitefalse X \else X \if\piece p\Figurefalse X \if#43 X \if\eprow#3\capturetrue\enpassanttrue\fi X \xdef\eprow{x} X \else X \xdef\eprow{x} X \if#27 X \if#45\xdef\eprow{#3}\fi X \else X \if#41\promotiontrue\fi X \fi X \fi X \else X \if\piece k X \ifknotmoved X \if#3g\if#48\castlingtrue\ootrue\fi X \else\if#3c\if#48\castlingtrue\oofalse\fi\fi X \fi X \global\knotmovedfalse X \fi X \fi X \fi X \ifcastling X \@set[#1#2](E)\@set[#3#4](k) X \ifoo 0\@dash0#5\@set[f8](r)\@set[h8](E) X \else 0\@dash0\@dash0#5\@set[d8](r)\@set[a8](E)\fi X \castlingfalse X \else X \ifFigure{\Fig\if\piece rR\else\if\piece bB\else\if\piece nN\else X \if\piece qQ\else K\fi\fi\fi\fi}\fi% X #1#2\ifcapture\@capt\else\@dash\fi#3#4 X \ifpromotion{\Fig#5}\else#5\fi X \@set[#1#2](E)\ifpromotion\@set[#3#4](#5)\else\@set[#3#4](\piece)\fi X \ifenpassant\@set[#3#2](E)\enpassantfalse\fi X \fi X \global\Whitetrue X \fi X} X X\newcount\movecount \movecount=0 X X\def\move#1 #2 {\frenchspacing X \ifWhite\advance\movecount by 1\fi X \hskip1cm\llap{\the\movecount.}\hskip.5cm X \hbox to 2.3cm{\hfil\@ply#1 \hfil}\hskip.5cm X \hbox to 2.3cm{\hfil\@ply#2 \hfil} X \par} X X\def\ply#1 {\frenchspacing X \ifWhite\advance\movecount by 1 X \hskip1cm\llap{\the\movecount.}\hskip.5cm X \hbox to 2.3cm{\hfil\@ply#1 \hfil} X \else\hskip1cm\llap{\the\movecount.}\hskip.5cm X \hbox to 2.3cm{\hfil$\ldots$\hfil}\hskip.5cm X \hbox to 2.3cm{\hfil\@ply#1 \hfil} X \fi\par} X X\def\newgame{\movecount=0 \@initboard X \Whitetrue\castlingfalse X \Knotmovedtrue\knotmovedtrue X \promotionfalse\enpassantfalse} X X\def\@dolist{\afterassignment\@dodolist\let\@next= } % Answer 11.5 TeXbook X\def\@dodolist{\ifx\@next\@endlist \let\@next\relax % adapted to generate X \else \@nextitem\let\@next\@dolist \fi % chess diagrams X \@next} X X\def\@endlist{\@endlist} X X\def\@nextitem{% X \if\@next\space\@set[\@col\the\@r](E)\else X \if\@next * \@set[\@col\the\@r](E)\else X \if\@next P \@set[\@col\the\@r](P)\else X \if\@next p \@set[\@col\the\@r](p)\else X \if\@next R \@set[\@col\the\@r](R)\else X \if\@next r \@set[\@col\the\@r](r)\else X \if\@next B \@set[\@col\the\@r](B)\else X \if\@next b \@set[\@col\the\@r](b)\else X \if\@next N \@set[\@col\the\@r](N)\else X \if\@next n \@set[\@col\the\@r](n)\else X \if\@next K \@set[\@col\the\@r](K)\else X \if\@next k \@set[\@col\the\@r](k)\else X \if\@next Q \@set[\@col\the\@r](Q)\else X \if\@next q \@set[\@col\the\@r](q)\else X \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi X \advance\@c by1} X X\def\@initrow#1#2{\@r=#1\@c=1\@dolist#2\@endlist} X X% X% For setting up a position X% X\def\board#1#2#3#4#5#6#7#8{ X \@initrow8{#1} X \@initrow7{#2} X \@initrow6{#3} X \@initrow5{#4} X \@initrow4{#5} X \@initrow3{#6} X \@initrow2{#7} X \@initrow1{#8}} X X% X% Next macros for defining chess position (thanks to Victor Eijkhout) X% X\def\White(#1){\def\match{xxx}\xWhite#1,xxx,} X\def\xWhite#1,{\def\temp{#1} X \ifx\temp\match \else \WhitePieceOrPawn#1XY \expandafter\xWhite \fi} X\def\WhitePieceOrPawn#1#2#3#4Y{% X \if#3X \@set[#1#2](P) X \else\ifnum`#1=\king@ \@set[#2#3](K)\else % King X \ifnum`#1=\queen@ \@set[#2#3](Q)\else % Queen X \ifnum`#1=\rook@ \@set[#2#3](R)\else % Rook X \ifnum`#1=\bishop@\@set[#2#3](B)\else % Bishop X \ifnum`#1=\knight@\@set[#2#3](N)\else % kNight X \fi\fi\fi\fi\fi X \fi} X X\def\Black(#1){\def\match{xxx}\xBlack#1,xxx,} X\def\xBlack#1,{\def\temp{#1} X \ifx\temp\match \else \BlackPieceOrPawn#1XY \expandafter\xBlack \fi} X\def\BlackPieceOrPawn#1#2#3#4Y{ X \if#3X\@set[#1#2](p) X \else\ifnum`#1=\king@ \@set[#2#3](k)\else % King X \ifnum`#1=\queen@ \@set[#2#3](q)\else % Queen X \ifnum`#1=\rook@ \@set[#2#3](r)\else % Rook X \ifnum`#1=\bishop@\@set[#2#3](b)\else % Bishop X \ifnum`#1=\knight@\@set[#2#3](n)\else % kNight X \fi\fi\fi\fi\fi X \fi} X X\def\position{\begingroup% X \@emptyboard\movecount=0 X \global\Whitetrue\global\castlingfalse X \global\Knotmovedtrue\global\knotmovedtrue X \global\promotionfalse\global\enpassantfalse} X\def\endposition{\endgroup} X END_OF_chess.sty if test 11701 -ne `wc -c <chess.sty`; then echo shar: \"chess.sty\" unpacked with wrong size! fi # end of overwriting check fi if test -f torture-test.ltx -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"torture-test.ltx\" else echo shar: Extracting \"torture-test.ltx\" \(1157 characters\) sed "s/^X//" >torture-test.ltx <<'END_OF_torture-test.ltx' X% X% torture-test.ltx X% ---------------- X% A LaTeX test for the chess.sty style. X% Author : Piet Tutelaers (UUCP: rcpt@urc.tue.nl) X% Version: 1 (17 Nov 1990) X% X\documentstyle[twocolumn,chess]{article} X\tracinglostchars=1 X\begin{document} X X\subsection*{Torture test for \verb|chess.sty|} X\begin{position} X\White(Ke1,Rh1,h7,b2) X\Black(Ke8,Ra8,a5) X\global\movecount=50 X\global\Whitefalse X\end{position} X X$$\showboard$$ X XThe castling test:\par X\ply e8c8!? X\ply e1g1 X XBoth players have castled. X X\ply c8e8? X\ply g1e1? X XThey move back their kings... Chess.sty does not check the Xvalidity of moves. X X\ply e8c8 X\ply e1g1?? X XBut now these moves are not typeset as castling moves because the kings have Xmoved. X XAnd now the `en passant' test:\par X\ply a5a4 X\move b2b4 a4b3ep X X\begin{chess} XA short analysis test: |54. b3? ab3:| and White looses his pawn. XBetter seems |54.Nf7 but not 54.Ng6 because then 54:Rg8!|. X\end{chess} X XAnd the promotion test (no comment yet!): X X\ply h7h8N X X$$\showboard$$ X X\begin{chess} XNot in that way? X X\centerline{|55.Nf3 Nc6|} X XBut in this way! X X|\centerline{55.Nf3 Nc6}| X\end{chess} X X\end{document} END_OF_torture-test.ltx if test 1157 -ne `wc -c <torture-test.ltx`; then echo shar: \"torture-test.ltx\" unpacked with wrong size! fi # end of overwriting check fi if test -f torture-test.tex -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"torture-test.tex\" else echo shar: Extracting \"torture-test.tex\" \(1103 characters\) sed "s/^X//" >torture-test.tex <<'END_OF_torture-test.tex' X% X% torture-test.tex X% ---------------- X% A plain TeX test for the chess.sty style. X% Author : Piet Tutelaers (UUCP: rcpt@urc.tue.nl) X% Version: 1 (17 Nov 1990) X% X\catcode`@=11 X\input chess.sty X\catcode`@=12 X X\tracinglostchars=1 X X{\bf Torture test for {\tt chess.sty}} X\position X\White(Ke1,Rh1,h7,b2) X\Black(Ke8,Ra8,a5) X\global\movecount=50 X\global\Whitefalse X\endposition X X$$\showboard$$ X XThe castling test:\par X\ply e8c8!? X\ply e1g1 X XBoth players have castled. X X\ply c8e8? X\ply g1e1? X XThey move back their kings... Chess.sty does not check the Xvalidity of moves. X X\ply e8c8 X\ply e1g1?? X XBut now these moves are not typeset as castling moves because the kings have Xmoved. X XAnd now the `en passant' test:\par X\ply a5a4 X\move b2b4 a4b3ep X X\chess XA short analysis test: |54. b3? ab3:| and White looses his pawn. XBetter seems |54.Nf7 but not 54.Ng6 because then 54:Rg8!|. X\endchess X XAnd the promotion test (no comment yet!): X X\ply h7h8N X X$$\showboard$$ X X\chess XNot in that way? X X\centerline{|55.Nf3 Nc6|} X XBut in this way! X X|\centerline{55.Nf3 Nc6}| X\endchess X X\bye END_OF_torture-test.tex if test 1103 -ne `wc -c <torture-test.tex`; then echo shar: \"torture-test.tex\" unpacked with wrong size! fi # end of overwriting check fi echo shar: End of shell archive. exit 0