%<*xskak>
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{xskak}[2019/06/23 version v1.5 extended chess typesetting and parsing]

\newif\ifxskakpdfmatch

\ifcsname pdfmatch\endcsname
 \xskakpdfmatchtrue
\else
 \xskakpdfmatchfalse
\fi

\DeclareOption{nopdfmatch}{\xskakpdfmatchfalse}
\providecommand\xskak@val@skakversion{skak}
\DeclareOption{skak14}{\def\xskak@val@skakversion{skak14}}
\DeclareOption{skak15}{\def\xskak@val@skakversion{skak15}}
\DeclareOption{small}{\AtEndOfClass{\smallboard}}
\ProcessOptions

\RequirePackage{\xskak@val@skakversion}[2005/06/29]
\expandafter\edef\csname ver@skak.sty\endcsname{\csname ver@\xskak@val@skakversion.sty\endcsname}

\RequirePackage{xifthen}
\RequirePackage{etoolbox}
\RequirePackage{chessboard}[2007/12/20]
\RequirePackage{xskak-keys}
\newcommand\chessdiagramname{\ (Diagram)\ }
\RequirePackage{xskak-nagdef}

%%%%%%%%%%%%%%%%%%%%%
%% Naming conventions
%%%%%%%%%%%%%%%%%%%%%


%%%%%%%%%%%%%%%%%%%%
%%%%% Initialisation


\newcommand\xskak@val@gameid{game}
\newcommand\xskak@val@movenr{1}
\newcommand\xskak@val@player{w}
\newcommand\xskak@val@type{}

\newcommand\xskak@val@defaultmovenr{1}
\newcommand\xskak@val@defaultplayer{w}
\newcommand\xskak@val@defaultmoveid{1w}

\newcommand\xskak@val@defaultid{game}
\newcommand\xskak@val@defaultfen{rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1}

\newcommand\xskak@val@currenttag{}

\newcommand\xskak@list@gametypes{%
 initfen,%
 initplayer,%
 initmovenr,%
 initmoveid,%
 lastfen,%
 lastplayer,%
 lastmovenr,%
 lastmoveid,%
 nextplayer,%
 nextmovenr,%
 nextmoveid,%
 diagramlist,%
 gameid,%
 parentid%NEW records game id of parent if the game is a variation, the last move of the parent=initmoveid
 }

\newcommand\xskak@list@movetypes{%
 movenr,%
 player,%
 moveid,%
 pgnpiece,%
 piece,%
 piecechar,%
 castling,%
 longcastling,%
 capture,%
 check,%
 mate,%
 lostpiece,%
 lostpiecechar,%
 pgnlostpiece,%
 movefrom,%
 pgnmovefrom,%
 moveto,%
 move,%
 enpassant,%
 enpassantsquare,%
 promotion,%
 promotionpiece,%
 promotionpiecechar,%
 addpieces,%
 clearfields,%
 comments,%
 nextfen,%
 pastfen,%
 nag,%
 san,%
 lan,%
 opennr,%
 vars,% NEW, records game id of child variations
 varnum% NEW, records number of child variations
 }

%% setting pgn infos
\newcommand\xskaknewpgninfo[2][]{%#1 default value, #2 keyname
 \ifcsname UFCB@locfill@#2\endcsname
  \PackageError{xskak}%
      {(pgn) key #1 is already defined! Use another name}{}%
 \else
  \expandafter\newcommand\csname xskak@val@default#2\endcsname{#1}%
  \define@key[UFXS]{setpgn}{#2}[\csname xskak@val@default#2\endcsname]{%
   \expandafter\xdef\csname Xskak\xskak@val@gameid #2\endcsname{##1}}%
  \define@key[UFCB]{locfill}{#2}[]{}%
  \define@key[UFXS]{set}{default#2}{%
   \expandafter\xdef\csname xskak@val@default#2\endcsname{##1}}%
  \@ifundefined{xskak@list@setpgn}%
   {\gdef\xskak@list@setpgn{#2}}%
   {\g@addto@macro\xskak@list@setpgn{,#2}}%
    \g@addto@macro\xskak@list@gametypes{,#2}%
 \fi
 }%

\xskaknewpgninfo[*]{result}
\xskaknewpgninfo[]{site}
\xskaknewpgninfo[]{event}
\xskaknewpgninfo[]{date}
\xskaknewpgninfo[]{round}
\xskaknewpgninfo[]{white}
\xskaknewpgninfo[]{black}
\xskaknewpgninfo[]{blackelo}
\xskaknewpgninfo[]{whiteelo}

%%% From skak.sty
\providecommand\CheckTest{}
\providecommand\MateTest{}

%%% For the benefit of texmate
\AtBeginDocument{\providecommand\fenposition[1]{}}

%%% new booleans
\newboolean{xskakboolcastling}
\newboolean{xskakboollongcastling}
\newboolean{xskakboolenpassant}
\newboolean{xskakboolcapture}
\newboolean{xskakboolcheck}
\newboolean{xskakboolmate}
\newboolean{xskakboolpromotion}
\newboolean{xskakboolcomment}
\newboolean{xskakboolnag}
\newboolean{xskakboolvar}

%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%

%% Variables
\newcommand\xskakcomment[1]{{#1}}
\newcommand\xskakmovehyphen{\hbox{--\hspace{1pt}}} %or movehyphen from skak?
\newcommand*\xskakenpassanttext{\,e.p.}

%% set various variables like gameid and move
\newcommand\xskakset[1]{%
 \setkeys[UFXS]{set}{#1}}

%% getting the move data
\newcommand*\xskakget[1]{%
 \if\xskak@strequal{movenr}{#1}%
  \xskak@val@movenr
 \else
  \if\xskak@strequal{player}{#1}%
   \xskak@val@player
  \else
   \if\xskak@strequal{moveid}{#1}%
    \xskak@val@movenr\xskak@val@player
   \else
    \if\xskak@strequal{level}{#1}%
     \xskak@val@curlevel
    \else
     \ifcsname xskak@tag@\xskak@val@currenttag @#1\endcsname
       \csname xskak@tag@\xskak@val@currenttag @#1\endcsname
     \else
      \ifcsname Xskak.\xskak@val@gameid.\xskak@val@movenr.\xskak@val@player.#1\endcsname
       \csname Xskak.\xskak@val@gameid.\xskak@val@movenr.\xskak@val@player.#1\endcsname
      \else
       \PackageError{xskak}%
        {\csname Xskak.\xskak@val@gameid.\xskak@val@movenr.\xskak@val@player.#1\endcsname isn't defined}{}%
      \fi
     \fi
    \fi
   \fi
  \fi
 \fi}

%% getting game data
\newcommand*\xskakgetgame[1]{%
 \ifcsname Xskak\xskak@val@gameid#1\endcsname
  \csname Xskak\xskak@val@gameid#1\endcsname
 \else
  \PackageError{xskak}%
   {\csname Xskak\xskak@val@gameid#1\endcsname isn't defined}{}%
 \fi}

%% getting ref data -> do it through xskakget and xskakgetgame

%% starting a new game

\newcommand\newchessgame[1][]{%
  \setkeys*[UFXS]{new}{id,moveid}%
  \setkeys*[UFXS]{new}{#1}%
   \@for\xskak@temp@gametype:=\xskak@list@gametypes\do
   {\expandafter\xdef
      \csname Xskak\xskak@val@gameid\xskak@temp@gametype\endcsname{}}%
  \expandafter\xdef\csname Xskak\xskak@val@gameid gameid\endcsname{\xskak@val@gameid}%
  \toks@=\expandafter{\xskak@list@setpgn}%
  \edef\xskak@temp@command{%
  \noexpand\setkeys*[UFXS]{setpgn}{\the\toks@}}%
  \xskak@temp@command
  %\setkeys*[UFXS]{setpgn}{result}%
  \setkeys*[UFXS]{setpgn}{#1}%
  \chessboard[maxfield=h8,zero=false,print=false,
    setfen=\xskak@val@defaultfen,%
    #1,
    mover=\xskak@val@player,
    fullmove=\xskak@val@movenr,
    storefen=@tempgame]%
   \edef\temp{\csname chessgame.@tempgame\endcsname}%16.10.2008 for skak1.5
   \expandafter\fenboard\expandafter{\temp}%16.10.2008 for skak1.5
   \storegame{@tempgame}%16.10.2008 for skak1.5
   \restoregame{@tempgame}%16.10.2008 for skak1.5
   \edef\@tempa{\csname chessgame.@tempgame\endcsname}%
   \expandafter\fenposition\expandafter{\@tempa}% for texmate
   \expandafter\xdef
    \csname Xskak\xskak@val@gameid initfen\endcsname{\csname chessgame.@tempgame\endcsname}%
   \expandafter\xdef
    \csname Xskak\xskak@val@gameid lastfen\endcsname{\csname chessgame.@tempgame\endcsname}%
   \expandafter\xdef
    \csname Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.pastfen\endcsname
      {\csname chessgame.@tempgame\endcsname}%
   \expandafter\xdef
    \csname Xskak\xskak@val@gameid initplayer\endcsname{\WhiteToMove{w}{b}}%
   \expandafter\xdef
    \csname Xskak\xskak@val@gameid initmovenr\endcsname{\the\c@move}%
   \expandafter\xdef
    \csname Xskak\xskak@val@gameid initmoveid\endcsname{\the\c@move\WhiteToMove{w}{b}}%
   \xskak@do@getpreviousmoveid{\the\c@move}{\WhiteToMove{w}{b}}%
   \expandafter\xdef
    \csname Xskak\xskak@val@gameid lastplayer\endcsname{\WhiteToMove{b}{w}}%
   \expandafter\xdef
    \csname Xskak\xskak@val@gameid lastmovenr\endcsname{\xskak@temp@movenr}%
   \expandafter\xdef
    \csname Xskak\xskak@val@gameid lastmoveid\endcsname{\xskak@temp@movenr\WhiteToMove{b}{w}}%
   \expandafter\xdef
    \csname Xskak\xskak@val@gameid nextplayer\endcsname{\WhiteToMove{w}{b}}%
   \expandafter\xdef
    \csname Xskak\xskak@val@gameid nextmovenr\endcsname{\the\c@move}%
   \expandafter\xdef
    \csname Xskak\xskak@val@gameid nextmoveid\endcsname{\the\c@move\WhiteToMove{w}{b}}%
   \expandafter\xdef\csname %new 1.6. Initialization of nag
     Xskak.\xskak@val@gameid.%
     \csname Xskak\xskak@val@gameid lastmovenr\endcsname.%
     \csname Xskak\xskak@val@gameid lastplayer\endcsname.nag\endcsname{}}

%% continuing a game
\newcommand\resumechessgame[1][]{%
  \def\xskak@temp@player{%
   \csname Xskak\xskak@val@gameid nextplayer\endcsname}%
  \def\xskak@temp@movenr{%
   \csname Xskak\xskak@val@gameid nextmovenr\endcsname}%
  \setkeys*[UFXS]{res}{#1}%
  \xdef\xskak@val@player{\xskak@temp@player}%
  \xdef\xskak@val@movenr{\xskak@temp@movenr}%
  \ifthenelse
    {\xskak@test@lessorequal
        {\xskak@val@movenr}%
        {\xskak@val@player}%
        {\csname Xskak\xskak@val@gameid nextmovenr\endcsname}%
        {\csname Xskak\xskak@val@gameid nextplayer\endcsname}%
    }%
    {\chessboard[maxfield=h8,zero=false,print=false,
    #1,
    setfen=\xskakget{pastfen},
    mover=\xskak@val@player,
    fullmove=\xskak@val@movenr,
    storefen=@tempgame
    ]%
    \restoregame{@tempgame}%
   \edef\@tempa{\csname chessgame.@tempgame\endcsname}%
   \expandafter\fenposition\expandafter{\@tempa}% for texmate
   \xskak@do@getpreviousmoveid{\the\c@move}{\WhiteToMove{w}{b}}%
   \expandafter\xdef
    \csname Xskak\xskak@val@gameid lastplayer\endcsname{\WhiteToMove{b}{w}}%
   \expandafter\xdef
    \csname Xskak\xskak@val@gameid lastmovenr\endcsname{\xskak@temp@movenr}%
   \expandafter\xdef
    \csname Xskak\xskak@val@gameid lastmoveid\endcsname{\xskak@temp@movenr\WhiteToMove{b}{w}}%
   \expandafter\xdef
    \csname Xskak\xskak@val@gameid nextplayer\endcsname{\WhiteToMove{w}{b}}%
   \expandafter\xdef
    \csname Xskak\xskak@val@gameid nextmovenr\endcsname{\the\c@move}%
   \expandafter\xdef
    \csname Xskak\xskak@val@gameid nextmoveid\endcsname{\the\c@move\WhiteToMove{w}{b}}%
    }%
    {\PackageError{xskak}{Move "\xskak@val@movenr\xskak@val@player" is
     not in game \xskak@val@gameid}{}}}

%% export games
\newcommand\xskak@messages{}
\newcommand\xskakexportgames[1][]{%
 \begingroup
 \def\xskak@messages{}%
 \setkeys[UFXS]{export}{file=xskakgames,games=\xskak@val@defaultid,#1}%
  \immediate\openout\@unused=\xskak@val@exportfile
  \immediate\write\@unused{%
  \@percentchar This are games exported with xskak.sty^^J%
  \@percentchar The options were: #1 ^^J%
  \@percentchar \the\day.\the\month.\the\year}%
  \expandafter\xskak@do@sanitizelist\expandafter{\xskak@val@exportgames}%
  \@for\xskak@temp@game:=\xskak@temp@list\do
  {%
  \@ifundefined{Xskak\xskak@temp@game initfen}%
   {\expandafter\g@addto@macro\expandafter\xskak@messages\expandafter{\expandafter"\xskak@temp@game"\space}}%
   {\immediate\write\@unused{%
    \@percentchar ^^J%
    \@percentchar Start of game \xskak@temp@game ^^J%
    \@percentchar}%
    \@for\xskak@temp@gametype:=\xskak@list@gametypes\do
       {\toks@=\expandafter\expandafter\expandafter{\csname Xskak\xskak@temp@game\xskak@temp@gametype\endcsname}%
       \immediate\write\@unused{%
        \unexpanded{\expandafter\def\csname}Xskak%
             \xskak@temp@game\xskak@temp@gametype\noexpand\endcsname{\the\toks@}\noexpand\relax}%
       }%
    \expandafter\let\expandafter\xskak@temp@movenr
     \csname Xskak\xskak@temp@game initmovenr\endcsname
    \expandafter\let\expandafter\xskak@temp@player
     \csname Xskak\xskak@temp@game initplayer\endcsname
    \whiledo% loop through moves
      {\xskak@test@moveidingame{\xskak@temp@movenr}{\xskak@temp@player}{\xskak@temp@game}}%
      {\@for\xskak@temp@movetype:=\xskak@list@movetypes \do
       {\toks@=\expandafter\expandafter\expandafter{%
         \csname Xskak.\xskak@temp@game.\xskak@temp@movenr.\xskak@temp@player.\xskak@temp@movetype\endcsname}%
        \immediate\write\@unused{%
          \unexpanded{\expandafter\def\csname}Xskak.%
            \xskak@temp@game.\xskak@temp@movenr.\xskak@temp@player.\xskak@temp@movetype
             \noexpand\endcsname{\the\toks@}\noexpand\relax}%
       }%
       %% nextmove
       \xskak@do@getnextmoveid{\xskak@temp@movenr}{\xskak@temp@player}%
      }%
    \immediate\write\@unused{\unexpanded{\def\xskakcurrentgameid}{\xskak@temp@game}\noexpand\xskakendgamedata}%
  }}%
  %
  \immediate\closeout\@unused\relax
  \ifx\xskak@messages\@empty
   \else
  \PackageWarning{xskak}{games \xskak@messages\space didn't exist. I
    skipped them}{}%
  \fi
  \endgroup
  }%

\newcommand\xskakendgamedata{}
\newcommand\xskakcurrentgameid{}

%% looping through a game.
\newcommand\xskakloop[2][]{%
 %\show\xskakstart
 \gdef\xskak@val@loopstep{1}%
 \savekeys[UFXS]{loop}{\global{showlast}}%
 \setkeys[UFXS]{loop}{showlast=false,#1}% getting the id
 \xdef\xskak@val@movenr{%
  \csname Xskak\xskak@val@gameid initmovenr\endcsname}%
 \xdef\xskak@val@player{%
  \csname Xskak\xskak@val@gameid initplayer\endcsname}%
 \xdef\xskak@val@stopmovenr{%
  \csname Xskak\xskak@val@gameid lastmovenr\endcsname}%
 \xdef\xskak@val@stopplayer{%
  \csname Xskak\xskak@val@gameid lastplayer\endcsname}%
 \setkeys[UFXS]{loop}{#1}% getting the rest.
 %%
 \whiledo%
  {\xskak@test@lessorequal
     {\xskak@val@movenr}{\xskak@val@player}%
     {\xskak@val@stopmovenr}{\xskak@val@stopplayer}}%
  {% test if move in game:
   \ifthenelse%
    {\xskak@test@moveidingame{\xskak@val@movenr}{\xskak@val@player}{\xskak@val@gameid}}%
    {#2%
     \count@=\xskak@val@loopstep\relax
     \whiledo{\the\count@>0}%
      {\xskak@do@getnextmoveid{\xskak@val@movenr}{\xskak@val@player}%
       \advance\count@ by -1%
       \global\let\xskak@val@movenr\xskak@temp@movenr
       \global\let\xskak@val@player\xskak@temp@player}%
     }%
     {\PackageError{xskak}%
       {move {\xskak@val@movenr}{\xskak@val@player} is not in game
        \xskak@val@gameid}{}}}%
    \ifthenelse{\boolean{\XKV@UFXS@loop@showlast@value}}%
     {\ifthenelse
      {\equal{\xskak@val@movenr\xskak@val@player}{\xskak@val@stopmovenr\xskak@val@stopplayer}}%
      {}%stop already processed.
      {\let\xskak@val@movenr\xskak@val@stopmovenr
       \let\xskak@val@player\xskak@val@stopplayer
       #2}}%
      {}}
%%% test if a number/color combination is in the game:

\newtest\xskaktestmoveid[2]{%number, w or b
  \xskak@test@lessorequal
   {\csname Xskak\xskak@val@gameid initmovenr\endcsname}%
   {\csname Xskak\xskak@val@gameid initplayer\endcsname}%
   {#1}{#2}%
  \AND
  \xskak@test@lessorequal
   {#1}{#2}%
   {\csname Xskak\xskak@val@gameid lastmovenr\endcsname}%
   {\csname Xskak\xskak@val@gameid lastplayer\endcsname}}

\newtest\xskak@test@moveidingame[3]{%number, w or b, gameid
  \xskak@test@lessorequal
   {\csname Xskak#3initmovenr\endcsname}%
   {\csname Xskak#3initplayer\endcsname}%
   {#1}{#2}%
  \AND
  \xskak@test@lessorequal
   {#1}{#2}%
   {\csname Xskak#3lastmovenr\endcsname}%
   {\csname Xskak#3lastplayer\endcsname}}

%%%%%%%%%%%%%%%%%%
%% Helper commands
%%%%%%%%%%%%%%%%%%

%%% help command for testing

\newcommand\xskak@matetest{}
 \let\xskak@matetest\mate

%%% special fencalculate
%%% Use only inside dothemove to get the correct color and movenumber!}
%02.01.2015: Patching the promotionpieces in Rank 1 + 8
\def\xskak@specialfencalculate{%
 %\expandafter\show\csname Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.promotionpiece\endcsname
  \Fen@Rank{8}%%
  \Promotion{%
   \WhiteToMove{%
    \patchcmd{\temp@rank}
     {P}
     {\csname Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.promotionpiece\endcsname}
     {}
     {\show\MistMist}}{}%
   }{}%
   \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}%
  \Promotion{%
   \WhiteToMove{}
    {\patchcmd{\temp@rank}
     {p}
     {\csname Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.promotionpiece\endcsname}
     {}
     {\show\MistMist}}{}}{}%
   \edef\temp@board{\temp@board\temp@rank}%
  \edef\temp@board{\temp@board\space\WhiteToMove{b}{w}}%
  \edef\temp@board{\temp@board\space\PrintCastling\space\EnPassantSquare}%
  \edef\temp@board{\temp@board\space\arabic{halfmove}\space\the\count@}}

%%% Get the previous movenumber/color.
\newcommand\xskak@do@getpreviousmoveid[2]{%1. move number, 2. color
 \if#2w%
  \edef\xskak@temp@movenr{\the\numexpr #1-1\relax}%
  \def\xskak@temp@player{b}%
 \else
  \edef\xskak@temp@movenr{#1}%
  \def\xskak@temp@player{w}%
 \fi}

%%% Get the next movenumber/color.
\newcommand\xskak@do@getnextmoveid[2]{%1. move number, 2. color
 \if#2b\relax
  \edef\xskak@temp@movenr{\the\numexpr #1+1\relax}%
  \def\xskak@temp@player{w}%
 \else
  \edef\xskak@temp@movenr{#1}%
  \def\xskak@temp@player{b}%
 \fi}

%%% splits a move id like 10b or 8w:

\def\xskak@do@storeplayer#1\@nnil{\def\xskak@temp@player{#1}}

\def\xskak@split@moveid#1{\afterassignment\xskak@do@storeplayer\count@=#1\@nnil
                        \edef\xskak@temp@movenr{\the\count@}}

%%% tests
%% moveidA < = moveidB
\newtest\xskak@test@lessorequal[4]{%movenr/playerA movenr/playerB
 \(#1<#3\)%
 \OR
 \(#1=#3%
   \AND
   \(\equal{#2}{#4}%
     \OR
     \equal{#4}{b}%
   \)%
  \)}%

\newcommand\xskak@do@sanitizelist[1]{%
 \def\xskak@temp@list{}%
 \@for\xskak@temp@listentry:=#1\do
 {\edef\xskak@temp@cmd{%
   \noexpand\setkeys[UFXS]{inner}{stripspace=\xskak@temp@listentry}}%
  \xskak@temp@cmd
  \ifx\xskak@temp@list\@empty
   \expandafter\def\expandafter\xskak@temp@list\expandafter{\xskak@temp@output}%
  \else
   \expandafter\board@do@l@addto@macro\expandafter\xskak@temp@list\expandafter{\expandafter,\xskak@temp@output}%
  \fi}}

\define@key[UFXS]{inner}{stripspace}{\def\xskak@temp@output{#1}}

\def\xskak@strequal#1{\number\xskak@strequalstart{}{}#1\relax}
\def\xskak@strequalstart#1#2#3{\if#3\relax\xskak@strequalstop\fi
     \xskak@strequalstart{\if#3#1}{#2\fi}}
\def\xskak@strequalstop\fi\xskak@strequalstart#1#2#3{\fi#1#3\relax'#213 }

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%% Core: Store Move Informations
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%% move related informations
%%%%   <type>          <value>
%%%%   vars            list of game id of variations. Is set to empty by \xskak@do@dothemove. Can be
%%%%                   change by variation games to notify the "parent" about its "child"
%%%%   varnum          record the number of variations of the move. Set to 0 by \xskak@do@dothemove.
%%%%   pgnpiece        K,Q,R,B or N (independent from language). Is empty for Pawn and Castling moves
%%%%   piece           K,Q,R,B,N or P or k,q,r,b,n or p (for black). Is empty for Castling
%%%%   piecechar       K,Q,R,B,N or p. Is empty for Castling
%%%%   castling        sets the boolean xskakboolcastling, is true for short *and* long castling
%%%%   longcastling    sets the boolean xskakboollongcastling
%%%%   capture         sets the boolean xskakboolcapture
%%%%   check           sets the boolean xskakboolcheck
%%%%   mate            sets the boolean xskakboolmate
%%%%   lostpiece       In case of a capture move: K,Q,R,B,N or P or k,q,r,b,n or p(independent from language).
%%%%   lostpiecechar   In case of a capture move: K,Q,R,B,N or p, empty else
%%%%   pgnlostpiece    in case of a capture move: K,Q,R,B, or N (independent from language)
%%%%   movefrom        a field, in case of castling: field of king and rook (e.g. e1,h1)
%%%%   pgnmovefrom     the additional movefrom description in the pgn-notation for ambiguous
%%%%                   moves and pawn captures.
%%%%   moveto          a field, in case of castling empty
%%%%   move            movefrom-moveto, in case of castling two moves: e.g. e1-f1,h1-f1
%%%%   enpassant       sets the boolean xskakboolenpassant to true
%%%%                   if the current move is an ep, else to false
%%%%   enpassantsquare a field, after e.g. e4 the value is e3. Indicates if the next
%%%%                   pawn move can be a ep.
%%%%   promotion       sets the boolean xskakboolpromotion
%%%%   promotionpiece  Q,R,B,N or q,r,b,n (undependant from language) or empty
%%%%   promotionpiecechar Q,R,B,N (undependant from language) or empty
%%%%   addpieces       contains the (list of) piece(s) that should be put on the board
%%%%                   e.g. {kg8,rf8} in case of black short castling
%%%%   clearfields     the list of fields that should be emptied on board
%%%%   comments        contains the short comments after a move (!,? \withattack{} etc)
%%%%   nextfen             the fen position after the current move (halfmoves, castling are perhaps wrong)
%%%%   pastfen        the fen position *before* the current move (identical to the fen after the previous move)
%%%%   nag             larger comments after (between) move.
%%%%   san             standard algebraic notation of the move.
%%%%                   e.g. \textsymfigsymbol{R}a2, e\capturesymbol d5,
%%%%                   \castlingchar\castlinghyphen\castlingchar
%%%%   lan             long algebraic notation of the move.
%%%%   opennr          The number representation for an open move e.g. 2...
%%% Game related informations. Don't use @ or "." to simplify use by the user
%%%%   gameid         stores the gameid (for easier retrieving)
%%%%   initfen       The fen before the first move. Set by \newchessgame
%%%%   initplayer    w or b, The color of the next (first) player.
%%%%                  (must be identical to the color in the initfen).
%%%%                  Also set by \newchessgame
%%%%   initmovenr    The number of the first move (must be identical to the fullmove number in the initfen)
%%%%                  Also set by \newchessgame
%%%%   lastfen            The fen after the last move, set during parsing.
%%%%   lastplayer     The fen color of the last move, set during parsing
%%%%                  = color of the fen before the last move!
%%%%                  not identical to color in fen!
%%%%   lastmovenr     The number of the last move, set during parsing.
%%%%   lastmoveid     combination of lastmovenr+lastplayer
%%%%   nextplayer     The fen color of the player which should move next, set during parsing
%%%%                  = color of the fen
%%%%   nextmovenr     The number of the next move, identical to number in fen
%%%%   nextmoveid     combination of nextmovenr+nextmoveplayer
%%%%  diagramlist     A comma separated list of MovenrPlayer (e.g. 3b,20w). Records the moves with an $d or $D after the move

%% save the original skak definition
\let\xskak@oriDoTheMove\DoTheMove

%% define a new DoTheMove:
\def\xskak@do@dothemove#1{% move the piece from #1 to \MoveToFile\MoveToRank
  %%%%% Store the move and board informations, will be used to retrieve the pieces deleted
  \Fen@calculate
  \setkeys[UFCB]{locinit}{maxfield=h8,zero=false}%
  \setkeys[UFCB]{locfill}{setfen=\temp@board}%
  %\expandafter\show\csname board@val@f4r4@piecechar\endcsname
  %===========%
  %% vars + varnum
  \expandafter\xdef
     \csname Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.vars\endcsname{}%
  %\expandafter\show\csname Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.vars\endcsname
  \expandafter\xdef
     \csname Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.varnum\endcsname{0}%
  %\expandafter\show\csname Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.varnum\endcsname
  %===========%
  %% pgnpiece
  \expandafter\xdef
     \csname Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.pgnpiece\endcsname{%
     \EqStr{\PieceNameToMove}{Z}{}{\PieceNameToMove}}%
  %\expandafter\show\csname Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.pgnpiece\endcsname
  %===========%
  %% piece
  \edef\@tempa{\PieceNameToMove}%
  \expandafter\board@conv@chartolowerchar\@tempa
  \expandafter\xdef
     \csname Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.piece\endcsname{%
       \Castling%
         {}%
         {\EqStr{\PieceNameToMove}{Z}%
           {\WhiteToMove{P}{p}}%
           {\WhiteToMove%
             {\PieceNameToMove}%
             {\board@temp@char}}}}%
  %\expandafter\show\csname Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.piece\endcsname
  %===========%
  %% piecechar
  \expandafter\xdef
     \csname Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.piecechar\endcsname{%
       \Castling%
         {}%
         {\EqStr{\PieceNameToMove}{Z}%
           {p}%
           {\PieceNameToMove}}}%
  %\expandafter\show\csname Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.piecechar\endcsname
  %===========%
  %% lostpiece
  % the values for enpassant move are corrected in the enpassant commands!
  \expandafter\board@conv@filechartonumber\MoveToFile{cnt@board@file}%
  \def\@tempa{empty}%
  \expandafter\xdef
     \csname Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.lostpiece\endcsname{%
      \expandafter\ifx
          \csname board@val@f\the\c@cnt@board@file r\MoveToRank @piecechar\endcsname
          \@tempa
      \else
         \expandafter\ifx
            \csname board@val@f\the\c@cnt@board@file r\MoveToRank @piecechar\endcsname
            \relax
         \else
            \csname board@val@f\the\c@cnt@board@file r\MoveToRank @piecechar\endcsname
         \fi
      \fi}%
  %===========%
  %% pgnlostpiece
  \def\board@temp@char{P}%
  \edef\@tempa{\csname Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.lostpiece\endcsname}%
  \expandafter\if
     \csname Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.lostpiece\endcsname\@empty
  \else
     \expandafter\board@conv@chartoupperchar\@tempa%
  \fi
  \expandafter\xdef
     \csname Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.pgnlostpiece\endcsname{%
       \if\board@temp@char P%
       \else
       \board@temp@char
       \fi}%
  %\expandafter\show\csname Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.pgnlostpiece\endcsname
  %===========%
  %% Opennr
  %%
  \expandafter\xdef
     \csname Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.opennr\endcsname{%
      \the\c@move\WhiteToMove
        {\noexpand\whiteopen\noexpand\beforewhite}%
        {\noexpand\blackopen\noexpand\beforeblack}}%
  %\expandafter\show\csname Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.opennr\endcsname
  %===========%
  %% MoveFrom-field
  %% expanded to set also castling from fields e.g. e1,h1 for short white castling
  \expandafter\xdef
     \csname Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.movefrom\endcsname{%
      \Castling
        {\LongCastling%
         {\WhiteToMove{e1,a1}{e8,a8}}%
         {\WhiteToMove{e1,h1}{e8,h8}}}%
        {#1}}%
  %\expandafter\show\csname Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.movefrom\endcsname
  %===========%
  %% pgnmovefrom
  \expandafter\xdef
   \csname Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.pgnmovefrom\endcsname{%
    \EqStr{\FileDiscriminator}{Z}%
     {}{\FileDiscriminator}%
    \EqStr{\RankDiscriminator}{Z}%
     {}{\RankDiscriminator}%
     }%
  %\expandafter\show\csname Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.pgnmovefrom\endcsname
  %===========%
  %% MoveTo-field
  %% added castling test: White O-O -> g1,f1
  \expandafter\xdef
     \csname Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.moveto\endcsname{%
       \Castling
        {\LongCastling
         {\WhiteToMove{c1,d1}{c8,d8}}%
         {\WhiteToMove{g1,f1}{g8,f8}}}%
        {\MoveToFile\MoveToRank}}%
  %\expandafter\show\csname Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.moveto\endcsname
  %===========%
  %% Move
  %% two moves for castling
  \expandafter\xdef
     \csname Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.move\endcsname{%
      \Castling
        {\LongCastling%
         {\WhiteToMove{e1-c1,a1-d1}{e8-c8,a8-d8}}%
         {\WhiteToMove{e1-g1,h1-f1}{e8-g8,h8-f8}}}%
        {\csname Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.movefrom\endcsname
         -\csname Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.moveto\endcsname}}%
  %\expandafter\show\csname Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.move\endcsname
  %===========%
  %% Castling
  % new naming
  \expandafter\xdef
     \csname Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.castling\endcsname{%
        \Castling{\noexpand\setboolean{xskakboolcastling}{true}}%
                 {\noexpand\setboolean{xskakboolcastling}{false}}}%
  %\expandafter\show\csname Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.castling\endcsname
  %===========%
  %% Longcastling
  % new naming
  \expandafter\xdef
     \csname Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.longcastling\endcsname{%
        \LongCastling{\noexpand\setboolean{xskakboollongcastling}{true}}%
                     {\noexpand\setboolean{xskakboollongcastling}{false}}}%
  %\expandafter\show\csname Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.longcastling\endcsname
  %% Capture
  %% new naming, changed to boolean!
  \expandafter\xdef
     \csname Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.capture\endcsname{%
       \Capture{\noexpand\setboolean{xskakboolcapture}{true}}%
               {\noexpand\setboolean{xskakboolcapture}{false}}}%
  %===========%
  %% Check?
  %%new naming, changed to boolean
  \expandafter\xdef
     \csname Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.check\endcsname{%
        \ifx\CheckTest\@empty
          \noexpand\setboolean{xskakboolcheck}{false}%
        \else
          \noexpand\setboolean{xskakboolcheck}{true}%
        \fi}%
  %\expandafter\show\csname Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.check\endcsname
  %===========%
  %% Mate?
  %%new naming, changed to boolean
  \expandafter\xdef
     \csname Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.mate\endcsname{%
        \ifx\MateTest\xskak@matetest\relax
           \noexpand\setboolean{xskakboolmate}{true}%
        \else
           \noexpand\setboolean{xskakboolmate}{false}%
         \fi}%
  %\expandafter\show\csname Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.mate\endcsname
  %===========%
  %% Enpassantsquare
  %%new naming
  \expandafter\xdef
     \csname Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.enpassantsquare\endcsname
        {\EnPassantSquare}%
  %\expandafter\show\csname Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.enpassantsquare\endcsname
  %===========%
  %% Enpassantcheck
  %% new naming, changed to boolean
  \begingroup
    \WhiteToMove%
     {\ifthenelse%
      {\equal{\csname Xskak.\xskak@val@gameid.\the\c@move.w.piecechar\endcsname}{p}}
      {% pawn move:
        \ifthenelse%white enpassant
         {\equal
          {\csname Xskak.\xskak@val@gameid.\the\c@move.w.moveto\endcsname}%
          {\csname Xskak.\xskak@val@gameid.\the\numexpr\the\c@move-1\relax.b.enpassantsquare\endcsname}}%
         {\expandafter\xdef
            \csname Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.enpassant\endcsname
               {\noexpand\setboolean{xskakboolenpassant}{true}}%
          \expandafter\xdef
            \csname Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.lostpiece\endcsname{p}}%
         {\expandafter\xdef
            \csname Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.enpassant\endcsname
              {\noexpand\setboolean{xskakboolenpassant}{false}}}}%
        {\expandafter\xdef
            \csname Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.enpassant\endcsname
              {\noexpand\setboolean{xskakboolenpassant}{false}}}%
         }%
     {\ifthenelse
      {\equal{\csname Xskak.\xskak@val@gameid.\the\c@move.b.moveto\endcsname}{p}}
      {%pawn move:
       \ifthenelse%black enpassant
         {\equal
          {\csname Xskak.\xskak@val@gameid.\the\c@move.b.moveto\endcsname}%
          {\csname Xskak.\xskak@val@gameid.\the\c@move.w.enpassantsquare\endcsname}}%
         {\expandafter\xdef
            \csname Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.enpassant\endcsname
              {\noexpand\setboolean{xskakboolenpassant}{true}}%
          \expandafter\xdef
            \csname Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.lostpiece\endcsname{P}}%
         {\expandafter\xdef
            \csname Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.enpassant\endcsname
                 {\noexpand\setboolean{xskakboolenpassant}{false}}}}%
         {\expandafter\xdef
            \csname Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.enpassant\endcsname
              {\noexpand\setboolean{xskakboolenpassant}{false}}}}%
         %
           \endgroup
  %\expandafter\show\csname Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.enpassant\endcsname
  %\expandafter\show\csname Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.lostpiece\endcsname
  %===========%
  %% lostpiecechar
  \edef\@tempa{\csname Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.lostpiece\endcsname}%
  \expandafter\xdef
     \csname Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.lostpiecechar\endcsname{%
      \if\@tempa P%
        p%
      \else
       \if\@tempa p%
        p%
       \else
        \csname Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.pgnlostpiece\endcsname
       \fi
      \fi}%
  %\expandafter\show\csname Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.lostpiecechar\endcsname
  %===========%
  %% Promotion
  %%new naming, added boolean
  \expandafter\xdef
     \csname Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.promotionpiecechar\endcsname{%
        \Promotion{\PromotionPieceName}{}}%
  \edef\@tempa{\PromotionPieceName}%
  \if\@tempa\@empty\else
   \WhiteToMove{\let\board@temp@char\@tempa}{\expandafter\board@conv@chartolowerchar\@tempa}%
  \fi
  \expandafter\xdef
     \csname Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.promotionpiece\endcsname{%
        \Promotion{\board@temp@char}{}}%
  \expandafter\xdef
     \csname Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.promotion\endcsname{%
        \Promotion%
          {\noexpand\setboolean{xskakboolpromotion}{true}}%
          {\noexpand\setboolean{xskakboolpromotion}{false}}}%
  %\expandafter\show\csname Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.promotion\endcsname
  %\expandafter\show\csname Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.promotionpiece\endcsname
  %\expandafter\show\csname Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.promotionpiecechar\endcsname
  %=============%
  %% san
  \csname Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.check\endcsname
  \csname Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.mate\endcsname
  \csname Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.enpassant\endcsname
  \csname Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.promotion\endcsname
  \expandafter\protected@xdef
   \csname Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.san\endcsname{%
    \Castling
     {\LongCastling
      {\unexpanded{\castlingchar\castlinghyphen\castlingchar\castlinghyphen\castlingchar}}%
      {\unexpanded{\castlingchar\castlinghyphen\castlingchar}}}%
     {\if\csname Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.piecechar\endcsname p\else
      \noexpand\textsymfigsymbol{\csname Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.piecechar\endcsname}%
      \fi
      \csname Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.pgnmovefrom\endcsname
      \Capture{\noexpand\capturesymbol}{}%
      \csname Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.moveto\endcsname
      \ifxskakboolpromotion
      \noexpand\textsymfigsymbol{\csname Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.promotionpiecechar\endcsname}%
      \fi
      \ifxskakboolenpassant
      \noexpand\xskakenpassanttext
      \fi}%move from below 2008-10-10
      \ifxskakboolcheck
      \noexpand\checksymbol
      \fi
      \ifxskakboolmate
      \noexpand\mate
      \fi
      }%
  %\expandafter\show\csname Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.san\endcsname
  %=============%
  %% lan
  \csname Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.check\endcsname
  \csname Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.mate\endcsname
  \csname Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.enpassant\endcsname
  \csname Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.promotion\endcsname
  \expandafter\protected@xdef
   \csname Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.lan\endcsname{%
    \Castling
     {\LongCastling
      {\unexpanded{\castlingchar\castlinghyphen\castlingchar\castlinghyphen\castlingchar}}%
      {\unexpanded{\castlingchar\castlinghyphen\castlingchar}}}%
     {\if\csname Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.piecechar\endcsname p\else
      \noexpand\textsymfigsymbol{\csname Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.piecechar\endcsname}%
      \fi
      \csname Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.movefrom\endcsname
      \Capture{\noexpand\capturesymbol}{\noexpand\xskakmovehyphen}%
      \csname Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.moveto\endcsname
      \ifxskakboolpromotion
      \noexpand\textsymfigsymbol{\csname Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.promotionpiecechar\endcsname}%
      \fi
      \ifxskakboolenpassant
      \noexpand\xskakenpassanttext
      \fi}%move from below 2008-10-10
      \ifxskakboolcheck
      \noexpand\checksymbol
      \fi
      \ifxskakboolmate
      \noexpand\mate
      \fi
      }%
  %\expandafter\show\csname Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.lan\endcsname
  %===========%
  %% addpieces
  \expandafter\xdef
     \csname Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.addpieces\endcsname{%
       \Castling%
         {\LongCastling%
           {\WhiteToMove{Kc1,Re1}{kc8,re8}}%
           {\WhiteToMove{Kg1,Rf1}{kg8,rf8}}}%
         {\Promotion%
           {\PromotionPieceName\MoveToFile\MoveToRank}%
           {\csname Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.piece\endcsname
            \MoveToFile\MoveToRank}%
          }}%
  %\expandafter\show\csname Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.addpieces\endcsname
  %===========%
  %% clearfields
  \csname Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.enpassant\endcsname
  \expandafter\xdef
     \csname Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.clearfields\endcsname{%
       \Castling%
         {\LongCastling%
           {e\WhiteToMove{1}{8},a\WhiteToMove{1}{8}}%
           {e\WhiteToMove{1}{8},h\WhiteToMove{1}{8}}}%
         {\ifxskakboolenpassant%
             \WhiteToMove
              {\csname Xskak.\xskak@val@gameid.\the\numexpr\the\c@move-1\relax.b.moveto\endcsname,#1}%
              {\csname Xskak.\xskak@val@gameid.\the\c@move.w.moveto\endcsname,#1}%
           \else
               #1%
           \fi}}%
  %\expandafter\show\csname Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.clearfields\endcsname
  %============%
  %% comments
  \toks@=\expandafter{\MoveRest}%
  \expandafter\xdef
     \csname Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.comments\endcsname{%
        \the\toks@}%
  %\expandafter\show\csname Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.comments\endcsname
  %============%
  %% lastplayer, nextplayer, lastmovenr, nextmovenr
  \expandafter\xdef
    \csname Xskak\xskak@val@gameid lastplayer\endcsname{\WhiteToMove{w}{b}}%
  \expandafter\xdef
    \csname Xskak\xskak@val@gameid nextplayer\endcsname{\WhiteToMove{b}{w}}%
   \expandafter\xdef
    \csname Xskak\xskak@val@gameid lastmovenr\endcsname{\the\c@move}%
   \expandafter\xdef
    \csname Xskak\xskak@val@gameid lastmoveid\endcsname{\the\c@move\WhiteToMove{w}{b}}%
   \WhiteToMove{%
    \expandafter\xdef
     \csname Xskak\xskak@val@gameid nextmovenr\endcsname{\the\c@move}%
    \expandafter\xdef
     \csname Xskak\xskak@val@gameid nextmoveid\endcsname{\the\c@move b}}%
    {\expandafter\xdef
      \csname Xskak\xskak@val@gameid nextmovenr\endcsname{\the\numexpr\the\c@move+1\relax}%
     \expandafter\xdef
      \csname Xskak\xskak@val@gameid nextmoveid\endcsname{\the\numexpr\the\c@move+1\relax w}}%
   %=============%
   % Initialization of the nag-commands (are filled later by \Mainline)%
   \expandafter\xdef\csname
     Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.nag\endcsname{}%
  \edef\oldpiece{\Get{\MoveToFile\MoveToRank}}%
  \Set{\MoveTo}{\Get{#1}}\Set{#1}{E}%
  \gdef\MoveFrom{#1}%
  %===========%
  %%fen position _after_ the move
  \count@=\value{move}%
  \WhiteToMove{}{\advance\count@ by 1\relax}%
  \xskak@specialfencalculate
  \expandafter\global\expandafter\let
   \csname Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.nextfen\endcsname\temp@board
  \xskak@do@getnextmoveid{\the\c@move}{\WhiteToMove{w}{b}}%
  %% fen before next move
  \expandafter\xdef
    \csname
     Xskak.\xskak@val@gameid.\xskak@temp@movenr.\xskak@temp@player.pastfen\endcsname{\temp@board}%
  %% current last fen of game
  \expandafter\xdef
     \csname
     Xskak\xskak@val@gameid lastfen\endcsname{\temp@board}%
  %\expandafter\show\csname Xskak.\xskak@val@gameid.\the\c@move.\WhiteToMove{w}{b}.nextfen\endcsname
}

%% overwrite the original skak definition:
\let\DoTheMove\xskak@do@dothemove

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% enabling parsing of comments
%%% comments a NAG ($<number>) or text in \xskakcomment{...}
%%% NAG and comments must have spaces between them!

%% tests is the argument is a NAG
\def\xskak@test@nag#1#2XX{%
       \ifthenelse{\equal{#1}{$}}%
         {\setboolean{xskakboolnag}{true}}{\setboolean{xskakboolnag}{false}}}

%% tests if the argument is \xskakcomment{...}
\def\xskak@test@comment#1=\xskakcomment#2=={%
       \def\@tempa{#1}%
       \ifx\@tempa\empty%#1 beginnt mit \xskakcomment
        \setboolean{xskakboolcomment}{true}%
       \else
        \setboolean{xskakboolcomment}{false}%
       \fi}

%% saving old version of \Mainline:
\let\xskak@oriMainline\Mainline

%% define a new own Mainline command
\def\xskak@do@parsemainline(#1 #2){%
 \let\xskak@save@nag\gdef
 \ifxskakboolnag
  \let\xskak@save@nag\g@addto@macro
 \fi
 \ifxskakboolcomment
  \let\xskak@save@nag\g@addto@macro
 \fi
 \xskak@test@comment=#1=\xskakcomment==%
 \ifxskakboolcomment
  \ExecuteMoves{% mainline
   \WhiteToMove
     {\expandafter\xskak@save@nag
       \csname Xskak.\xskak@val@gameid.\the\numexpr\the\c@move-1\relax.b.nag\endcsname
       {{\xskak@beforecomment{#1}}}%
     %\expandafter\show\csname Xskak.\xskak@val@gameid.\the\numexpr\the\c@move-1\relax.b.nag\endcsname
     }%
     {%
      \expandafter\xskak@save@nag
       \csname Xskak.\xskak@val@gameid.\the\c@move.w.nag\endcsname
       {{\xskak@beforecomment{#1}}}%
     %\expandafter\show\csname Xskak.\xskak@val@gameid.\the\c@move.w.nag\endcsname
     }}%
     {}%variation
  \PrintMoves{{\xskak@beforecomment{#1}}}{}%
  \xskak@do@parsemainline(#2)%
 \else
 \xskak@test@nag#1YXX%
 \ifthenelse%
  {\boolean{xskakboolnag}}%
  {\ExecuteMoves{% mainline%
   \WhiteToMove
     {\ifthenelse{\equal{#1}{$D} \OR \equal{#1}{$d}}%
        {\expandafter\ifx
          \csname Xskak\xskak@val@gameid diagramlist\endcsname\@empty
          \expandafter\xdef
             \csname Xskak\xskak@val@gameid diagramlist\endcsname
           {\the\numexpr\the\c@move-1\relax b}%
         \else
          \toks@=\expandafter\expandafter\expandafter{%
           \csname Xskak\xskak@val@gameid diagramlist\endcsname}%
          \expandafter\xdef
           \csname Xskak\xskak@val@gameid diagramlist\endcsname
           {\the\toks@,\the\numexpr\the\c@move-1\relax b}%
          \fi
        }%
        {\expandafter\xskak@save@nag
          \csname Xskak.\xskak@val@gameid.\the\numexpr\the\c@move-1\relax.b.nag\endcsname
          {{\xskak@beforeNAG{\csname#1\endcsname}}}}%
     %\expandafter\show\csname Xskak.\xskak@val@gameid.\the\numexpr\the\c@move-1\relax.b.nag\endcsname
     }%
     {\ifthenelse{\equal{#1}{$D} \OR \equal{#1}{$d}}%
        {\expandafter\ifx
          \csname Xskak\xskak@val@gameid diagramlist\endcsname\@empty
          \expandafter\xdef
             \csname Xskak\xskak@val@gameid diagramlist\endcsname
           {\the\c@move w}%
         \else
          \toks@=\expandafter\expandafter\expandafter{%
           \csname Xskak\xskak@val@gameid diagramlist\endcsname}%
          \expandafter\xdef
           \csname Xskak\xskak@val@gameid diagramlist\endcsname
           {\the\toks@,\the\c@move w}%
          \fi
        }%
        {\expandafter\xskak@save@nag
          \csname Xskak.\xskak@val@gameid.\the\c@move.w.nag\endcsname
          {{\xskak@beforeNAG{\csname#1\endcsname}}}}%
     %\expandafter\show\csname Xskak.\xskak@val@gameid.\the\c@move.w.nag\endcsname
     }}%
   {}%variation
   \PrintMoves{{\xskak@beforeNAG{\csname#1\endcsname}}}{}%
    \xskak@do@parsemainline(#2)}%
  {\EqStr{ }{#1}%
    {\xskak@do@parsemainline(#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}%
        \xskak@do@parsemainline(#2)}%
       {\Fen@calculate% 16.10.2008 skak1.5
        \expandafter\xdef\csname chessgame.skak.temp.previous\endcsname{\temp@board}%16.10.2008 skak1.5
       \MakeMoveMainline{#1}%
        \xskak@do@parsemainline(#2)}}}}%
    \fi}

%% overwrite the skak version:
%% currently needed as \runmoves use \Mainline
\let\Mainline\xskak@do@parsemainline

%% Printing
%%% Styles

%% helper command. Copies the commands around
\newcommand\xskak@do@copystyleitem[2]{% #1<type> to #2<type>
 %use empty #2 to copy to the skak original commands
 %use empty #1 to copy from the original skak commands
 %use xskak@styleitem@<name>@ to copy a named style item
 \ifcsname #1beforeblack\endcsname
  \expandafter\global\expandafter\let
     \csname #2whiteopen\expandafter\endcsname
     \csname #1whiteopen\endcsname
  \expandafter\global\expandafter\let
     \csname #2blackopen\expandafter\endcsname
     \csname #1blackopen\endcsname
  \expandafter\global\expandafter\let
     \csname #2beforewhite\expandafter\endcsname
     \csname #1beforewhite\endcsname
  \expandafter\global\expandafter\let
     \csname #2beforeblack\expandafter\endcsname
     \csname #1beforeblack\endcsname
  \expandafter\global\expandafter\let
     \csname #2afterwhite\expandafter\endcsname
     \csname #1afterwhite\endcsname
  \expandafter\global\expandafter\let
     \csname #2afterblack\expandafter\endcsname
     \csname #1afterblack\endcsname
  \expandafter\global\expandafter\let
     \csname #2beforenumber\expandafter\endcsname
     \csname #1beforenumber\endcsname
  \expandafter\global\expandafter\let
     \csname #2opencommands\expandafter\endcsname
     \csname #1opencommands\endcsname
  \expandafter\global\expandafter\let
     \csname #2closecommands\expandafter\endcsname
     \csname #1closecommands\endcsname
  %% two specific xskak command for the comments:
  \expandafter\global\expandafter\let
     \csname #2xskak@beforecomment\expandafter\endcsname
     \csname #1xskak@beforecomment\endcsname
  \expandafter\global\expandafter\let
     \csname #2xskak@beforeNAG\expandafter\endcsname
     \csname #1xskak@beforeNAG\endcsname
 \else
  \PackageError{xskak}{style template #1 doesn't exist!}{}%
 \fi}

%% new style items
 \def\xskak@temp@name{xskak@styleitem@@empty@}%
 \setkeys[UFXS]{styleitem}{%
   opencommands={},
   beforenumber={},
   whiteopen={},
   blackopen={},
   beforewhite={},
   afterwhite={},
   beforeblack={},
   afterblack={},
   closecommands={},
   beforecomment={},
   beforeNAG={}}

\newcommand\xskak@beforeNAG{}
\newcommand\xskak@beforecomment{}

\newcommand\xskaknewstyleitem[2][]{%
 \ifcsname xskak@styleitem@#2@beforeblack\endcsname
  \PackageWarning{xskak}{Style item #2 already exists.
                         I overwrite  it!}{}%
 \fi
 \def\xskak@temp@name{xskak@styleitem@#2@}%
 \setkeys*[UFXS]{styleiteminit}{%
  template=@empty, %empty everything
  #1}%             %use a possible template.
 \setrmkeys[UFXS]{styleitem}}

%%% styles



\newcommand*\xskak@do@splitlevel[1]{%
     \def\xskak@temp@levelprefix{#1}%
     \def\xskak@temp@levelpostfix{}%
     \def\xskak@temp@levelnumber{0}}

\ifxskakpdfmatch
   \renewcommand*\xskak@do@splitlevel[1]{%
    \ifnum\pdfmatch {([^0-9]*)([0-9]+)(.*)}{#1}=1 %
     \edef\xskak@temp@levelprefix{\expandafter\strip@prefix\pdflastmatch1}%
     \edef\xskak@temp@levelpostfix{\expandafter\strip@prefix\pdflastmatch3}%
     \edef\xskak@temp@levelnumber{\expandafter\strip@prefix\pdflastmatch2}%
    \else
     \edef\xskak@temp@levelprefix{#1}%
     \edef\xskak@temp@levelpostfix{}%
     \edef\xskak@temp@levelnumber{0}%
    \fi}%
\fi

\newcommand\xskaknewstyle[2][]{%
 \begingroup
 \def\xskak@temp@name{xskak@style@#2@}%
 \ifcsname\xskak@temp@name 1@item\endcsname
  \PackageError{xskak}{style #2 already exists}{}%
 \else
  \setkeys[UFXS]{style}{level=1,styleitem=@empty,#1}%
 \fi
 \endgroup
}

\newcommand\xskakaddtostyle[2][]{%
 \def\xskak@temp@name{xskak@style@#2@}%
 \ifcsname\xskak@temp@name 1@item\endcsname
  \setkeys[UFXS]{style}{#1}%
 \else
  \PackageError{xskak}{style #2 doesn't exist}{}%
 \fi
}

%% using and setting styles:
\newcommand\xskak@use@varstyle[1]{%
  \ifcsname xskak@style@\xskak@val@stylename @#1@item\endcsname
   %use xskak@styleitem@<name>@ to copy a named style item
   \edef\@tempa{%
      xskak@styleitem@%
      \csname xskak@style@\xskak@val@stylename @#1@item\endcsname%=<name>
       @}%
   \xskak@do@copystyleitem{%
   \@tempa}{}%
  \else
    \ifxskakpdfmatch
     \xskak@do@splitlevel{#1}%
     \ifnum\xskak@temp@levelnumber>0\relax
        \ifnum\xskak@temp@levelnumber=1\relax
          \xskak@use@varstyle{1}%
        \else
          \xskak@use@varstyle{%
             \xskak@temp@levelprefix
             \the\numexpr\xskak@temp@levelnumber-1\relax
             \xskak@temp@levelpostfix}%
        \fi
     \else
      \PackageError{xskak}{Unknown level #1}{}%
     \fi
    \else
       \ifnum#1=1\relax
          \xskak@use@varstyle{1}%
        \else
          \xskak@use@varstyle{%
             \the\numexpr#1-1\relax}%
        \fi
    \fi
  \fi
}

%% default styles A,B,C,@empty

\xskaknewstyleitem[%
 whiteopen=\space,
 blackopen=\ldots,
 afterwhite=\space,
 afterblack=\space]{styleB}

\xskaknewstyleitem[%
 whiteopen=.,
 blackopen=. -,
 beforewhite=\space,
 afterblack=\space,
 beforeblack={,\space}]{styleA}

\xskaknewstyleitem[%
 opencommands={\begin{tabbing}%
    \hspace{.2\linewidth}\=\hspace{.2\linewidth}\=%
    \hspace{.2\linewidth}\= \kill},
 closecommands={\end{tabbing}},
 blackopen=\>\ldots,
 beforenumber=\>,
 beforewhite=\>,
 beforeblack=\>,
 afterblack=\\]{styleC}

\xskaknewstyleitem[%
 whiteopen={.\,},
 blackopen={\ldots\,},
 afterwhite={\ },
 afterblack={\ }]{UF}

\xskaknewstyleitem[%
 opencommands =\begingroup\normalcolor\ttfamily\textbackslash opencommands\endgroup\ ,
 closecommands=\begingroup\normalcolor\ttfamily\textbackslash closecommands\endgroup\ ,
 whiteopen    =\begingroup\normalcolor\ttfamily\textbackslash whiteopen\endgroup\ ,
 blackopen    =\begingroup\normalcolor\ttfamily\textbackslash blackopen\endgroup\ ,
 beforenumber =\begingroup\normalcolor\ttfamily\textbackslash beforenumber\endgroup\ ,
 beforewhite  =\begingroup\normalcolor\ttfamily\textbackslash beforewhite\endgroup\ ,
 afterwhite   =\begingroup\normalcolor\ttfamily\textbackslash afterwhite\endgroup\ ,
 beforeblack  =\begingroup\normalcolor\ttfamily\textbackslash beforeblack\endgroup\ ,
 afterblack   =\begingroup\normalcolor\ttfamily\textbackslash afterblack\endgroup\ ,
 beforecomment=\begingroup\normalcolor\ttfamily\textbackslash beforecomment\endgroup\ ,
 beforeNAG=\color{green}\begingroup\normalcolor\ttfamily\textbackslash beforeNAG\endgroup\ ,
 ]{showcommands}

\xskaknewstyle[level= 1,styleitem=styleB,font=\bfseries,
               level= 3,font=\itshape]{styleB}

\xskaknewstyle[level= 1,styleitem=styleA,font=\bfseries,
               level= 3,font=\itshape]{styleA}

\xskaknewstyle[level= 1,styleitem=styleC,font=\bfseries,
               level= 2,styleitem=styleB,
               level= 3,font=\itshape]{styleC}

\xskaknewstyle[level= 1,styleitem=@empty,font=\bfseries]{@empty}

\xskaknewstyle[level= 1,styleitem=UF,font=\bfseries,
               level= 3,font=\itshape]{UF}

\xskaknewstyle[level= 1,styleitem=showcommands,font=\begingroup\ttfamily\textbackslash mainlinestyle\endgroup\ ,
               level= 2,font=\begingroup\ttfamily\textbackslash variationstyle\endgroup\ ]{test}

%% default level and style
\xskakset{style=styleB,level=1}

%%%%%%%%%%%%%%%%%%%%%
\gdef\xskak@do@printmove{\xskakget{san}}

\newcommand\printchessgame[1][]{%
 \setkeys*[UFXS]{print}{#1}%set style and level
 \leavevmode%UF 2012-09-10 to allow wrapping around wrapfigure
 \begingroup
 \setkeys*[UFXS]{xprint}{#1}%% getting the id
 \xdef\xskak@val@movenr{%
  \csname Xskak\xskak@val@gameid initmovenr\endcsname}%
 \xdef\xskak@val@player{%
  \csname Xskak\xskak@val@gameid initplayer\endcsname}%
 \xdef\xskak@val@stopmovenr{%
  \csname Xskak\xskak@val@gameid lastmovenr\endcsname}%
 \xdef\xskak@val@stopplayer{%
  \csname Xskak\xskak@val@gameid lastplayer\endcsname}%
 \setkeys*[UFXS]{xprint}{#1}%% using the rest of the keys
  \ifthenelse%
    {\xskak@test@moveidingame{\xskak@val@movenr}{\xskak@val@player}{\xskak@val@gameid}}%
    {}%
    {\PackageWarning{xskak}{init move
      \xskak@val@movenr\xskak@val@player\space
       is not in the game.%
     \MessageBreak The first move is used instead.}{}%
     \xdef\xskak@val@movenr{%
      \csname Xskak\xskak@val@gameid initmovenr\endcsname}%
     \xdef\xskak@val@player{%
      \csname Xskak\xskak@val@gameid initplayer\endcsname}}%
  %%
  \ifthenelse%
    {\xskak@test@moveidingame{\xskak@val@stopmovenr}{\xskak@val@stopplayer}{\xskak@val@gameid}}%
    {}%
    {\PackageWarning{xskak}{stop move
      \xskak@val@stopmovenr\xskak@val@stopplayer\space
      is not in the game.\MessageBreak The last move is used instead.}{}%
     \xdef\xskak@val@stopmovenr{%
       \csname Xskak\xskak@val@gameid lastmovenr\endcsname}%
     \xdef\xskak@val@stopplayer{%
       \csname Xskak\xskak@val@gameid lastplayer\endcsname}}%
  %%
  \ifthenelse%
   {\xskak@test@lessorequal
     {\xskak@val@movenr}{\xskak@val@player}%
     {\xskak@val@stopmovenr}{\xskak@val@stopplayer}}%
   %at least one move to print:
   {\mainlinestyle
    \opencommands
    %% handle the first move
    \ifthenelse{\equal{\xskak@val@player}{w}}%
     %first move is a white move. Will be handled in the loop
     {\beforenumber
      \xskak@val@movenr
      \whiteopen
      \beforewhite
      \xskak@do@printmove%
      \xdef\xskak@val@player{b}}%
     %first move is a black one:
     {\beforenumber
      \xskak@val@movenr
      \blackopen
      \beforeblack
      \xskak@do@printmove
  %    \afterblack
      \xdef\xskak@val@movenr{\the\numexpr\xskak@val@movenr +1\relax}%
      \xdef\xskak@val@player{w}}%
    %% loop through the res
    \whiledo
     {\xskak@test@lessorequal
       {\xskak@val@movenr}{\xskak@val@player}%
       {\xskak@val@stopmovenr}{\xskak@val@stopplayer}}%
     {\ifthenelse
       {\equal{\xskak@val@player}{w}}%
       {\afterblack
        \beforenumber
        \xskak@val@movenr
        \whiteopen
        \beforewhite
        \xskak@do@printmove
        }
       {\afterwhite
        \beforeblack
        \xskak@do@printmove
        %\afterblack
        }%
      \xskak@do@getnextmoveid{\xskak@val@movenr}{\xskak@val@player}%
       \global\let\xskak@val@movenr\xskak@temp@movenr
       \global\let\xskak@val@player\xskak@temp@player}%
      \closecommands
    }%
  {}% no move
 \endgroup
 }

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%% Corrections/changes of skak commands %%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%% changed \mainline and \variation for style/level handling
%%% (added optional argument)

\renewcommand\mainline[1][]{%
 \setkeys[UFXS]{print}{#1}%
 \begingroup\catcode`\#=12 \@mainline}

\DeclareRobustCommand{\variation}[1][]{%
 \setkeys[UFXS]{print}{#1}%
 \begingroup\catcode`\#=12 \@variation}

\newcommand\variationmovemode{\shortmoves}

%added \shortmoves as \variation doesn't work in longmoves-mode
\def\@variation#1{\endgroup\gdef\NumberNext{\True}%
  \gdef\AfterBlack{\False}%
  \gdef\PrintMoves{\True}%
  \gdef\ExecuteMoves{\False}%
  \gdef\StoreLastMove{\False}%
  {\variationstyle\opencommands%
   \variationmovemode
   \xskak@do@parsemainline(#1 Z )%
   \closecommands}}

%%% Read/store commands
%% changed to avoid the use of to much write/read registers
%% ?? What did I mean? changed \FenBoard to \fenboard in \loadgame/restoregame
%% ?? What did I mean? to avoid problems with the redefinition in texmate

\def\savegame#1{% writes the board as fen to #1.fen
  \immediate\openout0=#1.fen%
  \Fen@calculate%
  \immediate\write0{\temp@board}%
  \immediate\closeout0}

\def\loadgame#1{%
  \def\load@read{}%
  \openin0=#1.fen\relax%
  \read0 to \load@read%
  \closein0%
  \expandafter\fenboard\expandafter{\load@read}}

%%% ParseCastlingA changed so that comments are no longer lost:
%%% -> bug report 2008-10-10

\def\@setmoverestcastling(#1ZVW){\gdef\MoveRest{#1}}

\def\ParseCastlingA(#1#2#3){%
  \MyEqualB{#1#2}{-O}%
  {\gdef\LongCastling{\True}%
   \ParseCastlingAA(#3)}%
  {\ParseCastlingAA(#1#2#3)}}

\newcommand\ParseCastlingAA{}

\def\ParseCastlingAA(#1#2#3){%
 \EqStr{Z}{#1}%
  {}% we are done!
  {\EqStr{#1}{+}% chess ?
     {\protected@xdef\CheckTest{\checksymbol}%
      \ParseCastlingAA(#2#3)}%
     {\EqStr{#1}{##}% mate?
       {\protected@xdef\MateTest{\mate}%
        \ParseCastlingAA(#2#3)}%
       {\@setmoverestcastling(#1#2#3)}}}}


%%%% ExecutePawnMove changed:
%%%% moved \xdef of EnPassantSquare before DoTheMove
%%%% I hope it doesn't break something

\def\ExecutePawnMove{% relies on the info obtained by ParseMove
  \setcounter{halfmove}{0}%
  \Capture%
  {\EqPiece{E}{\Get{\MoveTo}}%
    {\Set{\MoveToFile\FromRank}{E}}%
    {}%
    \xdef\EnPassantSquare{-}% U.F. moved before \DoTheMove
    \DoTheMove{\FileDiscriminator\FromRank}%
    }%
  {\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}}}%
  {}}

%%% the internal longmove command changed to get correct pawn moves:

\def\xskak@do@printmove@algebraic{%
 \csname Xskak.\xskak@val@gameid.%
        \WhiteToMove{\the\numexpr\the\c@move-1\relax}{\the\c@move}.%
        \WhiteToMove{b}{w}.lan\endcsname
 \csname Xskak.\xskak@val@gameid.%
        \WhiteToMove{\the\numexpr\the\c@move-1\relax}{\the\c@move}.%
        \WhiteToMove{b}{w}.comments\endcsname{}}

\let\skaklongmoves\longmoves %added 16.10.2008

\def\longmoves{%
\let\printmove=\xskak@do@printmove@algebraic
\gdef\xskak@do@printmove{\xskakget{lan}}}

\def\shortmoves{%
\let\printmove=\printmove@san
\gdef\xskak@do@printmove{\xskakget{san}}}

%</xskak>
%<*xskak-keys>
\ProvidesFile{xskak-keys.sty}[2019/06/23 version v1.5 key definitions for xskak.sty]


%%%%%%%%%%%%%%%%%%%%%
%%%% Keys
%%%%%%%%%%%%%%%%%%%%%
%% \newchessgame: fam: new
\define@key[UFXS]{new}{id}[\xskak@val@defaultid]{\xdef\xskak@val@gameid{#1}}

\define@key[UFXS]{new}{movenr}{\xdef\xskak@val@movenr{#1}}

\define@key[UFXS]{new}{player}{\xdef\xskak@val@player{#1}}

\define@key[UFXS]{new}{moveid}[\xskak@val@defaultmovenr\xskak@val@defaultplayer]{%
 \edef\@tempa{#1}%
 \xskak@split@moveid{\@tempa}%
 \global\let\xskak@val@movenr\xskak@temp@movenr
 \global\let\xskak@val@player\xskak@temp@player}

\define@key[UFXS]{new}{newvar}[\xskak@val@gameid]{%
 \xdef\xskak@val@refgameid{#1}%
 \xdef\xskak@val@movenr{\csname Xskak#1lastmovenr\endcsname}%
 \xdef\xskak@val@player{\csname Xskak#1lastplayer\endcsname}}%



\define@key[UFXS]{new}{reftag}{%
 \xdef\xskak@val@currenttag{#1}}

\define@key[UFXS]{new}{refid}{%
 \ifcsname xskak@tag@#1@refid\endcsname
  \UFXS@new@id{\csname xskak@tag@#1@refid\endcsname}%
 \else
   \PackageError{xskak}{Unknown tag #1}{}%
 \fi}

\define@key[UFXS]{new}{refpastmovenr}{%
 \ifcsname xskak@tag@#1@refid\endcsname
  \UFXS@new@movenr{\csname xskak@tag@#1@refpastmovenr\endcsname}%
 \else
   \PackageError{xskak}{Unknown tag #1}{}%
 \fi}

\define@key[UFXS]{new}{refnextmovenr}{%
 \ifcsname xskak@tag@#1@refid\endcsname
  \UFXS@new@movenr{\csname xskak@tag@#1@refnextmovenr\endcsname}%
 \else
   \PackageError{xskak}{Unknown tag #1}{}%
 \fi}

\define@key[UFXS]{new}{refpastplayer}{%
 \ifcsname xskak@tag@#1@refid\endcsname
  \UFXS@new@movenr{\csname xskak@tag@#1@refpastmovenr\endcsname}%
 \else
   \PackageError{xskak}{Unknown tag #1}{}%
 \fi}

\define@key[UFXS]{new}{refnextplayer}{%
 \ifcsname xskak@tag@#1@refid\endcsname
  \UFXS@new@player{\csname xskak@tag@#1@refnextplayer\endcsname}%
 \else
   \PackageError{xskak}{Unknown tag #1}{}%
 \fi}

\define@key[UFXS]{new}{refpastmoveid}{%
  \ifcsname xskak@tag@#1@refid\endcsname
   \UFXS@new@moveid{%
    \csname xskak@tag@#1@refpastmovenr\endcsname
    \csname xskak@tag@#1@refpastplayer\endcsname}%
  \else
   \PackageError{xskak}{Unknown tag #1}{}%
 \fi}

\define@key[UFXS]{new}{refnextmoveid}{%
 \ifcsname xskak@tag@#1@refid\endcsname
   \PackageError{xskak}{Unknown tag #1}{}%
 \fi
 \UFXS@new@moveid{%
  \csname xskak@tag@#1@refnextmovenr\endcsname
  \csname xskak@tag@#1@refnextplayer\endcsname}}

\define@key[UFXS]{new}{refpast}{%
 \ifcsname xskak@tag@#1@refid\endcsname
   \PackageError{xskak}{Unknown tag #1}{}%
 \fi
 \UFXS@new@refpastmoveid{#1}%
 \UFXS@new@refid{#1}}

\define@key[UFXS]{new}{refnext}{%
 \ifcsname xskak@tag@#1@refid\endcsname
  \UFXS@new@refnextmoveid{#1}%
  \UFXS@new@refid{#1}%
 \else
   \PackageError{xskak}{Unknown tag #1}{}%
 \fi}

%% \xskakset: fam set
\define@key[UFXS]{set}{id}[\xskak@val@defaultid]{\UFXS@new@id{#1}}

\define@key[UFXS]{set}{movenr}{\UFXS@new@moveid{#1}}

\define@key[UFXS]{set}{player}{\UFXS@new@player{#1}}

\define@key[UFXS]{set}{moveid}[\xskak@val@defaultmovenr\xskak@val@defaultplayer]{%
 \UFXS@new@moveid{#1}}%

\define@key[UFXS]{set}{stepmoveid}[1]{%
  \count@=#1\relax
   \ifthenelse{\the\count@>0}
     {\whiledo{\the\count@>0}%
       {\xskak@do@getnextmoveid{\xskak@val@movenr}{\xskak@val@player}%
        \advance\count@ by -1%
        \global\let\xskak@val@movenr\xskak@temp@movenr
        \global\let\xskak@val@player\xskak@temp@player}%
     }%
     {\ifthenelse{\the\count@=0}%
       {}%
       {\whiledo{\the\count@<0}%
        {\xskak@do@getpreviousmoveid{\xskak@val@movenr}{\xskak@val@player}%
         \advance\count@ by 1%
         \global\let\xskak@val@movenr\xskak@temp@movenr
         \global\let\xskak@val@player\xskak@temp@player}%
         \ifthenelse{\the\count@<1}%
          {\PackageWarning{xskak}{Move number below 1!}{}}%
          {}}}}

\define@key[UFXS]{set}{lastmoveid}[\xskak@val@gameid]{%
  \ifcsname Xskak#1initfen\endcsname
   \xdef\xskak@val@gameid{#1}%
  \else\PackageError{xskak}{Game with the id #1 doesn't exist.}{}%
  \fi
  \xdef\xskak@val@movenr{\csname Xskak\xskak@val@gameid lastmovenr\endcsname}%
  \xdef\xskak@val@player{\csname Xskak\xskak@val@gameid lastplayer\endcsname}}%

\define@key[UFXS]{set}{defaultmoveid}{%
 \edef\@tempa{#1}\xskak@split@moveid{\@tempa}%
 %\xdef\xskak@val@movedefaultid{#1}%
 \xdef\xskak@val@defaultmovenr{\xskak@temp@movenr}%
 \xdef\xskak@val@defaultplayer{\xskak@temp@player}}

\define@key[UFXS]{set}{defaultmovenr}{%
 \xdef\xskak@val@defaultmovenr{#1}}

\define@key[UFXS]{set}{defaultplayer}{%
 \xdef\xskak@val@defaultplayer{#1}}

\define@key[UFXS]{set}{defaultid}{\gdef\xskak@val@defaultid{#1}}

\define@key[UFXS]{set}{defaultfen}{\gdef\xskak@val@defaultfen{#1}}

\define@key[UFXS]{set}{tag}{%
 \ifcsname xskak@tag@#1@refid\endcsname
   \PackageWarning{xskak}{Overwrite tag name #1}{}%
 \fi
 \expandafter\xdef
  \csname xskak@tag@#1@refid\endcsname{\xskak@val@gameid}%
 \ifnum\the\c@move=0
   \PackageWarning{xskak}{You haven't started a game yet. I won't set a tag!}{}%
 \else
  \expandafter\xdef
   \csname xskak@tag@#1@refnextmovenr\endcsname{\the\c@move}%
  \expandafter\xdef
   \csname xskak@tag@#1@refnextplayer\endcsname{\WhiteToMove{w}{b}}%
  \expandafter\xdef
   \csname xskak@tag@#1@refpastplayer\endcsname{\WhiteToMove{b}{w}}%
  \expandafter\xdef
   \csname xskak@tag@#1@refnextmoveid\endcsname{\the\c@move\WhiteToMove{w}{b}}%
  \WhiteToMove
   {\expandafter\xdef
    \csname xskak@tag@#1@refpastmovenr\endcsname{\the\numexpr\the\c@move-1\relax}}
   {\expandafter\xdef
    \csname xskak@tag@#1@refpastmovenr\endcsname{\the\c@move}}
  \expandafter\xdef
   \csname xskak@tag@#1@refpastmoveid\endcsname{%
   \csname xskak@tag@#1@refpastmovenr\endcsname
   \csname xskak@tag@#1@refpastplayer\endcsname}%
 \fi
  }

\define@key[UFXS]{set}{reftag}{%
 \UFXS@new@reftag{#1}}


\define@key[UFXS]{set}{refid}{%
 \UFXS@new@refid{#1}}

\define@key[UFXS]{set}{refpastmovenr}{%
 \UFXS@new@refpastmovenr{#1}}

\define@key[UFXS]{set}{refnextmovenr}{%
 \UFXS@new@refnextmovenr{#1}}

\define@key[UFXS]{set}{refpastplayer}{%
  \UFXS@new@refpastplayer{#1}}

\define@key[UFXS]{set}{refnextplayer}{%
  \UFXS@new@refnextplayer{#1}}

\define@key[UFXS]{set}{refpastmoveid}{%
   \UFXS@new@refpastmoveid{#1}}

\define@key[UFXS]{set}{refnextmoveid}{%
  \UFXS@new@refnextmoveid{#1}}

\define@key[UFXS]{set}{refpast}{%
  \UFXS@new@refpast{#1}}

\define@key[UFXS]{set}{refnext}{%
  \UFXS@new@refnext{#1}}

\define@key[UFXS]{set}{style}{%
 \ifcsname xskak@style@#1@1@item\endcsname
  \def\xskak@val@stylename{#1}%
  \def\mainlinestyle{%
   \xskak@use@varstyle{\xskak@val@curlevel}%
   \xskak@do@splitlevel{\xskak@val@curlevel}%
   \ifnum\xskak@temp@levelnumber=0\relax
   \else
    \csname xskak@style@#1@\xskak@temp@levelnumber @xfont\endcsname
   \fi
   \csname xskak@style@#1@\xskak@val@curlevel @font\endcsname}%
  \let\variationstyle\mainlinestyle
 \else
  \PackageError{xskak}{Style #1 doesn't exist!}{}
 \fi}

\define@key[UFXS]{set}{gstyle}{%
 \ifcsname xskak@style@#1@1@item\endcsname
  \xdef\xskak@val@stylename{#1}%
  \gdef\mainlinestyle{%
   \xskak@use@varstyle{\xskak@val@curlevel}%
   \xskak@do@splitlevel{\xskak@val@curlevel}%
   \ifnum\xskak@temp@levelnumber=0\relax
   \else
    \csname xskak@style@#1@\xskak@temp@levelnumber @xfont\endcsname
   \fi
   \csname xskak@style@#1@\xskak@val@curlevel @font\endcsname}%
  \global\let\variationstyle\mainlinestyle
 \else
  \PackageError{xskak}{Style #1 doesn't exist!}{}
 \fi}


\define@key[UFXS]{set}{level}{%
 \edef\xskak@val@curlevel{#1}}%

\define@key[UFXS]{set}{glevel}{%
 \xdef\xskak@val@curlevel{#1}}%

\define@key[UFXS]{set}{invar}[]{%
 \ifxskakpdfmatch
  \xskak@do@splitlevel{\xskak@val@curlevel}%
  \ifnum\xskak@temp@levelnumber=0\relax
   \PackageWarning{xskak}{key invar ignored}{}%
  \else
   \edef\xskak@val@curlevel{%
          \xskak@temp@levelprefix
          \the\numexpr\xskak@temp@levelnumber+1\relax
          \xskak@temp@levelpostfix}%
  \fi
 \else
 %% no pdfmatch. Will give an error if the level is not a number
   \edef\xskak@val@curlevel{%
          \the\numexpr\xskak@val@curlevel+1\relax}%
 \fi}

\define@key[UFXS]{set}{ginvar}[]{%
 \ifxskakpdfmatch
  \xskak@do@splitlevel{\xskak@val@curlevel}%
  \ifnum\xskak@temp@levelnumber=0\relax
   \PackageWarning{xskak}{key ginvar ignored}{}%
  \else
   \xdef\xskak@val@curlevel{%
          \xskak@temp@levelprefix
          \the\numexpr\xskak@temp@levelnumber+1\relax
          \xskak@temp@levelpostfix}%
  \fi
 \else
 %% no pdfmatch. Will give an error if the level is not a number
   \xdef\xskak@val@curlevel{%
          \the\numexpr\xskak@val@curlevel+1\relax}%
 \fi}

\define@key[UFXS]{set}{outvar}[]{%
 \ifxskakpdfmatch
  \xskak@do@splitlevel{\xskak@val@curlevel}%
   \ifnum\xskak@temp@levelnumber=0\relax
    \PackageWarning{xskak}{key outvar ignored}{}%
   \else
     \ifnum\xskak@temp@levelnumber=1\relax
      \PackageWarning{xskak}{Level has already  value 1}{}%
     \else
       \edef\xskak@val@curlevel{%
          \xskak@temp@levelprefix
          \the\numexpr\xskak@temp@levelnumber-1\relax
          \xskak@temp@levelpostfix}%
     \fi
  \fi
 \else
   \ifnum\xskak@val@curlevel=1\relax
     \PackageWarning{xskak}{Level has already  value 1}{}%
   \else
     \edef\xskak@val@curlevel{%
          \the\numexpr\xskak@val@curlevel-1}%
   \fi
 \fi}

\define@key[UFXS]{set}{goutvar}[]{%
 \ifxskakpdfmatch
  \xskak@do@splitlevel{\xskak@val@curlevel}%
   \ifnum\xskak@temp@levelnumber=0\relax
    \PackageWarning{xskak}{key goutvar ignored}{}%
   \else
     \ifnum\xskak@temp@levelnumber=1\relax
      \PackageWarning{xskak}{Level has already  value 1}{}%
     \else
       \xdef\xskak@val@curlevel{%
          \xskak@temp@levelprefix
          \the\numexpr\xskak@temp@levelnumber-1\relax
          \xskak@temp@levelpostfix}%
     \fi
  \fi
 \else
   \ifnum\xskak@val@curlevel=1\relax
     \PackageWarning{xskak}{Level has already  value 1}{}%
   \else
     \xdef\xskak@val@curlevel{%
          \the\numexpr\xskak@val@curlevel-1}%
   \fi
 \fi}

%% \resumechessgame: fam res
\define@key[UFXS]{res}{id}{\UFXS@new@id{#1}}

\define@key[UFXS]{res}{movenr}{\def\xskak@temp@movenr{#1}}

\define@key[UFXS]{res}{player}{\def\xskak@temp@player{#1}}

\define@key[UFXS]{res}{moveid}{\edef\@tempa{#1}\xskak@split@moveid{\@tempa}}

\define@key[UFXS]{res}{newvar}[\xskak@val@gameid]{%
 \xdef\xskak@val@refgameid{#1}%
 \xdef\xskak@val@gameid{#1}%
 \def\xskak@temp@movenr{\csname Xskak\xskak@val@gameid lastmovenr\endcsname}%
 \def\xskak@temp@player{\csname Xskak\xskak@val@gameid lastplayer\endcsname}}%


\define@key[UFXS]{res}{reftag}{%
 \UFXS@new@reftag{#1}}

\define@key[UFXS]{res}{refid}{%
 \UFXS@new@refid{#1}}

\define@key[UFXS]{res}{refpastmovenr}{%
 \UFXS@new@refpastmovenr{#1}}

\define@key[UFXS]{res}{refnextmovenr}{%
 \UFXS@new@refnextmovenr{#1}}

\define@key[UFXS]{res}{refpastplayer}{%
  \UFXS@new@refpastplayer{#1}}

\define@key[UFXS]{res}{refnextplayer}{%
  \UFXS@new@refnextplayer{#1}}

\define@key[UFXS]{res}{refpastmoveid}{%
   \UFXS@new@refpastmoveid{#1}}

\define@key[UFXS]{res}{refnextmoveid}{%
  \UFXS@new@refnextmoveid{#1}}

\define@key[UFXS]{res}{refpast}{%
  \UFXS@new@refpast{#1}}

\define@key[UFXS]{res}{refnext}{%
  \UFXS@new@refnext{#1}}

%% pgn-keys are defined during definition.

%%% xskakexportgames
\define@key[UFXS]{export}{file}{\edef\xskak@val@exportfile{#1.xsk}}
\define@key[UFXS]{export}{games}{\edef\xskak@val@exportgames{#1}}

%%% xskakloop
\define@key[UFXS]{loop}{id}{\UFXS@new@id{#1}}

\define@key[UFXS]{loop}{reftag}{%
 \UFXS@new@reftag{#1}}

\define@key[UFXS]{loop}{refid}{%
 \UFXS@new@refid{#1}}

\define@key[UFXS]{loop}{initmoveid}{%
 \xskak@split@moveid{#1}%
 \global\let\xskak@val@movenr\xskak@temp@movenr
 \global\let\xskak@val@player\xskak@temp@player
 }
\define@key[UFXS]{loop}{initmovenr}{%
 \xdef\xskak@val@movenr{#1}}

\define@key[UFXS]{loop}{initplayer}{%
 \xdef\xskak@val@player{#1}}

\define@key[UFXS]{loop}{stopmoveid}{%
 \xskak@split@moveid{#1}%
 \global\let\xskak@val@stopmovenr\xskak@temp@movenr
 \global\let\xskak@val@stopplayer\xskak@temp@player
 }
\define@key[UFXS]{loop}{stopmovenr}{%
 \xdef\xskak@val@stopmovenr{#1}}

\define@key[UFXS]{loop}{stopplayer}{%
 \xdef\xskak@val@stopplayer{#1}}

\define@key[UFXS]{loop}{step}{\xdef\xskak@val@loopstep{#1}}

\define@boolkey[UFXS]{loop}{showlast}[true]{}

%%
%% style items.

%% keys
\define@key[UFXS]{styleitem}{whiteopen}{%
 \expandafter\gdef\csname\xskak@temp@name whiteopen\endcsname{#1}}
\define@key[UFXS]{styleitem}{blackopen}{%
 \expandafter\gdef\csname\xskak@temp@name blackopen\endcsname{#1}}
\define@key[UFXS]{styleitem}{opencommands}{%
 \expandafter\gdef\csname\xskak@temp@name opencommands\endcsname{#1}}
\define@key[UFXS]{styleitem}{closecommands}{%
 \expandafter\gdef\csname\xskak@temp@name closecommands\endcsname{#1}}
\define@key[UFXS]{styleitem}{beforenumber}{%
 \expandafter\gdef\csname\xskak@temp@name beforenumber\endcsname{#1}}
\define@key[UFXS]{styleitem}{beforewhite}{%
 \expandafter\gdef\csname\xskak@temp@name beforewhite\endcsname{#1}}
\define@key[UFXS]{styleitem}{afterwhite}{%
 \expandafter\gdef\csname\xskak@temp@name afterwhite\endcsname{#1}}
\define@key[UFXS]{styleitem}{beforeblack}{%
 \expandafter\gdef\csname\xskak@temp@name beforeblack\endcsname{#1}}
\define@key[UFXS]{styleitem}{afterblack}{%
 \expandafter\gdef\csname\xskak@temp@name afterblack\endcsname{#1}}
\define@key[UFXS]{styleitem}{beforecomment}{%
 \expandafter\gdef\csname\xskak@temp@name xskak@beforecomment\endcsname{#1}}
\define@key[UFXS]{styleitem}{beforeNAG}{%
 \expandafter\gdef\csname\xskak@temp@name xskak@beforeNAG\endcsname{#1}}

\define@key[UFXS]{styleiteminit}{template}{% from #1 to current style. Make sure to have set temp@name correctly!
 \xskak@do@copystyleitem{xskak@styleitem@#1@}{\xskak@temp@name}}

%% style

\define@key[UFXS]{style}{level}[1]{%
  \def\xskak@val@curlevel{#1}}

\define@key[UFXS]{style}{font}{%
 \expandafter\gdef\csname\xskak@temp@name\xskak@val@curlevel @font\endcsname{#1}}

\define@key[UFXS]{style}{styleitem}{%
 \ifcsname xskak@styleitem@#1@whiteopen\endcsname
  \expandafter\xdef
   \csname\xskak@temp@name\xskak@val@curlevel @item\endcsname{#1}%
 \else
  \PackageError{xskak}{style item #1 doesn't exist!}{}%
 \fi}

\define@key[UFXS]{style}{xfont}{%
 \xskak@do@splitlevel{\xskak@val@curlevel}%
 \ifnum\xskak@temp@levelnumber=0\relax
  \PackageWarning{xskak}{key xfont ignored (no number found)}{}%
 \else
  \expandafter\gdef\csname\xskak@temp@name\xskak@temp@levelnumber @xfont\endcsname{#1}%
 \fi}

%% printing
%% style and level for all printing commands

\define@key[UFXS]{print}{style}{%
 \UFXS@set@style{#1}}

\define@key[UFXS]{print}{gstyle}{%
 \UFXS@set@gstyle{#1}}

\define@key[UFXS]{print}{level}{%
 \edef\xskak@val@curlevel{#1}}%

\define@key[UFXS]{print}{glevel}{%
 \xdef\xskak@val@curlevel{#1}}%

\define@key[UFXS]{print}{invar}[]{%
  \UFXS@set@invar{#1}}

\define@key[UFXS]{print}{outvar}[]{%
 \UFXS@set@outvar{#1}}

%% keys only for \printchessgame
\define@key[UFXS]{xprint}{id}{\def\xskak@val@gameid{#1}}
\define@key[UFXS]{xprint}{initmoveid}{%
 \xskak@split@moveid{#1}%
 \let\xskak@val@movenr\xskak@temp@movenr
 \let\xskak@val@player\xskak@temp@player
 }
\define@key[UFXS]{xprint}{initmovenr}{%
 \def\xskak@val@movenr{#1}}

\define@key[UFXS]{xprint}{initplayer}{%
 \def\xskak@val@player{#1}}

\define@key[UFXS]{xprint}{stopmoveid}{%
 \xskak@split@moveid{#1}%
 \let\xskak@val@stopmovenr\xskak@temp@movenr
 \let\xskak@val@stopplayer\xskak@temp@player
 }
\define@key[UFXS]{xprint}{stopmovenr}{%
 \def\xskak@val@stopmovenr{#1}}

\define@key[UFXS]{xprint}{stopplayer}{%
 \def\xskak@val@stopplayer{#1}}

\define@key[UFXS]{xprint}{reftag}{%
 \UFXS@new@reftag{#1}}

\define@key[UFXS]{xprint}{refid}{%
 \ifcsname xskak@tag@#1@refid\endcsname
  \UFXS@print@id{\csname xskak@tag@#1@refid\endcsname}%
 \else
   \PackageError{xskak}{Unknown tag #1}{}%
 \fi}

%% new keys for chessboard. Move to chessboard.sty??
%% empty keys to avoid errors:

\define@key[UFCB]{locfill}{tag}{}%
\define@key[UFCB]{locfill}{ref}{}%
\define@key[UFCB]{locfill}{defaultid}{}%
\define@key[UFCB]{locfill}{defaultmoveid}{}%
\define@key[UFCB]{locfill}{defaultfen}{}%

%% real keys (should also be defined in fam glofill):
\define@key[UFCB]{locfill}{id}[\xskak@val@defaultid]{%
 \ifcsname Xskak#1initfen\endcsname
   \edef\xskak@val@gameid{#1}%
 \else
  \PackageError{xskak}{Game with the id #1 doesn't exist.}{}%
 \fi}%

\define@key[UFCB]{glofill}{id}[\xskak@val@defaultid]{%
    \board@do@l@addto@macro\board@val@savedkeylist{,id=#1}}%

\define@key[UFCB]{locfill}{moveid}{%
 \edef\@tempa{#1}\xskak@split@moveid{\@tempa}%
 \let\xskak@val@movenr\xskak@temp@movenr
 \let\xskak@val@player\xskak@temp@player}%

\define@key[UFCB]{glofill}{moveid}{%
    \board@do@l@addto@macro\board@val@savedkeylist{,moveid=#1}}%

\define@key[UFCB]{locfill}{stepmoveid}[1]{%
  \count@=#1\relax
   \ifthenelse{\the\count@>0}
     {\whiledo{\the\count@>0}%
       {\xskak@do@getnextmoveid{\xskak@val@movenr}{\xskak@val@player}%
        \advance\count@ by -1%
        \let\xskak@val@movenr\xskak@temp@movenr
        \let\xskak@val@player\xskak@temp@player}%
     }%
     {\ifthenelse{\the\count@=0}%
       {}%
       {\whiledo{\the\count@<0}%
        {\xskak@do@getpreviousmoveid{\xskak@val@movenr}{\xskak@val@player}%
         \advance\count@ by 1%
         \let\xskak@val@movenr\xskak@temp@movenr
         \let\xskak@val@player\xskak@temp@player}%
         \ifthenelse{\the\count@<1}%
          {\PackageWarning{xskak}{Move number below 1!}{}}%
          {}}}}

\define@key[UFCB]{glofill}{stepmoveid}{%
    \board@do@l@addto@macro\board@val@savedkeylist{,stepmoveid=#1}}%

\define@key[UFCB]{locfill}{player}{\def\xskak@val@player{#1}}%

\define@key[UFCB]{glofill}{player}{%
    \board@do@l@addto@macro\board@val@savedkeylist{,player=#1}}%

\define@key[UFCB]{locfill}{movenr}{\def\xskak@val@movenr{#1}}%

\define@key[UFCB]{glofill}{movenr}{%
    \board@do@l@addto@macro\board@val@savedkeylist{,movenr=#1}}%

\define@key[UFCB]{locfill}{newvar}[\xskak@val@refgameid]{%
 \UFCB@locfill@setfen{%
  \csname Xskak.#1.%
    \csname Xskak#1lastmovenr\endcsname.%
    \csname Xskak#1lastplayer\endcsname.%
    pastfen\endcsname}%
 }%

\define@key[UFCB]{glofill}{newvar}{%
    \board@do@l@addto@macro\board@val@savedkeylist{,newvar=#1}}%

\define@key[UFCB]{locfill}{reftag}{%
 \edef\xskak@val@currenttag{#1}}

\define@key[UFCB]{glofill}{reftag}{%
    \board@do@l@addto@macro\board@val@savedkeylist{,reftag=#1}}%

\define@key[UFCB]{locfill}{lastmoveid}[\xskak@val@gameid]{%
 \ifcsname Xskak#1initfen\endcsname
  \edef\xskak@val@gameid{#1}%
 \else
  \PackageError{xskak}{Game with the id #1 doesn't exist.}{}%
 \fi
 \edef\xskak@val@movenr{\csname Xskak#1lastmovenr\endcsname}%
 \edef\xskak@val@player{\csname Xskak#1lastplayer\endcsname}%
 }%

\define@key[UFCB]{glofill}{lastmoveid}{%
    \board@do@l@addto@macro\board@val@savedkeylist{,lastmoveid=#1}}%

\define@key[UFCB]{locfill}{refid}{%
 \ifcsname xskak@tag@#1@refid\endcsname
  \UFCB@locfill@id{\csname xskak@tag@#1@refid\endcsname}%
 \else
   \PackageError{xskak}{Unknown tag #1}{}%
 \fi}

\define@key[UFCB]{glofill}{refid}{%
    \board@do@l@addto@macro\board@val@savedkeylist{,refid=#1}}%

\define@key[UFCB]{locfill}{refpastmovenr}{%
 \ifcsname xskak@tag@#1@refid\endcsname
  \UFCB@locfill@movenr{\csname xskak@tag@#1@refpastmovenr\endcsname}%
 \else
   \PackageError{xskak}{Unknown tag #1}{}%
 \fi}

\define@key[UFCB]{glofill}{refpastmovenr}{%
    \board@do@l@addto@macro\board@val@savedkeylist{,refpastmovenr=#1}}%

\define@key[UFCB]{locfill}{refnextmovenr}{%
 \ifcsname xskak@tag@#1@refid\endcsname
   \PackageError{xskak}{Unknown tag #1}{}%
 \fi
 \UFCB@locfill@movenr{\csname xskak@tag@#1@refnextmovenr\endcsname}}

\define@key[UFCB]{glofill}{refnextmovenr}{%
    \board@do@l@addto@macro\board@val@savedkeylist{,refnextmovenr=#1}}%

\define@key[UFCB]{locfill}{refpastplayer}{%
 \ifcsname xskak@tag@#1@refid\endcsname
  \UFCB@locfill@player{\csname xskak@tag@#1@refpastplayer\endcsname}%
 \else
   \PackageError{xskak}{Unknown tag #1}{}%
 \fi}

\define@key[UFCB]{glofill}{refpastplayer}{%
    \board@do@l@addto@macro\board@val@savedkeylist{,refpastplayer=#1}}%

\define@key[UFCB]{locfill}{refnextplayer}{%
 \ifcsname xskak@tag@#1@refid\endcsname
  \UFCB@locfill@player{\csname xskak@tag@#1@refnextplayer\endcsname}%
 \else
   \PackageError{xskak}{Unknown tag #1}{}%
 \fi}

\define@key[UFCB]{glofill}{refnextplayer}{%
    \board@do@l@addto@macro\board@val@savedkeylist{,refnextplayer=#1}}%

\define@key[UFCB]{locfill}{refpastmoveid}{%
 \ifcsname xskak@tag@#1@refid\endcsname
  \UFCB@locfill@moveid{\csname xskak@tag@#1@refpastmoveid\endcsname}%
 \else
   \PackageError{xskak}{Unknown tag #1}{}%
 \fi}

\define@key[UFCB]{glofill}{refpastmoveid}{%
    \board@do@l@addto@macro\board@val@savedkeylist{,refpastmoveid=#1}}%

\define@key[UFCB]{locfill}{refnextmoveid}{%
 \ifcsname xskak@tag@#1@refid\endcsname
  \UFCB@locfill@moveid{\csname xskak@tag@#1@refnextmoveid\endcsname}%
 \else
   \PackageError{xskak}{Unknown tag #1}{}%
 \fi}

\define@key[UFCB]{glofill}{refnextmoveid}{%
    \board@do@l@addto@macro\board@val@savedkeylist{,refnextmoveid=#1}}%

\define@key[UFCB]{locfill}{refpast}{%
 \ifcsname xskak@tag@#1@refid\endcsname
  \UFCB@locfill@movenr{\csname xskak@tag@#1@refpastmovenr\endcsname}%
  \UFCB@locfill@id{\csname xskak@tag@#1@refid\endcsname}%
 \else
   \PackageError{xskak}{Unknown tag #1}{}%
 \fi}

\define@key[UFCB]{glofill}{refpast}{%
    \board@do@l@addto@macro\board@val@savedkeylist{,refpast=#1}}%

\define@key[UFCB]{locfill}{refnext}{%
 \ifcsname xskak@tag@#1@refid\endcsname
  \UFCB@locfill@movenr{\csname xskak@tag@#1@refnextmovenr\endcsname}%
  \UFCB@locfill@id{\csname xskak@tag@#1@refid\endcsname}%
 \else
   \PackageError{xskak}{Unknown tag #1}{}%
 \fi}

\define@key[UFCB]{glofill}{refnext}{%
    \board@do@l@addto@macro\board@val@savedkeylist{,refnext=#1}}%

\define@key[UFCB]{locfill}{refpast}{%
 \ifcsname xskak@tag@#1@refid\endcsname
  \UFCB@locfill@movenr{\csname xskak@tag@#1@refpastmovenr\endcsname}%
  \UFCB@locfill@id{\csname xskak@tag@#1@refid\endcsname}%
 \else
   \PackageError{xskak}{Unknown tag #1}{}%
 \fi}

\define@key[UFCB]{glofill}{refpast}{%
    \board@do@l@addto@macro\board@val@savedkeylist{,refpast=#1}}%

\define@key[UFCB]{locfill}{reffen}{%
 \ifcsname xskak@tag@#1@refid\endcsname
  \UFCB@locfill@addfen{%
  \csname
   Xskak.%
   \csname xskak@tag@#1@refid\endcsname.%
   \csname xskak@tag@#1@refnextmovenr\endcsname.%
   \csname xskak@tag@#1@refnextplayer\endcsname.%
   pastfen%
  \endcsname}
 \else
   \PackageError{xskak}{Unknown tag #1}{}%
 \fi}

\define@key[UFCB]{glofill}{reffen}{%
    \board@do@l@addto@macro\board@val@savedkeylist{,reffen=#1}}%

%% currently not described. Perhaps delete. Perhaps change name to adapt to ref-keys?
\define@key[UFCB]{locfill}{setgame}[\xskak@val@gameid]{%
 \ifcsname Xskak#1initfen\endcsname
  \edef\xskak@val@gameid{#1}%
 \else
  \PackageError{xskak}{Game with the id #1 doesn't exist.}{}%
 \fi
 \edef\board@temp@curfen{\csname Xskak#1lastfen\endcsname}%
 \board@do@setsinglekeys*[UFCB]{locfill}{language=english, setfen=\board@temp@curfen, language=\board@val@savelang}}%

\define@key[UFCB]{glofill}{setgame}[\xskak@val@gameid]{%
    \board@do@l@addto@macro\board@val@savedkeylist{,showgame=#1}}%

%% currently not described. Perhaps delete. Perhaps change name to adapt to ref-keys?
\define@key[UFCB]{locfill}{addgame}[\xskak@val@gameid]{%
 \ifcsname Xskak#1initfen\endcsname
   \edef\xskak@val@gameid{#1}%
 \else\PackageError{xskak}{Game with the id #1 doesn't exist.}{}%
 \fi
 \edef\board@temp@curfen{\csname Xskak#1lastfen\endcsname}%
 \board@do@setsinglekeys*[UFCB]{locfill}{language=english, addfen=\board@temp@curfen, language=\board@val@savelang}}%

\define@key[UFCB]{glofill}{addgame}[\xskak@val@gameid]{%
    \board@do@l@addto@macro\board@val@savedkeylist{,showgame=#1}}%

%</xskak-keys>
%<*xskak-nagdef>
\ProvidesFile{xskak-nagdef.sty}[2019/06/23 version v1.5 nag definitions for xskak.sty]

\expandafter\def\csname $1\endcsname{!}
\expandafter\def\csname $2\endcsname{?}
\expandafter\def\csname $3\endcsname{!!}
\expandafter\def\csname $4\endcsname{??}
\expandafter\def\csname $5\endcsname{!?}
\expandafter\def\csname $6\endcsname{?!}
\expandafter\def\csname $7\endcsname{\onlymove}
\expandafter\def\csname $8\endcsname{\onlymove}
\expandafter\def\csname $9\endcsname{}
\expandafter\def\csname $10\endcsname{\equal}
\expandafter\def\csname $11\endcsname{\equal}
\expandafter\def\csname $12\endcsname{\equal}
\expandafter\def\csname $13\endcsname{\unclear}
\expandafter\def\csname $14\endcsname{\wbetter}
\expandafter\def\csname $15\endcsname{\bbetter}
\expandafter\def\csname $16\endcsname{\wupperhand}
\expandafter\def\csname $17\endcsname{\bupperhand}
\expandafter\def\csname $18\endcsname{\wdecisive}
\expandafter\def\csname $19\endcsname{\bdecisive}
\expandafter\def\csname $20\endcsname{\wdecisive}
\expandafter\def\csname $21\endcsname{\bdecisive}
\expandafter\def\csname $22\endcsname{\zugzwang}
\expandafter\def\csname $23\endcsname{\zugzwang}
\expandafter\def\csname $24\endcsname{\moreroom}
\expandafter\def\csname $25\endcsname{\moreroom}
\expandafter\def\csname $26\endcsname{\moreroom}
\expandafter\def\csname $27\endcsname{\moreroom}
\expandafter\def\csname $28\endcsname{\moreroom}
\expandafter\def\csname $29\endcsname{\moreroom}
\expandafter\def\csname $30\endcsname{\devadvantage}
\expandafter\def\csname $31\endcsname{\devadvantage}
\expandafter\def\csname $32\endcsname{\devadvantage}
\expandafter\def\csname $33\endcsname{\devadvantage}
\expandafter\def\csname $34\endcsname{\devadvantage}
\expandafter\def\csname $35\endcsname{\devadvantage}
\expandafter\def\csname $36\endcsname{\withinit}
\expandafter\def\csname $37\endcsname{\withinit}
\expandafter\def\csname $38\endcsname{\withinit}
\expandafter\def\csname $39\endcsname{\withinit}
\expandafter\def\csname $40\endcsname{\withattack}
\expandafter\def\csname $41\endcsname{\withattack}
\expandafter\def\csname $42\endcsname{\without\compensation}
\expandafter\def\csname $43\endcsname{\without\compensation}
\expandafter\def\csname $44\endcsname{\compensation}
\expandafter\def\csname $45\endcsname{\compensation}
\expandafter\def\csname $46\endcsname{\compensation}
\expandafter\def\csname $47\endcsname{\compensation}
\expandafter\def\csname $70\endcsname{\weakpt\cfss@symking}
\expandafter\def\csname $71\endcsname{\weakpt\cfss@symking}
\expandafter\def\csname $74\endcsname{\weakpt\cfss@symking}
\expandafter\def\csname $75\endcsname{\weakpt\cfss@symking}
\expandafter\def\csname $86\endcsname{\weakpt\cfss@symknight}
\expandafter\def\csname $87\endcsname{\weakpt\cfss@symknight}
\expandafter\def\csname $90\endcsname{\weakpt\cfss@symbishop}
\expandafter\def\csname $91\endcsname{\weakpt\cfss@symbishop}
\expandafter\def\csname $94\endcsname{\weakpt\cfss@symbishop}
\expandafter\def\csname $95\endcsname{\weakpt\cfss@symbishop}
\expandafter\def\csname $98\endcsname{\weakpt\cfss@symqueen}
\expandafter\def\csname $99\endcsname{\weakpt\cfss@symqueen}
\expandafter\def\csname $130\endcsname{\counterplay}
\expandafter\def\csname $130\endcsname{\counterplay}
\expandafter\def\csname $131\endcsname{\counterplay}
\expandafter\def\csname $132\endcsname{\counterplay}
\expandafter\def\csname $133\endcsname{\counterplay}
\expandafter\def\csname $134\endcsname{\counterplay}
\expandafter\def\csname $135\endcsname{\counterplay}
\expandafter\def\csname $136\endcsname{\timelimit}
\expandafter\def\csname $137\endcsname{\timelimit}
\expandafter\def\csname $138\endcsname{\timelimit}
\expandafter\def\csname $139\endcsname{\timelimit}
\expandafter\def\csname $140\endcsname{\space\withidea}
\expandafter\def\csname $142\endcsname{\space\betteris}
\expandafter\def\csname $145\endcsname{\chesscomment}
\expandafter\def\csname $146\endcsname{\novelty}
\expandafter\def\csname $D\endcsname{\chessdiagramname}
\expandafter\def\csname $d\endcsname{}

%</xskak-nagdef>
