From ccfb7362e633d55206b5f6cdb66668f835625b32 Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Thu, 16 Oct 2008 23:42:13 +0000 Subject: skak 1.5 (16oct08) git-svn-id: svn://tug.org/texlive/trunk@10991 c570f23f-e606-0410-a88d-b1316a301751 --- .../tex/latex/skak/chess-workshop-symbols.sty | 4 +- Master/texmf-dist/tex/latex/skak/pap.sty | 1572 -------------------- Master/texmf-dist/tex/latex/skak/skak.fd | 11 + Master/texmf-dist/tex/latex/skak/skak.sty | 295 +++- Master/texmf-dist/tex/latex/skak/uskak.fd | 11 + 5 files changed, 260 insertions(+), 1633 deletions(-) delete mode 100644 Master/texmf-dist/tex/latex/skak/pap.sty create mode 100644 Master/texmf-dist/tex/latex/skak/skak.fd create mode 100644 Master/texmf-dist/tex/latex/skak/uskak.fd (limited to 'Master/texmf-dist/tex/latex/skak') diff --git a/Master/texmf-dist/tex/latex/skak/chess-workshop-symbols.sty b/Master/texmf-dist/tex/latex/skak/chess-workshop-symbols.sty index 113600477b1..438ccfcc7cb 100644 --- a/Master/texmf-dist/tex/latex/skak/chess-workshop-symbols.sty +++ b/Master/texmf-dist/tex/latex/skak/chess-workshop-symbols.sty @@ -57,5 +57,5 @@ \providecommand{\without}{\kern.4pt\mbox{\vrule width 1ex height.08ex depth0ex\kern-0.08ex\vrule width0.08ex height1.5ex depth0ex}\kern.4pt} \providecommand{\with}{\kern.4pt\mbox{\vrule width 0.08ex height1.5ex depth0ex\kern-0.08ex\vrule width 1ex height.08ex depth0ex}\kern.4pt} \providecommand{\etc}{$\parallel$} -\providecommand{\see}{\kern.4pt\mbox{\vrule width 1em height.54ex depth-.46ex}\kern.4pt} - +%\providecommand{\see}{\kern.4pt\mbox{\vrule width 1em height.54ex depth-.46ex}\kern.4pt} +\providecommand{\see} {see} diff --git a/Master/texmf-dist/tex/latex/skak/pap.sty b/Master/texmf-dist/tex/latex/skak/pap.sty deleted file mode 100644 index eff2426f5b4..00000000000 --- a/Master/texmf-dist/tex/latex/skak/pap.sty +++ /dev/null @@ -1,1572 +0,0 @@ -% skak.sty -\NeedsTeXFormat{LaTeX2e} -\ProvidesPackage{skak} - -\DeclareOption{tiny}{\AtEndOfClass{\tinyboard}} -\DeclareOption{small}{\AtEndOfClass{\smallboard}} -\DeclareOption{normal}{\AtEndOfClass{\normalboard}} -\DeclareOption{large}{\AtEndOfClass{\largeboard}} -\DeclareOption{notation}{\AtEndOfClass{\notationOn}} -\DeclareOption{mover}{\AtEndOfClass{\showmoverOn}} -\DeclareOption{moveroff}{\AtEndOfClass{\showmoverOff}} -\DeclareOption{notationoff}{\AtEndOfClass{\notationOff}} -\DeclareOption{ps}{\def\ps@on{\True}} -\DeclareOption{psoff}{\def\ps@on{\False}} -\DeclareOption{english}{\AtEndOfClass{\skaklanguage[english]}} -\DeclareOption{styleA}{\AtEndOfClass{\styleA}} -\DeclareOption{styleB}{\AtEndOfClass{\styleB}} -\ExecuteOptions{notation,normal,psoff,english,moveroff,styleB} -\ProcessOptions -%\AtBeginDocument{\skaklanguage{english}} - -\RequirePackage{lambda,ifthen,calc} -\ps@on{\RequirePackage{pstricks,pst-node}\SpecialCoor% - \newpsstyle{psskak}{arrowinset=0,nodesep=.25,armA=.75,arrowsize=.2 1, - linearc=.2,arrowlength=1.25,linewidth=0.04, - doubleline=true,doublesep=.06}}{} - - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -% list related functions -\def\IsNil#1{#1{\False}{\True}} - -\def\Member#1#2#3% ('a -> 'a -> bool) -> 'a -> 'a list -> bool - {#3{\MemberA{#1}{#2}}{\False}} -\def\MemberA#1#2#3#4% - {#1{#2}{#3}% - {\True}% - {\Member{#1}{#2}{#4}}} - -% Explode: string -> char list -\def\Explode#1{\EqStr{Z}{#1}{\Nil}{\ExplodeA#1Z}} -\def\ExplodeA#1#2Z{\EqStr{Z}{#2}% - {\Singleton{#1}}% - {\Cons{#1}{\ExplodeA#2Z}}} - -\def\BoolToString#1{% bool -> string -#1{True}{False}} - -% the basic manipulation of the board -\def\Set#1#2{% square -> piece -> unit -\expandafter\xdef\csname#1\endcsname{#2}} -\def\Get#1{% square -> piece -\csname#1\endcsname} - -\def\StoreBool#1#2{% - \expandafter\def\csname#1\endcsname{#2}} -\def\GetBool#1{% - \csname#1\endcsname} - - -\def\PieceNames{\Listize[K,Q,R,B,N]} -\def\FileNames{\Listize[a,b,c,d,e,f,g,h]} -\def\RankNames{\Listize[1,2,3,4,5,6,7,8]} - -%% what pieces to show -%\def\ShowOnlyList{\Listize[K,Q,R,B,N,P,k,q,r,b,n,p]} - -\def\showonly#1{\expandafter\def\csname ShowOnlyList\endcsname{\Listize[#1]}} -\def\showall{\showonly{K,Q,R,B,N,P,k,q,r,b,n,p}} -\showall - -\def\showonlywhite{\showonly{K,Q,R,B,N,P}} -\def\showonlyblack{\showonly{k,q,r,b,n,p}} -\def\showonlypawns{\showonly{p,P}} - -%%% -\def\TeXifx#1#2#3% - {#1\def\next{#2}\else\def\next{#3}\fi - \next} -\def\EqStr#1#2{% % has to be changed - \TeXif{\if#1#2}} -\def\EqPiece#1#2{\TeXif{\if#1#2}} - - -\def\RankOf(#1){\Second{#1}} -\def\FileOf(#1){\First{#1}} - -\def\EqSquare#1#2{% - \ifthenelse{\equal{#1}{#2}}{\True}{\False}} - -%% is this really necessary???? -\def\MySecond(#1#2){#2} -\def\MyFirst(#1#2){#1} - -\def\MyEqual#1#2{% string -> string -> bool - \ifthenelse{\equal{#1}{#2}}{\True}{\False}} - -\def\myrightfile#1#2{% filediscriminator -> square -> bool - \Member{\MyEqual}{#2}{\File{#1}}} - -\def\RightRank(#1){%square -> bool - \EqStr{\RankDiscriminator}{Z}% - {\True}% -% {\EqStr{\RankDiscriminator}{\Second{#1}}}} -% {\expandafter\EqStr{\RankDiscriminator}{\MySecond(#1)}}} - {\Member{\MyEqual}{#1}{\Rank{\RankDiscriminator}}}} -\def\RightFile(#1){%square -> bool - \EqStr{\FileDiscriminator}{Z}% - {\True}% - {\Member{\MyEqual}{#1}{\File{\FileDiscriminator}}}} - -% {\myrightfile{\FileDiscriminator}{#1}}} - -% {\expandafter\EqStr{\FileDiscriminator}{\FileOf(#1)}}} -% {\edef\myhelper{\MyFirst(#1)}\Unlistize{\Explode{#1Z}}% -% (rf-test\myhelper)\EqStr{\FileDiscriminator}{\myhelper}}} -%% {(rf-test)\EqStr{\FileDiscriminator}{\MyFirst(#1)}}} - - -\def\Glue#1#2% 'a -> 'b -> 'ab , eg. a -> 1 -> a1 -{#1#2} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%% adding ornaments to a board %%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% usefull when adding ps arrows: -% set@fileangle: from -> to -> angle -> unit -\def\set@fileangle#1#2#3{% - \expandafter\xdef\csname fileangle.#1.#2\endcsname{#3}} -\def\get@fileangle#1#2{\ifx\csname fileangle.#1.#2\endcsname\relax - \errmessage{Files #1 and #2 does not belong to a valid knight move}% - \else \csname fileangle.#1.#2\endcsname\fi} -\def\set@rankangle#1#2#3{% - \expandafter\xdef\csname rankangle.#1.#2\endcsname{#3}} -\def\get@rankangle#1#2{\ifx\csname rankangle.#1.#2\endcsname\relax% - \errmessage{Ranks #1 and #2 does not belong to a valid knight move}% - \else \csname rankangle.#1.#2\endcsname\fi} - -\def\testfileangle{fileangles:\get@fileangle{a}{b},\get@fileangle{h}{f}} -\def\testrankangle{rankangles:\get@rankangle{1}{3},\get@rankangle{4}{5}} - -% a file to ... -\set@fileangle{a}{b}{0}\set@fileangle{a}{c}{0} -% b file to ... -\set@fileangle{b}{a}{0}\set@fileangle{b}{c}{0}\set@fileangle{b}{d}{0} -% c file to ... -\set@fileangle{c}{a}{180}\set@fileangle{c}{b}{0} -\set@fileangle{c}{d}{0}\set@fileangle{c}{e}{0} -% d file to ... -\set@fileangle{d}{b}{180}\set@fileangle{d}{c}{0} -\set@fileangle{d}{e}{0}\set@fileangle{d}{f}{0} -% e file to ... -\set@fileangle{e}{c}{180}\set@fileangle{e}{d}{0} -\set@fileangle{e}{f}{0}\set@fileangle{e}{g}{0} -% f file to ... -\set@fileangle{f}{d}{180}\set@fileangle{f}{e}{0} -\set@fileangle{f}{g}{0}\set@fileangle{f}{h}{0} -% g file to ... -\set@fileangle{g}{e}{180}\set@fileangle{g}{f}{0}\set@fileangle{g}{h}{0} -% h file to ... -\set@fileangle{h}{f}{180}\set@fileangle{h}{g}{0} - -% 1st rank to ... -\set@rankangle{1}{2}{0}\set@rankangle{1}{3}{90} -% 2nd rank to ... -\set@rankangle{2}{1}{0}\set@rankangle{2}{3}{0}\set@rankangle{2}{4}{90} -% 3rd rank to ... -\set@rankangle{3}{1}{270}\set@rankangle{3}{2}{0} -\set@rankangle{3}{4}{0}\set@rankangle{3}{5}{90} -% 4th rank to ... -\set@rankangle{4}{2}{270}\set@rankangle{4}{3}{0} -\set@rankangle{4}{5}{0}\set@rankangle{4}{6}{90} -% 5th rank to ... -\set@rankangle{5}{3}{270}\set@rankangle{5}{4}{0} -\set@rankangle{5}{6}{0}\set@rankangle{5}{7}{90} -% 6th rank to ... -\set@rankangle{6}{4}{270}\set@rankangle{6}{5}{0} -\set@rankangle{6}{7}{0}\set@rankangle{6}{8}{90} -% 7th rank to ... -\set@rankangle{7}{5}{270}\set@rankangle{7}{6}{0}\set@rankangle{7}{8}{0} -% 8th rank to ... -\set@rankangle{8}{6}{270}\set@rankangle{8}{7}{0} - -% PSTricks addon that allows hollow arrowheads -\ps@on{% -\edef\pst@arrowtable{\pst@arrowtable,<|-|>} -\def\tx@ArrowTriangleA{ArrowTriangleA } -\def\tx@ArrowTriangleB{ArrowTriangleB } -\@namedef{psas@|>}{% - /ArrowTriangleA { CLW dup 3.5 div SLW mul add dup 2 div /w ED mul dup - /h ED mul /a ED - 0 h a sub moveto w h L 0 0 L w neg h L 0 h a sub L - gsave 1 setgray fill grestore gsave - stroke grestore } def - \psk@arrowinset \psk@arrowlength \psk@arrowsize - \tx@ArrowTriangleA} -\@namedef{psas@<|}{% - /ArrowTriangle { CLW dup 2 div SLW mul add dup 2 div - /w ED mul dup /h ED mul /a ED - { 0 h T 1 -1 scale } if w neg h moveto 0 0 L w h L w neg a neg - rlineto w neg a rlineto w 0 rmoveto gsave stroke grestore } def - true \psk@arrowinset \psk@arrowlength \psk@arrowsize - \tx@ArrowTriangleB} -% end of PSTricks addon -} -{} - -\newcounter{ps@knightangle} \newcounter{ps@inverse} -\def\printknightmove#1#2{% - \setcounter{ps@knightangle}{\get@fileangle{\First#1}{\First#2}+% - \get@rankangle{\Second#1}{\Second#2} + \value{ps@inverse}}% - \ncdiagg[style=psskak,angleA=\arabic{ps@knightangle}]{-|>}{#1}{#2}} - -\def\printarrow#1#2{\ncline[style=psskak]{-|>}{#1}{#2}} - -\def\ps@highlightsquare#1{% - \pscustom[linewidth=.06]{\translate(#1)\psframe(-.5,-.5)(.5,.5)}} - -\def\highlight#1{% comma separated list eg, \highlight{a1,b4,d4} - \Apply{\ps@highlightsquare}{\Listize[#1]}} -%%%%% end of adding ornaments to a board %%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%% support for other languages %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% \uc@king queen rook bishop knight pawn holds the letters -% representinng the pieces in the current language -% \skak@currentPieceNames : char list, holds the current piece names -% \def\skak@pieceToEnglish#1{% string -> string, (pgn(curr. lang) -> pgn(eng)) -% \skak@piece@toEnglish(#1Z)} -\def\skak@piece@toEnglish#1{% - \EqPiece{#1}{\uc@king}% - {K}% - {\EqPiece{#1}{\uc@queen}% - {Q}% - {\EqPiece{#1}{\uc@rook}% - {R}% - {\EqPiece{#1}{\uc@bishop}% - {B}% - {\EqPiece{#1}{\uc@knight}% - {N}% - {\errmessage{not a valid piece name in the current language:#1}}}}}}} -% \EqPiece{Z}{#2}% -% {}% done -% {\skak@pgn@toEnglish(#2)}} - -\def\skak@englishToEnglish#1{#1} - -\def\skak@definepieces#1#2#3#4#5#6{% - \edef\uc@king{#1} - \edef\uc@queen{#2} - \edef\uc@rook{#3} - \edef\uc@bishop{#4} - \edef\uc@knight{#5} - \edef\uc@pawn{#6}} - -\def\newskaklanguage#1#2{% - \expandafter\xdef\csname skaklanguage.#1\endcsname{#2}} - -\newcommand{\skaklanguage}[1][english]{% -%\def\skaklanguage#1{% - \def\currentlanguage{#1}% - \ifthenelse{\equal{#1}{english}}% - {\let\skak@pieceToEnglish=\skak@englishToEnglish% - \def\PieceNames{\Listize[K,Q,R,B,N]}} - {\edef\temp@lang{\csname skaklanguage.#1\endcsname} - \expandafter\skak@definepieces\temp@lang% - \let\skak@pieceToEnglish=\skak@piece@toEnglish% - \def\PieceNames{% - \Listize[\uc@king,\uc@queen,\uc@rook,\uc@bishop,\uc@knight]}}} - - -\def\showskaklanguage{% - (\uc@king)(\uc@queen)(\uc@rook)(\uc@bishop)(\uc@knight)(\uc@pawn)} - -%%%%% end of language support %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%% parsing macros %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\def\IsPieceName#1{\Member{\EqPiece}{#1}\PieceNames} -\def\IsFile#1% char -> bool -{\Member{\EqStr}{#1}\FileNames} -\def\IsRank#1% char -> bool -{\Member{\EqStr}{#1}\RankNames} -\def\IsCapture#1% char -> bool -{\EqStr{#1}{x}} -\def\IsPromotion#1% char -> bool -{\EqStr{#1}{=}} -\def\IsDash#1% char -> bool -{\EqStr{#1}{-}} -\def\IsO#1% char -> bool -{\EqStr{#1}{O}} - -\def\File#1% file -> square list, eg. a -> [a1,a2,...,a8] -{\Map{\Glue{#1}}{\RankNames}} -\def\Rank#1% rank -> square list, eg. 1 -> [a1,b1,...,h1] -{\Map{\Twiddle\Glue{#1}}{\FileNames}} - - -% Compose: ('b -> 'c) -> ('a -> 'b) -> ('a -> c') -% Second: 'a -> 'b -> 'b -% f: 'a -> unit -% Compose Second f: 'a -> ('a -> 'b -> unit) -% \def\Apply#1#2% ('a -> unit) -> ('a list -> unit) -% {\Force{\Map{#1}{#2}}} -% \def\Force#1{#1\ForceA{}} -% \def\ForceA#1{#1\Foldr\DoIt{}} -% \def\DoIt#1#2{#1#2} - -\def\Sideeffect#1#2#3{% ('a -> unit) -> ('a -> 'b -> unit) - #1{#2}#3} - -\def\Apply#1#2{% ('a -> unit) -> 'a list -> unit - \Foldr{\Sideeffect{#1}}{\relax}{#2}} - - -\def\EmptyBoard% -{\Apply{\Twiddle\Set{E}}{\Rank{1}} -\Apply{\Twiddle\Set{E}}{\Rank{2}} -\Apply{\Twiddle\Set{E}}{\Rank{3}} -\Apply{\Twiddle\Set{E}}{\Rank{4}} -\Apply{\Twiddle\Set{E}}{\Rank{5}} -\Apply{\Twiddle\Set{E}}{\Rank{6}} -\Apply{\Twiddle\Set{E}}{\Rank{7}} -\Apply{\Twiddle\Set{E}}{\Rank{8}}} - - -\def\FenConvert#1{% - \EqStr{8}{#1}% - {EEEEEEEE}% - {\EqStr{7}{#1}% - {EEEEEEE}% - {\EqStr{6}{#1}% - {EEEEEE}% - {\EqStr{5}{#1}% - {EEEEE}% - {\EqStr{4}{#1}% - {EEEE}% - {\EqStr{3}{#1}% - {EEE}% - {\EqStr{2}{#1}% - {EE}% - {\EqStr{1}{#1}% - {E}% - {#1}}}}}}}}} - - -\def\ParseFenRank#1{\ParseFenRankA(#1Z)} -\def\ParseFenRankA(#1#2){% - \EqStr{Z}{#1}% - {}% - {\FenConvert{#1}\ParseFenRankA(#2)}} - -\def\SetCheckKing#1#2{% square -> piece -> unit - \EqStr{K}{#2}% - {\edef\WhiteKingSquare{#1}}% - {\EqStr{k}{#2}% - {\edef\BlackKingSquare{#1}}% - {}}% - \Set{#1}{#2}} - -\def\InitRank#1#2#3#4#5#6#7#8#9{% - \SetCheckKing{a#9}{#1}% - \SetCheckKing{b#9}{#2}% - \SetCheckKing{c#9}{#3}% - \SetCheckKing{d#9}{#4}% - \SetCheckKing{e#9}{#5}% - \SetCheckKing{f#9}{#6}% - \SetCheckKing{g#9}{#7}% - \SetCheckKing{h#9}{#8}} - -\def\SetRank#1#2{% rank -> fenrank -> unit - \edef\pap{\ParseFenRank{#2}}% - \expandafter\InitRank\pap#1} - - -\def\InitBoard(#1/#2/#3/#4/#5/#6/#7/#8){% - \SetRank{8}{#1}% - \SetRank{7}{#2}% - \SetRank{6}{#3}% - \SetRank{5}{#4}% - \SetRank{4}{#5}% - \SetRank{3}{#6}% - \SetRank{2}{#7}% - \SetRank{1}{#8}% - } - -\def\WhiteCastling{-} -\def\BlackCastling{-} - -\def\ExtractWhiteCastling#1{\def\tempCastling{-}% -\ExtractWhiteCastlingA(#1Z)% -\edef\WhiteCastling{\tempCastling}} -\def\ExtractWhiteCastlingA(#1#2){% - \EqStr{Z}{#1}% - {}% - {\Or{\EqPiece{K}{#1}}{\EqPiece{Q}{#1}}% - {\EqStr{-}{\tempCastling}% - {\edef\tempCastling{#1}\ExtractWhiteCastlingA(#2)}% - {\edef\tempCastling{\tempCastling#1}}}% - {\ExtractWhiteCastlingA(#2)}}} - -\def\ExtractBlackCastling#1{\def\tmpCastling{-}% -\ExtractBlackCastlingA(#1Z)% -\edef\BlackCastling{\tmpCastling}} -\def\ExtractBlackCastlingA(#1#2){% - \EqStr{Z}{#1}% - {}% - {\Or{\EqPiece{k}{#1}}{\EqPiece{q}{#1}}% - {\EqStr{-}{\tmpCastling}% - {\edef\tmpCastling{#1}\ExtractBlackCastlingA(#2)}% - {\edef\tmpCastling{\tmpCastling#1}}}% - {\ExtractBlackCastlingA(#2)}}} - -\newcounter{halfmove} -\newcounter{move} -\def\fenboard#1{\FenBoard#1)} -\def\FenBoard#1 #2 #3 #4 #5 #6){% - \InitBoard(#1)% - \def\WhiteToMove{\EqStr{w}{#2}}% - \ExtractWhiteCastling{#3}%} - \ExtractBlackCastling{#3}%} - \def\EnPassantSquare{#4}% - \setcounter{halfmove}{#5}% - \setcounter{move}{#6}} - - -\newcounter{helpgobble} -\def\PieceToFen#1{% - \EqPiece{E}{#1}% - {1}{#1}} - -\def\Fen@RawRank#1{\PieceToFen{\Get{a#1}}\PieceToFen{\Get{b#1}}% - \PieceToFen{\Get{c#1}}\PieceToFen{\Get{d#1}}% - \PieceToFen{\Get{e#1}}\PieceToFen{\Get{f#1}}% - \PieceToFen{\Get{g#1}}\PieceToFen{\Get{h#1}}} - -\def\PrintCastling{% - \EqStr{-}{\WhiteCastling}% - {\BlackCastling}% - {\WhiteCastling% - \EqStr{-}{\BlackCastling}% - {-}% - {\BlackCastling}}} - - -\def\Fen@handlenumbers#1#2#3#4#5#6#7#8{\setcounter{helpgobble}{0}% - \Fen@handleA(#1#2#3#4#5#6#7#8Z)} -\def\Fen@handleA(#1#2){% - \EqStr{Z}{#1}% - {\ifnum0=\thehelpgobble% - \else\edef\temp@rank{\temp@rank\arabic{helpgobble}}\fi}% - {\EqPiece{1}{#1}% - {\stepcounter{helpgobble}\Fen@handleA(#2)}% - {\ifnum0=\thehelpgobble\edef\temp@rank{\temp@rank#1}\Fen@handleA(#2)% - \else\edef\temp@rank{\temp@rank\arabic{helpgobble}#1}% - \setcounter{helpgobble}{0}\Fen@handleA(#2)\fi}}} - - -\def\Fen@Rank#1{\edef\temp@rank{}\edef\temp@rankA{\Fen@RawRank{#1}}% - \expandafter\Fen@handlenumbers\temp@rankA} - -\def\Fen@calculate{% - \Fen@Rank{8}\edef\temp@board{\temp@rank/}% - \Fen@Rank{7}\edef\temp@board{\temp@board\temp@rank/}% - \Fen@Rank{6}\edef\temp@board{\temp@board\temp@rank/}% - \Fen@Rank{5}\edef\temp@board{\temp@board\temp@rank/}% - \Fen@Rank{4}\edef\temp@board{\temp@board\temp@rank/}% - \Fen@Rank{3}\edef\temp@board{\temp@board\temp@rank/}% - \Fen@Rank{2}\edef\temp@board{\temp@board\temp@rank/}% - \Fen@Rank{1}\edef\temp@board{\temp@board\temp@rank}% - \edef\temp@board{\temp@board\space\WhiteToMove{w}{b}}% - \edef\temp@board{\temp@board\space\PrintCastling\space\EnPassantSquare}% - \edef\temp@board{\temp@board\space\arabic{halfmove}\space\arabic{move}}} - - -\def\boardasfen{\Fen@calculate\temp@board} % if someone wants fen in - % their document - - -%%%%% manipulation of the board state -% the special out-of-bounds square -\Set{Offboard}{X} % note: no piece is named X - -\def\EnPassantSquare{-}% updated by ExecuteMove - - -\def\WhiteToMove{\True} - -\def\WhiteKingSquare% unit -> square -{e1} -\def\BlackKingSquare% unit -> square -{e8} -\def\KingSquare#1{% bool -> square -#1\WhiteKingSquare\BlackKingSquare} -\def\SetKingSquare#1#2{% bool -> square -> unit - #1{\xdef\WhiteKingSquare{#2}}{\xdef\BlackKingSquare{#2}}} - - -% neighbours of a square -\def\SetNeighbour#1#2#3% direction -> square -> square -> unit, #2's - % neighbour in direction #1 is #3 -{\expandafter\xdef\csname#1.#2\endcsname{#3}} -\def\GetNeighbour#1#2% direction -> square -> square -{\csname#1.#2\endcsname} -% all the hard work: -% first we deal with the board boarder ;-) -\def\FF#1#2{\SetNeighbour{#1}{#2}{Offboard}} - -\def\ForwardDirection#1% bool -> direction; up for white, down for black -{#1{up}{down}} -\def\BackwardDirection#1% bool -> direction -{#1{down}{up}} -\def\LeftDirection#1% bool -> direction -{#1{left}{right}} -\def\RightDirection#1% bool -> direction -{#1{right}{left}} - - -\Apply{\FF{left}}{\File{a}} -\Apply{\FF{upleft}}{\File{a}} -\Apply{\FF{downleft}}{\File{a}} -\Apply{\FF{right}}{\File{h}} -\Apply{\FF{upright}}{\File{h}} -\Apply{\FF{downright}}{\File{h}} -\Apply{\FF{up}}{\Rank{8}} -\Apply{\FF{upleft}}{\Rank{8}} -\Apply{\FF{upright}}{\Rank{8}} -\Apply{\FF{down}}{\Rank{1}} -\Apply{\FF{downleft}}{\Rank{1}} -\Apply{\FF{downright}}{\Rank{1}} - - -\def\SetUpNeighbour#1#2#3% direction -> rank -> rank -> unit -{\SetNeighbour{#1}{a#2}{a#3}% - \SetNeighbour{#1}{b#2}{b#3}% - \SetNeighbour{#1}{c#2}{c#3}% - \SetNeighbour{#1}{d#2}{d#3}% - \SetNeighbour{#1}{e#2}{e#3}% - \SetNeighbour{#1}{f#2}{f#3}% - \SetNeighbour{#1}{g#2}{g#3}% - \SetNeighbour{#1}{h#2}{h#3}} -\let\SetDownNeighbour=\SetUpNeighbour% -\SetUpNeighbour{up}{1}{2} -\SetUpNeighbour{up}{2}{3} -\SetUpNeighbour{up}{3}{4} -\SetUpNeighbour{up}{4}{5} -\SetUpNeighbour{up}{5}{6} -\SetUpNeighbour{up}{6}{7} -\SetUpNeighbour{up}{7}{8} -\SetDownNeighbour{down}{2}{1} -\SetDownNeighbour{down}{3}{2} -\SetDownNeighbour{down}{4}{3} -\SetDownNeighbour{down}{5}{4} -\SetDownNeighbour{down}{6}{5} -\SetDownNeighbour{down}{7}{6} -\SetDownNeighbour{down}{8}{7} - - - -\def\SetUpRightNeighbour#1#2#3% direction -> rank -> rank -> unit -{\SetNeighbour{#1}{a#2}{b#3}% - \SetNeighbour{#1}{b#2}{c#3}% - \SetNeighbour{#1}{c#2}{d#3}% - \SetNeighbour{#1}{d#2}{e#3}% - \SetNeighbour{#1}{e#2}{f#3}% - \SetNeighbour{#1}{f#2}{g#3}% - \SetNeighbour{#1}{g#2}{h#3}% - \SetNeighbour{#1}{h#2}{Offboard}} -\let\SetDownRightNeighbour=\SetUpRightNeighbour -\SetUpRightNeighbour{upright}{1}{2} -\SetUpRightNeighbour{upright}{2}{3} -\SetUpRightNeighbour{upright}{3}{4} -\SetUpRightNeighbour{upright}{4}{5} -\SetUpRightNeighbour{upright}{5}{6} -\SetUpRightNeighbour{upright}{6}{7} -\SetUpRightNeighbour{upright}{7}{8} -\SetDownRightNeighbour{downright}{2}{1} -\SetDownRightNeighbour{downright}{3}{2} -\SetDownRightNeighbour{downright}{4}{3} -\SetDownRightNeighbour{downright}{5}{4} -\SetDownRightNeighbour{downright}{6}{5} -\SetDownRightNeighbour{downright}{7}{6} -\SetDownRightNeighbour{downright}{8}{7} - - - -\def\SetUpLeftNeighbour#1#2#3% direction -> rank -> rank -> unit -{\SetNeighbour{#1}{a#2}{Offboard}% - \SetNeighbour{#1}{b#2}{a#3}% - \SetNeighbour{#1}{c#2}{b#3}% - \SetNeighbour{#1}{d#2}{c#3}% - \SetNeighbour{#1}{e#2}{d#3}% - \SetNeighbour{#1}{f#2}{e#3}% - \SetNeighbour{#1}{g#2}{f#3}% - \SetNeighbour{#1}{h#2}{g#3}} -\let\SetDownLeftNeighbour=\SetUpLeftNeighbour -\SetUpLeftNeighbour{upleft}{1}{2} -\SetUpLeftNeighbour{upleft}{2}{3} -\SetUpLeftNeighbour{upleft}{3}{4} -\SetUpLeftNeighbour{upleft}{4}{5} -\SetUpLeftNeighbour{upleft}{5}{6} -\SetUpLeftNeighbour{upleft}{6}{7} -\SetUpLeftNeighbour{upleft}{7}{8} -\SetDownLeftNeighbour{downleft}{2}{1} -\SetDownLeftNeighbour{downleft}{3}{2} -\SetDownLeftNeighbour{downleft}{4}{3} -\SetDownLeftNeighbour{downleft}{5}{4} -\SetDownLeftNeighbour{downleft}{6}{5} -\SetDownLeftNeighbour{downleft}{7}{6} -\SetDownLeftNeighbour{downleft}{8}{7} - - -\def\SetLeftNeighbour#1#2#3% direction -> file -> file -> unit -{\SetNeighbour{#1}{#21}{#31}% - \SetNeighbour{#1}{#22}{#32}% - \SetNeighbour{#1}{#23}{#33}% - \SetNeighbour{#1}{#24}{#34}% - \SetNeighbour{#1}{#25}{#35}% - \SetNeighbour{#1}{#26}{#36}% - \SetNeighbour{#1}{#27}{#37}% - \SetNeighbour{#1}{#28}{#38}} -\let\SetRightNeighbour=\SetLeftNeighbour -\SetLeftNeighbour{left}{b}{a} -\SetLeftNeighbour{left}{c}{b} -\SetLeftNeighbour{left}{d}{c} -\SetLeftNeighbour{left}{e}{d} -\SetLeftNeighbour{left}{f}{e} -\SetLeftNeighbour{left}{g}{f} -\SetLeftNeighbour{left}{h}{g} -\SetRightNeighbour{right}{a}{b} -\SetRightNeighbour{right}{b}{c} -\SetRightNeighbour{right}{c}{d} -\SetRightNeighbour{right}{d}{e} -\SetRightNeighbour{right}{e}{f} -\SetRightNeighbour{right}{f}{g} -\SetRightNeighbour{right}{g}{h} - - - -% the knight needs special attention -\def\KnightSquares#1% square -> square list -{\csname#1.knight\endcsname} - -\def\SetKnightSquares#1#2% square -> square list -> unit -{\expandafter\def\csname#1.knight\endcsname{#2}} - -% a file -\SetKnightSquares{a1}{\Listize[b3,c2]} -\SetKnightSquares{a2}{\Listize[b4,c3,c1]} -\SetKnightSquares{a3}{\Listize[b5,c4,c2,b1]} -\SetKnightSquares{a4}{\Listize[b6,c5,c3,b2]} -\SetKnightSquares{a5}{\Listize[b7,c6,c4,b3]} -\SetKnightSquares{a6}{\Listize[b8,c7,c5,b4]} -\SetKnightSquares{a7}{\Listize[c8,c6,b5]} -\SetKnightSquares{a8}{\Listize[c7,b6]} -% b file -\SetKnightSquares{b1}{\Listize[a3,c3,d2]} -\SetKnightSquares{b2}{\Listize[a4,c4,d3,d1]} -\SetKnightSquares{b3}{\Listize[a5,c5,d4,d2,a1,c1]} -\SetKnightSquares{b4}{\Listize[a6,c6,d5,d3,a2,c2]} -\SetKnightSquares{b5}{\Listize[a7,c7,d6,d4,a3,c3]} -\SetKnightSquares{b6}{\Listize[a8,c8,d7,d5,a5,c5]} -\SetKnightSquares{b7}{\Listize[d8,d6,a5,c5]} -\SetKnightSquares{b8}{\Listize[d7,a6,c6]} -% c file -\SetKnightSquares{c1}{\Listize[a2,b3,d3,e2]} -\SetKnightSquares{c2}{\Listize[a1,a3,b4,d4,e3,e1]} -\SetKnightSquares{c3}{\Listize[a2,a4,b1,b5,d1,d5,e2,e4]} -\SetKnightSquares{c4}{\Listize[a3,a5,b2,b6,d2,d6,e3,e5]} -\SetKnightSquares{c5}{\Listize[a4,a6,b3,b7,d3,d7,e4,e6]} -\SetKnightSquares{c6}{\Listize[a5,a7,b4,b8,d4,d8,e5,e7]} -\SetKnightSquares{c7}{\Listize[a6,a8,b5,d5,e6,e8]} -\SetKnightSquares{c8}{\Listize[a7,b6,d6,e7]} -% d file -\SetKnightSquares{d1}{\Listize[b2,c3,e3,f2]} -\SetKnightSquares{d2}{\Listize[b1,b3,c4,e4,f3,f1]} -\SetKnightSquares{d3}{\Listize[b2,b4,c1,c5,e1,e5,f2,f4]} -\SetKnightSquares{d4}{\Listize[b3,b5,c2,c6,e2,e6,f3,f5]} -\SetKnightSquares{d5}{\Listize[b4,b6,c3,c7,e3,e7,f4,f6]} -\SetKnightSquares{d6}{\Listize[b5,b7,c4,c8,e4,e8,f5,f7]} -\SetKnightSquares{d7}{\Listize[b6,b8,c5,e5,f6,f8]} -\SetKnightSquares{d8}{\Listize[b7,c6,e6,f7]} -% e file -\SetKnightSquares{e1}{\Listize[c2,d3,f3,g2]} -\SetKnightSquares{e2}{\Listize[c1,c3,d4,f4,g3,g1]} -\SetKnightSquares{e3}{\Listize[c2,c4,d1,d5,f1,f5,g2,g4]} -\SetKnightSquares{e4}{\Listize[c3,c5,d2,d6,f2,f6,g3,g5]} -\SetKnightSquares{e5}{\Listize[c4,c6,d3,d7,f3,f7,g4,g6]} -\SetKnightSquares{e6}{\Listize[c5,c7,d4,d8,f4,f8,g5,g7]} -\SetKnightSquares{e7}{\Listize[c6,c8,d5,f5,g6,g8]} -\SetKnightSquares{e8}{\Listize[c7,d6,f6,g7]} -% f file -\SetKnightSquares{f1}{\Listize[d2,e3,g3,h2]} -\SetKnightSquares{f2}{\Listize[d1,d3,e4,g4,h3,h1]} -\SetKnightSquares{f3}{\Listize[d2,d4,e1,e5,g1,g5,h2,h4]} -\SetKnightSquares{f4}{\Listize[d3,d5,e2,e6,g1,g6,h3,h5]} -\SetKnightSquares{f5}{\Listize[d4,d6,e3,e7,g1,g7,h4,h6]} -\SetKnightSquares{f6}{\Listize[d5,d7,e4,e8,g1,g8,h5,h7]} -\SetKnightSquares{f7}{\Listize[d6,d8,e5,g5,h6,h8]} -\SetKnightSquares{f8}{\Listize[d7,e6,g6,h7]} -% g file -\SetKnightSquares{g1}{\Listize[h3,f3,e2]} -\SetKnightSquares{g2}{\Listize[h4,f4,e3,e1]} -\SetKnightSquares{g3}{\Listize[h5,f5,e4,e2,h1,f1]} -\SetKnightSquares{g4}{\Listize[h6,f6,e5,e3,h2,f2]} -\SetKnightSquares{g5}{\Listize[h7,f7,e6,e4,h3,f3]} -\SetKnightSquares{g6}{\Listize[h8,f8,e7,e5,h4,f4]} -\SetKnightSquares{g7}{\Listize[e8,e6,h5,f5]} -\SetKnightSquares{g8}{\Listize[h6,f6,e7]} -% h file -\SetKnightSquares{h1}{\Listize[g3,f2]} -\SetKnightSquares{h2}{\Listize[g4,f3,f1]} -\SetKnightSquares{h3}{\Listize[g5,f4,f2,g1]} -\SetKnightSquares{h4}{\Listize[g6,f5,f3,g2]} -\SetKnightSquares{h5}{\Listize[g7,f6,f4,g3]} -\SetKnightSquares{h6}{\Listize[g8,f7,f5,g4]} -\SetKnightSquares{h7}{\Listize[f8,f6,g5]} -\SetKnightSquares{h8}{\Listize[f7,g6]} - - -% % finding the neighbours of a square, used when the king moves... -% \def\Neighbours#1% square -> square list -% {\Map{\Twiddle\GetNeighbour{#1}}% -% {\Listize[left,upleft,up,upright,right,downright,down,downleft]}} - -% StringToTokens: string -> string list, cut at spaces -\def\StringToTokens#1% -{\ifthenelse{\equal{#1}{}}{\Nil}{\StrToTokens(#1 )}} -\def\StrToTokens (#1 #2){% - \EqStr{#1}{}% - {\Nil}% - \Cons{#1}{\EqStr{#2}{} {\Nil} {\StrToTokens(#2)}}} - -\def\BlackPiece#1% char -> piece -{\EqStr{#1}{K}% - {k}% - {\EqStr{#1}{Q}% - {q}% - {\EqStr{#1}{R}% - {r}% - {\EqStr{#1}{B}% - {b}% - {\EqStr{#1}{N}% - {n}% - {p}}}}}} - -\def\PieceNameToPiece#1#2% piecename -> bool -> piece -{#2{#1}{\BlackPiece{#1}}} - -% setting up variables for ParseMove -\def\ParseMoveInit{% - \gdef\MoveToRank{Z}\gdef\MoveToFile{Z}% - \gdef\RankDiscriminator{Z}\gdef\FileDiscriminator{Z}% - \gdef\PieceNameToMove{Z}% - \gdef\Capture{\False}% - \gdef\Promotion{\False}\gdef\PromotionPieceName{Z}% - \gdef\Castling{\False}\gdef\LongCastling{\False}} - -\def\ParseMove#1{% string -> unit - \ParseMoveA(#1)} - -\def\ParseMoveA(#1#2){% char -> string -> unit - \IsPieceName{#1}% - {\gdef\PieceNameToMove{\skak@pieceToEnglish{#1}}% - \gdef\PieceToMove{\PieceNameToPiece{\PieceNameToMove}{\WhiteToMove}}% - \ParseCoordinates(#2Z)% - \gdef\MoveTo{\MoveToFile\MoveToRank}}% - {\IsO{#1}% - {\def\Castling{\True}% - \ParseCastling(#2Z)}% - {\ParseCoordinates(#1#2Z)% - \gdef\MoveTo{\MoveToFile\MoveToRank}}}} - -\def\FirstChar(#1#2){#1} - -\def\ParseCoordinates(#1#2){% char -> string -> unit - \EqStr{Z}{#1}% - {}% we are done! - {\IsFile{#1}% - {\EqStr{\MoveToFile}{Z}% - {}% first File name in move so nothing to do - {\xdef\FileDiscriminator{\MoveToFile}}% - \gdef\MoveToFile{#1}% - \ParseCoordinates(#2)}% - {\IsRank{#1}% - {\EqStr{\MoveToRank}{Z}% - {}% - {\gdef\RankDiscriminator{\MoveToRank}}% - \gdef\MoveToRank{#1}% - \ParseCoordinates(#2)}% - {\IsCapture{#1}% - {\gdef\Capture{\True}% - \ParseCoordinates(#2)}% - {\IsPromotion{#1}% - {\gdef\Promotion{\True}% - \gdef\PromotionPieceName{\skak@pieceToEnlish{\FirstChar(#2)}}}}% - {}% no more information is of interest - }}}} - -% help for \ParseCastling -\def\ParseCastlingA(#1#2#3){% - \MyEqual{#1#2}{-O}% - {\gdef\LongCastling{\True}}% - {}} - -\def\ParseCastling(-O#1){% strip the first -O, at least Z is left - \ParseCastlingA(#1VW)} - -% \def\ParseCastling(-O#1#2){% -% \EqStr{#1}{Z}% -% {}% -% {\def\LongCastling{\True}}} - - -% for testing purposes -\def\ShowParseInfo% -{ %MoveTo: \MoveTo - MoveToRank: \MoveToRank, MoveToFile: \MoveToFile, \\ - RankDiscriminator: \RankDiscriminator, FileDiscriminator: - \FileDiscriminator, \\ Promotion: \BoolToString{\Promotion}, - PromotionPieceName: \PromotionPieceName - Capture: \BoolToString{\Capture}, \\ - PieceNameToMove: \PieceNameToMove, \\ - Castling: \BoolToString{\Castling}, - LongCastling: \BoolToString{\LongCastling}} - -% castling, with preparation for eg, FisheRandom -%\def\WhiteShortRook{h1} -%\def\WhiteLongRook{a1} -%\def\BlackShortRook{h8} -%\def\WhiteLong -\def\FirstRank#1{% bool -> rank - #1{1}{8}} -\def\CastleKingFile#1{% bool -> file, LongCastling is used as argument - #1{c}{g}} -\def\CastleRookToFile#1{% - #1{d}{f}} -\def\CastleRookFromFile#1{% - #1{a}{h}} - -\def\CastleDone#1{% bool -> unit - #1{\gdef\WhiteCastling{-}}{\gdef\BlackCastling{-}}} - -\def\ExecuteCastling{% relies on \ParseMove - \stepcounter{halfmove}% - \gdef\MoveTo{\CastleKingFile{\LongCastling}\FirstRank{\WhiteToMove}}% - \ExecuteKingMove% - \gdef\MoveTo{\CastleRookToFile{\LongCastling}\FirstRank{\WhiteToMove}}% - \DoTheMove{\CastleRookFromFile{\LongCastling}\FirstRank{\WhiteToMove}}% - \CastleDone{\WhiteToMove}} - - -%%% after ParseMove has gathered info we find the piece to move -% LookFor looks in one direction, stopping if a non-empty square is -% found -\def\LookFor#1#2#3{% (piece -> bool) -> square -> direction -> square list - \LookForA{#1}{\GetNeighbour{#3}{#2}}{#3}} % we have to skip the - % first square!!! -\def\LookForA#1#2#3{% (piece -> bool) -> square -> direction -> square list - #1{\Get{#2}}% - {\Singleton{#2}}% - {\EqPiece{E}{\Get{#2}}% empty square => continue in the given direction - {\LookForA{#1}{\GetNeighbour{#3}{#2}}{#3}}% - {\Nil}}} - - -% IsRightPiece is true if a piece matching #1 is on square#2 -\def\IsRightPiece#1#2{% piece -> square -> bool - \EqPiece{#1}{\Get{#2}}} - -\def\IsRookQueen#1#2{% bool -> piece -> bool - \Or{\EqPiece{#2}{\PieceNameToPiece{R}{#1}}}% - {\EqPiece{#2}{\PieceNameToPiece{Q}{#1}}}% - } -\def\IsBishopQueen#1#2{% bool -> piece -> bool - \Or{\EqPiece{#2}{\PieceNameToPiece{B}{#1}}}% - {\EqPiece{#2}{\PieceNameToPiece{Q}{#1}}}% - } - -% (piece-> bool) -> square -> direction list -> square list -\def\ScanDirections#1#2#3{\Foldr{\Compose\Cat{\LookFor{#1}{#2}}}\Nil{#3}} - - -% relies on the info gathered by ParseMove -\def\FindPieceSquares#1#2{% bool -> square -> square list - \EqPiece{\PieceNameToMove}{R}% - {\ScanDirections% - {\EqPiece{\PieceToMove}}{#2}{\Listize[up,down,left,right]}}% - {\EqPiece{\PieceNameToMove}{B}% - {\ScanDirections% - {\EqPiece{\PieceToMove}}{#2}% - {\Listize[upright,downright,downleft,upleft]}}% - {\EqPiece{\PieceNameToMove}{Q}% - {\ScanDirections% - {\EqPiece{\PieceToMove}}{#2}% - {\Listize[up,down,left,right,upleft,upright,downleft,downright]}}% - {\Filter{\IsRightPiece{\PieceToMove}}{\KnightSquares{#2}}}}}} - -\def\UniqueMove% bool, if the descriminators <> Z -{\And% - {\Not{\EqStr{\RankDiscriminator}{Z}}}% - {\Not{\EqStr{\FileDiscriminator}}{Z}}} - -\def\DoTheMove#1{% move the piece from #1 to \MoveToFile\MoveToRank - \gdef\oldpiece{\Get{\MoveToFile\MoveToRank}}% -% (DoTheMove: oldpiece=\oldpiece, square=#1, contents=\Get{#1}) - \Set{\MoveToFile\MoveToRank}{\Get{#1}}% - \Set{#1}{E}% - \gdef\MoveFrom{#1}} - -\def\DoTheMoveList#1{\DoTheMove{\Head{#1}}} - -% undoes the move to #1 -\def\UndoMove#1{% square -> unit, relies on \oldpiece and \MoveToFile/Rank -\Set{#1}{\Get{\MoveToFile\MoveToRank}}\Set{\MoveToFile\MoveToRank}{\oldpiece}% -\Or{\EqPiece{\PieceToMove}{K}}{\EqPiece{\PieceToMove}{k}}% - {\SetKingSquare{\WhiteToMove}{#1}}% - {}} - -\def\NoEnemiesFound{% bool -\IsNil{\Cat{\ScanDirections{\IsRookQueen{\Not\WhiteToMove}}% - {\KingSquare{\WhiteToMove}}{\Listize[up,down,left,right]}}% - {\ScanDirections{\IsBishopQueen{\Not\WhiteToMove}}% - {\KingSquare{\WhiteToMove}}% - {\Listize[upleft,downright,downleft,upright]}}}} - -\newboolean{helplegal} - -\def\LegalMove#1{% square -> bool, is the move possible to do? - \DoTheMove{#1}% - \NoEnemiesFound - {\UndoMove{#1}\True} - {\UndoMove{#1}\False}} -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% \DoTheMove{#1}% -% \gdef\HelpLegal{\NoEnemiesFound} -% \UndoMove{#1}% -% \HelpLegal} -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% % \ifthenelse{\boolean{helplegal}}{\True}{\False}} -% % \edef\oldpiece{\Get{\MoveToFile\MoveToRank}}% -% \DoTheMove{#1}% -% % \setboolean{helplegal}{\NoEnemiesFound{true}{false}}% -% \gdef\HelpLegal{\NoEnemiesFound} -% \UndoMove{#1}% -% \HelpLegal} -% % \ifthenelse{\boolean{helplegal}}{\True}{\False}} - -% relies on \ParseMove -\def\TrimMoveList#1{% square -> bool -% \gdef\trimhelp{#1}%( -% \And{\RightRank(\trimhelp)}{\And{\RightFile(\trimhelp)}{\LegalMove{\trimhelp}}}} -\And{\RightRank(#1)}{\And{\RightFile(#1)}{\LegalMove{#1}}}} - -\def\ExecuteKingMove{% relies on ParseMove, WhiteToMove - \DoTheMove{\KingSquare{\WhiteToMove}}% - \SetKingSquare{\WhiteToMove}{\MoveTo}% - \WhiteToMove% - {\edef\WhiteCastling{-}}% - {\edef\BlackCastling{-}}} - -% % used by UpdateCastling -% \def\RemoveLongCastling{% relies on \WhiteToMove -% \WhiteToMove% -% {\EqStr{KQ}{\WhiteCastling}% -% {\edef\WhiteCastling{K}}% -% {\EqStr{Q}{\WhiteCastling}% -% {\edef\WhiteCastling{-}} -% {}}}% -% {\EqStr{kq}{\BlackCastling}% -% {\edef\BlackCastling{k}}% -% {\EqStr{q}{\BlackCastling}% -% {\edef\BlackCastling{-}}% -% {}}}} - -% used by UpdateCastling -\def\RemoveLongCastling{% relies on \WhiteToMove - \WhiteToMove% - {\ifthenelse{\equal{KQ}{\WhiteCastling}}% - {\gdef\WhiteCastling{K}}% - {\ifthenelse{\equal{Q}{\WhiteCastling}}% - {\gdef\WhiteCastling{-}}% - {}}}% - {\ifthenelse{\equal{kq}{\BlackCastling}}% - {\gdef\BlackCastling{k}}% - {\ifthenelse{\equal{q}{\BlackCastling}}% - {\edef\BlackCastling{-}}% - {}}}}% - -% % used by UpdateCastling -% \def\RemoveShortCastling{% relies on \WhiteToMove -% \WhiteToMove% -% {\ifthenelse{\equal{KQ}{\WhiteCastling}}% -% %\EqStr{KQ}{\WhiteCastling}% -% {\edef\WhiteCastling{Q}}% -% {\EqStr{K}{\WhiteCastling}% -% {\edef\WhiteCastling{-}}% -% {}}}% -% {\ifthenelse{\equal{kq}{\BlackCastling}}% -% %\EqStr{kq}{\BlackCastling}% -% {\edef\BlackCastling{q}}% -% {\EqStr{k}{\BlackCastling}% -% {\edef\BlackCastling{-}}% -% {}}}} - -% used by UpdateCastling -\def\RemoveShortCastling{% relies on \WhiteToMove - \WhiteToMove% - {\ifthenelse{\equal{KQ}{\WhiteCastling}}% - %\EqStr{KQ}{\WhiteCastling}% - {\gdef\WhiteCastling{Q}}% - {\ifthenelse{\equal{K}{\WhiteCastling}} - {\gdef\WhiteCastling{-}}% - {}}}% - {\ifthenelse{\equal{kq}{\BlackCastling}}% - %\EqStr{kq}{\BlackCastling}% - {\gdef\BlackCastling{q}}% - {\EqStr{k}{\BlackCastling}% - {\gdef\BlackCastling{-}}% - {}}}} - -\def\UpdateCastling{% relies on \ParseMove - \EqPiece{R}{\PieceNameToMove}% - { \EqSquare{\MoveFrom}{\CastleRookFromFile{\True}\FirstRank{\WhiteToMove}}% - {\RemoveLongCastling}% - {\EqSquare{\MoveFrom}{\CastleRookFromFile{\False}\FirstRank{\WhiteToMove}}% - {\RemoveShortCastling}% - {}}}% - {}}% non rook moves will not change the castling possibilities - -\def\ExecutePieceMove{% relies on the info gathered by ParseMove - \Capture{\setcounter{halfmove}{0}}{\stepcounter{halfmove}}% - \UniqueMove% - {\DoTheMove{\FileDiscriminator\RankDiscriminator}}% - {\EqPiece{K}{\PieceNameToMove}% - {\ExecuteKingMove}% -% {\DoTheMove{\Head{\Filter{\TrimMoveList} -% {\FindPieceSquares{\WhiteToMove}{\MoveTo}}}}}}% -% \UpdateCastling} - {\Apply{\DoTheMove}{\Filter{\TrimMoveList}% - {\FindPieceSquares{\WhiteToMove}{\MoveTo}}}}}% - \UpdateCastling} - -% % for pawn captures and moves -% \newcounter{rankhelp} -% % \def\FromRank{\setcounter{rankhelp}{\MoveToRank}% -% % \addtocounter{rankhelp}{\WhiteToMove{-1}{1}} -% % \arabic{rankhelp}} -\def\FromRank{% - \EqStr{1}{\MoveToRank}% - {\WhiteToMove{0}{2}}% - {\EqStr{2}{\MoveToRank}% - {\WhiteToMove{1}{3}}% - {\EqStr{3}{\MoveToRank}% - {\WhiteToMove{2}{4}}% - {\EqStr{4}{\MoveToRank}% - {\WhiteToMove{3}{5}}% - {\EqStr{5}{\MoveToRank}% - {\WhiteToMove{4}{6}}% - {\EqStr{6}{\MoveToRank}% - {\WhiteToMove{5}{7}}% - {\EqStr{7}{\MoveToRank}% - {\WhiteToMove{6}{8}}% - {\EqStr{8}{\MoveToRank}% - {\WhiteToMove{7}{9}}% - {}}}}}}}}} -\def\InitialRank{\WhiteToMove{2}{7}} - -\def\ExecutePawnMove{% relies on the info obtained by ParseMove - \setcounter{halfmove}{0}% - \Capture% - {\EqPiece{E}{\Get{\MoveTo}}% - {\Set{\MoveToFile\FromRank}{E}}% - {}% - \DoTheMove{\FileDiscriminator\FromRank}% - \def\EnPassantSquare{-}}% - {\EqPiece{E}{\Get{\MoveToFile\FromRank}}% - {\edef\EnPassantSquare{\MoveToFile\FromRank}% two square move - \DoTheMove{\MoveToFile\InitialRank}}% - {\DoTheMove{\MoveToFile\FromRank}% one square move - \def\EnPassantSquare{-}}}% - \Promotion% - {\Set{\MoveTo}{\PieceNameToPiece{\PromotionPieceName}{\WhiteToMove}}}% - {}} - - -\def\MakeMove#1{% string -> unit -% (In MakeMove: WhiteToMove \BoolToString\WhiteToMove) - \ParseMoveInit% - \ParseMove{#1}% - \EqPiece{Z}{\PieceNameToMove}% - {\Castling% - {\gdef\EnPassantSquare{-}\ExecuteCastling}% - {\ExecutePawnMove}}% - {\gdef\EnPassantSquare{-}% - \ExecutePieceMove}% - \WhiteToMove% - {\gdef\WhiteToMove{\False}}% - {\gdef\WhiteToMove{\True}\addtocounter{move}{1}}% -%(End MakeMove: WhiteToMove \BoolToString\WhiteToMove) - } - -% debugging aid -%\def\MakeMove#1{#1} - -\def\mainline{\begingroup\catcode`\#=12 \@mainline} -\def\@mainline#1{\endgroup\gdef\NumberNext{\True}% - \Mainline(#1 Z ){\mainlinestyle\typeset@A{#1}}} - - -\def\hidemoves{\begingroup\catcode`\#=12 \@hidemoves} -\def\@hidemoves#1{\endgroup\def\NumberNext{\True}% - \Mainline(#1 Z )} - - -\newcounter{helpnumber} -\newcounter{helpnumberMove} -% \def\EatNumber#1{\setcounter{helpnumber}{0}\EatNumberA(#1Z)% -% \ifthenelse{\value{move}=\value{helpnumber}}% -% {\def\NumberOK{\True}}% -% {\def\NumberOK{\False}}}% -\def\EatNumber#1{% - \setcounter{helpnumberMove}{\arabic{move}}% - \setcounter{helpnumber}{0}\EatNumberA(#1WXYZ)% - \ifthenelse{\value{helpnumberMove}=\value{helpnumber}}% - {\gdef\NumberOK{\True}}% - {\gdef\NumberOK{\False}}}% -\def\EatNumberA(#1.#2){% - \setcounter{helpnumber}{#1}% - \LookForMove(.#2)% sets \ExpectedColur and \CurrentMove - } - -\def\LookForMove(#1#2#3#4){% - \EqStr{.}{#2}% ... after the move number - {\gdef\ExpectedColour{\False}% - \HandleMove(#4)}% - {\gdef\ExpectedColour{\True}% - \HandleMove(#2#3#4)}}% - -\def\HandleMove(#1XYZ){% executes a move if one is found - \EqStr{W}{#1}% - {}% - {\StripMove(#1)}} -\def\StripMove(#1W){% the execution of a move like 1.e4 - \MakeMoveMainline{#1}} - -\def\MakeMoveMainline#1{% - {\ExpectedColour% - {\WhiteToMove% - {\MakeMove{#1}% - \gdef\ExpectedColour{\False}}% - {\errmessage{mainline: black, not white, to move}}}% - {\WhiteToMove% - {\errmessage{mainline: white, not black, to move}}% - {\MakeMove{#1}\gdef\NumberNext{\True}}}}} - - -\def\Mainline(#1 #2){% - \EqStr{Z}{#1}% - {}% - {\NumberNext% - {\EatNumber{#1}% sets \NumberOK, \ExpectedColour - % executes a move not separated from the - % number with a space, eg, 1.e4 - \NumberOK% - {\gdef\NumberNext{\False}% - \Mainline(#2)}% - {\errmessage{mainline: not the correct move number}}}% - {\MakeMoveMainline{#1}% - \Mainline(#2)}}} - - -%%%%% typesetting -%%% figurine notation -%\input{fig1\@ptsize.clo} -\newcommand{\skakfamily}{\usefont{U}{skak}{m}{n}} -\DeclareTextFontCommand{\textskak}{\skakfamily} - -\def\liftfig#1{\textskak{#1}} - - -\def\styleA@opentypesetting{} -\def\styleA@closetypesetting{} -\def\styleA@whiteopen{.} -\def\styleA@blackopen{. -} -\def\styleA@beforenumber{} -\def\styleA@beforewhite{ } -\def\styleA@afterwhite{} -\def\styleA@beforeblack{, } -\def\styleA@afterblack{ } - -\def\styleA{% -\let\opentypesetting=\styleA@opentypesetting -\let\closetypesetting=\styleA@closetypesetting -\let\whiteopen=\styleA@whiteopen -\let\blackopen=\styleA@blackopen -\let\beforenumber=\styleA@beforenumber -\let\beforewhite=\styleA@beforewhite -\let\afterwhite=\styleA@afterwhite -\let\beforeblack=\styleA@beforeblack -\let\afterblack=\styleA@afterblack -} -%%%% the default style -\styleA - -\def\styleB@opentypesetting{} -\def\styleB@closetypesetting{} -\def\styleB@whiteopen{ } -\def\styleB@blackopen{\ldots} -\def\styleB@beforenumber{} -\def\styleB@beforewhite{} -\def\styleB@afterwhite{ } -\def\styleB@beforeblack{} -\def\styleB@afterblack{ } - -\def\styleB{% -\let\opentypesetting=\styleB@opentypesetting -\let\closetypesetting=\styleB@closetypesetting -\let\whiteopen=\styleB@whiteopen -\let\blackopen=\styleB@blackopen -\let\beforenumber=\styleB@beforenumber -\let\beforewhite=\styleB@beforewhite -\let\afterwhite=\styleB@afterwhite -\let\beforeblack=\styleB@beforeblack -\let\afterblack=\styleB@afterblack -} - -\def\styleC@opentypesetting{% - \begin{tabbing}% - \hspace{.2\linewidth}\=\hspace{.2\linewidth}\=% - \hspace{.2\linewidth}\= \kill} -\def\styleC@closetypesetting{\end{tabbing}} -\def\styleC@whiteopen{} -\def\styleC@blackopen{\>\ldots} -\def\styleC@beforenumber{\>} -\def\styleC@beforewhite{\>} -\def\styleC@afterwhite{} -\def\styleC@beforeblack{\>} -\def\styleC@afterblack{\\} - -\def\styleC{% -\let\opentypesetting=\styleC@opentypesetting -\let\closetypesetting=\styleC@closetypesetting -\let\whiteopen=\styleC@whiteopen -\let\blackopen=\styleC@blackopen -\let\beforenumber=\styleC@beforenumber -\let\beforewhite=\styleC@beforewhite -\let\afterwhite=\styleC@afterwhite -\let\beforeblack=\styleC@beforeblack -\let\afterblack=\styleC@afterblack -} - - - -\def\mainlinestyle{\bfseries}%\let\Fig=\Figb}% could also contain - % definitions of the - % various style options -\def\variationstyle{}%\let\Fig=\Fign} % as with mainlinestyle - - -\def\typeset@number#1{\TypeSetAfterBlack{\afterblack}{}% - \gdef\TypeSetAfterBlack{\True}% - \beforenumber\typeset@numberA(#1WXYZ)}% 22: -> 22\?open -\def\typeset@numberA(#1.#2){% - #1\typeset@numberHandlePeriods(.#2)} -\def\typeset@numberHandlePeriods(#1#2#3#4){% - \EqStr{.}{#2}% ... after the number - {\blackopen\gdef\TypeSetColour{\False}\gdef\TypeSetAfterWhite{\False}% - \typeset@numberHandleMove(#4)}% - {\whiteopen\gdef\TypeSetColour{\True}\gdef\TypeSetAfterWhite{\True}% - \typeset@numberHandleMove(#2#3#4)}} -\def\typeset@numberHandleMove(#1XYZ){% - \EqStr{W}{#1}% - {}% - {\typeset@numberStripMove(#1)}} -\def\typeset@numberStripMove(#1W){% - \typeset@A@move{#1}} - -\def\typeset@A@move#1{% - \TypeSetColour% - {\beforewhite\mbox{\typeset@A@moveA(#1Z)}\gdef\TypeSetColour{\False}}% - {\TypeSetAfterWhite{\afterwhite}{}% - \beforeblack\mbox{\typeset@A@moveA(#1Z)}% - \gdef\TypeSetColour{\True}\gdef\TypeSetNumberNext{\True}}} -\def\typeset@A@moveA(#1#2){% - \EqStr{Z}{#1}% - {}% - {\IsPieceName{#1}% - {\xdef\temp@piece{\skak@pieceToEnglish{#1}}% - \expandafter\liftfig\temp@piece}% - {\EqStr{=}{#1}% - {}% - {\EqStr{x}{#1}% - {\ensuremath{\!\!\:\times\!\!\;}}% - {\EqStr{+}{#1}% - {\ensuremath{\dagger}}% - {#1}}}}% - \typeset@A@moveA(#2)}} - - -\def\typeset@A#1{\gdef\TypeSetNumberNext{\True}% - \gdef\TypeSetAfterBlack{\False}\opentypesetting\typeset@AA(#1 Z )% - \closetypesetting} -\def\typeset@AA(#1 #2){% - \EqStr{Z}{#1}% - {}% - {\TypeSetNumberNext% - {\typeset@number{#1}% sets \TypeSetColour - \gdef\TypeSetNumberNext{\False}% - \typeset@AA(#2)}% - {\typeset@A@move{#1}% - \typeset@AA(#2)}}} - - -\def\variation{\begingroup\catcode`\#=12 \@variation} -\def\@variation#1{\endgroup{\variationstyle\typeset@A{#1}}} - -% typesetting moves with out move number -\def\wmove{\begingroup\catcode`\#=12 \@wmove} -\def\@wmove#1{\endgroup{\variationstyle\typeset@A@moveA(#1Z)}} -\def\bmove{\begingroup\catcode`\#=12 \@bmove} -\def\@bmove#1{\endgroup{\variationstyle\ldots\typeset@A@moveA(#1Z)}} - -%%% -% printing of the board -\newlength{\squarelength} -\newlength{\showlength} -\newlength{\ranklift} - -\def\setup@showboard#1{\font\Skak=skak#1% - \setlength{\squarelength}{#1pt}% - % ps setup - \ps@on{\psset{unit=\the\squarelength} - \edef\ps@squarecenter{(-.5,.5)}} - {} - \notationfont\setlength{\ranklift}{.5\squarelength-.8ex}\normalsize} - - - -\def\tinyboard{\font\notationfont=cmss6\setup@showboard{10}} -\def\smallboard{\font\notationfont=cmss8\setup@showboard{15}} -\def\normalboard{\font\notationfont=cmss10\setup@showboard{20}} -\def\largeboard{\font\notationfont=cmss12\setup@showboard{30}} - -% the default -\normalboard - -\def\ToggleWhiteSquare{% - \WhiteSquare{\def\WhiteSquare{\False}}{\def\WhiteSquare{\True}}} - -\def\WhiteSquarePiece#1{% - \EqPiece{E}{#1}{0}{#1}} - -\def\BlackSquarePiece#1{% - \EqPiece{E}{#1}{Z}% - {\EqPiece{P}{#1}{O}% - {\EqPiece{p}{#1}{o}% - {\EqPiece{R}{#1}{S}% - {\EqPiece{r}{#1}{s}% - {\EqPiece{N}{#1}{M}% - {\EqPiece{n}{#1}{m}% - {\EqPiece{B}{#1}{A}% - {\EqPiece{b}{#1}{a}% - {\EqPiece{Q}{#1}{L}% - {\EqPiece{q}{#1}{l}% - {\EqPiece{K}{#1}{J}{j}}}}}}}}}}}}} - -\def\FilterShowOnly#1{% piece -> piece, shows only the pieces in - % ShowOnlyList - \Member{\EqStr}{#1}{\ShowOnlyList}% - {#1}{E}} - - -\def\Showchar#1{% square -> drawn square - \WhiteSquare% - {\WhiteSquarePiece{\Compose\FilterShowOnly\Get{#1}}}% - {\BlackSquarePiece{\Compose\FilterShowOnly\Get{#1}}}% - \ToggleWhiteSquare% - % ps stuff - \ps@on{\expandafter\pnode\ps@squarecenter{#1}}{}} - -\def\Showrank#1{% rank -> drawn rank -\Skak\Apply{\Showchar}{\Rank{#1}}} - -\def\ShowrankInverse#1{% rank -> drawn rank - \Skak\Apply{\Showchar}{\Reverse{\Rank{#1}}}} -% \Skak\Apply{\Showchar}{\Rank{#1}}} - -\def\ShowMoverWhiteNormal{\pscustom{\translate(h1) -\psline{->}(1,0.25)(1,0.8)% -\psframe(0.84,-0.16)(1.16,0.16)}} - -\def\ShowMoverBlackNormal{% - \pscustom[fillstyle=solid,fillcolor=gray]{\translate(h8)% - \psline{->}(1,-0.25)(1,-0.8)% - \psframe(0.84,-0.16)(1.16,0.16)}} - -\def\ShowMoverWhiteInverse{\pscustom{\translate(a1) -\psline{->}(1,-0.25)(1,-0.8)% -\psframe(0.84,-0.16)(1.16,0.16)}} - -\def\ShowMoverBlackInverse{% - \pscustom[fillstyle=solid,fillcolor=gray]{\translate(a8)% - \psline{->}(1,0.25)(1,0.8)% - \psframe(0.84,-0.16)(1.16,0.16)}} - - - -\def\show@board{% - \def\WhiteSquare{\True} - \vbox{\offinterlineskip - \hrule height1pt - \hbox{\vrule width1pt - \vbox{\hbox{\Showrank{8}}\ToggleWhiteSquare - \hbox{\Showrank{7}}\ToggleWhiteSquare - \hbox{\Showrank{6}}\ToggleWhiteSquare - \hbox{\Showrank{5}}\ToggleWhiteSquare - \hbox{\Showrank{4}}\ToggleWhiteSquare - \hbox{\Showrank{3}}\ToggleWhiteSquare - \hbox{\Showrank{2}}\ToggleWhiteSquare - \hbox{\Showrank{1}}}% - \vrule width1pt} - \hrule height1pt} - \setcounter{ps@inverse}{0} - \ShowMover - {\WhiteToMove - {\ShowMoverWhiteNormal} - {\ShowMoverBlackNormal}} - {} -} - -\def\show@board@inverse{% - \def\WhiteSquare{\True} - \vbox{\offinterlineskip - \hrule height1pt - \hbox{\vrule width1pt - \vbox{\hbox{\ShowrankInverse{1}}\ToggleWhiteSquare - \hbox{\ShowrankInverse{2}}\ToggleWhiteSquare - \hbox{\ShowrankInverse{3}}\ToggleWhiteSquare - \hbox{\ShowrankInverse{4}}\ToggleWhiteSquare - \hbox{\ShowrankInverse{5}}\ToggleWhiteSquare - \hbox{\ShowrankInverse{6}}\ToggleWhiteSquare - \hbox{\ShowrankInverse{7}}\ToggleWhiteSquare - \hbox{\ShowrankInverse{8}}}% - \vrule width1pt} - \hrule height1pt} - \setcounter{ps@inverse}{180} - \ShowMover - {\WhiteToMove - {\ShowMoverWhiteInverse} - {\ShowMoverBlackInverse}} - {} -} - -\def\ShowrankNumber#1{% -\makebox[0pt][r]{% - \raisebox{\ranklift}[0cm][0cm]{% - \makebox[\squarelength][r]{\notationfont#1\hspace*{.1\squarelength}}}}} - -\def\ShowrankWithNumber#1{\ShowrankNumber{#1}% -\vrule width1pt \Showrank{#1}\vrule width1pt} - -\def\ShowrankInverseWithNumber#1{\ShowrankNumber{#1}% - \vrule width1pt\ShowrankInverse{#1}\vrule width1pt} - - -\def\Showfile#1{\hbox to \squarelength{\hfil\notationfont#1\hfil}} -\def\Showfiles{\hfil\Showfile{a}\Showfile{b}\Showfile{c}\Showfile{d}% - \Showfile{e}\Showfile{f}\Showfile{g}\Showfile{h}\hfil} -\def\Showfiles@inverse{\hfil\Showfile{h}\Showfile{g}\Showfile{f}\Showfile{e}% - \Showfile{d}\Showfile{c}\Showfile{b}\Showfile{a}\hfil} - -\def\show@board@notation{% - \def\WhiteSquare{\True}% - \vbox{\offinterlineskip% - \hrule height1pt - \hbox{\ShowrankWithNumber{8}}\ToggleWhiteSquare - \hbox{\ShowrankWithNumber{7}}\ToggleWhiteSquare - \hbox{\ShowrankWithNumber{6}}\ToggleWhiteSquare - \hbox{\ShowrankWithNumber{5}}\ToggleWhiteSquare - \hbox{\ShowrankWithNumber{4}}\ToggleWhiteSquare - \hbox{\ShowrankWithNumber{3}}\ToggleWhiteSquare - \hbox{\ShowrankWithNumber{2}}\ToggleWhiteSquare - \hbox{\ShowrankWithNumber{1}}\ToggleWhiteSquare - \hrule height1pt - \vspace*{.1\squarelength} - \hbox{\Showfiles}} - \setcounter{ps@inverse}{0} - \ShowMover - {\WhiteToMove - {\ShowMoverWhiteNormal} - {\ShowMoverBlackNormal}} - {} -} - -\def\show@board@notation@inverse{% - \def\WhiteSquare{\True}% - \vbox{\offinterlineskip% - \hrule height1pt - \hbox{\ShowrankInverseWithNumber{1}}\ToggleWhiteSquare - \hbox{\ShowrankInverseWithNumber{2}}\ToggleWhiteSquare - \hbox{\ShowrankInverseWithNumber{3}}\ToggleWhiteSquare - \hbox{\ShowrankInverseWithNumber{4}}\ToggleWhiteSquare - \hbox{\ShowrankInverseWithNumber{5}}\ToggleWhiteSquare - \hbox{\ShowrankInverseWithNumber{6}}\ToggleWhiteSquare - \hbox{\ShowrankInverseWithNumber{7}}\ToggleWhiteSquare - \hbox{\ShowrankInverseWithNumber{8}}\ToggleWhiteSquare - \hrule height1pt - \vspace*{.1\squarelength} - \hbox{\Showfiles@inverse}} - \setcounter{ps@inverse}{180} - \ShowMover - {\WhiteToMove - {\ShowMoverWhiteInverse} - {\ShowMoverBlackInverse}} - {} -} - -% on the fly configuration -\def\notationOn{\let\showboard=\show@board@notation% - \let\showinverseboard=\show@board@notation@inverse} -\def\notationOff{\let\showboard=\show@board% - \let\showinverseboard=\show@board@inverse} - -\def\showmoverOn{\def\ShowMover{\True}} -\def\showmoverOff{\def\ShowMover{\False}} - - -\def\newgame{% -\fenboard{rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1}} - - -%%%% storing and loading of games -\newtoks\store@toks -\def\savegame#1{% writes the board as fen to #1.fen - \newwrite\skakstore% - \immediate\openout\skakstore=#1.fen% - \Fen@calculate% - \immediate\write\skakstore{\temp@board}% - \immediate\closeout\skakstore} - -% loading a board from a fen file is also possible -% the file #1.fen should contain nothing but a fen of -% a game -\def\loadgame#1{% - \def\load@read{}% - \newread\load@in% - \openin\load@in=#1.fen\relax% - \read\load@in to \load@read% - \closein\load@in% - \expandafter\FenBoard\load@read)} - -%%% temporary storing of a game position, without resorting to files -% \def\storegame#1{\Fen@calculate% -% \def#1{\temp@board}} -% \def\restoregame#1{\expandafter\FenBoard#1)} -\def\storegame#1{\Fen@calculate% - \expandafter\xdef\csname chessgame.#1\endcsname{\temp@board}} -\def\restoregame#1{% - \edef\restore@temp{\csname chessgame.#1\endcsname} - \expandafter\FenBoard\restore@temp)} - -% end skak.sty - - - diff --git a/Master/texmf-dist/tex/latex/skak/skak.fd b/Master/texmf-dist/tex/latex/skak/skak.fd new file mode 100644 index 00000000000..e89f0b62505 --- /dev/null +++ b/Master/texmf-dist/tex/latex/skak/skak.fd @@ -0,0 +1,11 @@ +\DeclareFontFamily{U}{skak}{} + \DeclareFontShape{U}{skak}{m}{n}{<-> skakf10 }{} + \DeclareFontShape{U}{skak}{m}{sl}{<-> sub skakf10/m/n }{} + \DeclareFontShape{U}{skak}{m}{it}{<-> sub skakf10/m/n }{} + \DeclareFontShape{U}{skak}{m}{sc}{<-> sub skakf10/m/n }{} + \DeclareFontShape{U}{skak}{m}{u}{<-> sub skakf10/m/n }{} + \DeclareFontShape{U}{skak}{bx}{n}{<-> skakf10b }{} + \DeclareFontShape{U}{skak}{bx}{sl}{<-> sub skakf10b/bx/n }{} + \DeclareFontShape{U}{skak}{bx}{it}{<-> sub skakf10b/bx/n }{} + \DeclareFontShape{U}{skak}{b}{u}{<-> skakf10b }{} +\endinput diff --git a/Master/texmf-dist/tex/latex/skak/skak.sty b/Master/texmf-dist/tex/latex/skak/skak.sty index 895af5ef79f..f3190357760 100644 --- a/Master/texmf-dist/tex/latex/skak/skak.sty +++ b/Master/texmf-dist/tex/latex/skak/skak.sty @@ -27,9 +27,15 @@ % Joao Nabais reported a problem related to switching % back and forth from styleC - this has been fixed using % \leavestylec command complex. +% 1.5 2008-10-09 Fixed a major problem with longmoves - the pawn moves +% are now displayed correctly. Changed the \storegame and +% \restoregame to store both the current position and the +% previous positon so a full restore can be made. +% Added new variation commands. + \NeedsTeXFormat{LaTeX2e} -\ProvidesPackage{skak}[2005/06/29 v1.4a Chess typesetting] +\ProvidesPackage{skak}[2008/10/09 v1.5 Chess typesetting] \DeclareOption{tiny}{\AtEndOfClass{\tinyboard}} \DeclareOption{small}{\AtEndOfClass{\smallboard}} @@ -601,16 +607,23 @@ \newcounter{halfmove} \newcounter{move} -\def\fenboard#1{\FenBoard#1)} +\def\@fenboard#1{\FenBoard#1)} \def\FenBoard#1 #2 #3 #4 #5 #6){% \InitBoard(#1)% - \def\WhiteToMove{\EqStr{w}{#2}}% - \ExtractWhiteCastling{#3}%} - \ExtractBlackCastling{#3}%} - \def\EnPassantSquare{#4}% + \EqStr{w}{#2}% + {\gdef\WhiteToMove{\True}}% + {\gdef\WhiteToMove{\False}}%\EqStr{w}{#2}}% + \ExtractWhiteCastling{#3}%} + \ExtractBlackCastling{#3}%} + \edef\EnPassantSquare{#4}% \setcounter{halfmove}{#5}% \setcounter{move}{#6}} +\def\fenboard#1{% +% \@fenboard#1% + \FenBoard#1)% + \@initstorage} + \newcounter{helpgobble} \def\PieceToFen#1{% @@ -952,8 +965,8 @@ \addtocounter{move}{-1}% \beforenumber\arabic{move}\blackopen\beforeblack% \addtocounter{move}{1}}% - {\beforenumber\arabic{move}\whiteopen\beforewhite}% - \expandafter\wmove\expandafter{\LastMoveString}}} + {\beforenumber\arabic{move}\whiteopen\beforewhite}% + \expandafter\wmove\expandafter{\LastMoveString}}} \def\ParseMoveA(#1#2){% char -> string -> unit \IsPieceName{#1}% @@ -1219,25 +1232,48 @@ {}}}}}}}}} \def\InitialRank{\WhiteToMove{2}{7}} +% \def\ExecutePawnMove{% relies on the info obtained by ParseMove +% \setcounter{halfmove}{0}% +% \Capture% +% {\EqPiece{E}{\Get{\MoveTo}}% +% {\Set{\MoveToFile\FromRank}{E}}% +% {}% +% \DoTheMove{\FileDiscriminator\FromRank}% +% \xdef\EnPassantSquare{-}}% +% {\EqPiece{E}{\Get{\MoveToFile\FromRank}}% +% {\xdef\EnPassantSquare{\MoveToFile\FromRank}% two square move +% \DoTheMove{\MoveToFile\InitialRank}}% +% {\xdef\EnPassantSquare{-}% +% \DoTheMove{\MoveToFile\FromRank}% one square move +% }}% +% \Promotion% +% {\Set{\MoveTo}{\PieceNameToPiece{\PromotionPieceName}{\WhiteToMove}}}% +% {}} + +% Bug-fix for longmove \def\ExecutePawnMove{% relies on the info obtained by ParseMove \setcounter{halfmove}{0}% \Capture% {\EqPiece{E}{\Get{\MoveTo}}% {\Set{\MoveToFile\FromRank}{E}}% {}% - \DoTheMove{\FileDiscriminator\FromRank}% + \xdef\PawnFrom{\FileDiscriminator\FromRank}% + \DoTheMove{\PawnFrom}% \xdef\EnPassantSquare{-}}% {\EqPiece{E}{\Get{\MoveToFile\FromRank}}% {\xdef\EnPassantSquare{\MoveToFile\FromRank}% two square move - \DoTheMove{\MoveToFile\InitialRank}}% + \xdef\PawnFrom{\MoveToFile\InitialRank}% + \DoTheMove{\PawnFrom}}% {\xdef\EnPassantSquare{-}% - \DoTheMove{\MoveToFile\FromRank}% one square move + \xdef\PawnFrom{\MoveToFile\FromRank}% + \DoTheMove{\PawnFrom}% one square move }}% \Promotion% {\Set{\MoveTo}{\PieceNameToPiece{\PromotionPieceName}{\WhiteToMove}}}% {}} + \def\MakeMove#1{% string -> unit \ParseMoveInit% \ParseMove{#1}% @@ -1254,28 +1290,53 @@ {\gdef\WhiteToMove{\False}}% {\gdef\WhiteToMove{\True}\addtocounter{move}{1}}}% {}% moves are not executed - \printmove% - } + \printmove} \def\mainline{\begingroup\catcode`\#=12 \@mainline} +% \def\@mainline#1{\endgroup\gdef\NumberNext{\True}% +% \gdef\AfterBlack{\False}% +% \gdef\PrintMoves{\True}% +% \gdef\ExecuteMoves{\True}% +% \gdef\StoreLastMove{\True}% +% {\mainlinestyle\opencommands% +% \Mainline(#1 Z )% +% \closecommands}} + +% new version of @mainline \def\@mainline#1{\endgroup\gdef\NumberNext{\True}% - \gdef\AfterBlack{\False}% + \let\currentstyle=\mainlinestyle% \gdef\PrintMoves{\True}% \gdef\ExecuteMoves{\True}% \gdef\StoreLastMove{\True}% - {\mainlinestyle\opencommands% - \Mainline(#1 Z )% - \closecommands}} + \@restoremainline% + \runmoves{#1}% + \@storemainline} + +\def\@restoremainline{% + \@restoregame{skak.mainline.previous}% + \@storegame{skak.temp.previous}% + \@restoregame{skak.mainline}} + \def\hidemoves{\begingroup\catcode`\#=12 \@hidemoves} +% \def\@hidemoves#1{\endgroup\gdef\NumberNext{\True}% +% \gdef\AfterBlack{\False}% +% \gdef\PrintMoves{\False}% +% \gdef\ExecuteMoves{\True}% +% \gdef\StoreLastMove{\True}% just in case you want to refer to the last move. +% {\relax@typesetting% +% \Mainline(#1 Z )}} + +% new version af @hidemoves \def\@hidemoves#1{\endgroup\gdef\NumberNext{\True}% - \gdef\AfterBlack{\False}% \gdef\PrintMoves{\False}% \gdef\ExecuteMoves{\True}% \gdef\StoreLastMove{\True}% just in case you want to refer to the last move. - {\relax@typesetting% - \Mainline(#1 Z )}} + \let\currentstyle=\relax@typesetting% + \@restoremainline% + \runmoves{#1}% + \@storemainline} \newcounter{helpnumber} @@ -1294,7 +1355,7 @@ {\setcounter{helpnumber}{#1}% \ifthenelse{\value{helpnumberMove}=\value{helpnumber}}% {\LookForMove(.#2)}% sets \ExpectedColour and \CurrentMove - {\errmessage{mainline: not the correct move number}}}% + {\errmessage{mainline: #1 is not the correct move number}}}% {\LookForMove(.#2)}% } @@ -1317,6 +1378,8 @@ {\gdef\NumberNext{\False}}% {\StripMove(#1)}} \def\StripMove(#1W){% handles things like 1.e4 + \@storegame{skak.temp.previous}% store the previous position + % TO-DO: need a more effective way of going a move back. \MakeMoveMainline{#1}} % The tricky part! Has to integrate \typeset@A@move @@ -1331,6 +1394,7 @@ {\errmessage{mainline: white, not black, to move (#1)}}% {\MakeMove{#1}\gdef\NumberNext{\True}}}}} + \def\MakeMoveMainline#1{% \ExecuteMoves% {\ExpectedColour% @@ -1346,6 +1410,23 @@ \beforeblack\MakeMove{#1}\gdef\NumberNext{\True}}} +% \def\Mainline(#1 #2){% +% \EqStr{ }{#1}% +% {\Mainline(#2)}% +% {% +% \EqStr{Z}{#1}% +% {}% +% {\NumberNext% +% {\EatNumber{#1}% sets \NumberOK, \ExpectedColour +% % executes a move not separated from the +% % number with a space, eg, 1.e4 +% %{\gdef\NumberNext{\False}\Mainline(#2)}% +% %\gdef\NumberNext{\False}% +% \Mainline(#2)}% +% {\MakeMoveMainline{#1}% +% \Mainline(#2)}}}} + +% New version for longmoves in variation \def\Mainline(#1 #2){% \EqStr{ }{#1}% {\Mainline(#2)}% @@ -1356,10 +1437,12 @@ {\EatNumber{#1}% sets \NumberOK, \ExpectedColour % executes a move not separated from the % number with a space, eg, 1.e4 - %{\gdef\NumberNext{\False}\Mainline(#2)}% + % {\gdef\NumberNext{\False}\Mainline(#2)}% %\gdef\NumberNext{\False}% \Mainline(#2)}% - {\MakeMoveMainline{#1}% + {\@storegame{skak.temp.previous}% store the previous position + % TO-DO: need a more effective way of going a move back. + \MakeMoveMainline{#1}% \Mainline(#2)}}}} @@ -1496,18 +1579,18 @@ \def\styleC{% -\let\opencommands=\styleC@opencommands -\let\closecommands=\styleC@closecommands -\let\whiteopen=\styleC@whiteopen -\let\blackopen=\styleC@blackopen -\let\beforenumber=\styleC@beforenumber -\let\beforewhite=\styleC@beforewhite -\let\afterwhite=\styleC@afterwhite -\let\beforeblack=\styleC@beforeblack -\let\afterblack=\styleC@afterblack -\def\mainlinestyle{\styleC\bfseries} -\def\variationstyle{\styleB} -\def\styleC@on{\True} +\let\opencommands=\styleC@opencommands% +\let\closecommands=\styleC@closecommands% +\let\whiteopen=\styleC@whiteopen% +\let\blackopen=\styleC@blackopen% +\let\beforenumber=\styleC@beforenumber% +\let\beforewhite=\styleC@beforewhite% +\let\afterwhite=\styleC@afterwhite% +\let\beforeblack=\styleC@beforeblack% +\let\afterblack=\styleC@afterblack% +\def\mainlinestyle{\styleC\bfseries}% +\def\variationstyle{\styleB}% +\def\styleC@on{\True}% } \def\mainlinestyle{\bfseries}% could also contain @@ -1557,22 +1640,22 @@ {\checksymbol}% was "\ensuremath{\dagger}" before {\EqStr{-}{#1}% {\LastCharWasCastle - {\castlinghyphen}% %%changed UF, dash from Textfont short dash for castlings - {\hbox{--}}}% longer dash for moves - {\EqStr{O}{#1}% - {\gdef\LastCharWasCastle{\True}% - \castlingchar}% %% UF added to be able to change from O to 0 - {\gdef\LastCharWasCastle{\False}% - \EqStr{##}{#1}%added 2004.04.14 for \mate - {\mate} - {#1}}}}}}}% + {\castlinghyphen}% %%changed UF, dash from Textfont short dash for castlings + {\hbox{--}}}% longer dash for moves + {\EqStr{O}{#1}% + {\gdef\LastCharWasCastle{\True}% + \castlingchar}% %% UF added to be able to change from O to 0 + {\gdef\LastCharWasCastle{\False}% + \EqStr{##}{#1}%added 2004.04.14 for \mate + {\mate} + {#1}}}}}}}% \typeset@A@moveA(#2)}} \def\typeset@A#1{\gdef\TypeSetNumberNext{\True}% \gdef\TypeSetAfterBlack{\False}\opencommands\typeset@AA(#1 Z )% \closecommands} -%\typeset@AA is isomorf with \Mainline +% \typeset@AA is isomorf with \Mainline \def\typeset@AA(#1 #2){% \EqStr{ }{#1}% {\typeset@AA(#2)}% @@ -1580,34 +1663,98 @@ {}% {\TypeSetNumberNext% {\typeset@number{#1}% sets \TypeSetColour - %\gdef\TypeSetNumberNext{\False}% + % \gdef\TypeSetNumberNext{\False}% \typeset@AA(#2)}% {\typeset@A@move{#1}% \typeset@AA(#2)}}}} -%\typeset@cmoves and \typeset@comment added by db <2002-01-06> +% \typeset@cmoves and \typeset@comment added by db <2002-01-06> \def\movewhite{ } \def\typeset@cmoves(#1 #2){% \EqStr{ }{#1}% {\typeset@cmoves(#2)}% {\EqStr{Y}{#1}% - {}% - {\typeset@A@moveA(#1Z)\movewhite\typeset@cmoves(#2)}}} + {}% + {\typeset@A@moveA(#1Z)\movewhite\typeset@cmoves(#2)}}} \def\typeset@comment#1{\opencommands\typeset@cmoves(#1 Y )% - \closecommands} + \closecommands} %\def\variation{\begingroup\catcode`\#=12 \@variation} \DeclareRobustCommand{\variation}{\begingroup\catcode`\#=12 \@variation} %\def\@variation#1{\endgroup{\variationstyle\typeset@A{#1}}} +\DeclareRobustCommand{\variationcurrent}{\begingroup\catcode`\#=12 \@variationcurrent} +\DeclareRobustCommand{\continuevariation}{\begingroup\catcode`\#=12 \@continuevariation} +\DeclareRobustCommand{\continuevariationcurrent}{\begingroup\catcode`\#=12 \@continuevariationcurrent} + +% \def\@variation#1{\endgroup\gdef\NumberNext{\True}% +% \gdef\AfterBlack{\False}% +% \gdef\PrintMoves{\True}% +% \gdef\ExecuteMoves{\False}% +% \gdef\StoreLastMove{\False}% +% {\variationstyle\opencommands% +% \Mainline(#1 Z )% +% \closecommands}} + +% new version of \@variation +\def\@variation#1{\endgroup% + \let\currentstyle=\variationstyle% + \gdef\Printmoves{\True}% + \gdef\ExecuteMoves{\True}% + \gdef\StoreLastMove{\False}% + \@restoregame{skak.mainline.previous}% roll-back of last move. + \runmoves{#1}% + \storegame{skak.variation}\@restoremainline} + +% \def\@storevariationdata{% +% \storegame{skak.variation}% +% \restoregame{skak.temp.previous}% +% \storegame{skak.variation.previous}} + +\def\@storemainline{% Only to be called after executing moves in \@mainline +% or in \@hidemoves! + \@storegame{skak.mainline}% + \@restoregame{skak.temp.previous}% + \@storegame{skak.mainline.previous}% + \@restoregame{skak.mainline}} + +\def\@variationcurrent#1{\endgroup% + \let\currentstyle=\variationstyle% + \gdef\Printmoves{\True}% + \gdef\ExecuteMoves{\True}% + \gdef\StoreLastMove{\False}% + \@restoregame{skak.mainline}% + \runmoves{#1}% + \storegame{skak.variation}\@restoremainline} -\def\@variation#1{\endgroup\gdef\NumberNext{\True}% - \gdef\AfterBlack{\False}% - \gdef\PrintMoves{\True}% - \gdef\ExecuteMoves{\False}% +\def\@continuevariation#1{\endgroup% + \let\currentstyle=\variationstyle% + \gdef\Printmoves{\True}% + \gdef\ExecuteMoves{\True}% \gdef\StoreLastMove{\False}% - {\variationstyle\opencommands% + \@restoregame{skak.variation.previous}% roll-back of last move. + \runmoves{#1}% + \storegame{skak.variation}\@restoremainline} + + +\def\@continuevariationcurrent#1{\endgroup% + \let\currentstyle=\variationstyle% + \gdef\Printmoves{\True}% + \gdef\ExecuteMoves{\True}% + \gdef\StoreLastMove{\False}% + \@restoregame{skak.variation}% + \runmoves{#1}% + \storegame{skak.variation}\@restoremainline} + + + + +% \runmoves is common to \variation, \mainline and \hidemoves +\newcommand\runmoves[1]{% + \gdef\NumberNext{\True}% + \gdef\AfterBlack{\False}% + {\currentstyle\opencommands% \Mainline(#1 Z )% \closecommands}} @@ -1857,7 +2004,13 @@ \def\showmoveroff{\showmoverOff} \def\newgame{% -\fenboard{rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1}} + \fenboard{rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1}} + +% Stores the initial boards for board manipulation. +\def\@initstorage{% + \@storegame{skak.mainline}% + \@storegame{skak.mainline.previous}% no previous move for starters. + \@storegame{skak.temp.previous}} %%%% storing and loading of games @@ -1869,6 +2022,14 @@ \immediate\write\skakstore{\temp@board}% \immediate\closeout\skakstore} +\def\savegame#1{% writes the board as fen to #1.fen + \immediate\openout0=#1.fen% + \Fen@calculate% + \immediate\write0{\temp@board}% + \immediate\closeout0} + + + % loading a board from a fen file is also possible % the file #1.fen should contain nothing but a fen of % a game @@ -1884,10 +2045,26 @@ % \def\storegame#1{\Fen@calculate% % \def#1{\temp@board}} % \def\restoregame#1{\expandafter\FenBoard#1)} -\def\storegame#1{\Fen@calculate% +\def\@storegame#1{\Fen@calculate% \expandafter\xdef\csname chessgame.#1\endcsname{\temp@board}} -\def\restoregame#1{% - \edef\restore@temp{\csname chessgame.#1\endcsname} +\def\@restoregame#1{% + \edef\restore@temp{\csname chessgame.#1\endcsname}% \expandafter\FenBoard\restore@temp)} +\let\mystore=\@storegame +\let\myrestore=\@restoregame + +\def\storegame#1{% + \@storegame{#1}% + \@restoregame{skak.temp.previous}% + \@storegame{#1.previous}% + \@restoregame{#1}} + +\def\restoregame#1{% + \@restoregame{#1.previous}% + \@storegame{skak.temp.previous}% + \@storegame{skak.mainline.previous}% + \@restoregame{#1}% + \@storegame{skak.mainline}} + % end skak.sty diff --git a/Master/texmf-dist/tex/latex/skak/uskak.fd b/Master/texmf-dist/tex/latex/skak/uskak.fd new file mode 100644 index 00000000000..e89f0b62505 --- /dev/null +++ b/Master/texmf-dist/tex/latex/skak/uskak.fd @@ -0,0 +1,11 @@ +\DeclareFontFamily{U}{skak}{} + \DeclareFontShape{U}{skak}{m}{n}{<-> skakf10 }{} + \DeclareFontShape{U}{skak}{m}{sl}{<-> sub skakf10/m/n }{} + \DeclareFontShape{U}{skak}{m}{it}{<-> sub skakf10/m/n }{} + \DeclareFontShape{U}{skak}{m}{sc}{<-> sub skakf10/m/n }{} + \DeclareFontShape{U}{skak}{m}{u}{<-> sub skakf10/m/n }{} + \DeclareFontShape{U}{skak}{bx}{n}{<-> skakf10b }{} + \DeclareFontShape{U}{skak}{bx}{sl}{<-> sub skakf10b/bx/n }{} + \DeclareFontShape{U}{skak}{bx}{it}{<-> sub skakf10b/bx/n }{} + \DeclareFontShape{U}{skak}{b}{u}{<-> skakf10b }{} +\endinput -- cgit v1.2.3