summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/xskak
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/latex/contrib/xskak
Initial commit
Diffstat (limited to 'macros/latex/contrib/xskak')
-rw-r--r--macros/latex/contrib/xskak/README.md46
-rw-r--r--macros/latex/contrib/xskak/UF-xskak-documentation.sty220
-rw-r--r--macros/latex/contrib/xskak/skak-comment-test.pdfbin0 -> 21142 bytes
-rw-r--r--macros/latex/contrib/xskak/skak-comment-test.tex7
-rw-r--r--macros/latex/contrib/xskak/skak-longmoves-test-new.pdfbin0 -> 21121 bytes
-rw-r--r--macros/latex/contrib/xskak/skak-longmoves-test-new.tex8
-rw-r--r--macros/latex/contrib/xskak/xskak.dtx2409
-rw-r--r--macros/latex/contrib/xskak/xskak.ins72
-rw-r--r--macros/latex/contrib/xskak/xskak.pdfbin0 -> 622998 bytes
-rw-r--r--macros/latex/contrib/xskak/xskak.tex3490
-rw-r--r--macros/latex/contrib/xskak/xskak_and_beamer.pdfbin0 -> 151042 bytes
-rw-r--r--macros/latex/contrib/xskak/xskak_and_beamer.tex63
-rw-r--r--macros/latex/contrib/xskak/xskakgames.xsk1303
13 files changed, 7618 insertions, 0 deletions
diff --git a/macros/latex/contrib/xskak/README.md b/macros/latex/contrib/xskak/README.md
new file mode 100644
index 0000000000..e901ae229a
--- /dev/null
+++ b/macros/latex/contrib/xskak/README.md
@@ -0,0 +1,46 @@
+# xskak --- An extention to the package skak for chess typesetting
+
+Packageversion: 1.5
+Packagedate: 2019-06-23
+Ulrike Fischer 2006-2019
+
+## LICENSE
+LaTeX Project Public License
+
+## CONTENTS AND INSTALLATION
+
+- README.md (this file)
+- xskak.dtx
+- xskak.ins
+- xskak.tex, xskak.pdf (the main documentation file)
+- some files needed to typeset the documentation
+
+Run TeX/LaTeX on xskak.ins to unpack the dtx.
+
+Put the three extracted files in tex/latex/xskak/.
+
+The dtx-file doesn't contain any documentation.
+So running LaTeX on it makes no sense!
+
+Put the other files in
+ doc/latex/xskak/
+
+Update the filename database
+
+## DOCUMENTATION
+
+xskak.pdf.
+
+## DESCRIPTION
+
+The main point of xskak is to save informations about a chess game
+for later use e.g. to loop through a game to make an animated board.
+It also extend the input that the parsing commands can handle and
+offer an interface to define and switch between indefinite levels
+of styles.
+
+
+## REQUIREMENTS
+xskak uses some primitives of e\TeX. It needs version 1.4 of skak,
+a recent version of chessfss and xkeyval, version 1.5 of chessboard (which in turns
+needs xifthen and pgf).
diff --git a/macros/latex/contrib/xskak/UF-xskak-documentation.sty b/macros/latex/contrib/xskak/UF-xskak-documentation.sty
new file mode 100644
index 0000000000..eec0e064ea
--- /dev/null
+++ b/macros/latex/contrib/xskak/UF-xskak-documentation.sty
@@ -0,0 +1,220 @@
+\ProvidesFile{UF-xskak-documentation.sty}[2008/01/09 local style for documentations]
+\DeclareOption{codemargin}{\AtEndOfPackage{%
+ \advance\oddsidemargin by 0.5in\relax
+ \advance\marginparwidth by 1in\relax}}
+\ProcessOptions
+\newcommand\filetype[1] {\upshape\texttt{#1}} %e.g. \filetype{.pdf}
+\newcommand\programm[1] {\upshape\textsf{#1}} %e.g. \programm{afm2tfm}
+\newcommand\chessfontname[1]{\upshape\textsf{#1}} %e.g. chessfontname{maya}
+\newcommand\konzept[1] {\upshape\textsf{#1}} %e.g. \konzept{nfss}
+\newcommand\packagename[1] {\upshape\textsf{#1}}
+
+\newcommand\skaksty{the package \packagename{skak}\xspace}
+\newcommand\Skaksty{The package \packagename{skak}\xspace}
+
+\newcommand\xskak{the package \packagename{xskak}\xspace}
+\newcommand\Xskak{The package \packagename{xskak}\xspace}
+
+\newcommand\chessfss{the package \packagename{chessfss}\xspace}
+\newcommand\Chessfss{The package \packagename{chessfss}\xspace}
+
+\newcommand\pchessboard{the package \packagename{chessboard}\xspace}
+\newcommand\Pchessboard{The package \packagename{chessboard}\xspace}
+
+
+\newcommand\mynobreakpar{\par\nobreak\@afterheading}
+\newcommand\key[1]{\texttt{#1}}
+\newcommand\obsoletekey[1]{\key{#1}\index{#1 (obsolete)}}
+\providecommand\gobble[1]{}
+\newcommand\keyoarg{\oarg{key=value list}}
+\newcommand\keymarg{\marg{key=value list}}
+\newcommand\keylist{\textit{key=value list}\xspace}
+\newcommand\keylists{\textit{key=value lists}\xspace}
+\newcommand\keyvalue{\textit{key=value}\xspace}
+
+\AtBeginDocument{%
+ \renewcommand*\lstlistlistingname{Examples}
+ \renewcommand*\lstlistingname{Example}
+}
+
+%
+\setcounter{secnumdepth}{4}
+\renewcommand{\theparagraph}{\alph{paragraph})}
+
+
+%% standard needed packages
+\RequirePackage[english]{babel}
+\RequirePackage{microtype}
+
+\RequirePackage{array}
+\RequirePackage{booktabs}
+\RequirePackage{xspace}
+\RequirePackage{ifluatex}
+
+%% fonts
+\ifluatex
+\else
+\RequirePackage[scaled=0.85]{luximono}
+\RequirePackage{fourier}
+\RequirePackage[scaled=0.86]{helvet}
+\fi
+%\addtokomafont{sectioning}{\rmfamily}
+\renewcommand*\descfont{\rmfamily\bfseries}
+
+%% colors
+\RequirePackage{xcolor}
+\colorlet{hellgelb}{yellow!15}
+
+
+% Quotes
+\RequirePackage[babel]{csquotes}
+\MakeAutoQuote {«}{»}
+
+
+%% index
+\RequirePackage{makeidx}
+\makeindex % number of columns set after doc
+
+\begin{filecontents}{\jobname.mst}
+actual '='
+quote '!'
+level '>'
+preamble
+"\n \\begin{theindex} \n \\makeatletter\\scan@allowedfalse\n"
+postamble
+"\n\n \\end{theindex}\n"
+item_x1 "\\efill \n \\subitem "
+item_x2 "\\efill \n \\subsubitem "
+delim_0 "\\pfill "
+delim_1 "\\pfill "
+delim_2 "\\pfill "
+% The next lines will produce some warnings when
+% running Makeindex as they try to cover two different
+% versions of the program:
+lethead_prefix "{\\bfseries\\hfil "
+lethead_suffix "\\hfil}\\nopagebreak\n"
+lethead_flag 1
+heading_prefix "{\\bfseries\\hfil "
+heading_suffix "\\hfil}\\nopagebreak\n"
+headings_flag 1
+%%
+%%
+\end{filecontents}
+
+
+%% codes and examples
+\begin{filecontents}{UFlstlocal.cfg}
+\ProvidesFile{UFlstlocal.cfg}[2005/07/01 lokale Listingsdefinitionen (UF)]
+
+\RequirePackage{xcolor}
+
+
+\colorlet{UFkeyscolor}{black}
+\colorlet{UFidentifiercolor}{black}
+\colorlet{UFcommentscolor}{red}
+\colorlet{UFstringcolor}{green!50}
+\colorlet{UFbackgroundcolor}{yellow!10}
+
+\lstdefinestyle{inline}{%
+ basicstyle=\ttfamily,
+ keywordstyle={}}
+
+
+\lstdefinestyle{UFdocu}{% mehr oder weniger kopiert aus showexpl.cfg
+ language=[LaTeX]TeX,%
+ float=hbp,%
+ basicstyle=\ttfamily,%
+ identifierstyle=\color{UFidentifiercolor},%
+ keywordstyle=\color{UFkeyscolor},%
+ stringstyle=\color{UFstringcolor},%
+ commentstyle=\itshape,%
+ columns=flexible,%
+ tabsize=4,%
+ frame=single,%
+ extendedchars=true,%
+ showspaces=false,%
+ showstringspaces=false,%
+ numbers=none,%
+ %numberstyle=\tiny\ttfamily,%
+ breaklines=true,%
+ breakindent=10pt,%
+ backgroundcolor=\color{UFbackgroundcolor},%
+ breakautoindent=true,%
+ captionpos=t,%
+ xleftmargin=1em,%
+ xrightmargin=\fboxsep,%
+ %numbersep=1em,%
+ breakatwhitespace=true,
+ preset=\raggedright\setlength{\parskip}{1ex},%
+ explpreset={numbers=none, basicstyle=\footnotesize\ttfamily},% ueberschreibt default
+ rframe={},% code ist im Rahmen
+ varwidth=true,% Breite des Beispiels
+ pos=o,
+ overhang=4em,%
+ literate={ü}{{\"u}}1{ö}{{\"o}}1{ä}{{\"a}}1
+}
+
+\lstdefinestyle{inline}{%
+ basicstyle=\ttfamily,
+ keywordstyle={}}
+
+\newcommand\mylstinline{\lstinline[style=inline]}
+
+\endinput
+%%
+%% End of file `UFlstlocal.cfg'.
+\end{filecontents}
+
+\RequirePackage[final]{showexpl}
+\input{UFlstlocal.cfg}
+\lstset{style=UFdocu}
+
+\newcommand\UFleftexamples{%
+\let\OriisSX@odd\isSX@odd
+\renewcommand*{\isSX@odd}[2]{##2}}
+
+\UFleftexamples
+
+\RequirePackage{doc}
+\def\meta@font@select{\rmfamily\itshape}
+\c@IndexColumns = 2
+\renewcommand\MacroFont{\scriptsize\ttfamily}
+\renewcommand\encapchar{ -- }
+% from ltxdoc.sty
+\DeclareRobustCommand\cs[1]{\texttt{\char`\\#1}}
+\providecommand\marg[1]{%
+ {\ttfamily\char`\{}\meta{#1}{\ttfamily\char`\}}}
+\providecommand\oarg[1]{%
+ {\ttfamily[}\meta{#1}{\ttfamily]}}
+\providecommand\parg[1]{%
+ {\ttfamily(}\meta{#1}{\ttfamily)}}
+
+
+%% pagestyle and layout
+\providecommand\UFcurrentpackage{unknown}
+\providecommand\UFcurrentversion{version unknown}
+
+\reversemarginpar
+
+\RequirePackage{fancyhdr}
+\pagestyle{fancy}
+
+\renewcommand\headrulewidth{0pt}
+\fancyhf{}
+\cfoot{\thepage}
+\lfoot{\today}
+\rfoot{\packagename{\UFcurrentpackage} \UFcurrentversion}
+
+
+%% captions
+\RequirePackage[tableposition=top]{caption}
+\captionsetup{singlelinecheck=false,format=hang,belowskip=1em}
+
+
+
+%% pdf-goodies:
+\RequirePackage{animate}
+\RequirePackage[colorlinks=true, %options are passed to hyperref
+ linkcolor=black,
+ hyperindex=true% true clashes with doc.sty
+ ]{attachfile}
diff --git a/macros/latex/contrib/xskak/skak-comment-test.pdf b/macros/latex/contrib/xskak/skak-comment-test.pdf
new file mode 100644
index 0000000000..34b3f4b44b
--- /dev/null
+++ b/macros/latex/contrib/xskak/skak-comment-test.pdf
Binary files differ
diff --git a/macros/latex/contrib/xskak/skak-comment-test.tex b/macros/latex/contrib/xskak/skak-comment-test.tex
new file mode 100644
index 0000000000..17d099df2f
--- /dev/null
+++ b/macros/latex/contrib/xskak/skak-comment-test.tex
@@ -0,0 +1,7 @@
+\documentclass[12pt]{article}
+\usepackage{skak} %=skak version 1.5
+\begin{document}
+\newgame
+\newcommand\mycomment{ What else?}
+\mainline{1.e4!\wbetter{}\mycomment{} e5 2.Nf3 Nc6}
+\end{document}
diff --git a/macros/latex/contrib/xskak/skak-longmoves-test-new.pdf b/macros/latex/contrib/xskak/skak-longmoves-test-new.pdf
new file mode 100644
index 0000000000..1c7c56d4b3
--- /dev/null
+++ b/macros/latex/contrib/xskak/skak-longmoves-test-new.pdf
Binary files differ
diff --git a/macros/latex/contrib/xskak/skak-longmoves-test-new.tex b/macros/latex/contrib/xskak/skak-longmoves-test-new.tex
new file mode 100644
index 0000000000..086fb9f950
--- /dev/null
+++ b/macros/latex/contrib/xskak/skak-longmoves-test-new.tex
@@ -0,0 +1,8 @@
+\documentclass[12pt]{article}
+\usepackage{skak}%=skak version 1.5
+\begin{document}
+\newgame\longmoves
+\mainline{1.e4 e5 2.Nf3 Nf6}
+
+\variation{2... d5}
+\end{document}
diff --git a/macros/latex/contrib/xskak/xskak.dtx b/macros/latex/contrib/xskak/xskak.dtx
new file mode 100644
index 0000000000..6912904f8c
--- /dev/null
+++ b/macros/latex/contrib/xskak/xskak.dtx
@@ -0,0 +1,2409 @@
+%<*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>
diff --git a/macros/latex/contrib/xskak/xskak.ins b/macros/latex/contrib/xskak/xskak.ins
new file mode 100644
index 0000000000..7a6000039b
--- /dev/null
+++ b/macros/latex/contrib/xskak/xskak.ins
@@ -0,0 +1,72 @@
+%%
+%% This file will generate fast loadable files from chessfss-ex.dtx
+%% when run through LaTeX or TeX.
+%%
+%% This file is part of the LaTeX2e package xskak
+%% ---------------------------------------------------
+%%
+%% This system is distributed in the hope that it will be useful,
+%% but WITHOUT ANY WARRANTY; without even the implied warranty of
+%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+%%
+%% Copyright 2006-2015 Ulrike Fischer (chess@nililand.de)
+%% -------------------------------------------
+%
+%
+%% This program can be redistributed and/or modified under the terms
+%% of the LaTeX Project Public License distributed from CTAN archives
+%% in the directory macros/latex/base/lppl.txt; either version 1 of
+%% the License, or (at your option) any later version.
+
+%%
+%% --------------- start of docstrip commands ------------------
+%%
+\input docstrip.tex
+
+\keepsilent
+\askforoverwritetrue
+
+\preamble
+\endpreamble
+
+\ifToplevel{\ifx\generate\undefined
+ \Msg{**********************************************}
+ \Msg{*}
+ \Msg{* This installation requires docstrip}
+ \Msg{* version 2.3c or later.}
+ \Msg{*}
+ \Msg{* An older version of docstrip has been input}
+ \Msg{*}
+ \Msg{**********************************************}
+ \errhelp{Move or rename old docstrip.tex.}
+ \errmessage{Old docstrip in input path}
+ \batchmode
+ \csname @@end\endcsname
+ \fi
+ \ifx\askonceonly\undefined\else\askonceonly\fi
+}
+
+\declarepreamble\UFpreamble
+
+xskak: a package to parse and print chess games
+Copyright 2006-2015 Ulrike Fischer (chess@nililand.de)
+-------------------------------------------
+
+This file can be redistributed and/or modified under the terms of
+the LaTeX Project Public License distributed from CTAN archives in
+the directory macros/latex/base/lppl.txt; either version 1 of the
+License, or (at your option) any later version.
+
+For error reports see documentation.
+\endpreamble
+
+%% File generation:
+\generate{%
+ \usepreamble\UFpreamble
+ \file{xskak.sty}{\from{xskak.dtx}{xskak}}
+ \file{xskak-keys.sty}{\from{xskak.dtx}{xskak-keys}}
+ \file{xskak-nagdef.sty}{\from{xskak.dtx}{xskak-nagdef}}
+}
+\endbatchfile
+%%
+%%end of file xskak.ins
diff --git a/macros/latex/contrib/xskak/xskak.pdf b/macros/latex/contrib/xskak/xskak.pdf
new file mode 100644
index 0000000000..49fc60d4ba
--- /dev/null
+++ b/macros/latex/contrib/xskak/xskak.pdf
Binary files differ
diff --git a/macros/latex/contrib/xskak/xskak.tex b/macros/latex/contrib/xskak/xskak.tex
new file mode 100644
index 0000000000..f8655af210
--- /dev/null
+++ b/macros/latex/contrib/xskak/xskak.tex
@@ -0,0 +1,3490 @@
+% !Mode:: "TeX:DE:UTF-8:Main"
+% -*- mode: TeX -*- -*- coding: UTF-8 -*-
+\def\UFcurrentpackage{xskak}
+\newcommand\UFcurrentversion{1.5}
+
+\RequirePackage{fix-cm}
+
+\documentclass[pagesize,parskip=half-,fontsize=12pt]{scrartcl}
+\usepackage[utf8]{inputenc}
+
+%% xskak specific commands
+\usepackage[LSB1,LSB2, LSB3,LSBC2,LSBC3,LSBC4,LSBC5, T1]{fontenc}
+\usepackage{xskak}
+%\usepackage{eqparbox}
+\usepackage{tabularx}
+
+\usepackage{framed}
+\colorlet{shadecolor}{lightgray!25}
+
+
+\makeatletter
+\newcommand\Describefillkey[4][]{\par\index{#2 (\textbackslash chessboard key)}%
+\makebox[0pt][r]{\tiny #1\hspace{1em}}%
+ \colorbox{green!25}{\makebox[\dimexpr\textwidth-2\fboxsep\relax]{\ttfamily%
+ \eqparbox{fillkey}{#2=\meta{#3}}\hfill
+ \eqparbox{fillexample}{%
+ \ifthenelse{\equal{#4}{}}%
+ {#2}
+ {#2={#4}}}}}%
+ \par\nobreak\@afterheading}
+\makeatother
+
+\usepackage{filecontents}
+\usepackage{UF-xskak-documentation}
+
+\setchessboard{smallboard, showmover=false}
+\xskakset{style=UF}
+
+\usepackage{showexpl}
+\makeatletter
+\renewcommand\board@pgf@extractangle[2]{%#1 command, #2 pgfpoint
+ \pgfextracty{\len@board@tempy}{#2}%
+ \pgfextractx{\len@board@tempx}{#2}%
+ \ifdim\len@board@tempx=0pt\relax
+ %\len@board@tempy= 1 or unchanged?
+ \else
+ %\divide \len@board@tempy by \strip@pt\len@board@tempx\relax
+ \pgfmathsetlength{\len@board@tempy}{\len@board@tempy/\len@board@tempx}%
+ \fi
+ \ifdim\len@board@tempx=0pt\relax
+ \ifdim\len@board@tempy=0pt\relax
+ \def#1{0}%
+ \else
+ \ifdim\len@board@tempy>0pt\relax
+ \def#1{90}%
+ \else
+ \def#1{-90}%
+ \fi
+ \fi
+ \fi
+ \ifdim\len@board@tempy=0pt\relax
+ \ifdim\len@board@tempx=0pt\relax
+ \def#1{0}%
+ \else
+ \ifdim\len@board@tempx>0pt\relax
+ \def#1{0}%
+ \else
+ \def#1{180}%
+ \fi
+ \fi
+ \fi
+ \ifdim\len@board@tempx>0pt\relax
+ \ifdim\len@board@tempy>0pt\relax
+ \pgfmathatan{\len@board@tempy}%
+ \edef#1{\pgfmathresult}%
+ \fi
+ \ifdim\len@board@tempy<0pt\relax
+ \pgfmathatan{\len@board@tempy}%
+ \edef#1{\pgfmathresult}%
+ \fi
+ \fi
+ \ifdim\len@board@tempx<0pt\relax
+ \ifdim\len@board@tempy>0pt\relax
+ \pgfmathatan{-\len@board@tempy}%
+ \pgfmathadd{-\pgfmathresult}{180}%
+ \edef#1{\pgfmathresult}%
+ \fi
+ \ifdim\len@board@tempy<0pt\relax
+ \pgfmathatan{\len@board@tempy}%
+ \pgfmathadd{\pgfmathresult}{180}%
+ \edef#1{\pgfmathresult}%
+ \fi
+ \fi
+ }
+
+\makeatother
+
+\begin{document}
+
+\title{\packagename{xskak}: An extension to \skaksty}
+\author{Ulrike Fischer}
+\maketitle
+
+\tableofcontents
+
+\section{Changes}
+\begin{description}
+\item[2019-06-23] (Version 1.5)] Corrected a bug: \cs{xskak@beforecomment}{} was not defined. styleA was missing a space. Improved the documentation and added the source to the ctan upload.
+
+\item[2015-01-02] (Version 1.4)] Corrected a bug: After a promotion the promotionpiece and the fen position were wrong.
+\item[2014-04-19] (Version 1.3)] Corrected a bug: enpassant test didn't check the piece and so other figures than a pawn could make an enpassant move.
+\item[2012-08-24 (Version 1.2b)]
+Corrected a small bug -- \cs{printchessgame} doesn't wrap around a wrapfigure.
+
+
+\item[2012-08-24 (Version 1.2a)]
+Corrected a small bug -- \cs{hidemoves} printed comment signs.
+
+\item[2008-10-10 (Version 1.2)]
+Made some changes to make \xskak compatible to the version 1.5 of
+\skaksty. See below for details.
+
+Changed Code: As \cs{longmoves} doesn't work with \cs{variation}
+anyway \cs{variation} now use always \cs{shortmoves}.
+
+Bug correction: \skaksty forgets to store comments after castling
+moves. Code to correct this has been added to \xskak.
+
+Bug correction: \xskak didn't print check and mate symbol after
+castling moves due to wrong position of braces.
+
+\item[2008-07-28 (Version 1.1)]
+Bug correction: Added the code for the promotion piece to the SAN and
+LAN notation.
+
+Bug correction: Remove some spurious spaces.
+
+\end{description}
+
+
+\section{Introduction}
+
+\Xskak\footnote{License: \LaTeX\ Project Public License} is an extension for \skaksty -- and as \xskak is an extension
+(and not a replacement) the main work is still done by \skaksty so
+please read first the documentation of \skaksty as I'm not explaining
+the \packagename{skak} commands in this documentation.
+
+
+\Skaksty is a package from Torben Hoffmann which can parse and print
+chess games given in (a subset of) the PGN notation.
+
+The main features of \packagename{xskak} are:
+
+\begin{itemize}
+\item \packagename{xskak} can handle an extended set of PGN.
+
+\item \packagename{xskak}
+can parse and store an arbitrary number of chess games in PGN. The
+games can be exported and imported and all positions and moves can be
+retrieved at anytime.
+
+\item \packagename{xskak} can
+handle an arbitrary number of printing styles to distinguish
+the different variations levels.
+
+\end{itemize}
+
+\minisec{Extended PGN handling}
+
+When handling a PGN chess parsers at first have to split the notation
+in different chunks. I will call this step the \emph{PGN parser}.
+As an example\\[1ex]\mbox{}\quad {\ttfamily 15.Ne5!+
+\$3 \{This breaks the black defense\} (15.Re1? Kg8!)}\\[1ex] contains as
+chunks a \emph{move number} (\texttt{15.}), a \emph{move}
+(\texttt{Ne5}), \emph{short move comments} (\texttt{!+}), a
+\emph{NAG} (\texttt{\$3}), a \emph{comment} (\texttt{\{This breaks
+the black defense\}}) and a \emph{variation} (\texttt{(15.Re1?
+Kg8!)}).
+
+Neither \packagename{skak} nor \packagename{xskak} can handle all
+legal PGN's. \Skaksty can only handle PGN's which contains move
+numbers, moves and short comments. \packagename{xskak} can
+additionally handle NAG's and a special form of comments. None of the
+packages can currently parse PGN's with variations.
+
+
+\minisec{Storing moves}
+
+After the splitting of the PGN the chunks are processed further.
+Depending on the type of the chunk different actions are taken. The
+most important subprocess is the \emph{move parser}. It takes the
+move, retrieves from somewhere the current (FEN-)position of the game
+and tries to figure out what the move is exactly doing.
+
+In \packagename{xskak} only the commands \cs{mainline} and
+\cs{hidemoves} calls the move parser, \cs{variation} uses only the
+PGN parser.
+
+The main difference between \packagename{xskak} and
+\packagename{skak} is how they handle the information gathered by
+the move parser: \Skaksty uses the results of the move parser mainly
+to update the board and after the move throws almost all other
+information away -- including previous positions. \xskak saves all
+information about the moves for later use. Here a simple example:
+
+\begin{LTXexample}
+ \newchessgame
+ \mainline{1. e4 e5 2. Nf3 Nc6 3. Bb5 a6 4. Ba4 Nf6}
+
+ \xskakset{moveid=2w}%
+ \chessboard[setfen=\xskakget{nextfen}]\\[1ex]
+ Position after 2.\,\xskakget{lan}
+\end{LTXexample}
+
+So in short you start a game with \cs{newchessgame}, you enter moves
+with \cs{mainline} (or \cs{hidemoves}), you set the move for which
+you want to retrieve data with \cs{xskakset}, and then you retrieve
+the data with \cs{xskakget}.
+
+
+The storing of the moves and positions is not restricted to the main
+game. You can store and retrieve as much variation levels you want.
+
+
+\minisec{Printing styles}
+
+The following example shows how to use different styles for different
+variation levels. But it also shows the problems: It can be quite
+tiresome to get a good printing result. You must pay attention to the
+levels and the spaces after commands, and for each variation you have
+to start a new game and resume older games if you go back to them.
+
+\begin{LTXexample}
+\longmoves \xskakset{style=UF}
+\newchessgame[id=main]
+\mainline{1.e4 e5}
+%
+ (Alternatives are
+ \newchessgame[newvar=main,id=var1]%
+ \mainline[invar]{1... d5} which is answered by
+ \mainline{2. exd5 Qxd5}
+ %
+ \newchessgame[newvar=var1,id=var1-1]
+ (\mainline[invar]{2... Nf6})
+ %
+ or
+ \newchessgame[newvar=main,id=var2]
+ \mainline[outvar]{1... e6 2. d4})
+%
+\resumechessgame[id=main]%
+\mainline[outvar]{2.Nf3}
+
+\chessboard
+\end{LTXexample}
+
+
+
+\bigskip
+
+In the following sections I will describe the finer points. This
+includes
+\begin{itemize}
+\item how to handle more than one game at a time,
+\item how to retrieve the data faster,
+\item what data you can retrieve,
+\item how to loop through a game,
+\item how to export the data,
+\item how to improve the printing of the games,
+\item and some other changes/additions I made to \packagename{skak}.
+\end{itemize}
+
+
+\subsection{Warnings}
+
+\minisec{\packagename{xskak} and \packagename{skak}}
+
+\Xskak doesn't only define some new commands, it also changes some
+quite central internal commands of \skaksty. This means
+\begin{itemize}
+ \item it can break standard commands of \skaksty,
+
+ \item it will possibly not work together with future versions of
+ \skaksty,
+
+ \item loading \packagename{xskak.sty} can lead to problems with
+ packages like \packagename{texmate} which use internally
+ \packagename{skak}.
+\end{itemize}
+
+\minisec{Local and global commands}
+
+In the package \packagename{chessboard} almost every setting is local
+to the board. This was a quite natural decision as a board is a
+confined space. In \packagename{xskak} the situation is quite
+different: As a start \packagename{skak} already sets and saves some
+information globally and the data saved by \packagename{xskak}
+during the parsing must be saved globally or they wouldn't never
+escape the \cs{mainline}. And secondly, as I wanted to use
+\packagename{beamer} and \packagename{animate} a lot of data
+must be preserved from one frame/picture to the next. So I decided to
+use in most cases global commands unless -- like in the cases of
+styles -- I could see a real advantage in keeping a setting local.
+
+So please be aware that settings made e.g. in a figure environment
+can affect the following text.
+
+
+\subsection{Some history}
+
+While the commands \cs{mainline} and \cs{hidemoves} parse a chess
+game \skaksty updates an internal board and so can always show the
+current position. Sadly a lot of the data gathered during the
+parsing are thrown away after \packagename{skak} has updated the
+board and has go on to the next move and so can not be used by the
+user. E.g. there is no way to get the field a piece came from or to
+store easily all positions of a game.
+
+Some years ago I tried to find out how to print a game in long
+algebraic notation and I realized quite fast that I need some of
+these lost data to be able to do it, and that it would be necessary
+to patch some internal commands of \skaksty to save the data. At the
+same time I also tried to insert some code that allows the parsing of
+standard PGN-comment signs. Due to lack of time the whole project
+didn't got very far but I had a working beta. Then a new version of
+\skaksty came. It had even a -- sadly at the time not fully working -- command \cs{longmoves}%
+ \index{longmoves=\verb!*+\longmoves+>}%
+ \index{shortmoves=\verb!*+\shortmoves+>}
+(and the counterpart \cs{shortmoves}) to switch to the long algebraic
+notation. But I hadn't the time to test and adjust my package.
+
+ \index{longmoves=\verb!*+\longmoves+>}%
+ \index{shortmoves=\verb!*+\shortmoves+>}%
+
+Then in 2006 I wrote \pchessboard and during the tests also tried to
+make animated pdf's which show all positions of a game. That worked
+fine but the input was so tiresome that I restarted the
+\packagename{xskak}-project: Like in the case of the long algebraic
+notation the main problem was the loss of previous positions.
+
+
+\subsection{Bugs and errors}
+
+I'm quite sure that they are bugs and errors in the package.
+
+If you have questions ask them in the newsgroups
+\nolinkurl{comp.text.tex}, \nolinkurl{de.comp.text.tex} or
+\nolinkurl{fr.comp.text.tex} or at \url{http://tex.stackexchange.com/}.
+I'm reading these groups regularly and
+I'm much better in answering there than in answering e-mails.
+
+If you find errors in this text (this includes wrong english) or in
+the package, you can write me a bugreport at
+\nolinkurl{chess@nililand.de} or -- better -- add an issue to the github site
+\url{https://github.com/u-fischer/xskak/issues/}. A bugreport should contain a complete,
+running, \emph{minimal} example and the log-file of the pdf\LaTeX\
+run (that means the engine that makes a pdf!).
+
+
+\subsection{Requirements}
+
+\Xskak uses some primitives of e\TeX. It needs version 1.4 or version
+1.5 of \skaksty, a recent version of \chessfss (chess font selection)
+and \packagename{xkeyval} (\textit{key=value}-syntax), version 1.5 of
+\packagename{chessboard} (which in turns needs \packagename{pgf}) and
+\packagename{xifthen}.
+
+
+\subsection{Installation}
+
+Run \filetype{xskak.ins} through \LaTeX\ and then put the
+\filetype{*.sty} where \LaTeX\ finds them.
+(\path{<texmf>/tex/latex/xskak/} is a good place.) Update the
+filename database.
+
+
+\subsection{Loading and package options}
+
+Loading of the package is done with \verb+\usepackage{xskak}+.
+Currently the package has only one option: \texttt{nopdfmatch}.%
+ \index{nopdfmatch (package option)}
+The option will disable the use of the experimental \cs{pdfmatch}
+used in the processing of the style levels (see section
+\ref{sec:usestyles}). \packagename{xskak} will load \skaksty without
+option (and won't pass options to it). So, if you want to load
+\packagename{skak} with options, you must do it before loading
+\xskak.
+
+\subsection{Adaption to \skaksty version 1.5}
+
+Above I warned that \xskak can break with newer versions of \skaksty.
+When the version 1.5 of \packagename{skak} appeared
+promptly a lot of things broke so I had to adapt and change my code.
+Version 1.2 of \xskak will work with both versions of
+\skaksty.
+
+In version 1.5 of \skaksty some fundamental things have changed. At
+first \cs{longmoves} works now correctly, even as you can see for the
+\cs{variation} command:
+
+
+\LTXinputExample[label=ex:longmovesnew,
+ graphic={[trim=3cm 24cm 9cm
+ 4cm,clip]{skak-longmoves-test-new}},
+ caption={The new
+ longmoves implementation of
+ \skaksty}]{skak-longmoves-test-new}
+
+
+The more important change (from the point of my package) is that
+\cs{variation} now parse the moves too (that's why it can show the
+long algebraic notation). To achieve this the author of \skaksty,
+Torben Hoffman, stores now the position before a move so that he can
+go back to this position and start the variation from there.
+
+The main problem with this approach is that it imposes restrictions
+on the move numbers of variations: All variations must start with the
+move number of the last move in a \cs{mainline} command. So
+separating two moves of a variation by some text is no longer
+possible:
+
+\begin{lstlisting}
+ \documentclass{article}
+ \usepackage{skak} %=skak version 1.5
+ \begin{document}
+ \newgame
+ \mainline{1.e4 e5 2. Nf3}
+ \variation{2. d3 d6} %works
+ \variation{2. c3} %works
+ and then
+ \variation{2...c6} %error
+ \end{document}
+\end{lstlisting}
+
+To tell the truth, I'm not sure that this a very good idea. In any
+case: \xskak overwrites the responsable definitions of \skaksty. With
+\xskak \cs{variation} currently doesn't parse games (and so also
+can't show moves in long algebraic notation -- if you want this you
+will have to start with the commands described later in this
+documentation a new game with another id). So the above example works
+fine with \xskak.
+
+
+
+
+
+\subsection{The example}
+
+Almost all examples use as starting point a new game. But in some
+cases the following position is used, which allows to show almost all
+special cases (like enpassant, promotion, capture, castling,
+ambiguous moves). The position is stored under the name «example» and
+so can be retrieved e.g. with the key \key{restorefen=example} from
+\packagename{chessboard} or the command
+\lstinline+\restoregame{example}+ of the package
+\packagename{skak}\footnote{One could also use key \key{tag} to
+store the position and key \key{reffen} to retrieve it.}:
+
+\begin{LTXexample}[caption={The standard example position},width=.7\textwidth]
+ \newchessgame[id=example,
+ castling=Q,
+ setwhite={pa2,pc7,pg5,ph2,pe4,
+ ke1,ra1,bg4},
+ addblack={pb4,ph7,pd5,
+ ke8,rh8,bh3,nf6,ne5},
+ storefen=example]%
+
+ \mbox{\Xskakexampleinitfen}
+
+ \chessboard
+\end{LTXexample}
+
+
+\section{Improved parsing of comments}\label{sec:diagrams}
+
+ \Skaksty can handle comments in the input if they follow
+directly the move, if the commands are robust and if the spaces that
+separate moves and numbers are not swallowed by a command.
+
+\LTXinputExample[label=ex:comments,
+ graphic={[trim=3cm 24cm 9cm
+ 4cm,clip]{skak-comment-test}},
+ caption={comments in \skaksty}]{skak-comment-test}
+
+
+This is quite okay for a few small comments in a small number of
+games, but a bit tiresome if you want to handle a lot of games that
+you have annotated with a chess application. The PGN export of such
+games uses NAG's for short comments and curly braces for longer
+comments.
+
+
+With \xskak the commands \cs{mainline}, \cs{hidemoves} and
+\cs{variation} now can parse NAG's and longer comments if the input
+meet the following conditions:
+%\end{document}
+\begin{itemize}
+ \item There must be spaces between the moves, each NAG and the
+ comments.
+
+ \item Text comments must be written as
+ \verb+\xskakcomment{+\meta{Text}\verb+}+%
+ \footnote{Braces are so frequent in \TeX\ that is simply not
+ possible to identify the comments simply by looking for a brace
+ -- at least not without a lot of complicated hacks.}
+
+\end{itemize}
+
+While parsing the comments the spaces before and between them will be
+swallowed. If you want a space you must add it to the text. The
+NAG's (\$1, \$2 etc) are translated following the definitions in
+\filetype{xskak-nagdef.sty}. The list there is neither complete nor
+definite. For quite a lot NAG's I hadn't the faintest idea what do.
+I'm open for suggestions/corrections.
+
+There exist two «fake» NAG's: \$d and \$D. If used in a \cs{mainline}
+or \cs{hidemoves} both will save the identification of the current
+move in an internal list and print whatever they have been defined
+to. (Currently \$D will print \cs{chessdiagramname} which is defined
+as \verb+\ (Diagram)\ +, \$d is
+empty). This can be used to refer to diagrams printed later.%
+ \footnote{It is not a accidental that there is a similar command
+ «\cs{toD}» in \packagename{texmate}. That's where I got the idea
+ from.}
+
+
+
+\begin{LTXexample}[caption={NAG's, comments and diagram references in the input}]
+ \newchessgame[id=GameA]
+ \mainline{1.e4! $2 e5 $D 2.Nf3 Nf6 \xskakcomment{ What's that? }}
+
+ \renewcommand\xskakcomment[1]{{\itshape #1}}%
+ \mainline{3. Nxe5
+ \xskakcomment{ I took a pawn! } $D }
+ \variation[invar]{3. Nc3 $4
+ \xskakcomment{ (boring) }}
+
+ \makeatletter
+ \@for\mymoveid:=\XskakGameAdiagramlist\do{%
+ \xskakset{moveid=\mymoveid}%
+ \begin{tabular}{c}
+ \chessboard[tinyboard,
+ setfen=\xskakget{nextfen}]\\
+ After move \xskakget{opennr}\xskakget{lan}
+ \end{tabular} }
+\end{LTXexample}
+
+
+\section{The core of \xskak: Saving games.}
+
+\Xskak redefines some internal commands of \skaksty to enable
+\cs{mainline} and \cs{hidemoves} to store quite a lot%
+ \footnote{\textbf{Attention:} When I say «a lot» I really mean it. Currently
+ about 30 commands for each halfmove is saved plus about 30 commands
+ for each game. A lot of games with individual game identifications
+ can use a lot of memory. But in practice that shouldn't be a problem
+ as it is seldom necessary to use a lot of different game
+ identifications.}
+data about the moves and the state of the game while parsing
+the game.
+
+There are two sorts of data: Information related to the game as a
+whole (e.g. the names of the players and the start position) and
+information related to the moves. Both type of information use a
+\meta{GameId} in the names of the commands to identify the game they
+are referring to, the move data use additionally a \meta{MoveId}.
+
+\begin{shaded}
+\minisec{Exkurs 1}
+
+It is important to understand one difference between the use of
+\meta{GameId} and \meta{MoveId}: There is only \emph{one} command
+that holds the current \meta{GameId}. The \meta{GameId} is a concept
+specific to \xskak. The current value \meta{GameId} is stored in a
+command and will be used (and can be changed) by all the commands
+that store information \emph{and} by all the commands that retrieve
+information. So if you are parsing a game in bits you should be
+careful to use the same \meta{GameId} for each part.
+
+On the other sides there are \emph{three} different places where move
+data are set or used: \skaksty uses in \cs{mainline} and
+\cs{hidemoves} a counter called «\texttt{move}» and a boolean to keep
+track of the current move and player. \Xskak has two internal
+commands which are used to set up the start moves of games and to
+retrieve the stored move data, and \cs{chessboard} has two keys that
+set move data in FEN's. This can be sometimes a bit
+confusing. \Skaksty will not like it if its move counter is changed
+while parsing a game, but it is normally not a problem to change the
+\packagename{xskak} move commands e.g. to retrieve data about
+previous moves -- as long as you don't use commands like
+\cs{newchessgame} that affects also the \packagename{skak} move
+counter.
+\end{shaded}
+
+
+\begin{shaded}
+\minisec{Exkurs 2}
+
+In chess we speak quite as often about the last move and the last
+position than about the next move and the next position: A position
+can be described as the one \emph{after} the \emph{last} move, the
+result of a move. But it can also be described as the one
+\emph{before} the \emph{next} move.
+
+The keys and commands described later reflect this: Given a move
+number you can access e.g. the position \emph{before} the move
+through the key word \key{pastfen} and the position \emph{after} the
+move through the key word \key{nextfen}. Given a \emph{tag} -- that
+is a label between two moves, you can refer to the move
+\textit{before} the tag through keys with the prefix \key{past} and
+to the move \emph{after} the tag through keys with the prefix
+\key{next}.
+
+In short: \key{past} looks back and \key{next} looks forward.
+
+The first position of a game and the first move have the prefix
+\key{init}. The last position (after the last move) and the last move
+have the prefix \key{last}.
+
+\end{shaded}
+
+
+\subsection{Initialization of the game}
+
+\DescribeMacro{\newchessgame}%
+When using \xskak you should start a new game with
+\cs{newchessgame}\keyoarg{} instead of \cs{newgame}. It will set the
+identification \meta{GameId} of the game, the start position, start
+move and quite a lot of other variables to sensible values.
+
+In the optional argument you can use the following keys:
+
+\begin{description}
+\item[\key{id=}\meta{GameId}]
+ \index{newchessgame=\verb!*+\newchessgame+>id (key)}%
+ \index{id (\texttt{\textbackslash newchessgame} key)}%
+ This key sets the string that identifies the game and is used in
+ the following parsing commands to store the data.
+ It is possible to use commands and counters e.g. for automatic numbering of
+ the games.
+ If you don't use the key or if you use the key without
+ argument (\verb+\newchessgame[id]+) a default is used.
+ The initial value of this default is \texttt{game}, but it can be changed with
+ \cs{xskakset}.
+ You can use the key \key{id} in each \cs{newchessgame} only once.
+
+\begin{LTXexample}[varwidth=false,width=0.3\textwidth]
+ \newchessgame[white=Bob]%
+ \mainline{1. e4 e5}
+
+ \newchessgame[id=MY,white=Bill]%
+ \mainline{1. e4 e5}
+
+ \newcounter{gamecounter}%
+ \stepcounter{gamecounter}%
+ \xskakset{defaultid=Game\Alph{gamecounter}}%
+
+ \newchessgame[white=Harry]%
+ \mainline{1. e4 e5}
+
+ \stepcounter{gamecounter}%
+ \newchessgame[white=Thomas]%
+ \mainline{1. d4 d5}
+
+ \Xskakgamewhite, \XskakMYwhite,
+ \XskakGameAwhite, \XskakGameBwhite%
+\end{LTXexample}
+
+\item[\key{movenr=}\meta{number}, \key{player=}\meta{«w» or «b»}, \key{moveid=}\meta{number + «w» or «b»}]
+ \index{newchessgame=\verb!*+\newchessgame+>movenr (key)}%
+ \index{movenr (\texttt{\textbackslash newchessgame} key)}%
+ \index{newchessgame=\verb!*+\newchessgame+>player (key)}%
+ \index{player (\texttt{\textbackslash newchessgame} key)}%
+ \index{newchessgame=\verb!*+\newchessgame+>moveid (key)}%
+ \index{moveid (\texttt{\textbackslash newchessgame} key)}%
+ With this keys you can change the start move for the parsing
+ commands \cs{mainline} and \cs{hidemoves}.
+ Setting this keys will change the counter and boolean
+ of \packagename{skak} \emph{and} the internal commands of
+ \packagename{xskak}.
+ The changes are global.
+ Default is \texttt{moveid=1w}, this default can be changed with
+ \cs{xskakset}.
+ Move number and player given through one of the FEN-keys of \cs{chessboard}
+ will not affect the move counter of \packagename{skak}!
+
+
+\begin{LTXexample}[varwidth=false,width=0.3\textwidth]
+ \newchessgame
+ \mainline{1. e4}
+
+ \newchessgame[moveid=4w]
+ \mainline{4. e4 e5}
+
+ \xskakset{defaultmoveid=5b}
+ \newchessgame
+ \mainline{5... c4}
+ \xskakset{defaultmoveid=1w} %back to normal
+\end{LTXexample}
+
+\item[\key{newvar=}\meta{GameId}]
+ \index{newchessgame=\verb!*+\newchessgame+>newvar (key)}%
+ \index{newvar (\texttt{\textbackslash newchessgame} key)}%
+
+ If you use this key \cs{newchessgame} will use the position
+ and the \meta{moveid} \emph{before} the last
+ move of the game \meta{GameId} as start position. If you don't
+ give a value the current meaning of \meta{GameId} is used. This
+ can be used to start variations. The new game inherits only the
+ start position of the reference game!
+
+
+\item[\key{ref\ldots=}\meta{tag}]
+
+The \meta{GameId} and the start move can also be set with keys which
+use values saved with a \key{tag}. The keys are described in section
+\ref{sec:labeling}.
+
+
+\item[keys to set PGN-infos]
+ \index{newchessgame=\verb!*+\newchessgame+>result (key)}%
+ \index{result (\texttt{\textbackslash newchessgame} key)}%
+ \index{newchessgame=\verb!*+\newchessgame+>white (key)}%
+ \index{white (\texttt{\textbackslash newchessgame} key)}%
+ \index{newchessgame=\verb!*+\newchessgame+>black (key)}%
+ \index{black (\texttt{\textbackslash newchessgame} key)}%
+ \index{newchessgame=\verb!*+\newchessgame+>whiteelo (key)}%
+ \index{whiteelo (\texttt{\textbackslash newchessgame} key)}%
+ \index{newchessgame=\verb!*+\newchessgame+>blackelo (key)}%
+ \index{blackelo (\texttt{\textbackslash newchessgame} key)}%
+ \index{newchessgame=\verb!*+\newchessgame+>site (key)}%
+ \index{site (\texttt{\textbackslash newchessgame} key)}%
+ \index{newchessgame=\verb!*+\newchessgame+>date (key)}%
+ \index{date (\texttt{\textbackslash newchessgame} key)}%
+ \index{newchessgame=\verb!*+\newchessgame+>event (key)}%
+ \index{event (\texttt{\textbackslash newchessgame} key)}%
+ \index{newchessgame=\verb!*+\newchessgame+>round (key)}%
+ \index{round (\texttt{\textbackslash newchessgame} key)}%
+ \index{PGN-infos |see (\texttt{\textbackslash newchessgame} keys)}%
+ With the keys \key{result}, \key{white}, \key{black},
+ \key{whiteelo}, \key{blackelo}, \key{site}, \key{date},
+ \key{event} and \key{round} you can store the content of the
+ PGN-infos. Unused keys are set to default values. These defaults
+ can be changed with \cs{xskakset}.
+
+ \DescribeMacro{\xskaknewpgninfo}%
+ With \cs{xskaknewpgninfo}\oarg{default value}\marg{keyname} you can define a own PGN-info key. This
+ will also define a key \key{default\meta{name}} to change the default value later.
+
+\begin{LTXexample}[varwidth=false,width=0.3\textwidth]
+ \xskaknewpgninfo[Tom]{commentary}
+
+ \newchessgame[white=Harry,date=2007]
+ \xskakgetgame{white}, \xskakgetgame{date},
+ \xskakgetgame{event},
+ \xskakgetgame{commentary}
+
+ \xskakset{defaultevent=My open}
+
+ \newchessgame[commentary=Müller]
+ \xskakgetgame{commentary},
+ \xskakgetgame{event}
+
+\end{LTXexample}
+
+
+\item[using chessboard keys]
+ \index{newchessgame=\verb!*+\newchessgame+>using chessboard keys}%
+ You can use any key that can be used in the optional argument of
+ \cs{chessboard} from the package \packagename{chessboard}.
+ \cs{newchessgame} will pass all keys to an internal
+ \cs{chessboard}%
+ \footnote{That's why you will get an error from \cs{chessboard} if you use an unknown key.}.
+ \cs{chessboard} will set a position and give it back as the start position for the
+ game.
+ All \packagename{chessboard} keys are processed normally.
+ You can even print directly the board by using the key \key{print}.
+ The only exceptions\footnote{They don't gives
+ error but they will have no effect.} are the keys \key{maxfield}
+ and \key{zero} that change the size of the board --
+ \packagename{skak} doesn't like unusual sizes of the board --
+ and the keys \key{mover} and \key{fullmove} which are overwritten
+ by the (eventually default) value of key \key{moveid}. The castling
+ possibilities and the enpassant field are set accordingly the
+ values in the default fen, you only need to set them if you want
+ to use other values.
+ Read the documentation of \packagename{chessboard} for more information.
+
+
+\begin{LTXexample}
+\newchessgame[
+ moveid=4b,print,
+ showmover,
+ mover=w,% has no effect
+ castling=Q,enpassant=a3,
+ setwhite={pa4,pc7,pg5,ph2,pe4,ke1,ra1,bg4},
+ addblack={pb4,ph7,pd5,ke8,rh8,bh3,nf6,ne5}]%
+
+\mainline{4... bxa3}
+\chessboard
+\end{LTXexample}
+\end{description}
+
+ To use a position of another game as a start position you can use
+ e.g. this sequence of keys
+ (a shorter method that use a label/ref-method will
+ be described in the section \ref{sec:labeling}):
+
+ \cs{newchessgame}\verb+[id=+\meta{old id}%
+ \verb+, moveid=+\meta{old move id}%
+ \verb+,+\\\phantom{(newchessgame[}%
+ \verb+setfen=\xskakget{+\meta{\ttfamily\upshape nextfen|pastfen}\verb+}+%
+ \verb+,+\\\phantom{(newchessgame[}%
+ \verb+id=+\meta{new id}\verb+, moveid=+\meta{new initmove id}%
+ \verb+]+
+
+ \textbf{Attention:} A new game is a \emph{new} game. It doesn't inherit moves of
+ another game -- it only reuses a position.
+ So if the new and the old game have identical \meta{GameId}
+ then the old game will be more or less lost.
+
+ In case that you want to go one half move back and start a new
+ game from there you can use the key \key{newvar}:
+
+ \cs{newchessgame}\verb+[newvar=+\meta{old id}%
+ \verb+, id=+\meta{new id}\verb+]+
+
+
+\begin{LTXexample}
+ \newchessgame[id=A]%
+ \mainline{1. e4 e5 2. Nf3 Nc6 3. Bb5 a6 4. Ba4 Nf6 5. O-O}
+
+ \newchessgame[
+ id=A,moveid=3w,print,
+ setfen=\xskakget{nextfen},
+ %fen after move 3w
+ id=B,moveid=1b]
+
+ \mainline{1... Nf6}
+
+ \newchessgame[id=C]
+ \mainline{1. e4 e5 2. Nf3 Nc6 3. Bb5 a6 4. Ba4 Nf6 5. O-O}
+
+ \newchessgame[print,
+ id=C,
+ % we retrieve the number of the last move
+ % of game C and set it as first number
+ % of the new game B at the same time:
+ moveid=\xskakgetgame{lastmoveid},
+ setfen=\xskakget{pastfen},
+ id=B]
+
+ \mainline{5. d3}
+\end{LTXexample}
+
+
+\subsection{Continuing a game}
+
+\DescribeMacro{\resumechessgame}%
+ \Skaksty doesn't have a problem if you split a game in pieces.
+ You can use as many \cs{mainline} commands as you want. It even
+ doesn't matter if you started the game in another group. But if
+ you mix two games you must first reset the
+ position and the move counter to the end position of the old game
+ before you can continue it. This is possible with
+ \cs{resumechessgame}\keyoarg. You can use
+ \cs{chessboard}-keys in the optional argument but all the keys
+ that tries to change the position will have no effect. It is also
+ not possible to store the new moves under a new game identification or
+ to renumber the moves.
+
+ The command accepts the following additional keys in the optional
+ argument:
+
+\begin{description}
+\item[\key{id=}\meta{GameId}]
+ \index{resumechessgame=\verb!*+\resumechessgame+>id (key)}%
+ \index{id (\texttt{\textbackslash resumechessgame} key)}%
+ This key identifies the game that should be continued (as a
+ default the currently active identification is used). The key
+ changes \meta{GameId} globally!
+
+
+\item[\key{movenr=}\meta{number}, \key{player=}\meta{«w» or «b»}, \key{moveid}\meta{number + «w» or «b»}]
+ \index{resumechessgame=\verb!*+\resumechessgame+>movenr (key)}%
+ \index{movenr (\texttt{\textbackslash resumechessgame} key)}%
+ \index{resumechessgame=\verb!*+\resumechessgame+>player (key)}%
+ \index{player (\texttt{\textbackslash resumechessgame} key)}%
+ \index{resumechessgame=\verb!*+\resumechessgame+>moveid (key)}%
+ \index{moveid (\texttt{\textbackslash resumechessgame} key)}%
+ This keys set the move from which on the game should be
+ restarted. With the keys it is possible to go back and then
+ continue the game along another variation (in this case the moves
+ of the first variation will be lost).
+ The values describes the \emph{next} move that means the position \emph{before} the move is
+ used.
+ As a default \cs{resumechessgame} continues the game.
+
+\begin{LTXexample}[width=0.5\textwidth,preset=\parskip1ex]
+ \newchessgame[id=main]
+ \mainline{1. e4 e5 2. Nf3 Nc6 3. Bb5}
+
+ That reminds me another game
+ some years ago where I played
+ \newchessgame[id=exkurs]
+ \mainline{1. d4 Nf6 2. c4 e6}
+ \ldots\ lots of text \ldots\
+
+ Let's continue the second game with --
+ as a reminder -- the last move of
+ black
+ \resumechessgame[id=exkurs,moveid=2b]%
+ \mainline{2... e6 3. Nc3}
+
+ Let us now go back to the first game\\
+ \resumechessgame[id=main,print,
+ tinyboard,showmover]%
+ \mainline{3... a6}
+\end{LTXexample}
+
+\item[\key{newvar=}\meta{GameId}]
+ \index{resumechessgame=\verb!*+\resumechessgame+>newvar (key)}%
+ \index{newvar (\texttt{\textbackslash resumechessgame} key)}%
+
+ This key moves you one halfmove back.
+ This can be used to write down a lot of variations. With the
+ (optional) value of the key you set the \meta{GameId}. If you don't
+ give a value the current meaning of \meta{GameId} is used.
+
+\begin{LTXexample}[width=0.5\textwidth,preset=\parskip1ex]
+ \newchessgame[id=main]
+ \mainline{1. e4 e5 2. Nf3 Nc6 3. Bb5}
+
+
+ \newchessgame[id=exkurs]
+ \mainline{1. d4 Nf6 2. c4 e6}
+
+ \resumechessgame[newvar=main]
+ \mainline{3. Bc4}
+
+
+ \resumechessgame[newvar]
+ \mainline{3. Nc3}
+ \chessboard
+
+ \xskakset{id=exkurs}
+ \resumechessgame[newvar]
+ \mainline{2... c5}
+ \chessboard
+
+\end{LTXexample}
+
+\item[\key{ref\ldots=}\meta{tag}]
+The \meta{GameId} and start move can also be set with this keys which
+use values saved with a \key{tag}. The keys are described in section
+\ref{sec:labeling}.
+
+\end{description}
+
+\subsection{The stored information}
+
+The following lists describes all the types of information stored
+during the parsing of a game. As you will see some data are stored
+more than once with only slight differences. I did it because it is
+easier to store the redundant data than to have to convert them
+later.
+
+There are also commands which contains the \meta{GameId} and the
+\meta{MoveId}. That looks a bit senseless as you need to know this
+values to be able to retrieve them but they allow easy access to the
+values without having to know or use the internal command names.
+
+
+\subsubsection{Essential game related information}
+
+\begin{description}
+
+\item[\textbackslash Xskak\meta{GameId}initfen]%
+ \index{game data >Xskakinitfen=\textbackslash Xskak\meta{GameId}initfen}%
+ \index{Xskakinitfen=\textbackslash Xskak\meta{GameId}initfen}%
+ The position before the first move. Set by \cs{newchessgame}.
+
+
+\item[\textbackslash Xskak\meta{GameId}initplayer]%
+ \index{game data >Xskakinitplayer=\textbackslash Xskak\meta{GameId}initplayer}%
+ \index{Xskakinitplayer=\textbackslash Xskak\meta{GameId}initplayer}%
+ «w» or «b». The color of the next (first) player, (must be identical
+ to the color in the initfen). Also set by \cs{newchessgame}.
+
+\item[\textbackslash Xskak\meta{GameId}initmovenr]%
+ \index{game data >Xskakinitmovenr=\textbackslash Xskak\meta{GameId}initmovenr}%
+ \index{Xskakinitmovenr=\textbackslash Xskak\meta{GameId}initmovenr}%
+ The number of the first move (must be identical to the fullmove
+ number in the initfen). Also set by \cs{newchessgame}.
+
+\item[\textbackslash Xskak\meta{GameId}initmoveid]%
+ \index{game data >Xskakinitmoveid=\textbackslash Xskak\meta{GameId}initmoveid}%
+ \index{Xskakinitmoveid=\textbackslash Xskak\meta{GameId}initmoveid}%
+ Combination of \key{initmovenr} and \key{initplayer}.
+
+\begin{LTXexample}
+ \newchessgame[id=show,
+ setfen=2K/k/7R,
+ moveid=10b,
+ print]
+
+ \mbox{\xskakgetgame{initfen}},\\
+ \xskakgetgame{initplayer},
+ \xskakgetgame{initmovenr},
+ \xskakgetgame{initmoveid}
+\end{LTXexample}
+
+
+
+\item[\textbackslash Xskak\meta{GameId}lastfen]%
+ \index{game data >Xskaklastfen=\textbackslash Xskak\meta{GameId}lastfen}%
+ \index{Xskaklastfen=\textbackslash Xskak\meta{GameId}lastfen}%
+ The fen \emph{after} the last move, set during parsing.
+
+\item[\textbackslash Xskak\meta{GameId}lastplayer]%
+ \index{game data >Xskaklastplayer=\textbackslash Xskak\meta{GameId}lastplayer}%
+ \index{Xskaklastplayer=\textbackslash Xskak\meta{GameId}lastplayer}%
+ «w» or «b». The player which made the last move, set by
+ \cs{newchessgame}, by \cs{resumechessgame} and during
+ parsing. Identical to color in the fen \emph{before} the last
+ move! \emph{Not} identical to the color in {\texttt\textbackslash
+ Xskak\meta{GameId}lastfen}!
+
+\item[\textbackslash Xskak\meta{GameId}lastmovenr]%
+ \index{game data >Xskaklastmovenr=\textbackslash Xskak\meta{GameId}lastmovenr}%
+ \index{Xskaklastmovenr=\textbackslash Xskak\meta{GameId}lastmovenr}%
+ The number of the last move, set during parsing. Identical to
+ fullmove in the fen \emph{before} the last move! \emph{Not}
+ necessarily identical to the number in {\texttt\textbackslash
+ Xskak\meta{GameId}lastfen}!
+
+\item[\textbackslash Xskak\meta{GameId}lastmoveid]%
+ \index{game data >Xskaklastmoveid=\textbackslash Xskak\meta{GameId}lastmoveid}%
+ \index{Xskaklastmoveid=\textbackslash Xskak\meta{GameId}lastmoveid}%
+ Combination of \key{lastmovenr} and \key{lastplayer}.
+
+\begin{LTXexample}
+ \newchessgame[id=show,
+ setfen=2K/k/7R,
+ castling={},
+ % sets correct castling in the FEN
+ moveid=10b]
+ \mainline{10... Ka8}
+
+ \chessboard
+
+ \mbox{\xskakgetgame{lastfen}},\\
+ \xskakgetgame{lastplayer},
+ \xskakgetgame{lastmovenr},
+ \xskakgetgame{lastmoveid}
+\end{LTXexample}
+
+
+\item[\textbackslash Xskak\meta{GameId}nextplayer]%
+ \index{game data >Xskaknextplayer=\textbackslash Xskak\meta{GameId}nextplayer}%
+ \index{Xskaknextplayer=\textbackslash Xskak\meta{GameId}nextplayer}%
+ «w» or «b». The player which will make the next move, set by
+ \cs{newchessgame}, by \cs{resumechessgame} and during parsing.
+ Identical to the color in {\texttt\textbackslash Xskak\meta{GameId}lastfen}.
+
+\item[\textbackslash Xskak\meta{GameId}nextmovenr]%
+ \index{game data >Xskaknextmovenr=\textbackslash Xskak\meta{GameId}nextmovenr}%
+ \index{Xskaknextmovenr=\textbackslash Xskak\meta{GameId}nextmovenr}%
+ The number of the next move, set during parsing. Identical to
+ fullmove in {\texttt\textbackslash Xskak\meta{GameId}lastfen}.
+
+\item[\textbackslash Xskak\meta{GameId}nextmoveid]%
+ \index{game data >Xskaknextmoveid=\textbackslash Xskak\meta{GameId}nextmoveid}%
+ \index{Xskaknextmoveid=\textbackslash Xskak\meta{GameId}nextmoveid}%
+ Combination of \key{nextmovenr} and \key{nextplayer}.
+
+\begin{LTXexample}[width=0.5\textwidth]
+ \newchessgame[id=show,
+ setfen=2K/k/7R,
+ moveid=10b]
+ \mainline{10... Ka8}
+
+ \chessboard
+
+ \xskakgetgame{nextplayer},
+ \xskakgetgame{nextmovenr},
+ \xskakgetgame{nextmoveid}
+\end{LTXexample}
+
+
+\item[\textbackslash Xskak\meta{GameId}diagramlist]%
+ \index{game data >Xskakdiagramlist=\textbackslash Xskak\meta{GameId}diagramlist}%
+ \index{Xskakdiagramlist=\textbackslash Xskak\meta{GameId}diagramlist}%
+ A comma separated list of moves (a combination of movenr and
+ player), (e.g. 3b,20w). Records the moves with an \$d or \$D
+ after the move. See section \ref{sec:diagrams}.
+
+
+\item[\textbackslash Xskak\meta{GameId}gameid]%
+ \index{game data >Xskakgameid=\textbackslash Xskak\meta{GameId}gameid}%
+ \index{Xskakgameid=\textbackslash Xskak\meta{GameId}gameid}%
+ This command holds the game identification (the value is equal to the value of \meta{GameId}).
+
+\begin{LTXexample}
+ \newchessgame[id=game\arabic{section}]
+ The id of the current game is \xskakgetgame{gameid}
+\end{LTXexample}
+
+
+\end{description}
+
+
+\subsubsection{Optional game information: PGN-infos}
+
+\DescribeMacro{\xskaknewpgninfo}%
+The following commands store various optional information which are
+normally stored in the so-called PGN-infos. You can set them in
+\cs{newchessgame} and retrieve them later. New PGN-infos can be
+defined with the \cs{xskaknewpgninfo}\oarg{default}\marg{name}. With
+the exception of «result» all currently defined commands are empty
+by default.
+
+\begin{description}
+\item[\textbackslash Xskak\meta{GameId}result]%
+ \index{PGN-info data >Xskakresult=\textbackslash Xskak\meta{GameId}result}%
+ \index{Xskakresult=\textbackslash Xskak\meta{GameId}result}%
+ Default is \verb+*+, value should be 1-0, or 1/2-1/2, 0-1 or
+ something like that.
+
+\item[\textbackslash Xskak\meta{GameId}white]%
+ \index{PGN-info data >Xskakwhite=\textbackslash Xskak\meta{GameId}white}%
+ \index{Xskakwhite=\textbackslash Xskak\meta{GameId}white}%
+ The name of the white player.
+
+\item[\textbackslash Xskak\meta{GameId}black]%
+ \index{PGN-info data >Xskakblack=\textbackslash Xskak\meta{GameId}black}%
+ \index{Xskakblack=\textbackslash Xskak\meta{GameId}black}%
+ The name of the black player.
+
+
+\item[\textbackslash Xskak\meta{GameId}whiteelo]%
+ \index{PGN-info data >Xskakwhiteelo=\textbackslash Xskak\meta{GameId}whiteelo}%
+ \index{Xskakwhiteelo=\textbackslash Xskak\meta{GameId}whiteelo}%
+ The elo of the white player.
+
+\item[\textbackslash Xskak\meta{GameId}blackelo]%
+ \index{PGN-info data >Xskakblackelo=\textbackslash Xskak\meta{GameId}blackelo}%
+ \index{Xskakblackelo=\textbackslash Xskak\meta{GameId}blackelo}%
+ The elo of the black player.
+
+
+\item[\textbackslash Xskak\meta{GameId}site]%
+ \index{PGN-info data >Xskaksite=\textbackslash Xskak\meta{GameId}site}%
+ \index{Xskaksite=\textbackslash Xskak\meta{GameId}site}%
+ The site of the tournament.
+
+\item[\textbackslash Xskak\meta{GameId}event]%
+ \index{PGN-info data >Xskakevent=\textbackslash Xskak\meta{GameId}event}%
+ \index{Xskakevent=\textbackslash Xskak\meta{GameId}event}%
+The name of the tournament.
+
+
+
+\item[\textbackslash Xskak\meta{GameId}date]%
+ \index{PGN-info data >Xskakdate=\textbackslash Xskak\meta{GameId}date}%
+ \index{Xskakdate=\textbackslash Xskak\meta{GameId}date}%
+The date of the game.
+
+\item[\textbackslash Xskak\meta{GameId}round]%
+ \index{PGN-info data >Xskakround=\textbackslash Xskak\meta{GameId}round}%
+ \index{Xskakround=\textbackslash Xskak\meta{GameId}round}%
+The round of game.
+
+\end{description}
+
+\subsubsection{The move related data}\label{sec:movedata}
+
+The move data are stored during the parsing of a game with
+\cs{mainline} and/or \cs{hidemoves}. You can split the game in as
+much pieces as you want but {\bfseries you must start a game with
+\cs{newchessgame} and you must use the same game identification for
+each piece} if you don't want to end with broken games.
+
+All values depends on the parsing from \skaksty which in turn depends
+heavily on the correct input: \skaksty knows a bit about the position
+of the game (it needs it e.g. to find out where a piece came from)
+but doesn't analyze it thoroughly. The main work is done by analyzing
+the \emph{notation} e.g. \skaksty will recognize a check by the
++-sign. Quite often \skaksty doesn't recognize illegal moves or wrong
+input syntax (e.g. \texttt{0-0} for casting instead the correct
+\texttt{O-O}) but fails some moves later or shows a wrong position:
+
+\begin{LTXexample}
+ \newchessgame
+ \mainline{1.d4 e5 2.Bc4}
+ \chessboard
+\end{LTXexample}
+
+\paragraph{Piece data}
+
+The following types store the piece which was moved and the piece
+that was perhaps captured. The variants differ in the storing of
+black pieces and pawns:
+
+\begin{description}
+\item[pgnpiece]
+ \index{Move data >pgnpiece}%
+ \index{pgnpiece (move data type)}%
+ K,Q,R,B or N. Is empty for pawn and
+ castling moves.
+
+\item[piecechar]
+ \index{Move data >piecechar}%
+ \index{piecechar (move data type)}%
+ K,Q,R,B,N or p. Is empty for castling.
+
+
+\item[piece]
+ \index{Move data >piece}%
+ \index{piece (move data type)}%
+ K,Q,R,B,N or P or k,q,r,b,n or p (for black). Is empty for castling.
+
+
+\item[pgnlostpiece]
+ \index{Move data >pgnlostpiece}%
+ \index{pgnlostpiece (move data type)}%
+ In case of a capture move: K,Q,R,B, or N.
+
+\item[lostpiecechar]
+ \index{Move data >lostpiecechar}%
+ \index{lostpiecechar (move data type)}%
+ In case of a capture move: K,Q,R,B,N or p, empty
+ else.
+
+
+\item[lostpiece]
+ \index{Move data >lostpiece}%
+ \index{lostpiece (move data type)}%
+ In case of a capture move it stores the lost piece as K,Q,R,B,N or P or
+ k,q,r,b,n or p.
+
+\end{description}
+
+
+\paragraph{Move data}
+
+\begin{description}
+\item[movefrom]
+ \index{Move data >movefrom}%
+ \index{movefrom (move data type)}%
+ The field were the piece came from. Two fields in case of castling moves e.g. «e1,h1».
+
+\item[pgnmovefrom]
+ \index{Move data >pgnmovefrom}%
+ \index{pgnmovefrom (move data type)}%
+ This contains the additional «movefrom» information in the PGN
+ for ambiguous moves or pawn captures.
+ E.g. In case of \wmove{exd5} the value is
+ «e», in case of \wmove{Nbd2} it is «b».
+
+\item[moveto]
+ \index{Move data >moveto}%
+ \index{moveto (move data type)}%
+ The field were the piece move to. Two fields in case of castling moves e.g. «g1,f1».
+
+\item[enpassant]
+ \index{Move data >enpassant}%
+ \index{enpassant (move data type)}%
+ Sets the boolean \texttt{xskakboolenpassant} to true if the move
+ was an enpassant capture.
+
+\item[enpassantsquare]
+ \index{Move data >enpassantsquare}%
+ \index{enpassantsquare (move data type)}%
+ A field, after e.g. e4 the value is e3. Indicates if the next
+ pawn move can be an enpassant capture.
+
+\begin{LTXexample}
+ \newchessgame[restorefen=example]
+ \mainline{1. a4 h5}
+ \chessboard[lastmoveid,
+ pgfstyle=border,
+ color=red,
+ markfield=\xskakget{enpassantsquare},
+ moveid=1w, color=blue,
+ markfield=\xskakget{enpassantsquare}]
+\end{LTXexample}
+
+\item[castling]
+ \index{Move data >castling}%
+ \index{castling (move data type)}%
+ Sets the boolean \texttt{xskakboolcastling}, is true for short
+ *and* long castling!
+
+
+\item[longcastling]
+ \index{Move data >longcastling}%
+ \index{longcastling (move data type)}%
+ Sets the boolean \texttt{xskakboollongcastling}.
+
+\item[capture]
+ \index{Move data >capture}%
+ \index{capture (move data type)}%
+ Sets the boolean \texttt{xskakboolcapture}.
+
+
+\item[promotion]
+ \index{Move data >promotion}%
+ \index{promotion (move data type)}%
+ Sets the boolean \texttt{xskakboolpromotion}.
+
+
+\item[promotionpiece]
+ \index{Move data >promotionpiece}%
+ \index{promotionpiece (move data type)}%
+ Q,R,B or N or q,r,b or n or empty.
+
+\item[promotionpiecechar]
+ \index{Move data >promotionpiecechar}%
+ \index{promotionpiecechar (move data type)}%
+ Q,R,B or N or empty.
+
+\begin{LTXexample}
+ \newcommand\testpromotion{%
+ \xskakget{promotion}%
+ \ifthenelse{\boolean{xskakboolpromotion}}
+ {A pawn promoted to
+ \figsymbol{\xskakget{promotionpiecechar}}}
+ {No promotion in this move}}
+ \newchessgame[restorefen=example]
+ \mainline{1. c8=Q+ Ke7}
+
+ \xskakset{moveid=1w}
+ \testpromotion
+
+ \xskakset{moveid=1b}
+ \testpromotion
+\end{LTXexample}
+
+
+\end{description}
+
+\paragraph{Other data/combinations}
+
+\begin{description}
+\item[addpieces]
+ \index{Move data >addpieces}%
+ \index{addpieces (move data type)}%
+ contains the (list of) piece(s) that should be put on the
+ board.\\ E.g. \verb+{kg8,rf8}+ in case of black short castling.
+
+\item[clearfields]
+ \index{Move data >clearfields}%
+ \index{clearfields (move data type)}%
+ The list of fields that should be emptied on the board (equal
+ to the movefrom field with the exception of enpassant moves).
+
+\item[nextfen]
+ \index{Move data >nextfen}%
+ \index{nextfen (move data type)}%
+ The fen position \emph{after} the current move.
+
+\item[pastfen]
+ \index{Move data >pastfen}%
+ \index{pastfen (move data type)}%
+ The fen position \emph{before} the current move (identical to
+ the fen \emph{after} the previous move).
+
+\item[san]
+ \index{Move data >san}%
+ \index{san (move data type)}%
+ The standard algebraic notation of the move. It use chess
+ commands: E.g.
+ \\\verb+\textsymfigsymbol{R}a2+ for \textsymfigsymbol{R}a2
+ \\\verb+e\capturesymbol d5+ for e\capturesymbol d5,
+ \\\verb+\castlingchar\castlinghyphen\castlingchar+ for
+ \castlingchar\castlinghyphen\castlingchar\\
+ It contains also the signs for chess and mate, but not the
+ comments.
+
+\item[lan]
+ \index{Move data >lan}%
+ \index{lan (move data type)}%
+ Long algebraic notation of the move, similar to \texttt{san}.
+
+\medskip
+\begin{LTXexample}[varwidth=false,width=0.3\textwidth]
+ \newchessgame
+ \mainline{1.f3 e5 2. g4?? Qh4+#!}
+
+ \xskakset{moveid=2w}%
+ \xskakget{san}, \xskakget{lan}
+
+ \xskakset{moveid=2b}%
+ \xskakget{san}, \xskakget{lan}
+\end{LTXexample}
+
+
+
+\item[opennr]
+ \index{Move data >opennr}%
+ \index{opennr (move data type)}%
+ This contains the code to print the number like \skaksty would do
+ it if you start or continue a game with this move. The style must be set independantly either with
+ a \cs{styleX} of \packagename{skak} or -- if you use the new interface of
+ \packagename{xskak} to set a style -- with \cs{xskakset} and \cs{mainlinestyle} or \cs{variationstyle}.
+
+\medskip
+\begin{LTXexample}[varwidth=false,width=0.3\textwidth]
+ \newchessgame
+ \mainline{1.e4 e5}
+
+ \xskakset{moveid=1w}%
+ \xskakget{opennr}\xskakget{lan},
+ {\styleB\mainlinestyle
+ \xskakget{opennr}\xskakget{lan}}
+
+
+ \xskakset{moveid=1b}%
+ \xskakget{opennr}\xskakget{lan}
+ \xskakset{style=styleA,level=1}
+ {\mainlinestyle
+ \xskakget{opennr}\xskakget{lan}}
+
+ \xskakset{style=UF}%return to my style
+\end{LTXexample}
+
+\item[comments]%
+ \index{Move data >comments}%
+ \index{comments (move data type)}%
+ contains the short comments after a move (!,? \withattack{} etc)
+
+\medskip
+\begin{LTXexample}[varwidth=false,width=0.3\textwidth]
+ \newchessgame
+ \mainline{1.f3 e5 2. g4?? Qh4+#!}
+
+ \xskakset{moveid=2w}%
+ \xskakget{comments}
+
+ \xskakset{moveid=2b}%
+ \xskakget{comments}
+\end{LTXexample}
+
+
+\item[nag]
+ \index{Move data >nag}%
+ \index{nag (move data type)}
+ NAG's and comments inputed with \cs{xskakcomment}.
+
+\begin{LTXexample}[varwidth=false,width=0.3\textwidth]
+ \newchessgame
+ \mainline{1.f3 e5 2. g4
+ $4 \xskakcomment{ Why this? } Qh4+#!}
+
+ \xskakset{moveid=2w}%
+ \xskakget{nag}
+\end{LTXexample}
+
+\end{description}
+
+\subsection{Exporting the games}
+
+\DescribeMacro{\xskakexportgames}%
+With \cs{xskakexportgames}\keyoarg{} you can export games to a file.
+As default the command exports the game data of the game with the
+default \meta{GameId} to the file \texttt{xskakgames.xsk}\footnote{I
+didn't find any other application that use this extension. So I think
+it is quite safe.}.
+
+The command accept the following keys:
+\begin{description}
+\item[\key{file=}\meta{string}]
+ \index{xskakexportgames=\verb!*+\xskakexportgames+>file (key)}%
+ \index{file (\texttt{\textbackslash xskakexportgames} key)}
+ This changes the name of the file. The extension can not be changed.
+\item[\key{games=\{}\meta{comma separated list of games}\texttt{\}}]
+ \index{xskakexportgames=\verb!*+\xskakexportgames+>games (key)}%
+ \index{games (\texttt{\textbackslash xskakexportgames} key)}%
+ With this key you can chose the games that should be exported.
+\end{description}
+
+
+You can then input the games in other document and use there the game
+data without have to do all the parsing with \cs{mainline} again
+(which can be quite slow). The export file is also quite handy to
+debug the game parsing and saving.
+
+As an example I exported in another document the following two games
+which I will use later in this documentation:
+
+\begin{lstlisting}
+ \newchessgame[id=export,white=Deep Blue, black=Kasparov,result=1-0]
+ \mainline{1.e4 c6 2.d4 d5 3.Nc3 dxe4 4.Nxe4 Nd7 5.Ng5 Ngf6 6.Bd3 e6
+ 7.N1f3 h6 8.Nxe6 Qe7 9.O-O fxe6 10.Bg6+ Kd8 \xskakcomment{Kasparov
+ schüttelt kurz den Kopf} 11.Bf4 b5 12.a4 Bb7 13.Re1 Nd5 14.Bg3 Kc8
+ 15.axb5 cxb5 16.Qd3 Bc6 17.Bf5 exf5 18.Rxe7 Bxe7 19.c4}
+
+ \newchessgame[white=none,black=none,id=exportb]
+ \mainline{1. e4 e5}
+
+ \xskakexportgames[games={export,exportb}]
+\end{lstlisting}
+
+\DescribeMacro{\xskakendgamedata}%
+\DescribeMacro{\xskakcurrentgameid}%
+The export consists more or less of a long list of definitions with
+one notable exception: At the end of each game there is the command
+\cs{xskakendgamedata}. As a default the command does nothing but if
+you redefine it e.g. to \cs{printchessgame} (see section
+\ref{sec:print}), it can be used to print all games during the input.
+\cs{xskakcurrentgameid} holds the \meta{GameId} of the previous game.
+
+\begin{LTXexample}
+ \renewcommand\xskakendgamedata
+ {\xskakset{id=\xskakcurrentgameid}%
+ \xskakgetgame{white}--\xskakgetgame{black}:
+ \printchessgame[style=styleB,level=1]
+ \par\bigskip}
+ \input{xskakgames.xsk}
+\end{LTXexample}
+
+
+
+\subsection{The inner technique: how the data are stored}
+
+The game related data are stored in commands with names of
+the following structure:\\[0.5ex]
+%
+\indent{\ttfamily Xskak\meta{GameId}\meta{type of Information}}\\[0.5ex]
+%
+If \meta{GameId} is a simple string of characters you can use the
+command by putting a backslash before the name, in other case you
+will have to use \cs{csname}\ldots\cs{endcsname}.
+
+The move related data are stored in commands with names that
+have the following structure:\\[0.5ex]
+{\ttfamily Xskak.\meta{GameId}.\meta{movenr}.\meta{player}.\meta{type
+of Information}}\\[0.5ex]
+As the names contain points and a number it is not possible to
+execute the commands by putting a backslash before the name. If you
+want to use them you will have to surround the name by
+\cs{csname}\ldots\cs{endcsname}
+ -- something that probably will not be necessary in normal cases as
+there are user commands that allows «normal» access.
+
+During storing the data \meta{movenr} and \meta{player} are taken
+from the current move as processed by \skaksty, that is
+\verb+\mainline{15... Nf3}+ will store the data in \\{\ttfamily
+Xskak.\meta{GameId}.15.b.\meta{type of Information}}. \\Renumbering
+the moves during storing is not possible\footnote{But it would be
+probably not difficult to implement. So if you need it badly, sent me
+a feature request.}.
+
+Example \ref{ex:internal} on page \pageref{ex:internal} shows an
+example that use the internal commands. As you can see, the
+\cs{csname}--\cs{endcsname}-input is quite powerful: You can
+construct a command with the help of other (expandable) commands or
+use the value of counters.
+
+\minisec{Warning!} \verb+\csname whatever\endcsname+ doesn't give an
+error if the command isn't defined. It simply defines \cs{whatever}
+as \cs{relax} and then executes it. So it is easy to overlook typing
+errors -- and then to wonder why one doesn't get the expected output.
+
+
+\begin{LTXexample}[pos=t,
+ width=\textwidth,
+ float,caption=Using the internal commands,
+ label=ex:internal,
+ language=TeX,
+ texcs={mainline,figsymbol,xskakgameAlastmovenr,
+ xskakgameinitmovenr,xskakgameinitmovenr,
+ newchessgame,xskakgameinitmovenr,chessboard},
+ texcsstyle=*\color{blue},
+ texcs={[2]{ifthenelse,boolean,csname,endcsname,the,value,numexpr,relax}},
+ texcsstyle={*[2]{\color{red}}}]
+ \begin{multicols}{2}
+ \minisec{Game 1}\newchessgame[id=gameA]%
+ \mainline{1. e4 e5 2. Nf3 Nc6 3. Bb5 Nf6 4. O-O Nxe4 5.Bxc6 bxc6}
+
+ \minisec{Game 2}\newchessgame[id=game,restorefen=example,moveid=15w]%
+ \mainline{15. c8=Q+ Ke7 16. Rd1}
+
+ \minisec{Comments}\setcounter{enumi}{1}%
+ In the first game, white moved at first a
+ \figsymbol{\csname Xskak.gameA.\the\value{enumi}.w.piecechar\endcsname},
+ then a \figsymbol{%
+ \csname Xskak.gameA.\the\numexpr\the\value{enumi}+1\relax.w.piecechar\endcsname}
+ and a \figsymbol{%
+ \csname Xskak.gameA.\the\numexpr\the\value{enumi}+2\relax.w.piecechar\endcsname}.
+ In his last move black took a
+ \figsymbol{\csname Xskak.gameA.\XskakgameAlastmovenr.b.lostpiecechar\endcsname},
+ white took a \figsymbol{\csname
+ Xskak.gameA.5.w.lostpiecechar\endcsname}.
+
+ In the second game the second move of white was
+ \figsymbol{%
+ \csname Xskak.game.\the\numexpr \Xskakgameinitmovenr +1\relax.w.piece\endcsname}%
+ \csname Xskak.game.16.w.movefrom\endcsname--%
+ \csname Xskak.game.16.w.moveto\endcsname.
+
+ The position in the first game after the third move of black was:
+
+ \chessboard[tinyboard, setfen=\csname Xskak.gameA.3.b.nextfen\endcsname]
+ The fourth move of white was\csname
+ Xskak.gameA.4.w.castling\endcsname
+ \ifthenelse{\boolean{xskakboolcastling}}{}{not} a castling move.
+ \end{multicols}
+\end{LTXexample}
+
+\clearpage
+
+
+\section{Retrieving the stored information}
+
+\subsection{Setting the variables}
+
+\DescribeMacro{\xskakset}%
+It should be clear that to retrieve the information you must tell
+\packagename{xskak} the game and the move for which you want to get
+data. This is done with \cs{xskakset}\keymarg{} which will set the
+variables \meta{GameId} and/or \meta{MoveId} to the values listed in
+the \keylist.
+
+Some possible\footnote{More keys are described later.} keys are:
+\begin{description}
+\item[\key{id=}\meta{name}]
+ \index{xskakset=\verb!*+\xskakset+>id (key)}%
+ \index{id (\texttt{\textbackslash xskakset} key)}%
+The key will set/change globally the active game identification, the
+\meta{GameId}. This will also affect the storing of the following
+moves! So if you change the \meta{GameId} in the middle of the
+parsing of a game, don't forget to reset it to the old value before
+continuing!
+
+
+\item[\key{movenr=}\meta{number}, \key{player=}\meta{«w» or «b»},
+\key{moveid=}\meta{number + «w» or «b»}]
+ \index{xskakset=\verb!*+\xskakset+>movenr (key)}%
+ \index{movenr (\texttt{\textbackslash xskakset} key)}%
+ \index{xskakset=\verb!*+\xskakset+>player (key)}%
+ \index{player (\texttt{\textbackslash xskakset} key)}%
+ \index{xskakset=\verb!*+\xskakset+>moveid (key)}%
+ \index{moveid (\texttt{\textbackslash xskakset} key)}%
+ The keys will set the move number and the player. The values are global but
+ the values of \key{movenr} and \key{player} are not expanded
+ directly while the value of \key{moveid} is. The keys change only
+ the internal commands that are used to retrieve information, the
+ move counter and the boolean of \cs{mainline} are not affected by this keys.
+
+\item[\key{stepmoveid=}\meta{number}]
+ \index{xskakset=\verb!*+\xskakset+>stepmoveid (key)}%
+ \index{stepmoveid (\texttt{\textbackslash xskakset} key)}%
+\key{stepmoveid} picks up the current value of the move variables of
+\packagename{xskak} and «adds» the given number of halfmoves. When no
+number is given the value 1 is used and this gives the next move.
+E.g. if the current move is \texttt{10w} and you use
+\texttt{stepmoveid=3} then you get \texttt{11b}. Negative numbers can
+be used, if this results in a move number smaller than 1, a warning
+is given but not an error: This gives you the possibility e.g. in
+loops to handle the case yourself.
+
+
+
+\item[\key{lastmoveid=}\meta{GameId}]
+ \index{xskakset=\verb!*+\xskakset+>lastmoveid (key)}%
+ \index{lastmoveid (\texttt{\textbackslash xskakset} key)}%
+ This key sets the \packagename{xskak} move identification
+ commands
+ to the number/color of the last move
+ of the game \meta{GameId}. \meta{GameId} is optional.
+ \texttt{lastmoveid=A} ist equivalent to
+ \texttt{id=A,lastmoveid}.
+
+
+
+
+\item[\key{tag=}\meta{name}, \key{ref\ldots=}\meta{name}]
+ \index{xskakset=\verb!*+\xskakset+>tag (key)}%
+ \index{tag (\texttt{\textbackslash xskakset} key)}%
+ \index{xskakset=\verb!*+\xskakset+>refid (key)}%
+ \index{refid (\texttt{\textbackslash xskakset} key)}%
+ \index{xskakset=\verb!*+\xskakset+>refnextmoveid(key)}%
+ \index{refnextmoveid (\texttt{\textbackslash xskakset} key)}%
+ \index{xskakset=\verb!*+\xskakset+>refpastmoveid(key)}%
+ \index{refpastmoveid (\texttt{\textbackslash xskakset} key)}%
+ \index{xskakset=\verb!*+\xskakset+>refpastmovenr (key)}%
+ \index{refpastmovenr (\texttt{\textbackslash xskakset} key)}%
+ \index{xskakset=\verb!*+\xskakset+>refpastplayer (key)}%
+ \index{refpastplayer (\texttt{\textbackslash xskakset} key)}%
+ \index{xskakset=\verb!*+\xskakset+>refnextmovenr (key)}%
+ \index{refnextmovenr (\texttt{\textbackslash xskakset} key)}%
+ \index{xskakset=\verb!*+\xskakset+>refnextplayer (key)}%
+ \index{refnextplayer (\texttt{\textbackslash xskakset} key)}%
+ \index{xskakset=\verb!*+\xskakset+>refpast (key)}%
+ \index{refpast (\texttt{\textbackslash xskakset} key)}%
+ \index{xskakset=\verb!*+\xskakset+>refnext (key)}%
+ \index{refnext (\texttt{\textbackslash xskakset} key)}%
+
+
+\key{tag} saves the current values of \meta{GameId} and the move in
+internal commands. They can then later be retrieved by the keys of
+type \key{ref}.
+
+For more information on the labeling and referencing see section
+\ref{sec:labeling}.
+
+\item[\key{defaultid=}\meta{name}]
+ \index{xskakset=\verb!*+\xskakset+>defaultid (key)}%
+ \index{defaultid (\texttt{\textbackslash xskakset} key)}%
+ With this key you can change the default game identification.
+ The change is global.
+
+\begin{LTXexample}
+ \setcounter{gamecounter}{4}
+ \xskakset{defaultid=game\Alph{gamecounter}}
+
+ \newchessgame[white=John]
+ \mainline{1. e4 e5}
+
+ \stepcounter{gamecounter}
+ \newchessgame[white=Jack]
+ \mainline{1. d4 d5}
+
+ The white players were \XskakgameDwhite\ and \XskakgameEwhite.
+\end{LTXexample}
+
+
+\item[\key{defaultmovenr=}\meta{number},
+ \key{defaultplayer=}\meta{«w» or «b»},]
+\item[\key{defaultmoveid=}\meta{number}\meta{«w» or «b»}]
+ \index{xskakset=\verb!*+\xskakset+>defaultmoveid (key)}%
+ \index{defaultmoveid (\texttt{\textbackslash xskakset} key)}%
+ \index{xskakset=\verb!*+\xskakset+>defaultmovenr (key)}%
+ \index{defaultmovenr (\texttt{\textbackslash xskakset} key)}%
+ \index{xskakset=\verb!*+\xskakset+>defaultplayer (key)}%
+ \index{defaultplayer (\texttt{\textbackslash xskakset} key)}%
+ With this keys you can change the default start move for the
+ subsequent games. The change is global.
+
+\item[\key{defaultfen=}\meta{FEN}]
+ \index{xskakset=\verb!*+\xskakset+>defaultfen (key)}%
+ \index{defaultfen (\texttt{\textbackslash xskakset} key)}%
+ As a default \cs{newchessgame} sets the start position to a new
+ game. You can change this default with this key. The change is
+ global.
+
+\end{description}
+
+
+
+\subsection{Getting the game information}
+
+\DescribeMacro{\xskakgetgame}%
+With \cs{xskakgetgame}\marg{type} you can retrieve game data
+for the currently active \meta{GameId} (which can be set/changed with
+the commands \cs{newchessgame}, \cs{resumechessgame} and
+\cs{xskakset}).
+
+\begin{LTXexample}[width=0.5\textwidth]
+ \newchessgame[id=A,white=John White,
+ black=Jack Black,
+ result=1--0]
+ \minisec{\xskakgetgame{white}--
+ \xskakgetgame{black}}
+ \mainline{1.e4 e5 2.Bc4 Nc6 3. Qh5 Nf6 4.Qxf7#}
+ \mbox{\xskakgetgame{result}}
+
+
+ \newchessgame[id=B,
+ white=Harry Red,
+ black=Tom Green,
+ result=0--1,
+ setwhite={kd1},
+ addblack={kd3,rc5}]
+ \chessboard[setfen={\xskakgetgame{initfen}}]
+ \minisec{\xskakgetgame{white} --
+ \xskakgetgame{black}}
+ \mainline{1. Ke1 Rf5 2. Kd1 Rf1#} \mbox{\xskakgetgame{result}}
+\end{LTXexample}
+
+It is also possible to get the stored information by simply calling
+the command\\ \cs{xskak}\meta{gameid}\meta{type} (if \meta{gameid}
+consists of letters).
+
+\begin{LTXexample}[width=0.5\textwidth]
+ \newchessgame[id=A,white=John White,
+ black=Jack Black, result=1--0]
+ \minisec{\XskakAwhite\ -- \XskakAblack}
+ \mainline{1.e4 e5 2.Bc4 Nc6 3. Qh5 Nf6 4.Qxf7#}
+ \mbox{\XskakAresult}
+ \newchessgame[id=B,white=Harry Red,
+ black=Tom Green, result=0--1]
+ \minisec{\XskakBwhite\ -- \XskakBblack}
+ \mainline{1.f3 e5 2.g4 Qh4#}
+ \mbox{\XskakBresult}
+
+ \minisec{List of Results}
+ \begin{tabular}[t]{l@{\,--\,}lr}
+ \XskakAwhite&\XskakAblack&\XskakAresult\\
+ \XskakBwhite&\XskakBblack&\XskakBresult
+ \end{tabular}
+
+ \minisec{Final positions}
+ \chessboard[tinyboard,lastmoveid=A,
+ setfen=\xskakget{nextfen}]
+ \chessboard[tinyboard,lastmoveid=B,
+ setfen=\xskakget{nextfen}]
+\end{LTXexample}
+
+%If \meta{gameid} contains non-letter chars (e.g. a number) you must
+%use\\
+%\cs{csname}\texttt{~xskak}\meta{gameid}\meta{type}\cs{endcsname}.
+%
+%If the \meta{gameid} or the \meta{type} are stored in commands you
+%can use this commands in \cs{csname}\texttt{\ldots}\cs{endcsname}:
+%\cs{csname}\texttt{~xskak}\cs{mygameid}\cs{mygametype}\cs{endcsname}
+
+
+
+\subsection{Getting the move information}
+
+Move data are bit more difficult as they depend on more
+variables.
+
+At first, you can naturally use a
+\cs{csname}\texttt{\ldots}\cs{endcsname}:\\
+\cs{csname}\texttt{~xskak}.\meta{gameid}.\meta{movenr}.\meta{player}.\meta{type}\cs{endcsname}.
+
+
+But normally you should use a
+\cs{xskakset}/\cs{xskakget}-combination%
+\footnote{I had to implement the retrieving as a two-step-method to
+ be able to use the retrieving command in the \keylist of
+\cs{chessboard}. As the values are expanded during
+ the processing complicated commands which use internally \cs{def}
+ and \cs{setkeys} can not be used as values.}.
+
+
+\DescribeMacro{\xskakget}%
+\cs{xskakget}\marg{type} will pick up the current values of the
+variables for the \meta{GameId} and the \meta{MoveId} and then
+retrieve/print the content of type \meta{type}.
+
+ \index{Move data >movenr (virtual type)}%
+ \index{movenr (virtual move data type)}%
+ \index{Move data >moveid (virtual type)}%
+ \index{moveid (virtual move data type)}%
+ \index{Move data >player (virtual type)}%
+ \index{player (virtual move data type)}%
+\meta{type} can be any of the types described in \ref{sec:movedata}
+and additionally the three virtual types \textsf{movenr},
+\textsf{player} and \textsf{moveid} can be used which will output the
+current move identification. This allows easier retrieving of the
+current value of the internal variables e.g. in loops and tests.
+
+\textbf{Attention:} The move variables are not changed by the parsing
+command of \skaksty. And they are not stored like the other types --
+you can't retrieve them with a
+\cs{csname}\texttt{\ldots}\cs{endcsname} construction.
+
+\begin{LTXexample}
+\newchessgame[moveid=10b]
+\mainline{10... e5}
+
+The game started with move \xskakget{moveid}.
+
+\xskakset{moveid=5w}
+Now the moveid has value \xskakget{movenr}\xskakget{player}.
+\end{LTXexample}
+
+
+
+\subsection{Using the data with \texttt{\textbackslash chessboard}}
+
+The move data can naturally be used with \cs{chessboard} e.g. to
+highlight the last move with an arrow. The \meta{MoveId} you want to
+refer to can be set before the board with \cs{xskakset} but if this
+were the sole possibility this would mean that you couldn't get data
+from other moves. So I defined a bunch of new keys for
+\cs{chessboard} (and changed some existing keys) which allows to
+retrieve during building the board all available move datas. The most
+important ones are keys that tells \cs{chessboard} the \meta{GameId}
+and the \meta{MoveId} for which you want to retrieve datas:
+
+\begin{description}
+\item[\key{id=}\meta{name}]
+ \index{chessboard=\verb!*+\chessboard+>id (key)}%
+ \index{movenr (\texttt{\textbackslash chessboard} key)}%
+ Like the other \key{id}-keys this one sets the variable that
+ identifies the game. But setting this key will \emph{not} affect
+ the value of the game identification outside the board, any
+ change is local to the board.
+
+\textbf{Attention:} Setting this key will \emph{not} change the
+default position shown by \cs{chessboard}. This is always the
+«current» game.
+
+\item[\key{movenr=}\meta{number}, \key{player=}\meta{«w» or «b»}, \key{moveid=}\meta{number + «w» or «b»}]
+ \index{chessboard=\verb!*+\chessboard+>movenr (key)}%
+ \index{movenr (\texttt{\textbackslash chessboard} key)}%
+ \index{chessboard=\verb!*+\chessboard+>player (key)}%
+ \index{player (\texttt{\textbackslash chessboard} key)}%
+ \index{chessboard=\verb!*+\chessboard+>moveid (key)}%
+ \index{moveid (\texttt{\textbackslash chessboard} key)}%
+ This keys stores the number and player for which you want to retrieve
+ move related information. Again any setting is local to the board.
+
+
+
+\item[\key{stepmoveid=}\meta{number}]
+ \index{xskakset=\verb!*+\chessboard+>stepmoveid (key)}%
+ \index{stepmoveid (\texttt{\textbackslash chessboard} key)}%
+Like the similar key of \cs{xskakset} \key{stepmoveid} picks up the
+current value of the move variables of \packagename{xskak} and «adds»
+the given number of halfmoves. But again when you use the key in the
+argument of \cs{chessboard} the change is local to the board.
+
+\textbf{Attention:} If you set the \meta{MoveId} with the above keys
+to a value «outside» the game and then try to retrieve a data you
+will probably get horrible errors.
+
+
+\item[\key{lastmoveid=}\meta{gameid}]
+ \index{chessboard=\verb!*+\chessboard+>lastmoveid (key)}%
+ \index{lastmoveid (\texttt{\textbackslash chessboard} key)}
+The usual case is probably that you want to use the (currently) last
+move of a game. This can be done with this key. The (optional) value
+lets you specify a game identification. \texttt{lastmoveid=A} ist
+equivalent to \texttt{id=A,lastmoveid}. Again the setting is local to
+the board.
+
+\end{description}
+
+ \index{xskakget=\verb!*+\xskakget+ (with \texttt{\textbackslash chessboard})}%
+After you have set the move variables, you can use the command
+\cs{xskakget}\marg{type} described above used without
+problems\footnote{I hope but I haven't tested any possible usage.}
+inside \cs{chessboard} as long as the value expands to something the
+keys can handle (\key{markmove} e.g. will not like it if you ask it
+to process a fen).
+
+\begin{LTXexample}[width=0.4\textwidth]
+ \newchessgame[id=A,white=John White,
+ black=Jack Black, result=1--0]
+ \mainline{1.e4 e5 2.Bc4 Nc6 3. Qh5 Nf6 4.Qxf7#}
+
+ \newchessgame % a game between A and the board
+ \mainline{1.e4}
+
+ \setchessboard{shortenend=5pt,color=red}%
+ \chessboard[lastmoveid=A,setfen=\xskakget{nextfen},
+ pgfstyle=border,color=red,
+ markfields={\xskakget{moveto},\xskakget{movefrom}},
+ pgfstyle=straightmove,
+ markmove=\xskakget{movefrom}-\xskakget{moveto}]
+\end{LTXexample}
+
+
+\begin{LTXexample}[width=0.4\textwidth,escapechar=/]
+ \newchessgame[id=A]
+ \mainline{1.e4 e5 2.Bc4 Nc6 3. Qh5 Nf6 4.Qxf7#}
+
+ \xskakget{moveid}% to show /\meta{MoveId} is still 1w/
+
+ \setchessboard{shortenend=5pt,color=red}%
+ \chessboard[lastmoveid=A,setfen=\xskakget{nextfen},
+ moveid=1w,
+ pgfstyle=straightmove,
+ markmove=\xskakget{movefrom}-\xskakget{moveto},
+ stepmoveid=2,color=green,
+ markmove=\xskakget{movefrom}-\xskakget{moveto},
+ stepmoveid=2,color=blue,
+ markmove=\xskakget{movefrom}-\xskakget{moveto},
+ stepmoveid=2,color=yellow,
+ markmove=\xskakget{movefrom}-\xskakget{moveto}]
+
+\xskakget{moveid}% to show that /\meta{MoveId} is again 1w/
+\end{LTXexample}
+
+
+\subsection{Labeling a game}\label{sec:labeling}
+
+It is a bit tedious to have to remember the number and the color of
+the moves when you want to start or to continue a game, or for which
+you want to draw a diagram or retrieve another move information. So
+there is a sort of labeling system. In difference to the labeling in
+normal \LaTeX\ it doesn't write the values to auxiliary files. That
+means that you can't reference labels which come later in the
+document (at my opinion this would lead to chaos anyway).
+
+
+
+To set a label you use the command \cs{xskakset} with the key
+\key{tag}\footnote{The name «label» is used by \cs{chessboard} to set
+the labels of the boards.}.%
+ \index{xskakset=\verb!*+\xskakset+>tag (key)}%
+ \index{tag (\texttt{\textbackslash xskakset} key)}
+It saves the current value of the move counter (the
+\packagename{skak} counter!), the value of the (\packagename{skak}!)
+boolean that holds the player and the \meta{GameId}. If you haven't
+started any game yet (more precisely: if the move counter has value
+0) then \xskak will issue a warning and do nothing.
+
+You can set the tag between two \cs{mainline} (or \cs{hidemoves})
+commands, but it works also if you put them directly in the argument
+of \cs{mainline}:
+
+\begin{LTXexample}
+ \newchessgame%
+ \mainline{1. e4 e5\xskakset{tag=A}
+ 2. Nf3\xskakset{tag=B} Nc6
+ 3. Bb5 Nf6
+ 4. O-O Nxe4
+ 5.Bxc6 bxc6}
+
+\end{LTXexample}
+
+
+The saved values can be retrieved with various keys of type \key{ref}
+(e.g. \key{refpastmoveid}, \key{refnextplayer}), or by the command
+\cs{xskakget}.
+
+The label is set in most cases between two moves. There probably will
+be cases when you need the \meta{MoveId} of the move \emph{before}
+the tag e.g. to show the position or to comment on the last move, and
+there will be cases when you will need the \meta{MoveId} of the move
+\emph{after} the tag e.g. to continue the game. So there are ref-keys
+for both cases.
+
+\subsubsection{Retrieving the tagged values with \texttt{\textbackslash
+xskakget}}
+
+Retrieving the \meta{GameId} and/or \meta{MoveId} values stored by a
+\key{tag} is again a more-than-one-step procedure: At first you must
+tell \packagename{xskak} the tag name you want to use, and then use a
+\cs{xskakget}\marg{list of ref types}, where \meta{ref type} is one
+of the following keywords: {\ttfamily refid, refpastmoveid,
+refnextmoveid, refpastmovenr, refnextmovenr, refpastplayer,
+refnextplayer}.
+
+
+ \index{resumechessgame=\verb!*+\resumechessgame+>reftag (key)}%
+ \index{reftag (\texttt{\textbackslash resumechessgame} key)}%
+ \index{newchessgame=\verb!*+\newchessgame+>reftag (key)}%
+ \index{reftag (\texttt{\textbackslash newchessgame} key)}%
+ \index{xskakset=\verb!*+\xskakset+>reftag (key)}%
+ \index{reftag (\texttt{\textbackslash xskakset} key)}%
+ \index{xskakloop=\verb!*+\xskakloop+>reftag (key)}%
+ \index{reftag (\texttt{\textbackslash xskakloop} key)}%
+ \index{printchessgame=\verb!*+\xskakloop+>reftag (key)}%
+ \index{reftag (\texttt{\textbackslash printchessgame} key)}%
+ \index{chessboard=\verb!*+\chessboard+>reftag (key)}%
+ \index{reftag (\texttt{\textbackslash chessboard} key)}%
+Setting the tag name is done with the key \key{reftag}, which you can
+use with all commands that accept the key \key{id}. If you use the
+key in the optional argument of \cs{chessboard} it will change the
+tag name locally for the board. In all other cases the tag name is
+set globally.
+
+\begin{LTXexample}[escapechar=/]
+ \newchessgame[id=new] % to set a new id
+ \chessboard[
+ reftag=B,%from previous example
+ id=\xskakget{refid},
+ %retrieves and sets the /\meta{Gameid}/ from tag B
+ moveid=\xskakget{refnextmoveid},
+ %retrieves and sets the /\meta{Moveid}/ from tag B
+ setfen=\xskakget{pastfen}]
+\end{LTXexample}
+
+
+\subsubsection{The \key{ref}-keys}
+
+As the more-step-procedure to use the tags is a bit longuish there
+exist keys that shorten the procedure. This keys too work in the
+arguments of all commands that can also handle the correspondant keys
+\key{id}, \key{moveid} etc. The effect will be identical to setting
+the values directly: Keys used in the optional argument of
+\cs{chessboard} will set their values only local to the board, in the
+other cases the values are set globally.
+
+\begin{description}
+\item[\key{refid=}\meta{tag}]
+ \index{resumechessgame=\verb!*+\resumechessgame+>refid (key)}%
+ \index{refid (\texttt{\textbackslash resumechessgame} key)}%
+ \index{newchessgame=\verb!*+\newchessgame+>refid (key)}%
+ \index{refid (\texttt{\textbackslash newchessgame} key)}%
+ \index{xskakset=\verb!*+\xskakset+>refid (key)}%
+ \index{refid (\texttt{\textbackslash xskakset} key)}%
+ \index{xskakloop=\verb!*+\xskakloop+>refid (key)}%
+ \index{refid (\texttt{\textbackslash xskakloop} key)}%
+ \index{chessboard=\verb!*+\chessboard+>refid (key)}%
+ \index{refid (\texttt{\textbackslash chessboard} key)}%
+
+This key will set the \meta{GameId} to the value stored in the tag.
+It is a shortcut for\\
+\key{reftag=}\meta{tag},\key{id=}\cs{xskakget}verb+{refid}+
+
+
+\item[\key{refpastmoveid=}\meta{tag}, \key{refpastmovenr=}\meta{tag}, \key{refpastplayer=}\meta{tag} ]
+ \index{resumechessgame=\verb!*+\resumechessgame+>refpastmoveid (key)}%
+ \index{refpastmoveid (\texttt{\textbackslash resumechessgame} key)}%
+ \index{resumechessgame=\verb!*+\resumechessgame+>refpastmovenr (key)}%
+ \index{refpastmovenr (\texttt{\textbackslash resumechessgame} key)}%
+ \index{resumechessgame=\verb!*+\resumechessgame+>refpastplayer (key)}%
+ \index{refpastplayer (\texttt{\textbackslash resumechessgame} key)}%
+ %
+ \index{newchessgame=\verb!*+\newchessgame+>refpastmovenr (key)}%
+ \index{refpastmovenr (\texttt{\textbackslash newchessgame} key)}%
+ \index{newchessgame=\verb!*+\newchessgame+>refpastmoveid (key)}%
+ \index{refpastmoveid (\texttt{\textbackslash newchessgame} key)}%
+ \index{newchessgame=\verb!*+\newchessgame+>refpastplayer (key)}%
+ \index{refpastplayer (\texttt{\textbackslash newchessgame} key)}%
+ %
+ \index{xskakset=\verb!*+\xskakset+>refpastmoveid (key)}%
+ \index{refpastmoveid (\texttt{\textbackslash xskakset} key)}%
+ \index{xskakset=\verb!*+\xskakset+>refpastmovenr (key)}%
+ \index{refpastmovenr (\texttt{\textbackslash xskakset} key)}%
+ \index{xskakset=\verb!*+\xskakset+>refpastplayer (key)}%
+ \index{refpastplayer (\texttt{\textbackslash xskakset} key)}%
+ %
+ \index{chessboard=\verb!*+\chessboard+>refpastmoveid (key)}%
+ \index{refpastmoveid (\texttt{\textbackslash chessboard} key)}%
+ \index{chessboard=\verb!*+\chessboard+>refpastmovenr (key)}%
+ \index{refpastmovenr (\texttt{\textbackslash chessboard} key)}%
+ \index{chessboard=\verb!*+\chessboard+>refpastplayer (key)}%
+ \index{refpastplayer (\texttt{\textbackslash chessboard} key)}%
+
+
+This keys will set the respective move information to the value of
+the move before the tag. If the tag is before the move 1w, then the
+value 0b is used.
+
+\item[\key{refnextmoveid=}\meta{tag}, \key{refnextmovenr=}\meta{tag}, \key{refnextplayer=}\meta{tag} ]
+ \index{resumechessgame=\verb!*+\resumechessgame+>refnextmoveid (key)}%
+ \index{refnextmoveid (\texttt{\textbackslash resumechessgame} key)}%
+ \index{resumechessgame=\verb!*+\resumechessgame+>refnextmovenr (key)}%
+ \index{refnextmovenr (\texttt{\textbackslash resumechessgame} key)}%
+ \index{resumechessgame=\verb!*+\resumechessgame+>refnextplayer (key)}%
+ \index{refnextplayer (\texttt{\textbackslash resumechessgame} key)}%
+ %
+ \index{newchessgame=\verb!*+\newchessgame+>refnextmovenr (key)}%
+ \index{refnextmovenr (\texttt{\textbackslash newchessgame} key)}%
+ \index{newchessgame=\verb!*+\newchessgame+>refnextmoveid (key)}%
+ \index{refnextmoveid (\texttt{\textbackslash newchessgame} key)}%
+ \index{newchessgame=\verb!*+\newchessgame+>refnextplayer (key)}%
+ \index{refnextplayer (\texttt{\textbackslash newchessgame} key)}%
+ %
+ \index{xskakset=\verb!*+\xskakset+>refnextmoveid (key)}%
+ \index{refnextmoveid (\texttt{\textbackslash xskakset} key)}%
+ \index{xskakset=\verb!*+\xskakset+>refnextmovenr (key)}%
+ \index{refnextmovenr (\texttt{\textbackslash xskakset} key)}%
+ \index{xskakset=\verb!*+\xskakset+>refnextplayer (key)}%
+ \index{refnextplayer (\texttt{\textbackslash xskakset} key)}%
+ %
+ \index{chessboard=\verb!*+\chessboard+>refnextmoveid (key)}%
+ \index{refnextmoveid (\texttt{\textbackslash chessboard} key)}%
+ \index{chessboard=\verb!*+\chessboard+>refnextmovenr (key)}%
+ \index{refnextmovenr (\texttt{\textbackslash chessboard} key)}%
+ \index{chessboard=\verb!*+\chessboard+>refnextplayer (key)}%
+ \index{refnextplayer (\texttt{\textbackslash chessboard} key)}%
+
+
+This keys will set the respective move information to the value of
+the move after the tag.
+
+\item[\key{refpast=}\meta{tag}, \key{refnext=}\meta{tag}]
+ \index{resumechessgame=\verb!*+\resumechessgame+>refpast (key)}%
+ \index{refpast (\texttt{\textbackslash resumechessgame} key)}%
+ \index{newchessgame=\verb!*+\newchessgame+>refpast (key)}%
+ \index{refpast (\texttt{\textbackslash newchessgame} key)}%
+ \index{xskakset=\verb!*+\xskakset+>refpast (key)}%
+ \index{refpast (\texttt{\textbackslash xskakset} key)}%
+ \index{resumechessgame=\verb!*+\resumechessgame+>refnext (key)}%
+ \index{refnext (\texttt{\textbackslash resumechessgame} key)}%
+ \index{newchessgame=\verb!*+\newchessgame+>refnext (key)}%
+ \index{refnext (\texttt{\textbackslash newchessgame} key)}%
+ \index{xskakset=\verb!*+\xskakset+>refnext (key)}%
+ \index{refnext (\texttt{\textbackslash xskakset} key)}%
+ \index{chessboard=\verb!*+\chessboard+>refpast (key)}%
+ \index{refpast (\texttt{\textbackslash chessboard} key)}%
+ \index{chessboard=\verb!*+\chessboard+>refnext (key)}%
+ \index{refnext (\texttt{\textbackslash chessboard} key)}%
+
+
+This keys will set the \meta{GameId} and the \meta{MoveId} in one go.
+E.g. \key{refpast} is a shortcut for\\
+\key{reftag=}\meta{tag},\key{id=}\cs{xskakget}verb+{refid}+,\key{moveid=}\cs{xskakget}verb+{refpastmoveid}+
+
+
+
+
+\item[\key{reffen=}\meta{tag}]
+ \index{chessboard=\verb!*+\chessboard+>reffen (key)}%
+ \index{reffen (\texttt{\textbackslash chessboard} key)}%
+ \index{newchessgame=\verb!*+\newchessgame+>reffen (key)}%
+ \index{reffen (\texttt{\textbackslash newchessgame} key)}%
+
+This is a \cs{chessboard} key. It will add the position at the tag on
+the board, its effect is identical to using the key {\ttfamily
+addfen =}\meta{Position at tag} described in the documentation of
+\pchessboard. So be aware that it really only places pieces on the
+board. It will not change the \meta{GameId} nor the \meta{MoveId} or
+the move counter of \packagename{skak}. So it is quite possible to
+use a position where black should move next to start a game with
+white to move.
+
+
+\begin{LTXexample}
+ \newchessgame[id=new]% to set a new id
+ \chessboard[reffen=B]
+\end{LTXexample}
+
+
+
+
+\begin{LTXexample}
+ \newchessgame[id=A]%
+ \mainline{1.e4 e5 2. Nf3\xskakset{tag=C} Nc6
+ 3. Bb5 Nf6 4. O-O Nxe4 5.Bxc6 bxc6}
+
+
+ \newchessgame[id=B,reffen=C]
+ \mainline{1. Nc3}
+
+ \chessboard
+
+ \chessboard[reffen=C,
+ markstyle=circle,
+ color=red,
+ %from game B:
+ markfield=\xskakget{movefrom},
+ refpast=C,
+ color=green,
+ %from game A:
+ markfield=\xskakget{movefrom}]
+\end{LTXexample}
+\end{description}
+
+\section{Looping}
+
+Looping with the \cs{whiledo} command of the package
+\packagename{ifthen} is not very difficult. But to adjust to the
+special numbering of chessmoves (1w, 1b, 2w, 2b, 3w \ldots) one needs
+some special commands to step through the moves and test for the end
+of the loop.
+
+\DescribeMacro{\xskaktestmoveid}%
+Stepping can be done with the key \key{stepmoveid} described
+earlier.\\ \cs{xskaktestmoveid}\marg{movenr}\marg{player} is a test
+(defined with the help of package \packagename{xifthen}) which you
+can use in the first argument of \cs{whiledo}. It will give true if
+the move is in the current game.
+
+\begin{LTXexample}
+ \newchessgame[id=A]
+ \mainline{1. e4 e5 2. Nf3 Nf6}
+
+ \newchessgame[id=B]
+ (a second game)
+
+ Reprinting the first game:
+ \xskakset{id=A,
+ moveid=\xskakgetgame{initmoveid}}
+ \whiledo{\xskaktestmoveid
+ {\xskakget{movenr}}{\xskakget{player}}}
+ {\ifthenelse%
+ {\equal{\xskakget{player}}{w}}
+ { \xskakget{movenr}.\,}
+ { }%
+ \xskakget{lan}%
+ \xskakset{stepmoveid}}
+
+ Reprinting only the black moves:
+ \xskakset{%
+ id=A,
+ moveid=\xskakgetgame{initmoveid},stepmoveid}
+ \whiledo{\xskaktestmoveid
+ {\xskakget{movenr}}{\xskakget{player}}}
+ { \xskakget{lan}%
+ \xskakset{stepmoveid=2}}
+\end{LTXexample}
+
+
+\DescribeMacro{\xskakloop}%
+\cs{xskakloop}\keyoarg\marg{code} is a wrapper command for such a
+\cs{whiledo} loop.
+
+The possible keys are:
+
+\begin{description}
+\item[\key{id=}\meta{string}]
+ \index{xskakloop=\verb!*+\xskakloop+>id (key)}%
+ \index{id (\texttt{\textbackslash xskakloop} key)}%
+ Which sets the game identification. The setting is global.
+
+\item[\key{initmovenr=}\meta{number}, \key{initplayer=}\meta{«w» or «b»},
+\key{initmoveid=}\meta{number + «w» or «b»}]
+ \index{xskakloop=\verb!*+\xskakloop+>initmovenr (key)}%
+ \index{initmovenr (\texttt{\textbackslash xskakloop} key)}%
+ \index{xskakloop=\verb!*+\xskakloop+>initplayer (key)}%
+ \index{initplayer (\texttt{\textbackslash xskakloop} key)}%
+ \index{xskakloop=\verb!*+\xskakloop+>initmoveid (key)}%
+ \index{initmoveid (\texttt{\textbackslash xskakloop} key)}%
+ This sets the move the loop should start with. Default is the
+ first move of the game.
+
+\item[\key{stopmovenr =}\meta{number}, \key{stopplayer =}\meta{«w» or «b»},
+\key{stopmoveid=}\meta{number + «w» or «b»}]
+ \index{xskakloop=\verb!*+\xskakloop+>stopmovenr (key)}%
+ \index{stopmovenr (\texttt{\textbackslash xskakloop} key)}%
+ \index{xskakloop=\verb!*+\xskakloop+>stopplayer (key)}%
+ \index{stopplayer (\texttt{\textbackslash xskakloop} key)}%
+ \index{xskakloop=\verb!*+\xskakloop+>stopmoveid (key)}%
+ \index{stopmoveid (\texttt{\textbackslash xskakloop} key)}%
+ This sets the move where the loop should stop. Default is the
+ last move of the game.
+
+\item[\key{step=}\meta{number}]
+ \index{xskakloop=\verb!*+\xskakloop+>step (key)}%
+ \index{step (\texttt{\textbackslash xskakloop} key)}%
+ This sets the length of the steps of the loop. The number gives the number of
+ halfmoves. Default is one.
+
+
+\item[\key{showlast=}\meta{true|false}]
+ \index{xskakloop=\verb!*+\xskakloop+>showlast (key)}%
+ \index{showlast (\texttt{\textbackslash xskakloop} key)}%
+ When you are using the key \key{step} with a number unequal to
+ one, it is possible that the last move (possibly set by
+ \key{stopmoveid}) is left out. With the key \key{showlast} you can force \cs{xskakloop} to process
+ the code for the last move.
+\end{description}
+
+
+\begin{LTXexample}[pos=t,width=\textwidth]
+ \newchessgame
+ \mainline{%
+ 1.d4 Nf6 2.c4 g6 3.Nc3 Bg7 4.e4 d6 5.Nge2 O-O 6.Ng3 c6 7.Be2 a6 8.a4
+ a5 9.h4 h5 10.Be3 Na6 11.f3 e5 12.d5 Nd7 13.Nf1 Ndc5 14.Nd2 Qb6
+ 15.Qb1 Nb4 16.Nb3 Ncd3+ 17.Kd2 Qxe3+}
+
+ \xskakloop[step=6,showlast]{%
+ \begin{tabular}{c}
+ \chessboard[tinyboard,
+ setfen=\xskakget{nextfen}]
+ \\
+ \xskakget{opennr}\xskakget{lan}%
+ \end{tabular}\quad}%
+\end{LTXexample}
+
+With the help of the package \packagename{animate} and \cs{xskakloop}
+you can make animated boards:\mynobreakpar
+\begingroup
+ \setchessboard{boardfontsize=0.8cm,shortenend=5pt, margin=false}%
+ \setboardfontencoding{LSBC4}%
+ \newskaklanguage{german}{KDTLSB}\skaklanguage[german]%
+ %
+ \newcommand\getmovestyle[1]{%
+ \ifthenelse
+ {\equal{#1}{N}}%knight move
+ {\def\mymovestyle{[clockwise=false,style=knight]curvemove}}
+ {\ifthenelse
+ {\equal{#1}{}}% castling
+ {\def\mymovestyle{curvemove}}
+ {\def\mymovestyle{straightmove}}}}%
+ %
+ \newchessgame[white=Paethz,black=Dirr,result=0-1,id=anim]%
+ \hidemoves{%
+ 1.d4 Sf6 2.c4 g6 3.Sc3 Lg7 4.e4 d6 5.Sge2 O-O
+ 6.Sg3 c6 7.Le2 a6 8.a4 a5 9.h4 h5 10.Le3 Sa6
+ 11.f3 e5 12.d5 Sd7 13.Sf1 Sdc5 14.Sd2 Db6
+ 15.Db1 Sb4 16.Sb3 Scd3+ 17.Kd2 Dxe3+}%
+ %
+ \unitlength0.8cm\relax
+ \begin{animateinline}[autoplay,loop,controls]{0.5}%
+ \begin{picture}(11,11)
+ \put(1.5,1.5){\chessboard[setfen=\xskakgetgame{initfen}]}%
+ \end{picture}
+ \newframe
+ \xskakloop{%
+ \getmovestyle{\xskakget{piecechar}}%
+ \begin{picture}(11,11)
+ \put(1.5,1.5){%
+ \chessboard[pgfstyle=\mymovestyle, color=blue,
+ pgfshortenend=0.3em,arrow=to,
+ markmoves=\xskakget{move},
+ coloremph,piececolor=blue,
+ emphfields={\xskakget{moveto}},
+ setfen=\xskakget{nextfen}]}%
+ \end{picture}%
+ \newframe}%
+ \begin{picture}(11,11)
+ \put(1.5,1.5){\chessboard[setfen=\xskakgetgame{lastfen}]}%
+ \end{picture}
+ \end{animateinline}
+\endgroup
+
+\bigskip
+The board was made with the following code:
+
+\begin{lstlisting}
+ \setchessboard{boardfontsize=0.8cm,shortenend=5pt, margin=false}%
+ \setboardfontencoding{LSBC4}%
+ \newskaklanguage{german}{KDTLSB}\skaklanguage[german]%
+ %
+ \newcommand\getmovestyle[1]{%
+ \ifthenelse
+ {\equal{#1}{N}}%knight move
+ {\def\mymovestyle{[clockwise=false,style=knight]curvemove}}
+ {\ifthenelse
+ {\equal{#1}{}}% castling
+ {\def\mymovestyle{curvemove}}
+ {\def\mymovestyle{straightmove}}}}%
+ %
+ \newchessgame[white=Paethz,black=Dirr,result=0-1,id=anim]%
+ \hidemoves{%
+ 1.d4 Sf6 2.c4 g6 3.Sc3 Lg7 4.e4 d6 5.Sge2 O-O
+ 6.Sg3 c6 7.Le2 a6 8.a4 a5 9.h4 h5 10.Le3 Sa6
+ 11.f3 e5 12.d5 Sd7 13.Sf1 Sdc5 14.Sd2 Db6
+ 15.Db1 Sb4 16.Sb3 Scd3+ 17.Kd2 Dxe3+}%
+ %
+ \unitlength0.8cm\relax
+ \begin{animateinline}[autoplay,loop,controls]{0.5}%
+ \begin{picture}(11,11)
+ \put(1.5,1.5){\chessboard[setfen=\xskakgetgame{initfen}]}%
+ \end{picture}
+ \newframe
+ \xskakloop{%
+ \getmovestyle{\xskakget{piecechar}}%
+ \begin{picture}(11,11)
+ \put(1.5,1.5){%
+ \chessboard[pgfstyle=\mymovestyle, color=blue,
+ pgfshortenend=0.3em,arrow=to,
+ markmoves=\xskakget{move},
+ coloremph,piececolor=blue,
+ emphfields={\xskakget{moveto}},
+ setfen=\xskakget{nextfen}]}%
+ \end{picture}%
+ \newframe}%
+ \begin{picture}(11,11)
+ \put(1.5,1.5){\chessboard[setfen=\xskakgetgame{lastfen}]}%
+ \end{picture}
+ \end{animateinline}
+\end{lstlisting}
+
+\section{Printing}
+\subsection{\texttt{\textbackslash longmoves} revisitated}\index{longmoves=\verb!*+\longmoves+>}%
+
+
+
+In the example on page \ref{ex:longmoves} I showed that the
+\cs{longmoves} of \skaksty doesn't work correctly. This is due to the
+asynchronous parsing and printing of the \packagename{skak}-engine
+(\packagename{skak} -- like \TeX~-- has sometimes to look a bit
+ahead). With \xskak the problem can be easily solved as it is now
+possible to retrieve information about previous moves. So \xskak
+redefines the internal commands to get \cs{longmoves} working.
+
+\textbf{Attention!} The new \cs{longmoves} command works only
+correctly if the internal engine parses the moves -- so {\em it
+doesn't work with \cs{variation}}. So starting with version 1.2
+\xskak forces \cs{variation} to use \cs{shortmoves}.
+
+
+The redefinition of \cs{longmoves} is done by first defining a
+printing command and then (re-)defining \cs{longmoves} such that the
+internal \cs{printmove} now use the new command. The listing below
+shows the code\footnote{The code doesn't show the complete truth. In
+the real code \cs{longmoves} also has to change the printing mode for
+\cs{printchessgame}. See \ref{sec:print}}. You can take it as a
+template for your own special printing commands.
+\cs{WhiteToMove}\marg{code for white}\marg{code for black} is a
+command of \skaksty that executes the first argument if white is to
+move and the second if its black turn. The main trick in the new
+printing command is to go back one halfmove. The new printing command
+defines only the printing format for the move itself as the number is
+printed by \skaksty at another place.
+
+\begin{lstlisting}
+\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{}}
+
+\def\longmoves{%
+ \let\printmove=\xskak@do@printmove@algebraic}
+\end{lstlisting}
+
+\DescribeMacro{\xskakenpassanttext}%
+The new printing command inserts a test for enpassant moves. You can
+suppress it by redefining \cs{xskakenpassantext}.
+
+
+
+\begin{LTXexample}
+ \longmoves
+ \newchessgame
+ \mainline{1.e4 e5 2.Nf3 Nf6}
+
+ \newchessgame[restorefen=example]
+ \mainline{1. a4 bxa3!}
+
+ \renewcommand\xskakenpassanttext{}
+ \newchessgame[restorefen=example]
+ \mainline{1. a4 bxa3!}
+\end{LTXexample}
+
+
+
+\subsection{An user interface for styles}\label{sec:interface}
+
+To format a game \skaksty puts during parsing commands before and
+between the moves and the counter. You can see the names of this
+commands in the following example (the style \key{test} is a simple
+local style predefined by \packagename{xskak} which contains
+different tests. In level 1 and 2 it contains style items to show
+commands. The optional argument \texttt{[invar]} force \cs{variation}
+to use level 2).
+
+\begin{LTXexample}[pos=t,width=\textwidth,caption={The internal commands to format the output}]
+ \newchessgame
+ \xskakset{%
+ style=test,
+ level=1}
+ \color{blue}
+
+ \mainline{1.d4 Nf6 2.c4}
+
+ \mainline{2... g6 3.Nc3 Bg7 4.e4}
+
+ \mainline{4... O-O 5. Nf3 Re8}
+
+ \mainline{6. Be3 e6}
+
+ \variation[invar]{6... d6}
+\end{LTXexample}
+
+By judiciously (re-)definining the commands \packagename{skak}
+inserts one can get almost every chess style one want.
+\packagename{skak} itself defines three examples that demonstrates
+the possibilities. These styles can be chosen by the commands
+\cs{styleA}, \cs{styleB} and \cs{styleC}. The first two are inline
+styles, the third uses for \cs{mainline} a tabbing environment and
+switches to an inline style for \cs{variation}. But this styles are
+really no more than examples. There is no user interface to change
+and define styles. And due to some dependencies between the
+predefined styles (\cs{styleB} is not only a stand-alone style but it
+is also used in the definition of \cs{styleC} for the variation
+level) adapting the styles is not easy.
+
+
+So I decided to define a real user interface to define styles and
+switch from one to another. The user interface supports an unlimited
+number of levels: Each style is a bundle of \emph{levels} where the
+look on each level is describe by a \emph{style item}\index{style
+item} and some optional commands. Defining a style is therefore done
+in two steps:
+
+\begin{lstlisting}
+ % Define items:
+ \xskaknewstyleitem{A}{%
+ beforenumber={},
+ whiteopen={.\,},
+ ...}
+ \xskaknewstyleitem{B}{...}
+
+ %Define style
+ \xskaknewstyle[%
+ level=1,styleitem=A,
+ font=\bfseries, %add special command to level 1.
+ level=2,styleitem=A,
+ level=3,styleitem=B,
+ ...]{mystyle}
+ \end{lstlisting}
+
+
+\textbf{Attention!} The (almost) indefinite number of levels comes at
+a price: \cs{mainline} and \cs{variation} no longer use
+automatically different styles. If a \cs{variation} should switch to
+a «variation style» you will have to use e.g. the option
+\texttt{[invar]} mentioned above (but you can define your own
+«variation» commands that do this switch). Please read section
+\ref{sec:usestyles} for more information.
+
+
+
+\subsubsection{Defining style items}
+
+\DescribeMacro{\xskaknewstyleitem}%
+With \cs{xskaknewstyleitem}\keyoarg\marg{item} you define the style
+item \meta{item}. You can use the following keys:
+
+
+\begin{description}
+\item[\meta{command name}=\meta{commands}]
+ \index{xskaknewstyleitem=\verb!*+\xskaknewstyleitem+>opencommands (key)}%
+ \index{opencommands (\texttt{\textbackslash xskaknewstyleitem} key)}%
+ \index{xskaknewstyleitem=\verb!*+\xskaknewstyleitem+>closecommands (key)}%
+ \index{closecommands (\texttt{\textbackslash xskaknewstyleitem} key)}%
+ \index{xskaknewstyleitem=\verb!*+\xskaknewstyleitem+>beforenumber (key)}%
+ \index{beforenumber (\texttt{\textbackslash xskaknewstyleitem} key)}%
+ \index{xskaknewstyleitem=\verb!*+\xskaknewstyleitem+>whiteopen (key)}%
+ \index{whiteopen (\texttt{\textbackslash xskaknewstyleitem} key)}%
+ \index{xskaknewstyleitem=\verb!*+\xskaknewstyleitem+>beforewhite (key)}%
+ \index{beforewhite (\texttt{\textbackslash xskaknewstyleitem} key)}%
+ \index{xskaknewstyleitem=\verb!*+\xskaknewstyleitem+>afterwhite (key)}%
+ \index{afterwhite (\texttt{\textbackslash xskaknewstyleitem} key)}%
+ \index{xskaknewstyleitem=\verb!*+\xskaknewstyleitem+>blackopen (key)}%
+ \index{blackopen (\texttt{\textbackslash xskaknewstyleitem} key)}%
+ \index{xskaknewstyleitem=\verb!*+\xskaknewstyleitem+>beforeblack (key)}%
+ \index{beforeblack (\texttt{\textbackslash xskaknewstyleitem} key)}%
+ \index{xskaknewstyleitem=\verb!*+\xskaknewstyleitem+>afterblack (key)}%
+ \index{afterblack (\texttt{\textbackslash xskaknewstyleitem} key)}%
+
+{\raggedright where \meta{command name} is one of
+\\\texttt{opencommands}, \texttt{closecommands},
+\texttt{beforenumber}, \texttt{whiteopen}, \texttt{blackopen},
+\texttt{beforewhite}, \texttt{beforeblack}, \texttt{afterwhite},
+\texttt{afterblack}.\par}
+
+
+There are endless possibilities for the value \meta{commands} -- as
+there are endless possibilities to get more or less horrible errors.
+So I will give only some general advices for the definitions of style
+items:
+
+\begin{itemize}
+\item While processing \keylists\/ \packagename{xkeyval} strips spaces.
+So if you want to set one of the commands to a space use
+either commands like \verb+\ +, \verb+\space+ and \verb+~+, or
+protect the space by enough layers of braces.
+
+\item While processing \keylists\/ \packagename{xkeyval} strips also braces.
+If you need some grouping use \cs{begingroup} and \cs{endgroup} or
+protect the «real» braces by enough other braces.
+
+\item Use if possible switches (like \cs{bfseries}) instead of commands with arguments.
+
+\item Think about how you want to handle spaces at the start and the end of (bits of) a game
+or a variation. An input like
+ \verb+\mainline{1. e4}+\verb*+ \variation{1.e5}+ will already insert a
+ space so avoid to insert another one through e.g. \key{opencommands}.
+
+
+\item It is possible to open a group (with
+\cs{begingroup}) or a environment in one command and close it in
+another command. If you do this check carefully that you have
+balanced groups in all four combinations of white/black opening and
+ending the game! Check also if everything works if you have only one
+move.
+
+\item You don't have to give a definition for all keys/commands.
+Unused keys are set to empty.
+
+\item If you want to force a style (or a style item) to use the long
+or the short algebraic notation you can add
+\cs{longmoves}/\hspace{0pt}\cs{shortmoves} to \key{opencommands}.
+ \index{longmoves=\verb!*+\longmoves+>}%
+ \index{shortmoves=\verb!*+\shortmoves+>}%
+\end{itemize}
+
+
+\item[\meta{beforeNAG}=\meta{commands}, \meta{beforecomment}=\meta{commands}]
+
+\packagename{xskak} puts around each NAG and comment given by
+\cs{xskakcomment} a group and before each NAG's and comment a
+formatting command. This commands are named \cs{xskak@beforeNAG} and
+\cs{xskak@beforecomment}. With the keys \key{beforeNAG} and
+\key{beforecomment} you can change this commands and so to some
+extend change the formatting of NAG and long comments (the styles of
+short comments like + or ! are not affected!). The last command in
+\meta{commands} can be a command that has one argument. NAG and the
+content of the comment will then be used as this argument. This makes
+is e.g. possible to gobble commands:
+
+\begin{LTXexample}[varwidth=false,width=0.3\textwidth]
+ \providecommand\gobble[1]{}
+ \xskaknewstyleitem[%
+ template=UF,%a predefined style item
+ beforeNAG=\gobble,
+ beforecomment=\gobble]{gobblecomments}
+
+ \xskakaddtostyle[%
+ level=gobble,
+ styleitem=gobblecomments]{test}
+
+ \variation[style=test,level=gobble]{1. e4! $1 \xskakcomment{expected} e5 $2}
+\end{LTXexample}
+
+
+
+
+
+
+\item[\key{template}=\meta{item}]
+ \index{xskaknewstyleitem=\verb!*+\xskaknewstyleitem+>template (key)}%
+ \index{template (\texttt{\textbackslash xskaknewstyleitem} key)}%
+
+With this key you can reuse the definitions from another style item.
+\end{description}
+
+
+\subsubsection{Defining style}
+
+
+\DescribeMacro{\xskaknewstyle}%
+\DescribeMacro{\xskakaddtostyle}%
+With \cs{xskaknewstyle}\keyoarg\marg{style} you define the style
+\meta{style}. \\With \cs{xskakaddtostyle}\keyoarg\marg{style} you can
+add more levels (or overwrite existing ones) to a style. Both
+commands can handle four keys: \key{level}, \key{styleitem},
+\key{font} and \key{xfont}.
+
+
+\begin{description}
+\item[\key{level}=\meta{number}]
+ \index{xskaknewstyle=\verb!*+\xskaknewstyle+>level (key)}%
+ \index{level (\texttt{\textbackslash xskaknewstyle} key)}%
+
+With this key you set the number of the level for which you want to
+declared a «look» with the following keys. The «highest» level number
+is 1. Normally it should contain the description of the style for the
+main game. Variation styles should have larger numbers. But the
+\meta{number} don't need to be a number, strings are also possible.
+
+
+If you want to keep everything simple: Use only (positive) numbers
+with levels. Then the levels have a well-defined order which is easy
+to handle. Key \key{invar} will add 1 to a level number, key
+\key{outvar} will substract 1 and if you set the level to a number
+for which no style item as been declared \packagename{xskak} will
+simply substract 1 from this number until it finds a level with a
+style item it can use.
+
+But you can also use level names with chars e.g. to define variants
+for a specific variation level. So you could e.g. define levels
+\texttt{1open}, \texttt{1close}, \texttt{1middle},
+\texttt{1betteris}.
+
+In this case it depends on your compiler how the keys \key{invar}
+and \key{outvar} and levels without declared style items are handled:
+
+\begin{description}
+\item[Case 1:] You have an old pdf\TeX\ where the (experimental) primitive
+\cs{pdfmatch} is not defined (or you did use the package option
+\texttt{nopdfmatch}).\mynobreakpar
+
+Then the keys \key{invar} and \key{outvar} will not work when the
+current level contains chars or other non-numerical tokens. They will
+issue more or less bewildering errors.
+
+Levels without a declared style item will issue errors too.
+
+\item[Case 2:] You have a recent pdf\TeX\ where the (experimental) primitive
+\cs{pdfmatch} is defined (and you didn't use the package option
+\texttt{nopdfmatch}).\mynobreakpar
+
+ \begin{description}
+ \item[Case a)] The level name doesn't contain any number, e.g. \texttt{level=gobble}:\mynobreakpar
+
+ Then you will get an error if you try to set the level and you haven't declared a style item for this level.
+
+ If the current level is \texttt{gobble} then the keys \key{invar} and \key{outvar} will issue a warning
+ and let the level unchanged.
+
+ \item[Case b)] The level name do contain numbers, e.g. \texttt{level=a12b567}:\mynobreakpar
+
+ Then \packagename{xskak} will use the following substituation if you try to set the level and there is no style
+ item declared:
+ \packagename{xskak} will extract the
+ first number from the name (in this case «12»), substract one
+ from this number and try the name with the new number in it. If
+ the first number is 1, level 1 is used (it is always defined). If
+ the first number is 0 you will get an error.
+
+ In the example \packagename{xskak} will try the levels in the following order until it finds one that it can use:
+ {\ttfamily a12b567 $\rightarrow$ a11b567 $\rightarrow$ a10b567 $\rightarrow$ \ldots a2b567 $\rightarrow$ a1b567 $\rightarrow$ 1}
+ \end{description}
+
+\end{description}
+
+
+\item[\key{styleitem}=\meta{item}]
+ \index{xskaknewstyle=\verb!*+\xskaknewstyle+>styleitem (key)}%
+ \index{styleitem (\texttt{\textbackslash xskaknewstyle} key)}%
+
+With this key you set the style item used by the current level
+\emph{and all following levels} until another \key{styleitem} is set.
+
+
+\item[\key{font}=\meta{commands}]
+ \index{xskaknewstyle=\verb!*+\xskaknewstyle+>font (key)}%
+ \index{font (\texttt{\textbackslash xskaknewstyle} key)}%
+
+With this key you can add some specific commands to the current
+level (\emph{and only to the current level}). While the key is meant
+to add font switches to a level it can also be used to overwrite some
+commands of a style item.
+
+
+
+\begin{LTXexample}[varwidth=false,width=0.3\textwidth]
+ \xskaknewstyleitem[%
+ template=UF,%a predefined style item
+ beforenumber=\color{red},%
+ whiteopen=.\,\color{black},
+ blackopen=\ldots\,\color{black}]{rednumbers}
+
+ %% add to existing style test
+ \xskakaddtostyle[%
+ level=10,styleitem=rednumbers,
+ level=12,
+ font=\def\beforenumber{\color{green}}\bfseries]
+ {test}
+
+
+ \newchessgame
+ \mainline[style=test,level=12]{1. Nf3 Nf6 2. d4}
+
+ \variation[level=10]{2. Nc3}
+
+
+ \mainline[level=11]{2... d5}
+ \end{LTXexample}
+
+\begin{LTXexample}[varwidth=false,width=0.3\textwidth]
+\xskakset{style=test}%
+ \xskaknewstyleitem[%
+ template=UF,%a predefined style item
+ beforeNAG=\color{blue},
+ beforecomment=\mdseries]{mycomments}
+
+ \xskakaddtostyle[level=13,styleitem=mycomments,
+ font=\bfseries]{test}
+
+ \variation[level=13]{1. e4 $1 \xskakcomment{ as expected} e5}
+
+ \makeatletter
+ \xskakaddtostyle[%
+ level=gobbleB,styleitem=gobblecomments,
+ font=\renewcommand\xskak@beforeNAG{\color{red}}]%
+ {test}
+ \makeatother
+
+ \variation[level=gobbleB]{1. e4! $1 \xskakcomment{ I expected it} e5 $2}
+ \end{LTXexample}
+
+\item[\key{xfont}=\meta{commands}]
+ \index{xskaknewstyle=\verb!*+\xskaknewstyle+>xfont (key)}%
+ \index{xfont (\texttt{\textbackslash xskaknewstyle} key)}%
+
+With this key you can add some specific commands to all levels with
+the same first number in their name. It needs a recent pdf\TeX\ with
+the command \cs{pdfmatch}.
+
+As an example lets add three levels to the test style used above: the
+first (main) level should use a bold font, the second \cs{mdseries}
+and the third an italic font. For each level we will define a variant
+which puts a \cs{betteris} (\betteris) before the first move.
+
+The example also demonstrates how to retrieve the current level.
+Please note the braces around some of the \cs{variations} which keep
+the level change local.
+
+\begin{LTXexample}[width=0.3\textwidth,varwidth=false,caption=«betteris» style,label=sty:betteris]
+ \xskaknewstyleitem[%
+ template=UF,
+ opencommands=(\betteris,
+ closecommands=)]{betteris}
+
+
+ \xskakaddtostyle
+ [level=20 ,styleitem=UF,xfont=\bfseries,
+ level=20bis,styleitem=betteris,
+ level=21 ,xfont=\mdseries,
+ level=22 ,xfont=\itshape]{test}
+
+ \xskakset{style=test}
+
+ \variation[level=20]{1. e4 e5} (level \xskakget{level})
+ \variation[level=20bis]{1... e6} (level \xskakget{level})
+
+ \variation[level=21]{1. e4 e5} (level \xskakget{level})
+ \variation[level=21bis]{1... e6} (level \xskakget{level})
+
+ \variation[level=22]{1. e4 e5} (level \xskakget{level})
+ \variation[level=22bis]{1... e6} (level \xskakget{level})
+
+
+ \variation[level=20]{1. e4 e5}
+ {\variation[level=\xskakget{level}bis]{1... e6}
+ \variation[invar]{1... e6} \variation[invar]{1... e6}}
+
+ \variation[invar]{1. e4 e5} %to level 21
+ {\variation[level=\xskakget{level}bis]{1... e6}}
+
+ \variation[invar]{1. e4 e5} %to level 22
+ {\variation[level=\xskakget{level}bis]{1... e6}}
+
+\end{LTXexample}
+
+
+\end{description}
+
+
+The previous examples demonstrate some important points to consider
+when defining styles:
+
+\begin{itemize}
+\item You can define as much levels as you want.
+
+\item The number of the levels don't have to be consecutive (they even need to be numbers). If there
+is no definition for a level (in the first example level 11), the
+style item of a previous level (in this case level 10) is used if
+\packagename{xskak} is able to figure out what the previous level
+could be.
+
+\item While it is often sensible to store the settings for the main level
+in level 1, and for the first variation level in level 2 and so on,
+you can also chose other orders or use more than one level for each
+logical variation level. If you e.g. want sometimes to add braces
+through \key{opencommands} you could define variants $n$a, $n$b etc
+of the involved variation level.
+
+
+
+\item While it is easy to define style items and styles it is not
+easy sort and bundle them in a sensible way.
+
+\end{itemize}
+
+
+\subsection{Using the styles}\label{sec:usestyles}
+
+The names of the commands \cs{mainline} and \cs{variation} give the
+impression that you should use the first for the main game and the
+second for the variations. But at my opinion this impression is
+wrong: You should use
+ \begin{itemize}
+ \item \cs{mainline} if you want to parse \emph{and} print chess moves,
+ \item \cs{variation} if you want only to print chess moves,
+ \item \cs{hidemoves} if you want only to parse moves and
+ \item \cs{printchessgame} (described later) if you want to
+ (re)print a previously parsed game.
+ \end{itemize}
+
+This means that each of the printing commands can be used for the
+main game and for variations. And so it should be possible for each
+of the printing commands to set and use every style level.
+
+In consequence this means that if you use the new interface -- you
+don't have to -- \cs{variation} will no longer switch to another
+style.
+
+You can set the style and the level either with \cs{xskakset} or in
+the optional argument of the three printing commands. The keys you
+can use in both cases are:
+
+
+
+\begin{description}
+\item[\key{style}=\meta{style name}]
+ \index{xskakset=\verb!*+\xskakset+>style (key)}%
+ \index{style (\texttt{\textbackslash xskakset} key)}%
+ \index{mainline=\verb!*+\mainline+>style (key)}%
+ \index{style (\texttt{\textbackslash mainline} key)}%
+ \index{variation=\verb!*+\variation+>style (key)}%
+ \index{style (\texttt{\textbackslash variation} key)}%
+ \index{printchessgame=\verb!*+\printchessgame+>style (key)}%
+ \index{style (\texttt{\textbackslash printchessgame} key)}%
+
+This key sets the name of the style the following printing commands
+should use. The setting is always local to the current group (even
+with \cs{xskakset}\footnote{At first \cs{xskakset} did the settings
+globally. I changed it after the third time I had to correct the
+documentation because I forgot to reset a style after an example.}.
+
+
+\item[\key{gstyle}=\meta{style name}]
+ \index{xskakset=\verb!*+\xskakset+>gstyle (key)}%
+ \index{gstyle (\texttt{\textbackslash xskakset} key)}%
+ \index{mainline=\verb!*+\mainline+>gstyle (key)}%
+ \index{gstyle (\texttt{\textbackslash mainline} key)}%
+ \index{variation=\verb!*+\variation+>gstyle (key)}%
+ \index{gstyle (\texttt{\textbackslash variation} key)}%
+ \index{printchessgame=\verb!*+\printchessgame+>gstyle (key)}%
+ \index{gstyle (\texttt{\textbackslash printchessgame} key)}%
+
+This key sets the name of the style globally.
+
+
+\item[\key{level}=\meta{number}]
+ \index{xskakset=\verb!*+\xskakset+>level (key)}%
+ \index{level (\texttt{\textbackslash xskakset} key)}%
+ \index{mainline=\verb!*+\mainline+>level (key)}%
+ \index{level (\texttt{\textbackslash mainline} key)}%
+ \index{variation=\verb!*+\variation+>level (key)}%
+ \index{level (\texttt{\textbackslash variation} key)}%
+ \index{printchessgame=\verb!*+\printchessgame+>level (key)}%
+ \index{level (\texttt{\textbackslash printchessgame} key)}%
+
+This key sets the level the following printing commands should use.
+The setting is always local to the current group.
+
+\item[\key{glevel}=\meta{number}]
+ \index{xskakset=\verb!*+\xskakset+>glevel (key)}%
+ \index{glevel (\texttt{\textbackslash xskakset} key)}%
+ \index{mainline=\verb!*+\mainline+>glevel (key)}%
+ \index{glevel (\texttt{\textbackslash mainline} key)}%
+ \index{variation=\verb!*+\variation+>glevel (key)}%
+ \index{glevel (\texttt{\textbackslash variation} key)}%
+ \index{printchessgame=\verb!*+\printchessgame+>glevel (key)}%
+ \index{glevel (\texttt{\textbackslash printchessgame} key)}%
+
+This key sets the level globally.
+
+\item[\key{invar}]
+ \index{xskakset=\verb!*+\xskakset+>invar (key)}%
+ \index{invar (\texttt{\textbackslash xskakset} key)}%
+ \index{mainline=\verb!*+\mainline+>invar (key)}%
+ \index{invar (\texttt{\textbackslash mainline} key)}%
+ \index{variation=\verb!*+\variation+>invar (key)}%
+ \index{invar (\texttt{\textbackslash variation} key)}%
+ \index{printchessgame=\verb!*+\printchessgame+>invar (key)}%
+ \index{invar (\texttt{\textbackslash printchessgame} key)}%
+
+This will add 1 to the first number in the current level (so it goes
+towards «higher» (deeper) levels). Again the change is local to the
+group. This key can break if the current value of the level is not a
+number.
+
+\item[\key{ginvar}]
+ \index{xskakset=\verb!*+\xskakset+>ginvar (key)}%
+ \index{ginvar (\texttt{\textbackslash xskakset} key)}%
+ \index{mainline=\verb!*+\mainline+>ginvar (key)}%
+ \index{ginvar (\texttt{\textbackslash mainline} key)}%
+ \index{variation=\verb!*+\variation+>ginvar (key)}%
+ \index{ginvar (\texttt{\textbackslash variation} key)}%
+ \index{printchessgame=\verb!*+\printchessgame+>ginvar (key)}%
+ \index{ginvar (\texttt{\textbackslash printchessgame} key)}%
+
+This is the global variant of \key{invar}.
+
+\item[\key{outvar}]
+ \index{xskakset=\verb!*+\xskakset+>outvar (key)}%
+ \index{outvar (\texttt{\textbackslash xskakset} key)}%
+ \index{mainline=\verb!*+\mainline+>outvar (key)}%
+ \index{outvar (\texttt{\textbackslash mainline} key)}%
+ \index{variation=\verb!*+\variation+>outvar (key)}%
+ \index{outvar (\texttt{\textbackslash variation} key)}%
+ \index{printchessgame=\verb!*+\printchessgame+>outvar (key)}%
+ \index{outvar (\texttt{\textbackslash printchessgame} key)}%
+
+This will substract 1 to the first number in the current level (so it
+goes towards level 1 as the main level). This key can break if the
+current value of the level is not a number.
+
+\item[\key{goutvar}]
+ \index{xskakset=\verb!*+\xskakset+>goutvar (key)}%
+ \index{goutvar (\texttt{\textbackslash xskakset} key)}%
+ \index{mainline=\verb!*+\mainline+>goutvar (key)}%
+ \index{goutvar (\texttt{\textbackslash mainline} key)}%
+ \index{variation=\verb!*+\variation+>goutvar (key)}%
+ \index{goutvar (\texttt{\textbackslash variation} key)}%
+ \index{printchessgame=\verb!*+\printchessgame+>goutvar (key)}%
+ \index{goutvar (\texttt{\textbackslash printchessgame} key)}%
+
+This is the global variant of \key{outvar}.
+\end{description}
+
+
+\subsection{The predefined styles}
+
+\Xskak predefines five styles: \texttt{styleA}, \texttt{styleB} and
+\texttt{styleC} imitate the predefined styles of \packagename{skak}
+with the addition that they change to italic in the third level.
+Style \texttt{UF} is my style and style \texttt{test} is a large
+container for all sorts of tests.
+
+
+\begin{LTXexample}[width=0.4\textwidth,varwidth=false]
+\minisec{style \enquote{styleA}}
+\newchessgame
+ \xskakset{style=styleA}
+ \mainline[level=1]{%
+ 1. e4 e6 2. d4 d5 3. e5 c5 4. c3 Qb6}
+ (\variation[invar]{4... Ne7 5. Nf3 Nec6}
+ (\variation[invar]{5... Nf5 6. h4 Be7
+ 7. Bd3 cxd4 8. cxd4 Nc6 9. Bxf5 exf5 10. Bg5 $14})
+ \variation[outvar]{6. Bd3}
+ (\variation[invar]{6. h4 Nd7 7. h5 f6 $1 $132}))
+ \mainline[outvar,outvar]{ 5. Nf3 Bd7}
+
+\end{LTXexample}
+
+
+\begin{LTXexample}[width=0.4\textwidth,varwidth=false]
+\minisec{style \enquote{styleB}}
+\newchessgame
+ \xskakset{style=styleB}
+ \mainline[level=1]{%
+ 1. e4 e6 2. d4 d5 3. e5 c5 4. c3 Qb6}
+ (\variation[invar]{4... Ne7 5. Nf3 Nec6}
+ (\variation[invar]{5... Nf5 6. h4 Be7
+ 7. Bd3 cxd4 8. cxd4 Nc6 9. Bxf5 exf5 10. Bg5 $14})
+ \variation[outvar]{6. Bd3}
+ (\variation[invar]{6. h4 Nd7 7. h5 f6 $1 $132}))
+ \mainline[outvar,outvar]{ 5. Nf3 Bd7}
+
+\end{LTXexample}
+
+\begin{LTXexample}[width=0.4\textwidth,varwidth=false]
+\minisec{style \enquote{UF}}
+\newchessgame
+ \xskakset{style=UF}
+ \mainline[level=1]{%
+ 1. e4 e6 2. d4 d5 3. e5 c5 4. c3 Qb6}
+ (\variation[invar]{4... Ne7 5. Nf3 Nec6}
+ (\variation[invar]{5... Nf5 6. h4 Be7
+ 7. Bd3 cxd4 8. cxd4 Nc6 9. Bxf5 exf5 10. Bg5 $14})
+ \variation[outvar]{6. Bd3}
+ (\variation[invar]{6. h4 Nd7 7. h5 f6 $1 $132}))
+ \mainline[outvar,outvar]{ 5. Nf3 Bd7}
+
+\end{LTXexample}
+
+\minisec{style \enquote{styleC}}
+styleC sets the moves in a tabbing and should be used only for the main moves.
+\begin{LTXexample}[width=0.4\textwidth,varwidth=false]
+\newchessgame
+ \mainline[style=styleC,level=1]{%
+ 1. e4 e6 2. d4 d5 3. e5 c5 4. c3 Qb6}
+ (\variation[invar]{4... Ne7 5. Nf3 Nec6}
+ (\variation[invar]{5... Nf5 6. h4 Be7
+ 7. Bd3 cxd4 8. cxd4 Nc6 9. Bxf5 exf5 10. Bg5 $14})
+ \variation[outvar]{6. Bd3}
+ (\variation[invar]{6. h4 Nd7 7. h5 f6 $1 $132}))
+ \mainline[outvar,outvar]{ 5. Nf3 Bd7}
+
+\end{LTXexample}
+
+
+\subsection{The new \texorpdfstring{\texttt{xskak}}{xskak} printing
+command}\label{sec:print}
+
+\DescribeMacro{\printchessgame}%
+As one of the aims of \packagename{xskak} is to separate the parsing
+from the printing of a game there is naturally also a printing
+command. With \cs{printchessgame}\keyoarg{} you can print a
+previously parsed and saved game. Without any options
+\cs{printchessgame} will print the game with the currently active
+\meta{GameId} from start to end.
+
+
+
+As keys you can use
+\begin{description}
+\item[\key{id}=\meta{GameId}, \key{refid}=\meta{tag}]
+ \index{printchessgame=\verb!*+\printchessgame+>id (key)}%
+ \index{id (\texttt{\textbackslash printchessgame} key)}%
+ \index{printchessgame=\verb!*+\printchessgame+>refid (key)}%
+ \index{refid (\texttt{\textbackslash printchessgame} key)}%
+
+This keys change only for the printing the current \meta{GameId}.
+Afterwards the old \meta{GameId} is restored.
+
+\item[\key{initmovenr=}\meta{number}, \key{initplayer=}\meta{«w» or «b»}, \key{initmoveid=}\meta{number + «w» or «b»}]\index{printchessgame=\verb!*+\printchessgame+>initmovenr (key)}%
+ \index{initmovenr (\texttt{\textbackslash printchessgame} key)}%
+ \index{printchessgame=\verb!*+\printchessgame+>initplayer (key)}%
+ \index{initplayer (\texttt{\textbackslash printchessgame} key)}%
+ \index{printchessgame=\verb!*+\printchessgame+>initmoveid (key)}%
+ \index{initmoveid (\texttt{\textbackslash printchessgame} key)}%
+~\\ This keys sets the move the printing should start with. If the
+move isn't in the game a warning is issued and the first move of the
+game is used instead.
+
+\item[\key{stopmovenr=}\meta{number}, \key{stopplayer=}\meta{«w» or «b»}, \key{stopmoveid=}\meta{number + «w» or «b»}]
+ \index{printchessgame=\verb!*+\printchessgame+>stopmovenr (key)}%
+ \index{stopmovenr (\texttt{\textbackslash printchessgame} key)}%
+ \index{printchessgame=\verb!*+\printchessgame+>stopplayer (key)}%
+ \index{stopplayer (\texttt{\textbackslash printchessgame} key)}%
+ \index{printchessgame=\verb!*+\printchessgame+>stopmoveid (key)}%
+ \index{stopmoveid (\texttt{\textbackslash printchessgame} key)}%
+~\\ This keys sets the move the printing should end with. If the move
+isn't in the game a warning is issued and the last move of the game
+is used instead.
+
+\item[\key{reftag}=\meta{tag}]
+ \index{printchessgame=\verb!*+\printchessgame+>reftag (key)}%
+ \index{reftag (\texttt{\textbackslash printchessgame} key)}%
+
+This sets the tag name in case that you want to use tagged moves as
+start or end of the printing. There are no keys like
+\key{initrefpastmoveid} (I thought so long names are no longer
+manageable), so you will have to use e.g. \texttt{reftag=}\meta{tag},
+\texttt{initmovenr=}\cs{xskakget}\verb+{refpast}+.
+
+
+\item[\key{style}, \key{level}, key{invar} and \key{outvar}]%
+ \index{printchessgame=\verb!*+\printchessgame+>level (key)}%
+ \index{level (\texttt{\textbackslash printchessgame} key)}%
+ \index{printchessgame=\verb!*+\printchessgame+>invar (key)}%
+ \index{invar (\texttt{\textbackslash printchessgame} key)}%
+ \index{printchessgame=\verb!*+\printchessgame+>outvar (key)}%
+ \index{outvar (\texttt{\textbackslash printchessgame} key)}%
+ \index{printchessgame=\verb!*+\printchessgame+>style (key)}%
+ \index{style (\texttt{\textbackslash printchessgame} key)}%
+
+\cs{printchessgame} use the same formatting commands as
+\packagename{skak}, so the style can be change through the interface
+defined and described in section \ref{sec:interface}.
+
+
+To set the level and the style you can use the keys described in
+section \ref{sec:usestyles} in the optional argument of
+\cs{printchessgame}. Like with \cs{mainline} and \cs{variation} the
+keys sets the values locally for the current group.
+
+To print the actual moves, \cs{printchessgame} doesn't use the
+command \cs{printmove} from \packagename{skaksty} but an internal
+command named \cs{xskak@do@printmove}. So commands like
+\cs{longmoves} must set this command appropriately.
+
+
+\end{description}
+
+\begin{LTXexample}
+ \input{xskakgames.xsk}
+ \printchessgame[style=UF,level=1,id=export,
+ initmoveid=7w,stopmoveid=12b]
+\end{LTXexample}
+
+
+\subsection{Game titles and chessboard captions}
+
+There are no pre-made commands. You will have to define them with the
+help of the stored game data/move data. For titles I advise you to
+use a sort of sectioning command -- this will prevent page breaks
+between the title and the game. Look e.g. at the definition of
+\cs{minisec} in one of the classes from the KOMA-bundle. For
+captions: look at the package \packagename{caption}.
+
+
+
+
+\section{PGN2LTX or How to sort the input}
+
+While \packagename{skak}/\packagename{xskak} can handle games in
+PGN-notation they can't handle PGN-files: neither the PGN-infos
+(which is a small nuisances) nor the variations and the comments in
+the game notation (which makes it tedious to print large games with a
+lot of annotations).
+
+There exists a small number of perl scripts and applications to help
+to convert PGN to \LaTeX\ but none is really satisfactory. One of the
+problems that prevents better solutions is that there is no clear
+description what should be the result of a conversion from PGN to
+\LaTeX. In this section I will make some remarks about what I think
+would be a good output from such a converter for
+\packagename{xskak}\footnote{\packagename{texmate} needs another
+output.} and where I see problems. The description should also help
+you to enter or convert complicated games manually.
+
+
+\minisec{The PGN-infos}
+
+The «tag pair» section of a chess game in PGN shouldn't pose problems
+to a converter. The tags should be simply converted to the equivalent
+keys of a \cs{newchessgame}:
+
+\begin{lstlisting}
+ [Round "29"]
+ [White "Fischer, Robert J."]
+ [Black "Spassky, Boris V."]
+ [Result "1/2-1/2"]
+\end{lstlisting}
+%
+\begin{lstlisting}[escapechar=/]
+ \newchessgame[id=/\meta{GameId}/, %see below
+ round={29},
+ white={Fischer, Robert J.},
+ black={Spassky, Boris V.},
+ result={1/2-1/2}]
+\end{lstlisting}
+
+\xskakset{style=UF}%
+If the game use a \texttt{SetUp} and a \texttt{FEN} tag to set an
+alternative starting position, the converter will have to extract the
+start move from the FEN and set it with the key \key{moveid}.
+
+\minisec{The \meta{GameId}}
+
+While it is probably possible to give each game an unique
+\meta{GameId} I don't think that it is sensible or really necessary.
+I would suggest, that each game gets uses\\
+\verb+\newchessgame[id=main\xskakaddtoid,...]+ where
+\cs{xskakaddtoid} is empty by default but can be redefined to allow
+some automatic numbering.
+
+\minisec{The parsing command}
+
+As you will probably sometimes use \cs{mainline} and sometimes
+\cs{hidemoves} it is probably best if the converter use an general
+\cs{parsechessgame} which can be \cs{let} to both commands.
+
+\minisec{NAG's}
+
+Most NAG's don't need any special handling as \packagename{xskak} can
+parse them.
+
+But some chess applications seems to put NAG's \emph{after} a move to
+denote a symbol that should go \emph{before} the move. E.g.
+ \verb+1. e5 $142+
+%
+should become \betteris\variation{1. e5}.
+
+Putting such symbols before a move number is in most cases only
+possible at the start of a \cs{mainline} or \cs{variation} so the
+converter will have probably to split the input and add the symbol
+either directly or through a style. A converter will need a list of
+all this special cases and good rules how to handle them.
+
+
+
+
+\minisec{Long comments}
+
+Longer commands (in the PGN in curly braces) could be handled either
+by adding a \cs{xskakcomment} at the begin of the comment or by
+ending the parsing and starting it again after the comment. The first
+method has the advantage that one can use styles to format to some
+extend the comments (or gobble them) but can cause problems if the
+comment contains something that isn't allowed in the argument of a
+command.
+
+I think some real examples are needed to decide what is the best way.
+
+
+\minisec{The content of long comments}
+
+I don't think that is possible to handle all possible contents
+automatically and get a suitable result for \LaTeX. You will either
+have to follow some rules while inputing the comments or tidy them up
+later.
+
+But a converter will probably be able to identify moves like
+\texttt{4.\,\,Nf3} and to surround them by suitable
+\verb+\variation[style=...,level=...]{...}+.
+
+\minisec{Diagrams}
+
+Some chess applications let you put markers at places where you would
+like to print a diagram. E.g. chessbase put
+\texttt{Diagramm~\#}\footnote{I don't know if «Diagramm» is language
+dependent. Probably yes.} in a comment.
+
+A converter should also be able to recognize such markers for
+diagrams. But it is not easy to decide what should be done with this
+markers. In some cases you would probably not want to print boards at
+all. Sometimes the game should be interrupted and the diagram printed
+directly. Sometimes it should float. And I recall that someone once
+tried to put all diagrams in the order there were mentioned in the
+margin. If such markers are used it is probably the best if the
+converter sets a tag and sets one of the fake NAG's \texttt{\$D} and
+\texttt{\$d}. Then \cs{printchessgame} and the list of diagrams could
+be used to print the moves and the diagrams in the intended order
+(but it will probably need some coding to get the right results). The
+tag and the NAG should be move outside of the comment as the comment
+isn't processed in all cases.
+
+\begin{lstlisting}[caption={Input and suggested output for diagram
+markers}]
+ 10. c3 e5 $1 {Diagramm # Die energische und konsequente
+ Fortsetzung, Schwarz öffnet das Zentrum, um seine Figuren zu
+ aktivieren.} 11. h3
+\end{lstlisting}
+
+\begin{lstlisting}
+ \mainline{10. c3 e5\xskakset{tag=dia1} $d $1
+ \xskakcomment{ Die energische und konsequente Fortsetzung,
+ Schwarz öffnet das Zentrum, um seine Figuren zu aktivieren. }
+ 11. h3}
+\end{lstlisting}
+
+
+
+
+\minisec{Variations}
+
+Here starts the real problems. Even if we forget for the moment the
+parsing of moves and diagrams it is not easy to describe a suitable
+output. The main problems come from the fact that styles and good
+typesetting are involved: E.g. PGN code two variations in a row as
+\texttt{(1...~e5) (1...~e6)}. But you would probably print this as
+(\variation{1... e5}; \variation{1... e6}).
+
+So the converter will have to look ahead and use suitable «open»,
+«middle», «close» and «single» styles in the different combinations.
+
+If you make long analyzes you will probably want to use numbered list
+for the variations -- but not every variation is so important that
+it need its own number. In this case there must be a marker that
+tells the converter to handle this variation differently.
+
+I haven't solved all this problems but I think that the following
+code could be used as starting point for further discussion about a
+\LaTeX-chess input\footnote{If one really wants to parse all
+variations a better naming for the nodes is needed.}:
+
+\begin{lstlisting}
+ \newchessgame[id=main, ...]
+ \mainline{...}
+ %new var level
+ \newchessgame[newvar=main,id=var1a]%
+ \mainline[level=1open]{.....}
+ %same var level
+ \newchessgame[newvar=main,id=var1b]%
+ \mainline[level=1close]{....}
+ %new var level
+ \newchessgame[newvar=var1b,id=var2a]%
+ \mainline[level=2single]{....}
+ %% return to var1b:
+ \resumechessgame[id=var1b]
+ \mainline[level=1open]{....}
+\end{lstlisting}
+
+
+\minisec{Initialization and title}
+
+Until now I have only discussed the game itself. But you would
+probably want to print titles, make table of contents and other
+lists. So one should also add some generic commands or environments
+like \verb+\begin{chessgame}+/\hspace{0pt}\verb+\end{chessgame}+ and
+\verb+{\chessgameheader}+ to each game.
+
+
+
+
+
+
+\section{Compability issues}
+\subsection{\texorpdfstring{\packagename{xskak} and
+\packagename{texmate}}{xskak and texmate}}\index{texmate}
+
+It will probably work fine to use both packages in one document.
+
+\cs{newchessgame} and \cs{resumechessgame} will both internally issue
+a \cs{fenposition} command that will setup the games also for
+\packagename{texmate}. This naturally means in return that both
+commands interfere with \packagename{texmate}!
+
+You can't benefit of the extended input possibilities for NAG's and
+comments. \packagename{texmate} has its own parsing method.
+
+Btw: If you are using \packagename{texmate} you should always indent
+your input as the package doesn't recognize new lines as spaces.
+
+\subsection{\texorpdfstring{\packagename{xskak} and
+\packagename{beamer}}{xskak and beamer}}\index{beamer}
+
+When making presentations with \packagename{beamer} you should
+remember two things: First you can't use verbatim material or other
+commands that relies on catcode changes in the
+\texttt{frame}-environment or -command. That means for \skaksty that
+you can't use \# in a \cs{mainline} but should replace it by
+\cs{mate}.
+
+Second, if you are using overlays the content of the frame is
+processed more than once. That means that you should be careful to
+reset counters if you don't want to run into never ending loops.
+
+The following listing shows an example how to print a chessgame with
+beamer. If your pdf-reader can handle annotations you can see the
+result in the attached file: \attachfile{xskak_and_beamer.pdf} It
+uses overlays (which worked fine) and also shows how you can handle
+games in another language:
+
+\lstinputlisting{xskak_and_beamer.tex}
+
+\phantomsection
+\makeatletter\def\index@prologue{\section*{Index}\addcontentsline{toc}{section}{Index}}\makeatother
+\printindex
+\end{document}
+
+\end{document}
diff --git a/macros/latex/contrib/xskak/xskak_and_beamer.pdf b/macros/latex/contrib/xskak/xskak_and_beamer.pdf
new file mode 100644
index 0000000000..7c7617ad31
--- /dev/null
+++ b/macros/latex/contrib/xskak/xskak_and_beamer.pdf
Binary files differ
diff --git a/macros/latex/contrib/xskak/xskak_and_beamer.tex b/macros/latex/contrib/xskak/xskak_and_beamer.tex
new file mode 100644
index 0000000000..47d63634b0
--- /dev/null
+++ b/macros/latex/contrib/xskak/xskak_and_beamer.tex
@@ -0,0 +1,63 @@
+\documentclass{beamer}
+\usepackage[LSBC4,T1]{fontenc}
+\usepackage{chessboard}
+\usepackage{xskak}
+
+\newcommand\getmovestyle[1]{%
+ \ifthenelse
+ {\equal{#1}{N}}%knight move
+ {\def\mymovestyle{[clockwise=false,style=knight]curvemove}}
+ {\ifthenelse
+ {\equal{#1}{}}% castling
+ {\def\mymovestyle{curvemove}}
+ {\def\mymovestyle{straightmove}}}}
+
+
+\setboardfontencoding{LSBC4}
+\newskaklanguage{german}{KDTLSB}
+\skaklanguage[german]
+
+\begin{document}
+\newchessgame[white=Paethz,black=Dirr,result=0-1]
+\hidemoves{%
+1.d4 Sf6 2.c4 g6 3.Sc3 Lg7 4.e4 d6 5.Sge2 O-O 6.Sg3 c6 7.Le2 a6 8.a4
+a5 9.h4 h5 10.Le3 Sa6 11.f3 e5 12.d5 Sd7 13.Sf1 Sdc5 14.Sd2 Db6
+15.Db1 Sb4 16.Sb3 Scd3+ 17.Kd2 Dxe3+}
+
+\newcounter{chessmoves}
+
+
+\begin{frame}{\xskakgetgame{white} -- \xskakgetgame{black}}
+
+\begin{columns}[T]
+\column[T]{0.5\textwidth}
+\setcounter{chessmoves}{0}%
+\xskakloop{%
+ \getmovestyle{\xskakget{piecechar}}%
+ \refstepcounter{chessmoves}%
+ \only<\arabic{chessmoves}>{%
+ \chessboard[%
+ margin=false,showmover=false,inverse,
+ pgfstyle=\mymovestyle,color=blue,
+ linewidth=0.1em, pgfshortenend=0.4em,
+ arrow=to, markmoves=\xskakget{move},
+ setfen=\xskakget{nextfen},
+ coloremph,piececolor=blue,
+ emphfields={\xskakget{moveto}}
+]\par
+ }%
+ }
+
+\column[T]{0.45\textwidth}%
+\renewcommand\baselinestretch{1.2}\footnotesize
+\setcounter{chessmoves}{0}%
+\xskakloop{%
+ \refstepcounter{chessmoves}%
+ { \color<\arabic{chessmoves}>{blue}%
+ \uncover<\arabic{chessmoves}->{%
+ \ifthenelse{\equal{\xskakget{player}}{w}}
+ {\xskakget{opennr}}{}\xskakget{lan}}}}
+\xskakgetgame{result}
+\end{columns}
+\end{frame}
+\end{document}
diff --git a/macros/latex/contrib/xskak/xskakgames.xsk b/macros/latex/contrib/xskak/xskakgames.xsk
new file mode 100644
index 0000000000..97945abd64
--- /dev/null
+++ b/macros/latex/contrib/xskak/xskakgames.xsk
@@ -0,0 +1,1303 @@
+%This are games exported with xskak.sty
+%The options were: games={export,exportb}
+%17.10.2008
+%
+%Start of game export
+%
+\expandafter \def \csname Xskakexportinitfen\endcsname {rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1}\relax
+\expandafter \def \csname Xskakexportinitplayer\endcsname {w}\relax
+\expandafter \def \csname Xskakexportinitmovenr\endcsname {1}\relax
+\expandafter \def \csname Xskakexportinitmoveid\endcsname {1w}\relax
+\expandafter \def \csname Xskakexportlastfen\endcsname {r1k4r/p2nb1p1/2b4p/1p1n1p2/2PP4/3Q1NB1/1P3PPP/R5K1 b - c3 0 19}\relax
+\expandafter \def \csname Xskakexportlastplayer\endcsname {w}\relax
+\expandafter \def \csname Xskakexportlastmovenr\endcsname {19}\relax
+\expandafter \def \csname Xskakexportlastmoveid\endcsname {19w}\relax
+\expandafter \def \csname Xskakexportnextplayer\endcsname {b}\relax
+\expandafter \def \csname Xskakexportnextmovenr\endcsname {19}\relax
+\expandafter \def \csname Xskakexportnextmoveid\endcsname {19b}\relax
+\expandafter \def \csname Xskakexportdiagramlist\endcsname {}\relax
+\expandafter \def \csname Xskakexportgameid\endcsname {export}\relax
+\expandafter \def \csname Xskakexportresult\endcsname {1-0}\relax
+\expandafter \def \csname Xskakexportsite\endcsname {}\relax
+\expandafter \def \csname Xskakexportevent\endcsname {}\relax
+\expandafter \def \csname Xskakexportdate\endcsname {}\relax
+\expandafter \def \csname Xskakexportround\endcsname {}\relax
+\expandafter \def \csname Xskakexportwhite\endcsname {Deep Blue}\relax
+\expandafter \def \csname Xskakexportblack\endcsname {Kasparov}\relax
+\expandafter \def \csname Xskakexportblackelo\endcsname {}\relax
+\expandafter \def \csname Xskakexportwhiteelo\endcsname {}\relax
+\expandafter \def \csname Xskak.export.1.w.movenr\endcsname {\Xskak.export.1.w.movenr }\relax
+\expandafter \def \csname Xskak.export.1.w.player\endcsname {\Xskak.export.1.w.player }\relax
+\expandafter \def \csname Xskak.export.1.w.moveid\endcsname {\Xskak.export.1.w.moveid }\relax
+\expandafter \def \csname Xskak.export.1.w.pgnpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.1.w.piece\endcsname {P}\relax
+\expandafter \def \csname Xskak.export.1.w.piecechar\endcsname {p}\relax
+\expandafter \def \csname Xskak.export.1.w.castling\endcsname {\setboolean {xskakboolcastling}{false}}\relax
+\expandafter \def \csname Xskak.export.1.w.longcastling\endcsname {\setboolean {xskakboollongcastling}{false}}\relax
+\expandafter \def \csname Xskak.export.1.w.capture\endcsname {\setboolean {xskakboolcapture}{false}}\relax
+\expandafter \def \csname Xskak.export.1.w.check\endcsname {\setboolean {xskakboolcheck}{false}}\relax
+\expandafter \def \csname Xskak.export.1.w.mate\endcsname {\setboolean {xskakboolmate}{false}}\relax
+\expandafter \def \csname Xskak.export.1.w.lostpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.1.w.lostpiecechar\endcsname {}\relax
+\expandafter \def \csname Xskak.export.1.w.pgnlostpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.1.w.movefrom\endcsname {e2}\relax
+\expandafter \def \csname Xskak.export.1.w.pgnmovefrom\endcsname {}\relax
+\expandafter \def \csname Xskak.export.1.w.moveto\endcsname {e4}\relax
+\expandafter \def \csname Xskak.export.1.w.move\endcsname {e2-e4}\relax
+\expandafter \def \csname Xskak.export.1.w.enpassant\endcsname {\setboolean {xskakboolenpassant}{false}}\relax
+\expandafter \def \csname Xskak.export.1.w.enpassantsquare\endcsname {e3}\relax
+\expandafter \def \csname Xskak.export.1.w.promotion\endcsname {\setboolean {xskakboolpromotion}{false}}\relax
+\expandafter \def \csname Xskak.export.1.w.promotionpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.1.w.promotionpiecechar\endcsname {}\relax
+\expandafter \def \csname Xskak.export.1.w.addpieces\endcsname {Pe4}\relax
+\expandafter \def \csname Xskak.export.1.w.clearfields\endcsname {e2}\relax
+\expandafter \def \csname Xskak.export.1.w.comments\endcsname {}\relax
+\expandafter \def \csname Xskak.export.1.w.nextfen\endcsname {rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNR b KQkq e3 0 1}\relax
+\expandafter \def \csname Xskak.export.1.w.pastfen\endcsname {rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1}\relax
+\expandafter \def \csname Xskak.export.1.w.nag\endcsname {}\relax
+\expandafter \def \csname Xskak.export.1.w.san\endcsname {e4}\relax
+\expandafter \def \csname Xskak.export.1.w.lan\endcsname {e2\xskakmovehyphen e4}\relax
+\expandafter \def \csname Xskak.export.1.w.opennr\endcsname {1\whiteopen \beforewhite }\relax
+\expandafter \def \csname Xskak.export.1.b.movenr\endcsname {\Xskak.export.1.b.movenr }\relax
+\expandafter \def \csname Xskak.export.1.b.player\endcsname {\Xskak.export.1.b.player }\relax
+\expandafter \def \csname Xskak.export.1.b.moveid\endcsname {\Xskak.export.1.b.moveid }\relax
+\expandafter \def \csname Xskak.export.1.b.pgnpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.1.b.piece\endcsname {p}\relax
+\expandafter \def \csname Xskak.export.1.b.piecechar\endcsname {p}\relax
+\expandafter \def \csname Xskak.export.1.b.castling\endcsname {\setboolean {xskakboolcastling}{false}}\relax
+\expandafter \def \csname Xskak.export.1.b.longcastling\endcsname {\setboolean {xskakboollongcastling}{false}}\relax
+\expandafter \def \csname Xskak.export.1.b.capture\endcsname {\setboolean {xskakboolcapture}{false}}\relax
+\expandafter \def \csname Xskak.export.1.b.check\endcsname {\setboolean {xskakboolcheck}{false}}\relax
+\expandafter \def \csname Xskak.export.1.b.mate\endcsname {\setboolean {xskakboolmate}{false}}\relax
+\expandafter \def \csname Xskak.export.1.b.lostpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.1.b.lostpiecechar\endcsname {}\relax
+\expandafter \def \csname Xskak.export.1.b.pgnlostpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.1.b.movefrom\endcsname {c7}\relax
+\expandafter \def \csname Xskak.export.1.b.pgnmovefrom\endcsname {}\relax
+\expandafter \def \csname Xskak.export.1.b.moveto\endcsname {c6}\relax
+\expandafter \def \csname Xskak.export.1.b.move\endcsname {c7-c6}\relax
+\expandafter \def \csname Xskak.export.1.b.enpassant\endcsname {\setboolean {xskakboolenpassant}{false}}\relax
+\expandafter \def \csname Xskak.export.1.b.enpassantsquare\endcsname {-}\relax
+\expandafter \def \csname Xskak.export.1.b.promotion\endcsname {\setboolean {xskakboolpromotion}{false}}\relax
+\expandafter \def \csname Xskak.export.1.b.promotionpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.1.b.promotionpiecechar\endcsname {}\relax
+\expandafter \def \csname Xskak.export.1.b.addpieces\endcsname {pc6}\relax
+\expandafter \def \csname Xskak.export.1.b.clearfields\endcsname {c7}\relax
+\expandafter \def \csname Xskak.export.1.b.comments\endcsname {}\relax
+\expandafter \def \csname Xskak.export.1.b.nextfen\endcsname {rnbqkbnr/pp1ppppp/2p5/8/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - 0 2}\relax
+\expandafter \def \csname Xskak.export.1.b.pastfen\endcsname {rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNR b KQkq e3 0 1}\relax
+\expandafter \def \csname Xskak.export.1.b.nag\endcsname {}\relax
+\expandafter \def \csname Xskak.export.1.b.san\endcsname {c6}\relax
+\expandafter \def \csname Xskak.export.1.b.lan\endcsname {c7\xskakmovehyphen c6}\relax
+\expandafter \def \csname Xskak.export.1.b.opennr\endcsname {1\blackopen \beforeblack }\relax
+\expandafter \def \csname Xskak.export.2.w.movenr\endcsname {\Xskak.export.2.w.movenr }\relax
+\expandafter \def \csname Xskak.export.2.w.player\endcsname {\Xskak.export.2.w.player }\relax
+\expandafter \def \csname Xskak.export.2.w.moveid\endcsname {\Xskak.export.2.w.moveid }\relax
+\expandafter \def \csname Xskak.export.2.w.pgnpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.2.w.piece\endcsname {P}\relax
+\expandafter \def \csname Xskak.export.2.w.piecechar\endcsname {p}\relax
+\expandafter \def \csname Xskak.export.2.w.castling\endcsname {\setboolean {xskakboolcastling}{false}}\relax
+\expandafter \def \csname Xskak.export.2.w.longcastling\endcsname {\setboolean {xskakboollongcastling}{false}}\relax
+\expandafter \def \csname Xskak.export.2.w.capture\endcsname {\setboolean {xskakboolcapture}{false}}\relax
+\expandafter \def \csname Xskak.export.2.w.check\endcsname {\setboolean {xskakboolcheck}{false}}\relax
+\expandafter \def \csname Xskak.export.2.w.mate\endcsname {\setboolean {xskakboolmate}{false}}\relax
+\expandafter \def \csname Xskak.export.2.w.lostpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.2.w.lostpiecechar\endcsname {}\relax
+\expandafter \def \csname Xskak.export.2.w.pgnlostpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.2.w.movefrom\endcsname {d2}\relax
+\expandafter \def \csname Xskak.export.2.w.pgnmovefrom\endcsname {}\relax
+\expandafter \def \csname Xskak.export.2.w.moveto\endcsname {d4}\relax
+\expandafter \def \csname Xskak.export.2.w.move\endcsname {d2-d4}\relax
+\expandafter \def \csname Xskak.export.2.w.enpassant\endcsname {\setboolean {xskakboolenpassant}{false}}\relax
+\expandafter \def \csname Xskak.export.2.w.enpassantsquare\endcsname {d3}\relax
+\expandafter \def \csname Xskak.export.2.w.promotion\endcsname {\setboolean {xskakboolpromotion}{false}}\relax
+\expandafter \def \csname Xskak.export.2.w.promotionpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.2.w.promotionpiecechar\endcsname {}\relax
+\expandafter \def \csname Xskak.export.2.w.addpieces\endcsname {Pd4}\relax
+\expandafter \def \csname Xskak.export.2.w.clearfields\endcsname {d2}\relax
+\expandafter \def \csname Xskak.export.2.w.comments\endcsname {}\relax
+\expandafter \def \csname Xskak.export.2.w.nextfen\endcsname {rnbqkbnr/pp1ppppp/2p5/8/3PP3/8/PPP2PPP/RNBQKBNR b KQkq d3 0 2}\relax
+\expandafter \def \csname Xskak.export.2.w.pastfen\endcsname {rnbqkbnr/pp1ppppp/2p5/8/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - 0 2}\relax
+\expandafter \def \csname Xskak.export.2.w.nag\endcsname {}\relax
+\expandafter \def \csname Xskak.export.2.w.san\endcsname {d4}\relax
+\expandafter \def \csname Xskak.export.2.w.lan\endcsname {d2\xskakmovehyphen d4}\relax
+\expandafter \def \csname Xskak.export.2.w.opennr\endcsname {2\whiteopen \beforewhite }\relax
+\expandafter \def \csname Xskak.export.2.b.movenr\endcsname {\Xskak.export.2.b.movenr }\relax
+\expandafter \def \csname Xskak.export.2.b.player\endcsname {\Xskak.export.2.b.player }\relax
+\expandafter \def \csname Xskak.export.2.b.moveid\endcsname {\Xskak.export.2.b.moveid }\relax
+\expandafter \def \csname Xskak.export.2.b.pgnpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.2.b.piece\endcsname {p}\relax
+\expandafter \def \csname Xskak.export.2.b.piecechar\endcsname {p}\relax
+\expandafter \def \csname Xskak.export.2.b.castling\endcsname {\setboolean {xskakboolcastling}{false}}\relax
+\expandafter \def \csname Xskak.export.2.b.longcastling\endcsname {\setboolean {xskakboollongcastling}{false}}\relax
+\expandafter \def \csname Xskak.export.2.b.capture\endcsname {\setboolean {xskakboolcapture}{false}}\relax
+\expandafter \def \csname Xskak.export.2.b.check\endcsname {\setboolean {xskakboolcheck}{false}}\relax
+\expandafter \def \csname Xskak.export.2.b.mate\endcsname {\setboolean {xskakboolmate}{false}}\relax
+\expandafter \def \csname Xskak.export.2.b.lostpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.2.b.lostpiecechar\endcsname {}\relax
+\expandafter \def \csname Xskak.export.2.b.pgnlostpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.2.b.movefrom\endcsname {d7}\relax
+\expandafter \def \csname Xskak.export.2.b.pgnmovefrom\endcsname {}\relax
+\expandafter \def \csname Xskak.export.2.b.moveto\endcsname {d5}\relax
+\expandafter \def \csname Xskak.export.2.b.move\endcsname {d7-d5}\relax
+\expandafter \def \csname Xskak.export.2.b.enpassant\endcsname {\setboolean {xskakboolenpassant}{false}}\relax
+\expandafter \def \csname Xskak.export.2.b.enpassantsquare\endcsname {d6}\relax
+\expandafter \def \csname Xskak.export.2.b.promotion\endcsname {\setboolean {xskakboolpromotion}{false}}\relax
+\expandafter \def \csname Xskak.export.2.b.promotionpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.2.b.promotionpiecechar\endcsname {}\relax
+\expandafter \def \csname Xskak.export.2.b.addpieces\endcsname {pd5}\relax
+\expandafter \def \csname Xskak.export.2.b.clearfields\endcsname {d7}\relax
+\expandafter \def \csname Xskak.export.2.b.comments\endcsname {}\relax
+\expandafter \def \csname Xskak.export.2.b.nextfen\endcsname {rnbqkbnr/pp2pppp/2p5/3p4/3PP3/8/PPP2PPP/RNBQKBNR w KQkq d6 0 3}\relax
+\expandafter \def \csname Xskak.export.2.b.pastfen\endcsname {rnbqkbnr/pp1ppppp/2p5/8/3PP3/8/PPP2PPP/RNBQKBNR b KQkq d3 0 2}\relax
+\expandafter \def \csname Xskak.export.2.b.nag\endcsname {}\relax
+\expandafter \def \csname Xskak.export.2.b.san\endcsname {d5}\relax
+\expandafter \def \csname Xskak.export.2.b.lan\endcsname {d7\xskakmovehyphen d5}\relax
+\expandafter \def \csname Xskak.export.2.b.opennr\endcsname {2\blackopen \beforeblack }\relax
+\expandafter \def \csname Xskak.export.3.w.movenr\endcsname {\Xskak.export.3.w.movenr }\relax
+\expandafter \def \csname Xskak.export.3.w.player\endcsname {\Xskak.export.3.w.player }\relax
+\expandafter \def \csname Xskak.export.3.w.moveid\endcsname {\Xskak.export.3.w.moveid }\relax
+\expandafter \def \csname Xskak.export.3.w.pgnpiece\endcsname {N}\relax
+\expandafter \def \csname Xskak.export.3.w.piece\endcsname {N}\relax
+\expandafter \def \csname Xskak.export.3.w.piecechar\endcsname {N}\relax
+\expandafter \def \csname Xskak.export.3.w.castling\endcsname {\setboolean {xskakboolcastling}{false}}\relax
+\expandafter \def \csname Xskak.export.3.w.longcastling\endcsname {\setboolean {xskakboollongcastling}{false}}\relax
+\expandafter \def \csname Xskak.export.3.w.capture\endcsname {\setboolean {xskakboolcapture}{false}}\relax
+\expandafter \def \csname Xskak.export.3.w.check\endcsname {\setboolean {xskakboolcheck}{false}}\relax
+\expandafter \def \csname Xskak.export.3.w.mate\endcsname {\setboolean {xskakboolmate}{false}}\relax
+\expandafter \def \csname Xskak.export.3.w.lostpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.3.w.lostpiecechar\endcsname {}\relax
+\expandafter \def \csname Xskak.export.3.w.pgnlostpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.3.w.movefrom\endcsname {b1}\relax
+\expandafter \def \csname Xskak.export.3.w.pgnmovefrom\endcsname {}\relax
+\expandafter \def \csname Xskak.export.3.w.moveto\endcsname {c3}\relax
+\expandafter \def \csname Xskak.export.3.w.move\endcsname {b1-c3}\relax
+\expandafter \def \csname Xskak.export.3.w.enpassant\endcsname {\setboolean {xskakboolenpassant}{false}}\relax
+\expandafter \def \csname Xskak.export.3.w.enpassantsquare\endcsname {-}\relax
+\expandafter \def \csname Xskak.export.3.w.promotion\endcsname {\setboolean {xskakboolpromotion}{false}}\relax
+\expandafter \def \csname Xskak.export.3.w.promotionpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.3.w.promotionpiecechar\endcsname {}\relax
+\expandafter \def \csname Xskak.export.3.w.addpieces\endcsname {Nc3}\relax
+\expandafter \def \csname Xskak.export.3.w.clearfields\endcsname {b1}\relax
+\expandafter \def \csname Xskak.export.3.w.comments\endcsname {}\relax
+\expandafter \def \csname Xskak.export.3.w.nextfen\endcsname {rnbqkbnr/pp2pppp/2p5/3p4/3PP3/2N5/PPP2PPP/R1BQKBNR b KQkq - 1 3}\relax
+\expandafter \def \csname Xskak.export.3.w.pastfen\endcsname {rnbqkbnr/pp2pppp/2p5/3p4/3PP3/8/PPP2PPP/RNBQKBNR w KQkq d6 0 3}\relax
+\expandafter \def \csname Xskak.export.3.w.nag\endcsname {}\relax
+\expandafter \def \csname Xskak.export.3.w.san\endcsname {\textsymfigsymbol {N}c3}\relax
+\expandafter \def \csname Xskak.export.3.w.lan\endcsname {\textsymfigsymbol {N}b1\xskakmovehyphen c3}\relax
+\expandafter \def \csname Xskak.export.3.w.opennr\endcsname {3\whiteopen \beforewhite }\relax
+\expandafter \def \csname Xskak.export.3.b.movenr\endcsname {\Xskak.export.3.b.movenr }\relax
+\expandafter \def \csname Xskak.export.3.b.player\endcsname {\Xskak.export.3.b.player }\relax
+\expandafter \def \csname Xskak.export.3.b.moveid\endcsname {\Xskak.export.3.b.moveid }\relax
+\expandafter \def \csname Xskak.export.3.b.pgnpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.3.b.piece\endcsname {p}\relax
+\expandafter \def \csname Xskak.export.3.b.piecechar\endcsname {p}\relax
+\expandafter \def \csname Xskak.export.3.b.castling\endcsname {\setboolean {xskakboolcastling}{false}}\relax
+\expandafter \def \csname Xskak.export.3.b.longcastling\endcsname {\setboolean {xskakboollongcastling}{false}}\relax
+\expandafter \def \csname Xskak.export.3.b.capture\endcsname {\setboolean {xskakboolcapture}{true}}\relax
+\expandafter \def \csname Xskak.export.3.b.check\endcsname {\setboolean {xskakboolcheck}{false}}\relax
+\expandafter \def \csname Xskak.export.3.b.mate\endcsname {\setboolean {xskakboolmate}{false}}\relax
+\expandafter \def \csname Xskak.export.3.b.lostpiece\endcsname {P}\relax
+\expandafter \def \csname Xskak.export.3.b.lostpiecechar\endcsname {p}\relax
+\expandafter \def \csname Xskak.export.3.b.pgnlostpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.3.b.movefrom\endcsname {d5}\relax
+\expandafter \def \csname Xskak.export.3.b.pgnmovefrom\endcsname {d}\relax
+\expandafter \def \csname Xskak.export.3.b.moveto\endcsname {e4}\relax
+\expandafter \def \csname Xskak.export.3.b.move\endcsname {d5-e4}\relax
+\expandafter \def \csname Xskak.export.3.b.enpassant\endcsname {\setboolean {xskakboolenpassant}{false}}\relax
+\expandafter \def \csname Xskak.export.3.b.enpassantsquare\endcsname {-}\relax
+\expandafter \def \csname Xskak.export.3.b.promotion\endcsname {\setboolean {xskakboolpromotion}{false}}\relax
+\expandafter \def \csname Xskak.export.3.b.promotionpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.3.b.promotionpiecechar\endcsname {}\relax
+\expandafter \def \csname Xskak.export.3.b.addpieces\endcsname {pe4}\relax
+\expandafter \def \csname Xskak.export.3.b.clearfields\endcsname {d5}\relax
+\expandafter \def \csname Xskak.export.3.b.comments\endcsname {}\relax
+\expandafter \def \csname Xskak.export.3.b.nextfen\endcsname {rnbqkbnr/pp2pppp/2p5/8/3Pp3/2N5/PPP2PPP/R1BQKBNR w KQkq - 0 4}\relax
+\expandafter \def \csname Xskak.export.3.b.pastfen\endcsname {rnbqkbnr/pp2pppp/2p5/3p4/3PP3/2N5/PPP2PPP/R1BQKBNR b KQkq - 1 3}\relax
+\expandafter \def \csname Xskak.export.3.b.nag\endcsname {}\relax
+\expandafter \def \csname Xskak.export.3.b.san\endcsname {d\capturesymbol e4}\relax
+\expandafter \def \csname Xskak.export.3.b.lan\endcsname {d5\capturesymbol e4}\relax
+\expandafter \def \csname Xskak.export.3.b.opennr\endcsname {3\blackopen \beforeblack }\relax
+\expandafter \def \csname Xskak.export.4.w.movenr\endcsname {\Xskak.export.4.w.movenr }\relax
+\expandafter \def \csname Xskak.export.4.w.player\endcsname {\Xskak.export.4.w.player }\relax
+\expandafter \def \csname Xskak.export.4.w.moveid\endcsname {\Xskak.export.4.w.moveid }\relax
+\expandafter \def \csname Xskak.export.4.w.pgnpiece\endcsname {N}\relax
+\expandafter \def \csname Xskak.export.4.w.piece\endcsname {N}\relax
+\expandafter \def \csname Xskak.export.4.w.piecechar\endcsname {N}\relax
+\expandafter \def \csname Xskak.export.4.w.castling\endcsname {\setboolean {xskakboolcastling}{false}}\relax
+\expandafter \def \csname Xskak.export.4.w.longcastling\endcsname {\setboolean {xskakboollongcastling}{false}}\relax
+\expandafter \def \csname Xskak.export.4.w.capture\endcsname {\setboolean {xskakboolcapture}{true}}\relax
+\expandafter \def \csname Xskak.export.4.w.check\endcsname {\setboolean {xskakboolcheck}{false}}\relax
+\expandafter \def \csname Xskak.export.4.w.mate\endcsname {\setboolean {xskakboolmate}{false}}\relax
+\expandafter \def \csname Xskak.export.4.w.lostpiece\endcsname {p}\relax
+\expandafter \def \csname Xskak.export.4.w.lostpiecechar\endcsname {p}\relax
+\expandafter \def \csname Xskak.export.4.w.pgnlostpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.4.w.movefrom\endcsname {c3}\relax
+\expandafter \def \csname Xskak.export.4.w.pgnmovefrom\endcsname {}\relax
+\expandafter \def \csname Xskak.export.4.w.moveto\endcsname {e4}\relax
+\expandafter \def \csname Xskak.export.4.w.move\endcsname {c3-e4}\relax
+\expandafter \def \csname Xskak.export.4.w.enpassant\endcsname {\setboolean {xskakboolenpassant}{false}}\relax
+\expandafter \def \csname Xskak.export.4.w.enpassantsquare\endcsname {-}\relax
+\expandafter \def \csname Xskak.export.4.w.promotion\endcsname {\setboolean {xskakboolpromotion}{false}}\relax
+\expandafter \def \csname Xskak.export.4.w.promotionpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.4.w.promotionpiecechar\endcsname {}\relax
+\expandafter \def \csname Xskak.export.4.w.addpieces\endcsname {Ne4}\relax
+\expandafter \def \csname Xskak.export.4.w.clearfields\endcsname {c3}\relax
+\expandafter \def \csname Xskak.export.4.w.comments\endcsname {}\relax
+\expandafter \def \csname Xskak.export.4.w.nextfen\endcsname {rnbqkbnr/pp2pppp/2p5/8/3PN3/8/PPP2PPP/R1BQKBNR b KQkq - 0 4}\relax
+\expandafter \def \csname Xskak.export.4.w.pastfen\endcsname {rnbqkbnr/pp2pppp/2p5/8/3Pp3/2N5/PPP2PPP/R1BQKBNR w KQkq - 0 4}\relax
+\expandafter \def \csname Xskak.export.4.w.nag\endcsname {}\relax
+\expandafter \def \csname Xskak.export.4.w.san\endcsname {\textsymfigsymbol {N}\capturesymbol e4}\relax
+\expandafter \def \csname Xskak.export.4.w.lan\endcsname {\textsymfigsymbol {N}c3\capturesymbol e4}\relax
+\expandafter \def \csname Xskak.export.4.w.opennr\endcsname {4\whiteopen \beforewhite }\relax
+\expandafter \def \csname Xskak.export.4.b.movenr\endcsname {\Xskak.export.4.b.movenr }\relax
+\expandafter \def \csname Xskak.export.4.b.player\endcsname {\Xskak.export.4.b.player }\relax
+\expandafter \def \csname Xskak.export.4.b.moveid\endcsname {\Xskak.export.4.b.moveid }\relax
+\expandafter \def \csname Xskak.export.4.b.pgnpiece\endcsname {N}\relax
+\expandafter \def \csname Xskak.export.4.b.piece\endcsname {n}\relax
+\expandafter \def \csname Xskak.export.4.b.piecechar\endcsname {N}\relax
+\expandafter \def \csname Xskak.export.4.b.castling\endcsname {\setboolean {xskakboolcastling}{false}}\relax
+\expandafter \def \csname Xskak.export.4.b.longcastling\endcsname {\setboolean {xskakboollongcastling}{false}}\relax
+\expandafter \def \csname Xskak.export.4.b.capture\endcsname {\setboolean {xskakboolcapture}{false}}\relax
+\expandafter \def \csname Xskak.export.4.b.check\endcsname {\setboolean {xskakboolcheck}{false}}\relax
+\expandafter \def \csname Xskak.export.4.b.mate\endcsname {\setboolean {xskakboolmate}{false}}\relax
+\expandafter \def \csname Xskak.export.4.b.lostpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.4.b.lostpiecechar\endcsname {}\relax
+\expandafter \def \csname Xskak.export.4.b.pgnlostpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.4.b.movefrom\endcsname {b8}\relax
+\expandafter \def \csname Xskak.export.4.b.pgnmovefrom\endcsname {}\relax
+\expandafter \def \csname Xskak.export.4.b.moveto\endcsname {d7}\relax
+\expandafter \def \csname Xskak.export.4.b.move\endcsname {b8-d7}\relax
+\expandafter \def \csname Xskak.export.4.b.enpassant\endcsname {\setboolean {xskakboolenpassant}{false}}\relax
+\expandafter \def \csname Xskak.export.4.b.enpassantsquare\endcsname {-}\relax
+\expandafter \def \csname Xskak.export.4.b.promotion\endcsname {\setboolean {xskakboolpromotion}{false}}\relax
+\expandafter \def \csname Xskak.export.4.b.promotionpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.4.b.promotionpiecechar\endcsname {}\relax
+\expandafter \def \csname Xskak.export.4.b.addpieces\endcsname {nd7}\relax
+\expandafter \def \csname Xskak.export.4.b.clearfields\endcsname {b8}\relax
+\expandafter \def \csname Xskak.export.4.b.comments\endcsname {}\relax
+\expandafter \def \csname Xskak.export.4.b.nextfen\endcsname {r1bqkbnr/pp1npppp/2p5/8/3PN3/8/PPP2PPP/R1BQKBNR w KQkq - 1 5}\relax
+\expandafter \def \csname Xskak.export.4.b.pastfen\endcsname {rnbqkbnr/pp2pppp/2p5/8/3PN3/8/PPP2PPP/R1BQKBNR b KQkq - 0 4}\relax
+\expandafter \def \csname Xskak.export.4.b.nag\endcsname {}\relax
+\expandafter \def \csname Xskak.export.4.b.san\endcsname {\textsymfigsymbol {N}d7}\relax
+\expandafter \def \csname Xskak.export.4.b.lan\endcsname {\textsymfigsymbol {N}b8\xskakmovehyphen d7}\relax
+\expandafter \def \csname Xskak.export.4.b.opennr\endcsname {4\blackopen \beforeblack }\relax
+\expandafter \def \csname Xskak.export.5.w.movenr\endcsname {\Xskak.export.5.w.movenr }\relax
+\expandafter \def \csname Xskak.export.5.w.player\endcsname {\Xskak.export.5.w.player }\relax
+\expandafter \def \csname Xskak.export.5.w.moveid\endcsname {\Xskak.export.5.w.moveid }\relax
+\expandafter \def \csname Xskak.export.5.w.pgnpiece\endcsname {N}\relax
+\expandafter \def \csname Xskak.export.5.w.piece\endcsname {N}\relax
+\expandafter \def \csname Xskak.export.5.w.piecechar\endcsname {N}\relax
+\expandafter \def \csname Xskak.export.5.w.castling\endcsname {\setboolean {xskakboolcastling}{false}}\relax
+\expandafter \def \csname Xskak.export.5.w.longcastling\endcsname {\setboolean {xskakboollongcastling}{false}}\relax
+\expandafter \def \csname Xskak.export.5.w.capture\endcsname {\setboolean {xskakboolcapture}{false}}\relax
+\expandafter \def \csname Xskak.export.5.w.check\endcsname {\setboolean {xskakboolcheck}{false}}\relax
+\expandafter \def \csname Xskak.export.5.w.mate\endcsname {\setboolean {xskakboolmate}{false}}\relax
+\expandafter \def \csname Xskak.export.5.w.lostpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.5.w.lostpiecechar\endcsname {}\relax
+\expandafter \def \csname Xskak.export.5.w.pgnlostpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.5.w.movefrom\endcsname {e4}\relax
+\expandafter \def \csname Xskak.export.5.w.pgnmovefrom\endcsname {}\relax
+\expandafter \def \csname Xskak.export.5.w.moveto\endcsname {g5}\relax
+\expandafter \def \csname Xskak.export.5.w.move\endcsname {e4-g5}\relax
+\expandafter \def \csname Xskak.export.5.w.enpassant\endcsname {\setboolean {xskakboolenpassant}{false}}\relax
+\expandafter \def \csname Xskak.export.5.w.enpassantsquare\endcsname {-}\relax
+\expandafter \def \csname Xskak.export.5.w.promotion\endcsname {\setboolean {xskakboolpromotion}{false}}\relax
+\expandafter \def \csname Xskak.export.5.w.promotionpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.5.w.promotionpiecechar\endcsname {}\relax
+\expandafter \def \csname Xskak.export.5.w.addpieces\endcsname {Ng5}\relax
+\expandafter \def \csname Xskak.export.5.w.clearfields\endcsname {e4}\relax
+\expandafter \def \csname Xskak.export.5.w.comments\endcsname {}\relax
+\expandafter \def \csname Xskak.export.5.w.nextfen\endcsname {r1bqkbnr/pp1npppp/2p5/6N1/3P4/8/PPP2PPP/R1BQKBNR b KQkq - 2 5}\relax
+\expandafter \def \csname Xskak.export.5.w.pastfen\endcsname {r1bqkbnr/pp1npppp/2p5/8/3PN3/8/PPP2PPP/R1BQKBNR w KQkq - 1 5}\relax
+\expandafter \def \csname Xskak.export.5.w.nag\endcsname {}\relax
+\expandafter \def \csname Xskak.export.5.w.san\endcsname {\textsymfigsymbol {N}g5}\relax
+\expandafter \def \csname Xskak.export.5.w.lan\endcsname {\textsymfigsymbol {N}e4\xskakmovehyphen g5}\relax
+\expandafter \def \csname Xskak.export.5.w.opennr\endcsname {5\whiteopen \beforewhite }\relax
+\expandafter \def \csname Xskak.export.5.b.movenr\endcsname {\Xskak.export.5.b.movenr }\relax
+\expandafter \def \csname Xskak.export.5.b.player\endcsname {\Xskak.export.5.b.player }\relax
+\expandafter \def \csname Xskak.export.5.b.moveid\endcsname {\Xskak.export.5.b.moveid }\relax
+\expandafter \def \csname Xskak.export.5.b.pgnpiece\endcsname {N}\relax
+\expandafter \def \csname Xskak.export.5.b.piece\endcsname {n}\relax
+\expandafter \def \csname Xskak.export.5.b.piecechar\endcsname {N}\relax
+\expandafter \def \csname Xskak.export.5.b.castling\endcsname {\setboolean {xskakboolcastling}{false}}\relax
+\expandafter \def \csname Xskak.export.5.b.longcastling\endcsname {\setboolean {xskakboollongcastling}{false}}\relax
+\expandafter \def \csname Xskak.export.5.b.capture\endcsname {\setboolean {xskakboolcapture}{false}}\relax
+\expandafter \def \csname Xskak.export.5.b.check\endcsname {\setboolean {xskakboolcheck}{false}}\relax
+\expandafter \def \csname Xskak.export.5.b.mate\endcsname {\setboolean {xskakboolmate}{false}}\relax
+\expandafter \def \csname Xskak.export.5.b.lostpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.5.b.lostpiecechar\endcsname {}\relax
+\expandafter \def \csname Xskak.export.5.b.pgnlostpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.5.b.movefrom\endcsname {g8}\relax
+\expandafter \def \csname Xskak.export.5.b.pgnmovefrom\endcsname {g}\relax
+\expandafter \def \csname Xskak.export.5.b.moveto\endcsname {f6}\relax
+\expandafter \def \csname Xskak.export.5.b.move\endcsname {g8-f6}\relax
+\expandafter \def \csname Xskak.export.5.b.enpassant\endcsname {\setboolean {xskakboolenpassant}{false}}\relax
+\expandafter \def \csname Xskak.export.5.b.enpassantsquare\endcsname {-}\relax
+\expandafter \def \csname Xskak.export.5.b.promotion\endcsname {\setboolean {xskakboolpromotion}{false}}\relax
+\expandafter \def \csname Xskak.export.5.b.promotionpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.5.b.promotionpiecechar\endcsname {}\relax
+\expandafter \def \csname Xskak.export.5.b.addpieces\endcsname {nf6}\relax
+\expandafter \def \csname Xskak.export.5.b.clearfields\endcsname {g8}\relax
+\expandafter \def \csname Xskak.export.5.b.comments\endcsname {}\relax
+\expandafter \def \csname Xskak.export.5.b.nextfen\endcsname {r1bqkb1r/pp1npppp/2p2n2/6N1/3P4/8/PPP2PPP/R1BQKBNR w KQkq - 3 6}\relax
+\expandafter \def \csname Xskak.export.5.b.pastfen\endcsname {r1bqkbnr/pp1npppp/2p5/6N1/3P4/8/PPP2PPP/R1BQKBNR b KQkq - 2 5}\relax
+\expandafter \def \csname Xskak.export.5.b.nag\endcsname {}\relax
+\expandafter \def \csname Xskak.export.5.b.san\endcsname {\textsymfigsymbol {N}gf6}\relax
+\expandafter \def \csname Xskak.export.5.b.lan\endcsname {\textsymfigsymbol {N}g8\xskakmovehyphen f6}\relax
+\expandafter \def \csname Xskak.export.5.b.opennr\endcsname {5\blackopen \beforeblack }\relax
+\expandafter \def \csname Xskak.export.6.w.movenr\endcsname {\Xskak.export.6.w.movenr }\relax
+\expandafter \def \csname Xskak.export.6.w.player\endcsname {\Xskak.export.6.w.player }\relax
+\expandafter \def \csname Xskak.export.6.w.moveid\endcsname {\Xskak.export.6.w.moveid }\relax
+\expandafter \def \csname Xskak.export.6.w.pgnpiece\endcsname {B}\relax
+\expandafter \def \csname Xskak.export.6.w.piece\endcsname {B}\relax
+\expandafter \def \csname Xskak.export.6.w.piecechar\endcsname {B}\relax
+\expandafter \def \csname Xskak.export.6.w.castling\endcsname {\setboolean {xskakboolcastling}{false}}\relax
+\expandafter \def \csname Xskak.export.6.w.longcastling\endcsname {\setboolean {xskakboollongcastling}{false}}\relax
+\expandafter \def \csname Xskak.export.6.w.capture\endcsname {\setboolean {xskakboolcapture}{false}}\relax
+\expandafter \def \csname Xskak.export.6.w.check\endcsname {\setboolean {xskakboolcheck}{false}}\relax
+\expandafter \def \csname Xskak.export.6.w.mate\endcsname {\setboolean {xskakboolmate}{false}}\relax
+\expandafter \def \csname Xskak.export.6.w.lostpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.6.w.lostpiecechar\endcsname {}\relax
+\expandafter \def \csname Xskak.export.6.w.pgnlostpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.6.w.movefrom\endcsname {f1}\relax
+\expandafter \def \csname Xskak.export.6.w.pgnmovefrom\endcsname {}\relax
+\expandafter \def \csname Xskak.export.6.w.moveto\endcsname {d3}\relax
+\expandafter \def \csname Xskak.export.6.w.move\endcsname {f1-d3}\relax
+\expandafter \def \csname Xskak.export.6.w.enpassant\endcsname {\setboolean {xskakboolenpassant}{false}}\relax
+\expandafter \def \csname Xskak.export.6.w.enpassantsquare\endcsname {-}\relax
+\expandafter \def \csname Xskak.export.6.w.promotion\endcsname {\setboolean {xskakboolpromotion}{false}}\relax
+\expandafter \def \csname Xskak.export.6.w.promotionpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.6.w.promotionpiecechar\endcsname {}\relax
+\expandafter \def \csname Xskak.export.6.w.addpieces\endcsname {Bd3}\relax
+\expandafter \def \csname Xskak.export.6.w.clearfields\endcsname {f1}\relax
+\expandafter \def \csname Xskak.export.6.w.comments\endcsname {}\relax
+\expandafter \def \csname Xskak.export.6.w.nextfen\endcsname {r1bqkb1r/pp1npppp/2p2n2/6N1/3P4/3B4/PPP2PPP/R1BQK1NR b KQkq - 4 6}\relax
+\expandafter \def \csname Xskak.export.6.w.pastfen\endcsname {r1bqkb1r/pp1npppp/2p2n2/6N1/3P4/8/PPP2PPP/R1BQKBNR w KQkq - 3 6}\relax
+\expandafter \def \csname Xskak.export.6.w.nag\endcsname {}\relax
+\expandafter \def \csname Xskak.export.6.w.san\endcsname {\textsymfigsymbol {B}d3}\relax
+\expandafter \def \csname Xskak.export.6.w.lan\endcsname {\textsymfigsymbol {B}f1\xskakmovehyphen d3}\relax
+\expandafter \def \csname Xskak.export.6.w.opennr\endcsname {6\whiteopen \beforewhite }\relax
+\expandafter \def \csname Xskak.export.6.b.movenr\endcsname {\Xskak.export.6.b.movenr }\relax
+\expandafter \def \csname Xskak.export.6.b.player\endcsname {\Xskak.export.6.b.player }\relax
+\expandafter \def \csname Xskak.export.6.b.moveid\endcsname {\Xskak.export.6.b.moveid }\relax
+\expandafter \def \csname Xskak.export.6.b.pgnpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.6.b.piece\endcsname {p}\relax
+\expandafter \def \csname Xskak.export.6.b.piecechar\endcsname {p}\relax
+\expandafter \def \csname Xskak.export.6.b.castling\endcsname {\setboolean {xskakboolcastling}{false}}\relax
+\expandafter \def \csname Xskak.export.6.b.longcastling\endcsname {\setboolean {xskakboollongcastling}{false}}\relax
+\expandafter \def \csname Xskak.export.6.b.capture\endcsname {\setboolean {xskakboolcapture}{false}}\relax
+\expandafter \def \csname Xskak.export.6.b.check\endcsname {\setboolean {xskakboolcheck}{false}}\relax
+\expandafter \def \csname Xskak.export.6.b.mate\endcsname {\setboolean {xskakboolmate}{false}}\relax
+\expandafter \def \csname Xskak.export.6.b.lostpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.6.b.lostpiecechar\endcsname {}\relax
+\expandafter \def \csname Xskak.export.6.b.pgnlostpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.6.b.movefrom\endcsname {e7}\relax
+\expandafter \def \csname Xskak.export.6.b.pgnmovefrom\endcsname {}\relax
+\expandafter \def \csname Xskak.export.6.b.moveto\endcsname {e6}\relax
+\expandafter \def \csname Xskak.export.6.b.move\endcsname {e7-e6}\relax
+\expandafter \def \csname Xskak.export.6.b.enpassant\endcsname {\setboolean {xskakboolenpassant}{false}}\relax
+\expandafter \def \csname Xskak.export.6.b.enpassantsquare\endcsname {-}\relax
+\expandafter \def \csname Xskak.export.6.b.promotion\endcsname {\setboolean {xskakboolpromotion}{false}}\relax
+\expandafter \def \csname Xskak.export.6.b.promotionpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.6.b.promotionpiecechar\endcsname {}\relax
+\expandafter \def \csname Xskak.export.6.b.addpieces\endcsname {pe6}\relax
+\expandafter \def \csname Xskak.export.6.b.clearfields\endcsname {e7}\relax
+\expandafter \def \csname Xskak.export.6.b.comments\endcsname {}\relax
+\expandafter \def \csname Xskak.export.6.b.nextfen\endcsname {r1bqkb1r/pp1n1ppp/2p1pn2/6N1/3P4/3B4/PPP2PPP/R1BQK1NR w KQkq - 0 7}\relax
+\expandafter \def \csname Xskak.export.6.b.pastfen\endcsname {r1bqkb1r/pp1npppp/2p2n2/6N1/3P4/3B4/PPP2PPP/R1BQK1NR b KQkq - 4 6}\relax
+\expandafter \def \csname Xskak.export.6.b.nag\endcsname {}\relax
+\expandafter \def \csname Xskak.export.6.b.san\endcsname {e6}\relax
+\expandafter \def \csname Xskak.export.6.b.lan\endcsname {e7\xskakmovehyphen e6}\relax
+\expandafter \def \csname Xskak.export.6.b.opennr\endcsname {6\blackopen \beforeblack }\relax
+\expandafter \def \csname Xskak.export.7.w.movenr\endcsname {\Xskak.export.7.w.movenr }\relax
+\expandafter \def \csname Xskak.export.7.w.player\endcsname {\Xskak.export.7.w.player }\relax
+\expandafter \def \csname Xskak.export.7.w.moveid\endcsname {\Xskak.export.7.w.moveid }\relax
+\expandafter \def \csname Xskak.export.7.w.pgnpiece\endcsname {N}\relax
+\expandafter \def \csname Xskak.export.7.w.piece\endcsname {N}\relax
+\expandafter \def \csname Xskak.export.7.w.piecechar\endcsname {N}\relax
+\expandafter \def \csname Xskak.export.7.w.castling\endcsname {\setboolean {xskakboolcastling}{false}}\relax
+\expandafter \def \csname Xskak.export.7.w.longcastling\endcsname {\setboolean {xskakboollongcastling}{false}}\relax
+\expandafter \def \csname Xskak.export.7.w.capture\endcsname {\setboolean {xskakboolcapture}{false}}\relax
+\expandafter \def \csname Xskak.export.7.w.check\endcsname {\setboolean {xskakboolcheck}{false}}\relax
+\expandafter \def \csname Xskak.export.7.w.mate\endcsname {\setboolean {xskakboolmate}{false}}\relax
+\expandafter \def \csname Xskak.export.7.w.lostpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.7.w.lostpiecechar\endcsname {}\relax
+\expandafter \def \csname Xskak.export.7.w.pgnlostpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.7.w.movefrom\endcsname {g1}\relax
+\expandafter \def \csname Xskak.export.7.w.pgnmovefrom\endcsname {1}\relax
+\expandafter \def \csname Xskak.export.7.w.moveto\endcsname {f3}\relax
+\expandafter \def \csname Xskak.export.7.w.move\endcsname {g1-f3}\relax
+\expandafter \def \csname Xskak.export.7.w.enpassant\endcsname {\setboolean {xskakboolenpassant}{false}}\relax
+\expandafter \def \csname Xskak.export.7.w.enpassantsquare\endcsname {-}\relax
+\expandafter \def \csname Xskak.export.7.w.promotion\endcsname {\setboolean {xskakboolpromotion}{false}}\relax
+\expandafter \def \csname Xskak.export.7.w.promotionpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.7.w.promotionpiecechar\endcsname {}\relax
+\expandafter \def \csname Xskak.export.7.w.addpieces\endcsname {Nf3}\relax
+\expandafter \def \csname Xskak.export.7.w.clearfields\endcsname {g1}\relax
+\expandafter \def \csname Xskak.export.7.w.comments\endcsname {}\relax
+\expandafter \def \csname Xskak.export.7.w.nextfen\endcsname {r1bqkb1r/pp1n1ppp/2p1pn2/6N1/3P4/3B1N2/PPP2PPP/R1BQK2R b KQkq - 1 7}\relax
+\expandafter \def \csname Xskak.export.7.w.pastfen\endcsname {r1bqkb1r/pp1n1ppp/2p1pn2/6N1/3P4/3B4/PPP2PPP/R1BQK1NR w KQkq - 0 7}\relax
+\expandafter \def \csname Xskak.export.7.w.nag\endcsname {}\relax
+\expandafter \def \csname Xskak.export.7.w.san\endcsname {\textsymfigsymbol {N}1f3}\relax
+\expandafter \def \csname Xskak.export.7.w.lan\endcsname {\textsymfigsymbol {N}g1\xskakmovehyphen f3}\relax
+\expandafter \def \csname Xskak.export.7.w.opennr\endcsname {7\whiteopen \beforewhite }\relax
+\expandafter \def \csname Xskak.export.7.b.movenr\endcsname {\Xskak.export.7.b.movenr }\relax
+\expandafter \def \csname Xskak.export.7.b.player\endcsname {\Xskak.export.7.b.player }\relax
+\expandafter \def \csname Xskak.export.7.b.moveid\endcsname {\Xskak.export.7.b.moveid }\relax
+\expandafter \def \csname Xskak.export.7.b.pgnpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.7.b.piece\endcsname {p}\relax
+\expandafter \def \csname Xskak.export.7.b.piecechar\endcsname {p}\relax
+\expandafter \def \csname Xskak.export.7.b.castling\endcsname {\setboolean {xskakboolcastling}{false}}\relax
+\expandafter \def \csname Xskak.export.7.b.longcastling\endcsname {\setboolean {xskakboollongcastling}{false}}\relax
+\expandafter \def \csname Xskak.export.7.b.capture\endcsname {\setboolean {xskakboolcapture}{false}}\relax
+\expandafter \def \csname Xskak.export.7.b.check\endcsname {\setboolean {xskakboolcheck}{false}}\relax
+\expandafter \def \csname Xskak.export.7.b.mate\endcsname {\setboolean {xskakboolmate}{false}}\relax
+\expandafter \def \csname Xskak.export.7.b.lostpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.7.b.lostpiecechar\endcsname {}\relax
+\expandafter \def \csname Xskak.export.7.b.pgnlostpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.7.b.movefrom\endcsname {h7}\relax
+\expandafter \def \csname Xskak.export.7.b.pgnmovefrom\endcsname {}\relax
+\expandafter \def \csname Xskak.export.7.b.moveto\endcsname {h6}\relax
+\expandafter \def \csname Xskak.export.7.b.move\endcsname {h7-h6}\relax
+\expandafter \def \csname Xskak.export.7.b.enpassant\endcsname {\setboolean {xskakboolenpassant}{false}}\relax
+\expandafter \def \csname Xskak.export.7.b.enpassantsquare\endcsname {-}\relax
+\expandafter \def \csname Xskak.export.7.b.promotion\endcsname {\setboolean {xskakboolpromotion}{false}}\relax
+\expandafter \def \csname Xskak.export.7.b.promotionpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.7.b.promotionpiecechar\endcsname {}\relax
+\expandafter \def \csname Xskak.export.7.b.addpieces\endcsname {ph6}\relax
+\expandafter \def \csname Xskak.export.7.b.clearfields\endcsname {h7}\relax
+\expandafter \def \csname Xskak.export.7.b.comments\endcsname {}\relax
+\expandafter \def \csname Xskak.export.7.b.nextfen\endcsname {r1bqkb1r/pp1n1pp1/2p1pn1p/6N1/3P4/3B1N2/PPP2PPP/R1BQK2R w KQkq - 0 8}\relax
+\expandafter \def \csname Xskak.export.7.b.pastfen\endcsname {r1bqkb1r/pp1n1ppp/2p1pn2/6N1/3P4/3B1N2/PPP2PPP/R1BQK2R b KQkq - 1 7}\relax
+\expandafter \def \csname Xskak.export.7.b.nag\endcsname {}\relax
+\expandafter \def \csname Xskak.export.7.b.san\endcsname {h6}\relax
+\expandafter \def \csname Xskak.export.7.b.lan\endcsname {h7\xskakmovehyphen h6}\relax
+\expandafter \def \csname Xskak.export.7.b.opennr\endcsname {7\blackopen \beforeblack }\relax
+\expandafter \def \csname Xskak.export.8.w.movenr\endcsname {\Xskak.export.8.w.movenr }\relax
+\expandafter \def \csname Xskak.export.8.w.player\endcsname {\Xskak.export.8.w.player }\relax
+\expandafter \def \csname Xskak.export.8.w.moveid\endcsname {\Xskak.export.8.w.moveid }\relax
+\expandafter \def \csname Xskak.export.8.w.pgnpiece\endcsname {N}\relax
+\expandafter \def \csname Xskak.export.8.w.piece\endcsname {N}\relax
+\expandafter \def \csname Xskak.export.8.w.piecechar\endcsname {N}\relax
+\expandafter \def \csname Xskak.export.8.w.castling\endcsname {\setboolean {xskakboolcastling}{false}}\relax
+\expandafter \def \csname Xskak.export.8.w.longcastling\endcsname {\setboolean {xskakboollongcastling}{false}}\relax
+\expandafter \def \csname Xskak.export.8.w.capture\endcsname {\setboolean {xskakboolcapture}{true}}\relax
+\expandafter \def \csname Xskak.export.8.w.check\endcsname {\setboolean {xskakboolcheck}{false}}\relax
+\expandafter \def \csname Xskak.export.8.w.mate\endcsname {\setboolean {xskakboolmate}{false}}\relax
+\expandafter \def \csname Xskak.export.8.w.lostpiece\endcsname {p}\relax
+\expandafter \def \csname Xskak.export.8.w.lostpiecechar\endcsname {p}\relax
+\expandafter \def \csname Xskak.export.8.w.pgnlostpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.8.w.movefrom\endcsname {g5}\relax
+\expandafter \def \csname Xskak.export.8.w.pgnmovefrom\endcsname {}\relax
+\expandafter \def \csname Xskak.export.8.w.moveto\endcsname {e6}\relax
+\expandafter \def \csname Xskak.export.8.w.move\endcsname {g5-e6}\relax
+\expandafter \def \csname Xskak.export.8.w.enpassant\endcsname {\setboolean {xskakboolenpassant}{false}}\relax
+\expandafter \def \csname Xskak.export.8.w.enpassantsquare\endcsname {-}\relax
+\expandafter \def \csname Xskak.export.8.w.promotion\endcsname {\setboolean {xskakboolpromotion}{false}}\relax
+\expandafter \def \csname Xskak.export.8.w.promotionpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.8.w.promotionpiecechar\endcsname {}\relax
+\expandafter \def \csname Xskak.export.8.w.addpieces\endcsname {Ne6}\relax
+\expandafter \def \csname Xskak.export.8.w.clearfields\endcsname {g5}\relax
+\expandafter \def \csname Xskak.export.8.w.comments\endcsname {}\relax
+\expandafter \def \csname Xskak.export.8.w.nextfen\endcsname {r1bqkb1r/pp1n1pp1/2p1Nn1p/8/3P4/3B1N2/PPP2PPP/R1BQK2R b KQkq - 0 8}\relax
+\expandafter \def \csname Xskak.export.8.w.pastfen\endcsname {r1bqkb1r/pp1n1pp1/2p1pn1p/6N1/3P4/3B1N2/PPP2PPP/R1BQK2R w KQkq - 0 8}\relax
+\expandafter \def \csname Xskak.export.8.w.nag\endcsname {}\relax
+\expandafter \def \csname Xskak.export.8.w.san\endcsname {\textsymfigsymbol {N}\capturesymbol e6}\relax
+\expandafter \def \csname Xskak.export.8.w.lan\endcsname {\textsymfigsymbol {N}g5\capturesymbol e6}\relax
+\expandafter \def \csname Xskak.export.8.w.opennr\endcsname {8\whiteopen \beforewhite }\relax
+\expandafter \def \csname Xskak.export.8.b.movenr\endcsname {\Xskak.export.8.b.movenr }\relax
+\expandafter \def \csname Xskak.export.8.b.player\endcsname {\Xskak.export.8.b.player }\relax
+\expandafter \def \csname Xskak.export.8.b.moveid\endcsname {\Xskak.export.8.b.moveid }\relax
+\expandafter \def \csname Xskak.export.8.b.pgnpiece\endcsname {Q}\relax
+\expandafter \def \csname Xskak.export.8.b.piece\endcsname {q}\relax
+\expandafter \def \csname Xskak.export.8.b.piecechar\endcsname {Q}\relax
+\expandafter \def \csname Xskak.export.8.b.castling\endcsname {\setboolean {xskakboolcastling}{false}}\relax
+\expandafter \def \csname Xskak.export.8.b.longcastling\endcsname {\setboolean {xskakboollongcastling}{false}}\relax
+\expandafter \def \csname Xskak.export.8.b.capture\endcsname {\setboolean {xskakboolcapture}{false}}\relax
+\expandafter \def \csname Xskak.export.8.b.check\endcsname {\setboolean {xskakboolcheck}{false}}\relax
+\expandafter \def \csname Xskak.export.8.b.mate\endcsname {\setboolean {xskakboolmate}{false}}\relax
+\expandafter \def \csname Xskak.export.8.b.lostpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.8.b.lostpiecechar\endcsname {}\relax
+\expandafter \def \csname Xskak.export.8.b.pgnlostpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.8.b.movefrom\endcsname {d8}\relax
+\expandafter \def \csname Xskak.export.8.b.pgnmovefrom\endcsname {}\relax
+\expandafter \def \csname Xskak.export.8.b.moveto\endcsname {e7}\relax
+\expandafter \def \csname Xskak.export.8.b.move\endcsname {d8-e7}\relax
+\expandafter \def \csname Xskak.export.8.b.enpassant\endcsname {\setboolean {xskakboolenpassant}{false}}\relax
+\expandafter \def \csname Xskak.export.8.b.enpassantsquare\endcsname {-}\relax
+\expandafter \def \csname Xskak.export.8.b.promotion\endcsname {\setboolean {xskakboolpromotion}{false}}\relax
+\expandafter \def \csname Xskak.export.8.b.promotionpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.8.b.promotionpiecechar\endcsname {}\relax
+\expandafter \def \csname Xskak.export.8.b.addpieces\endcsname {qe7}\relax
+\expandafter \def \csname Xskak.export.8.b.clearfields\endcsname {d8}\relax
+\expandafter \def \csname Xskak.export.8.b.comments\endcsname {}\relax
+\expandafter \def \csname Xskak.export.8.b.nextfen\endcsname {r1b1kb1r/pp1nqpp1/2p1Nn1p/8/3P4/3B1N2/PPP2PPP/R1BQK2R w KQkq - 1 9}\relax
+\expandafter \def \csname Xskak.export.8.b.pastfen\endcsname {r1bqkb1r/pp1n1pp1/2p1Nn1p/8/3P4/3B1N2/PPP2PPP/R1BQK2R b KQkq - 0 8}\relax
+\expandafter \def \csname Xskak.export.8.b.nag\endcsname {}\relax
+\expandafter \def \csname Xskak.export.8.b.san\endcsname {\textsymfigsymbol {Q}e7}\relax
+\expandafter \def \csname Xskak.export.8.b.lan\endcsname {\textsymfigsymbol {Q}d8\xskakmovehyphen e7}\relax
+\expandafter \def \csname Xskak.export.8.b.opennr\endcsname {8\blackopen \beforeblack }\relax
+\expandafter \def \csname Xskak.export.9.w.movenr\endcsname {\Xskak.export.9.w.movenr }\relax
+\expandafter \def \csname Xskak.export.9.w.player\endcsname {\Xskak.export.9.w.player }\relax
+\expandafter \def \csname Xskak.export.9.w.moveid\endcsname {\Xskak.export.9.w.moveid }\relax
+\expandafter \def \csname Xskak.export.9.w.pgnpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.9.w.piece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.9.w.piecechar\endcsname {}\relax
+\expandafter \def \csname Xskak.export.9.w.castling\endcsname {\setboolean {xskakboolcastling}{true}}\relax
+\expandafter \def \csname Xskak.export.9.w.longcastling\endcsname {\setboolean {xskakboollongcastling}{false}}\relax
+\expandafter \def \csname Xskak.export.9.w.capture\endcsname {\setboolean {xskakboolcapture}{false}}\relax
+\expandafter \def \csname Xskak.export.9.w.check\endcsname {\setboolean {xskakboolcheck}{false}}\relax
+\expandafter \def \csname Xskak.export.9.w.mate\endcsname {\setboolean {xskakboolmate}{false}}\relax
+\expandafter \def \csname Xskak.export.9.w.lostpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.9.w.lostpiecechar\endcsname {}\relax
+\expandafter \def \csname Xskak.export.9.w.pgnlostpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.9.w.movefrom\endcsname {e1,h1}\relax
+\expandafter \def \csname Xskak.export.9.w.pgnmovefrom\endcsname {}\relax
+\expandafter \def \csname Xskak.export.9.w.moveto\endcsname {g1,f1}\relax
+\expandafter \def \csname Xskak.export.9.w.move\endcsname {e1-g1,h1-f1}\relax
+\expandafter \def \csname Xskak.export.9.w.enpassant\endcsname {\setboolean {xskakboolenpassant}{false}}\relax
+\expandafter \def \csname Xskak.export.9.w.enpassantsquare\endcsname {-}\relax
+\expandafter \def \csname Xskak.export.9.w.promotion\endcsname {\setboolean {xskakboolpromotion}{false}}\relax
+\expandafter \def \csname Xskak.export.9.w.promotionpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.9.w.promotionpiecechar\endcsname {}\relax
+\expandafter \def \csname Xskak.export.9.w.addpieces\endcsname {Kg1,Rf1}\relax
+\expandafter \def \csname Xskak.export.9.w.clearfields\endcsname {e1,h1}\relax
+\expandafter \def \csname Xskak.export.9.w.comments\endcsname {}\relax
+\expandafter \def \csname Xskak.export.9.w.nextfen\endcsname {r1b1kb1r/pp1nqpp1/2p1Nn1p/8/3P4/3B1N2/PPP2PPP/R1BQ1RK1 b kq - 2 9}\relax
+\expandafter \def \csname Xskak.export.9.w.pastfen\endcsname {r1b1kb1r/pp1nqpp1/2p1Nn1p/8/3P4/3B1N2/PPP2PPP/R1BQK2R w KQkq - 1 9}\relax
+\expandafter \def \csname Xskak.export.9.w.nag\endcsname {}\relax
+\expandafter \def \csname Xskak.export.9.w.san\endcsname {\castlingchar \castlinghyphen \castlingchar }\relax
+\expandafter \def \csname Xskak.export.9.w.lan\endcsname {\castlingchar \castlinghyphen \castlingchar }\relax
+\expandafter \def \csname Xskak.export.9.w.opennr\endcsname {9\whiteopen \beforewhite }\relax
+\expandafter \def \csname Xskak.export.9.b.movenr\endcsname {\Xskak.export.9.b.movenr }\relax
+\expandafter \def \csname Xskak.export.9.b.player\endcsname {\Xskak.export.9.b.player }\relax
+\expandafter \def \csname Xskak.export.9.b.moveid\endcsname {\Xskak.export.9.b.moveid }\relax
+\expandafter \def \csname Xskak.export.9.b.pgnpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.9.b.piece\endcsname {p}\relax
+\expandafter \def \csname Xskak.export.9.b.piecechar\endcsname {p}\relax
+\expandafter \def \csname Xskak.export.9.b.castling\endcsname {\setboolean {xskakboolcastling}{false}}\relax
+\expandafter \def \csname Xskak.export.9.b.longcastling\endcsname {\setboolean {xskakboollongcastling}{false}}\relax
+\expandafter \def \csname Xskak.export.9.b.capture\endcsname {\setboolean {xskakboolcapture}{true}}\relax
+\expandafter \def \csname Xskak.export.9.b.check\endcsname {\setboolean {xskakboolcheck}{false}}\relax
+\expandafter \def \csname Xskak.export.9.b.mate\endcsname {\setboolean {xskakboolmate}{false}}\relax
+\expandafter \def \csname Xskak.export.9.b.lostpiece\endcsname {N}\relax
+\expandafter \def \csname Xskak.export.9.b.lostpiecechar\endcsname {N}\relax
+\expandafter \def \csname Xskak.export.9.b.pgnlostpiece\endcsname {N}\relax
+\expandafter \def \csname Xskak.export.9.b.movefrom\endcsname {f7}\relax
+\expandafter \def \csname Xskak.export.9.b.pgnmovefrom\endcsname {f}\relax
+\expandafter \def \csname Xskak.export.9.b.moveto\endcsname {e6}\relax
+\expandafter \def \csname Xskak.export.9.b.move\endcsname {f7-e6}\relax
+\expandafter \def \csname Xskak.export.9.b.enpassant\endcsname {\setboolean {xskakboolenpassant}{false}}\relax
+\expandafter \def \csname Xskak.export.9.b.enpassantsquare\endcsname {-}\relax
+\expandafter \def \csname Xskak.export.9.b.promotion\endcsname {\setboolean {xskakboolpromotion}{false}}\relax
+\expandafter \def \csname Xskak.export.9.b.promotionpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.9.b.promotionpiecechar\endcsname {}\relax
+\expandafter \def \csname Xskak.export.9.b.addpieces\endcsname {pe6}\relax
+\expandafter \def \csname Xskak.export.9.b.clearfields\endcsname {f7}\relax
+\expandafter \def \csname Xskak.export.9.b.comments\endcsname {}\relax
+\expandafter \def \csname Xskak.export.9.b.nextfen\endcsname {r1b1kb1r/pp1nq1p1/2p1pn1p/8/3P4/3B1N2/PPP2PPP/R1BQ1RK1 w kq - 0 10}\relax
+\expandafter \def \csname Xskak.export.9.b.pastfen\endcsname {r1b1kb1r/pp1nqpp1/2p1Nn1p/8/3P4/3B1N2/PPP2PPP/R1BQ1RK1 b kq - 2 9}\relax
+\expandafter \def \csname Xskak.export.9.b.nag\endcsname {}\relax
+\expandafter \def \csname Xskak.export.9.b.san\endcsname {f\capturesymbol e6}\relax
+\expandafter \def \csname Xskak.export.9.b.lan\endcsname {f7\capturesymbol e6}\relax
+\expandafter \def \csname Xskak.export.9.b.opennr\endcsname {9\blackopen \beforeblack }\relax
+\expandafter \def \csname Xskak.export.10.w.movenr\endcsname {\Xskak.export.10.w.movenr }\relax
+\expandafter \def \csname Xskak.export.10.w.player\endcsname {\Xskak.export.10.w.player }\relax
+\expandafter \def \csname Xskak.export.10.w.moveid\endcsname {\Xskak.export.10.w.moveid }\relax
+\expandafter \def \csname Xskak.export.10.w.pgnpiece\endcsname {B}\relax
+\expandafter \def \csname Xskak.export.10.w.piece\endcsname {B}\relax
+\expandafter \def \csname Xskak.export.10.w.piecechar\endcsname {B}\relax
+\expandafter \def \csname Xskak.export.10.w.castling\endcsname {\setboolean {xskakboolcastling}{false}}\relax
+\expandafter \def \csname Xskak.export.10.w.longcastling\endcsname {\setboolean {xskakboollongcastling}{false}}\relax
+\expandafter \def \csname Xskak.export.10.w.capture\endcsname {\setboolean {xskakboolcapture}{false}}\relax
+\expandafter \def \csname Xskak.export.10.w.check\endcsname {\setboolean {xskakboolcheck}{true}}\relax
+\expandafter \def \csname Xskak.export.10.w.mate\endcsname {\setboolean {xskakboolmate}{false}}\relax
+\expandafter \def \csname Xskak.export.10.w.lostpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.10.w.lostpiecechar\endcsname {}\relax
+\expandafter \def \csname Xskak.export.10.w.pgnlostpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.10.w.movefrom\endcsname {d3}\relax
+\expandafter \def \csname Xskak.export.10.w.pgnmovefrom\endcsname {}\relax
+\expandafter \def \csname Xskak.export.10.w.moveto\endcsname {g6}\relax
+\expandafter \def \csname Xskak.export.10.w.move\endcsname {d3-g6}\relax
+\expandafter \def \csname Xskak.export.10.w.enpassant\endcsname {\setboolean {xskakboolenpassant}{false}}\relax
+\expandafter \def \csname Xskak.export.10.w.enpassantsquare\endcsname {-}\relax
+\expandafter \def \csname Xskak.export.10.w.promotion\endcsname {\setboolean {xskakboolpromotion}{false}}\relax
+\expandafter \def \csname Xskak.export.10.w.promotionpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.10.w.promotionpiecechar\endcsname {}\relax
+\expandafter \def \csname Xskak.export.10.w.addpieces\endcsname {Bg6}\relax
+\expandafter \def \csname Xskak.export.10.w.clearfields\endcsname {d3}\relax
+\expandafter \def \csname Xskak.export.10.w.comments\endcsname {}\relax
+\expandafter \def \csname Xskak.export.10.w.nextfen\endcsname {r1b1kb1r/pp1nq1p1/2p1pnBp/8/3P4/5N2/PPP2PPP/R1BQ1RK1 b kq - 1 10}\relax
+\expandafter \def \csname Xskak.export.10.w.pastfen\endcsname {r1b1kb1r/pp1nq1p1/2p1pn1p/8/3P4/3B1N2/PPP2PPP/R1BQ1RK1 w kq - 0 10}\relax
+\expandafter \def \csname Xskak.export.10.w.nag\endcsname {}\relax
+\expandafter \def \csname Xskak.export.10.w.san\endcsname {\textsymfigsymbol {B}g6\checksymbol }\relax
+\expandafter \def \csname Xskak.export.10.w.lan\endcsname {\textsymfigsymbol {B}d3\xskakmovehyphen g6\checksymbol }\relax
+\expandafter \def \csname Xskak.export.10.w.opennr\endcsname {10\whiteopen \beforewhite }\relax
+\expandafter \def \csname Xskak.export.10.b.movenr\endcsname {\Xskak.export.10.b.movenr }\relax
+\expandafter \def \csname Xskak.export.10.b.player\endcsname {\Xskak.export.10.b.player }\relax
+\expandafter \def \csname Xskak.export.10.b.moveid\endcsname {\Xskak.export.10.b.moveid }\relax
+\expandafter \def \csname Xskak.export.10.b.pgnpiece\endcsname {K}\relax
+\expandafter \def \csname Xskak.export.10.b.piece\endcsname {k}\relax
+\expandafter \def \csname Xskak.export.10.b.piecechar\endcsname {K}\relax
+\expandafter \def \csname Xskak.export.10.b.castling\endcsname {\setboolean {xskakboolcastling}{false}}\relax
+\expandafter \def \csname Xskak.export.10.b.longcastling\endcsname {\setboolean {xskakboollongcastling}{false}}\relax
+\expandafter \def \csname Xskak.export.10.b.capture\endcsname {\setboolean {xskakboolcapture}{false}}\relax
+\expandafter \def \csname Xskak.export.10.b.check\endcsname {\setboolean {xskakboolcheck}{false}}\relax
+\expandafter \def \csname Xskak.export.10.b.mate\endcsname {\setboolean {xskakboolmate}{false}}\relax
+\expandafter \def \csname Xskak.export.10.b.lostpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.10.b.lostpiecechar\endcsname {}\relax
+\expandafter \def \csname Xskak.export.10.b.pgnlostpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.10.b.movefrom\endcsname {e8}\relax
+\expandafter \def \csname Xskak.export.10.b.pgnmovefrom\endcsname {}\relax
+\expandafter \def \csname Xskak.export.10.b.moveto\endcsname {d8}\relax
+\expandafter \def \csname Xskak.export.10.b.move\endcsname {e8-d8}\relax
+\expandafter \def \csname Xskak.export.10.b.enpassant\endcsname {\setboolean {xskakboolenpassant}{false}}\relax
+\expandafter \def \csname Xskak.export.10.b.enpassantsquare\endcsname {-}\relax
+\expandafter \def \csname Xskak.export.10.b.promotion\endcsname {\setboolean {xskakboolpromotion}{false}}\relax
+\expandafter \def \csname Xskak.export.10.b.promotionpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.10.b.promotionpiecechar\endcsname {}\relax
+\expandafter \def \csname Xskak.export.10.b.addpieces\endcsname {kd8}\relax
+\expandafter \def \csname Xskak.export.10.b.clearfields\endcsname {e8}\relax
+\expandafter \def \csname Xskak.export.10.b.comments\endcsname {}\relax
+\expandafter \def \csname Xskak.export.10.b.nextfen\endcsname {r1bk1b1r/pp1nq1p1/2p1pnBp/8/3P4/5N2/PPP2PPP/R1BQ1RK1 w kq - 2 11}\relax
+\expandafter \def \csname Xskak.export.10.b.pastfen\endcsname {r1b1kb1r/pp1nq1p1/2p1pnBp/8/3P4/5N2/PPP2PPP/R1BQ1RK1 b kq - 1 10}\relax
+\expandafter \def \csname Xskak.export.10.b.nag\endcsname {{\xskak@beforecomment {\xskakcomment {Kasparov schüttelt kurz den Kopf}}}}\relax
+\expandafter \def \csname Xskak.export.10.b.san\endcsname {\textsymfigsymbol {K}d8}\relax
+\expandafter \def \csname Xskak.export.10.b.lan\endcsname {\textsymfigsymbol {K}e8\xskakmovehyphen d8}\relax
+\expandafter \def \csname Xskak.export.10.b.opennr\endcsname {10\blackopen \beforeblack }\relax
+\expandafter \def \csname Xskak.export.11.w.movenr\endcsname {\Xskak.export.11.w.movenr }\relax
+\expandafter \def \csname Xskak.export.11.w.player\endcsname {\Xskak.export.11.w.player }\relax
+\expandafter \def \csname Xskak.export.11.w.moveid\endcsname {\Xskak.export.11.w.moveid }\relax
+\expandafter \def \csname Xskak.export.11.w.pgnpiece\endcsname {B}\relax
+\expandafter \def \csname Xskak.export.11.w.piece\endcsname {B}\relax
+\expandafter \def \csname Xskak.export.11.w.piecechar\endcsname {B}\relax
+\expandafter \def \csname Xskak.export.11.w.castling\endcsname {\setboolean {xskakboolcastling}{false}}\relax
+\expandafter \def \csname Xskak.export.11.w.longcastling\endcsname {\setboolean {xskakboollongcastling}{false}}\relax
+\expandafter \def \csname Xskak.export.11.w.capture\endcsname {\setboolean {xskakboolcapture}{false}}\relax
+\expandafter \def \csname Xskak.export.11.w.check\endcsname {\setboolean {xskakboolcheck}{false}}\relax
+\expandafter \def \csname Xskak.export.11.w.mate\endcsname {\setboolean {xskakboolmate}{false}}\relax
+\expandafter \def \csname Xskak.export.11.w.lostpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.11.w.lostpiecechar\endcsname {}\relax
+\expandafter \def \csname Xskak.export.11.w.pgnlostpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.11.w.movefrom\endcsname {c1}\relax
+\expandafter \def \csname Xskak.export.11.w.pgnmovefrom\endcsname {}\relax
+\expandafter \def \csname Xskak.export.11.w.moveto\endcsname {f4}\relax
+\expandafter \def \csname Xskak.export.11.w.move\endcsname {c1-f4}\relax
+\expandafter \def \csname Xskak.export.11.w.enpassant\endcsname {\setboolean {xskakboolenpassant}{false}}\relax
+\expandafter \def \csname Xskak.export.11.w.enpassantsquare\endcsname {-}\relax
+\expandafter \def \csname Xskak.export.11.w.promotion\endcsname {\setboolean {xskakboolpromotion}{false}}\relax
+\expandafter \def \csname Xskak.export.11.w.promotionpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.11.w.promotionpiecechar\endcsname {}\relax
+\expandafter \def \csname Xskak.export.11.w.addpieces\endcsname {Bf4}\relax
+\expandafter \def \csname Xskak.export.11.w.clearfields\endcsname {c1}\relax
+\expandafter \def \csname Xskak.export.11.w.comments\endcsname {}\relax
+\expandafter \def \csname Xskak.export.11.w.nextfen\endcsname {r1bk1b1r/pp1nq1p1/2p1pnBp/8/3P1B2/5N2/PPP2PPP/R2Q1RK1 b - - 3 11}\relax
+\expandafter \def \csname Xskak.export.11.w.pastfen\endcsname {r1bk1b1r/pp1nq1p1/2p1pnBp/8/3P4/5N2/PPP2PPP/R1BQ1RK1 w kq - 2 11}\relax
+\expandafter \def \csname Xskak.export.11.w.nag\endcsname {}\relax
+\expandafter \def \csname Xskak.export.11.w.san\endcsname {\textsymfigsymbol {B}f4}\relax
+\expandafter \def \csname Xskak.export.11.w.lan\endcsname {\textsymfigsymbol {B}c1\xskakmovehyphen f4}\relax
+\expandafter \def \csname Xskak.export.11.w.opennr\endcsname {11\whiteopen \beforewhite }\relax
+\expandafter \def \csname Xskak.export.11.b.movenr\endcsname {\Xskak.export.11.b.movenr }\relax
+\expandafter \def \csname Xskak.export.11.b.player\endcsname {\Xskak.export.11.b.player }\relax
+\expandafter \def \csname Xskak.export.11.b.moveid\endcsname {\Xskak.export.11.b.moveid }\relax
+\expandafter \def \csname Xskak.export.11.b.pgnpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.11.b.piece\endcsname {p}\relax
+\expandafter \def \csname Xskak.export.11.b.piecechar\endcsname {p}\relax
+\expandafter \def \csname Xskak.export.11.b.castling\endcsname {\setboolean {xskakboolcastling}{false}}\relax
+\expandafter \def \csname Xskak.export.11.b.longcastling\endcsname {\setboolean {xskakboollongcastling}{false}}\relax
+\expandafter \def \csname Xskak.export.11.b.capture\endcsname {\setboolean {xskakboolcapture}{false}}\relax
+\expandafter \def \csname Xskak.export.11.b.check\endcsname {\setboolean {xskakboolcheck}{false}}\relax
+\expandafter \def \csname Xskak.export.11.b.mate\endcsname {\setboolean {xskakboolmate}{false}}\relax
+\expandafter \def \csname Xskak.export.11.b.lostpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.11.b.lostpiecechar\endcsname {}\relax
+\expandafter \def \csname Xskak.export.11.b.pgnlostpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.11.b.movefrom\endcsname {b7}\relax
+\expandafter \def \csname Xskak.export.11.b.pgnmovefrom\endcsname {}\relax
+\expandafter \def \csname Xskak.export.11.b.moveto\endcsname {b5}\relax
+\expandafter \def \csname Xskak.export.11.b.move\endcsname {b7-b5}\relax
+\expandafter \def \csname Xskak.export.11.b.enpassant\endcsname {\setboolean {xskakboolenpassant}{false}}\relax
+\expandafter \def \csname Xskak.export.11.b.enpassantsquare\endcsname {b6}\relax
+\expandafter \def \csname Xskak.export.11.b.promotion\endcsname {\setboolean {xskakboolpromotion}{false}}\relax
+\expandafter \def \csname Xskak.export.11.b.promotionpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.11.b.promotionpiecechar\endcsname {}\relax
+\expandafter \def \csname Xskak.export.11.b.addpieces\endcsname {pb5}\relax
+\expandafter \def \csname Xskak.export.11.b.clearfields\endcsname {b7}\relax
+\expandafter \def \csname Xskak.export.11.b.comments\endcsname {}\relax
+\expandafter \def \csname Xskak.export.11.b.nextfen\endcsname {r1bk1b1r/p2nq1p1/2p1pnBp/1p6/3P1B2/5N2/PPP2PPP/R2Q1RK1 w - b6 0 12}\relax
+\expandafter \def \csname Xskak.export.11.b.pastfen\endcsname {r1bk1b1r/pp1nq1p1/2p1pnBp/8/3P1B2/5N2/PPP2PPP/R2Q1RK1 b - - 3 11}\relax
+\expandafter \def \csname Xskak.export.11.b.nag\endcsname {}\relax
+\expandafter \def \csname Xskak.export.11.b.san\endcsname {b5}\relax
+\expandafter \def \csname Xskak.export.11.b.lan\endcsname {b7\xskakmovehyphen b5}\relax
+\expandafter \def \csname Xskak.export.11.b.opennr\endcsname {11\blackopen \beforeblack }\relax
+\expandafter \def \csname Xskak.export.12.w.movenr\endcsname {\Xskak.export.12.w.movenr }\relax
+\expandafter \def \csname Xskak.export.12.w.player\endcsname {\Xskak.export.12.w.player }\relax
+\expandafter \def \csname Xskak.export.12.w.moveid\endcsname {\Xskak.export.12.w.moveid }\relax
+\expandafter \def \csname Xskak.export.12.w.pgnpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.12.w.piece\endcsname {P}\relax
+\expandafter \def \csname Xskak.export.12.w.piecechar\endcsname {p}\relax
+\expandafter \def \csname Xskak.export.12.w.castling\endcsname {\setboolean {xskakboolcastling}{false}}\relax
+\expandafter \def \csname Xskak.export.12.w.longcastling\endcsname {\setboolean {xskakboollongcastling}{false}}\relax
+\expandafter \def \csname Xskak.export.12.w.capture\endcsname {\setboolean {xskakboolcapture}{false}}\relax
+\expandafter \def \csname Xskak.export.12.w.check\endcsname {\setboolean {xskakboolcheck}{false}}\relax
+\expandafter \def \csname Xskak.export.12.w.mate\endcsname {\setboolean {xskakboolmate}{false}}\relax
+\expandafter \def \csname Xskak.export.12.w.lostpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.12.w.lostpiecechar\endcsname {}\relax
+\expandafter \def \csname Xskak.export.12.w.pgnlostpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.12.w.movefrom\endcsname {a2}\relax
+\expandafter \def \csname Xskak.export.12.w.pgnmovefrom\endcsname {}\relax
+\expandafter \def \csname Xskak.export.12.w.moveto\endcsname {a4}\relax
+\expandafter \def \csname Xskak.export.12.w.move\endcsname {a2-a4}\relax
+\expandafter \def \csname Xskak.export.12.w.enpassant\endcsname {\setboolean {xskakboolenpassant}{false}}\relax
+\expandafter \def \csname Xskak.export.12.w.enpassantsquare\endcsname {a3}\relax
+\expandafter \def \csname Xskak.export.12.w.promotion\endcsname {\setboolean {xskakboolpromotion}{false}}\relax
+\expandafter \def \csname Xskak.export.12.w.promotionpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.12.w.promotionpiecechar\endcsname {}\relax
+\expandafter \def \csname Xskak.export.12.w.addpieces\endcsname {Pa4}\relax
+\expandafter \def \csname Xskak.export.12.w.clearfields\endcsname {a2}\relax
+\expandafter \def \csname Xskak.export.12.w.comments\endcsname {}\relax
+\expandafter \def \csname Xskak.export.12.w.nextfen\endcsname {r1bk1b1r/p2nq1p1/2p1pnBp/1p6/P2P1B2/5N2/1PP2PPP/R2Q1RK1 b - a3 0 12}\relax
+\expandafter \def \csname Xskak.export.12.w.pastfen\endcsname {r1bk1b1r/p2nq1p1/2p1pnBp/1p6/3P1B2/5N2/PPP2PPP/R2Q1RK1 w - b6 0 12}\relax
+\expandafter \def \csname Xskak.export.12.w.nag\endcsname {}\relax
+\expandafter \def \csname Xskak.export.12.w.san\endcsname {a4}\relax
+\expandafter \def \csname Xskak.export.12.w.lan\endcsname {a2\xskakmovehyphen a4}\relax
+\expandafter \def \csname Xskak.export.12.w.opennr\endcsname {12\whiteopen \beforewhite }\relax
+\expandafter \def \csname Xskak.export.12.b.movenr\endcsname {\Xskak.export.12.b.movenr }\relax
+\expandafter \def \csname Xskak.export.12.b.player\endcsname {\Xskak.export.12.b.player }\relax
+\expandafter \def \csname Xskak.export.12.b.moveid\endcsname {\Xskak.export.12.b.moveid }\relax
+\expandafter \def \csname Xskak.export.12.b.pgnpiece\endcsname {B}\relax
+\expandafter \def \csname Xskak.export.12.b.piece\endcsname {b}\relax
+\expandafter \def \csname Xskak.export.12.b.piecechar\endcsname {B}\relax
+\expandafter \def \csname Xskak.export.12.b.castling\endcsname {\setboolean {xskakboolcastling}{false}}\relax
+\expandafter \def \csname Xskak.export.12.b.longcastling\endcsname {\setboolean {xskakboollongcastling}{false}}\relax
+\expandafter \def \csname Xskak.export.12.b.capture\endcsname {\setboolean {xskakboolcapture}{false}}\relax
+\expandafter \def \csname Xskak.export.12.b.check\endcsname {\setboolean {xskakboolcheck}{false}}\relax
+\expandafter \def \csname Xskak.export.12.b.mate\endcsname {\setboolean {xskakboolmate}{false}}\relax
+\expandafter \def \csname Xskak.export.12.b.lostpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.12.b.lostpiecechar\endcsname {}\relax
+\expandafter \def \csname Xskak.export.12.b.pgnlostpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.12.b.movefrom\endcsname {c8}\relax
+\expandafter \def \csname Xskak.export.12.b.pgnmovefrom\endcsname {}\relax
+\expandafter \def \csname Xskak.export.12.b.moveto\endcsname {b7}\relax
+\expandafter \def \csname Xskak.export.12.b.move\endcsname {c8-b7}\relax
+\expandafter \def \csname Xskak.export.12.b.enpassant\endcsname {\setboolean {xskakboolenpassant}{false}}\relax
+\expandafter \def \csname Xskak.export.12.b.enpassantsquare\endcsname {-}\relax
+\expandafter \def \csname Xskak.export.12.b.promotion\endcsname {\setboolean {xskakboolpromotion}{false}}\relax
+\expandafter \def \csname Xskak.export.12.b.promotionpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.12.b.promotionpiecechar\endcsname {}\relax
+\expandafter \def \csname Xskak.export.12.b.addpieces\endcsname {bb7}\relax
+\expandafter \def \csname Xskak.export.12.b.clearfields\endcsname {c8}\relax
+\expandafter \def \csname Xskak.export.12.b.comments\endcsname {}\relax
+\expandafter \def \csname Xskak.export.12.b.nextfen\endcsname {r2k1b1r/pb1nq1p1/2p1pnBp/1p6/P2P1B2/5N2/1PP2PPP/R2Q1RK1 w - - 1 13}\relax
+\expandafter \def \csname Xskak.export.12.b.pastfen\endcsname {r1bk1b1r/p2nq1p1/2p1pnBp/1p6/P2P1B2/5N2/1PP2PPP/R2Q1RK1 b - a3 0 12}\relax
+\expandafter \def \csname Xskak.export.12.b.nag\endcsname {}\relax
+\expandafter \def \csname Xskak.export.12.b.san\endcsname {\textsymfigsymbol {B}b7}\relax
+\expandafter \def \csname Xskak.export.12.b.lan\endcsname {\textsymfigsymbol {B}c8\xskakmovehyphen b7}\relax
+\expandafter \def \csname Xskak.export.12.b.opennr\endcsname {12\blackopen \beforeblack }\relax
+\expandafter \def \csname Xskak.export.13.w.movenr\endcsname {\Xskak.export.13.w.movenr }\relax
+\expandafter \def \csname Xskak.export.13.w.player\endcsname {\Xskak.export.13.w.player }\relax
+\expandafter \def \csname Xskak.export.13.w.moveid\endcsname {\Xskak.export.13.w.moveid }\relax
+\expandafter \def \csname Xskak.export.13.w.pgnpiece\endcsname {R}\relax
+\expandafter \def \csname Xskak.export.13.w.piece\endcsname {R}\relax
+\expandafter \def \csname Xskak.export.13.w.piecechar\endcsname {R}\relax
+\expandafter \def \csname Xskak.export.13.w.castling\endcsname {\setboolean {xskakboolcastling}{false}}\relax
+\expandafter \def \csname Xskak.export.13.w.longcastling\endcsname {\setboolean {xskakboollongcastling}{false}}\relax
+\expandafter \def \csname Xskak.export.13.w.capture\endcsname {\setboolean {xskakboolcapture}{false}}\relax
+\expandafter \def \csname Xskak.export.13.w.check\endcsname {\setboolean {xskakboolcheck}{false}}\relax
+\expandafter \def \csname Xskak.export.13.w.mate\endcsname {\setboolean {xskakboolmate}{false}}\relax
+\expandafter \def \csname Xskak.export.13.w.lostpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.13.w.lostpiecechar\endcsname {}\relax
+\expandafter \def \csname Xskak.export.13.w.pgnlostpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.13.w.movefrom\endcsname {f1}\relax
+\expandafter \def \csname Xskak.export.13.w.pgnmovefrom\endcsname {}\relax
+\expandafter \def \csname Xskak.export.13.w.moveto\endcsname {e1}\relax
+\expandafter \def \csname Xskak.export.13.w.move\endcsname {f1-e1}\relax
+\expandafter \def \csname Xskak.export.13.w.enpassant\endcsname {\setboolean {xskakboolenpassant}{false}}\relax
+\expandafter \def \csname Xskak.export.13.w.enpassantsquare\endcsname {-}\relax
+\expandafter \def \csname Xskak.export.13.w.promotion\endcsname {\setboolean {xskakboolpromotion}{false}}\relax
+\expandafter \def \csname Xskak.export.13.w.promotionpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.13.w.promotionpiecechar\endcsname {}\relax
+\expandafter \def \csname Xskak.export.13.w.addpieces\endcsname {Re1}\relax
+\expandafter \def \csname Xskak.export.13.w.clearfields\endcsname {f1}\relax
+\expandafter \def \csname Xskak.export.13.w.comments\endcsname {}\relax
+\expandafter \def \csname Xskak.export.13.w.nextfen\endcsname {r2k1b1r/pb1nq1p1/2p1pnBp/1p6/P2P1B2/5N2/1PP2PPP/R2QR1K1 b - - 2 13}\relax
+\expandafter \def \csname Xskak.export.13.w.pastfen\endcsname {r2k1b1r/pb1nq1p1/2p1pnBp/1p6/P2P1B2/5N2/1PP2PPP/R2Q1RK1 w - - 1 13}\relax
+\expandafter \def \csname Xskak.export.13.w.nag\endcsname {}\relax
+\expandafter \def \csname Xskak.export.13.w.san\endcsname {\textsymfigsymbol {R}e1}\relax
+\expandafter \def \csname Xskak.export.13.w.lan\endcsname {\textsymfigsymbol {R}f1\xskakmovehyphen e1}\relax
+\expandafter \def \csname Xskak.export.13.w.opennr\endcsname {13\whiteopen \beforewhite }\relax
+\expandafter \def \csname Xskak.export.13.b.movenr\endcsname {\Xskak.export.13.b.movenr }\relax
+\expandafter \def \csname Xskak.export.13.b.player\endcsname {\Xskak.export.13.b.player }\relax
+\expandafter \def \csname Xskak.export.13.b.moveid\endcsname {\Xskak.export.13.b.moveid }\relax
+\expandafter \def \csname Xskak.export.13.b.pgnpiece\endcsname {N}\relax
+\expandafter \def \csname Xskak.export.13.b.piece\endcsname {n}\relax
+\expandafter \def \csname Xskak.export.13.b.piecechar\endcsname {N}\relax
+\expandafter \def \csname Xskak.export.13.b.castling\endcsname {\setboolean {xskakboolcastling}{false}}\relax
+\expandafter \def \csname Xskak.export.13.b.longcastling\endcsname {\setboolean {xskakboollongcastling}{false}}\relax
+\expandafter \def \csname Xskak.export.13.b.capture\endcsname {\setboolean {xskakboolcapture}{false}}\relax
+\expandafter \def \csname Xskak.export.13.b.check\endcsname {\setboolean {xskakboolcheck}{false}}\relax
+\expandafter \def \csname Xskak.export.13.b.mate\endcsname {\setboolean {xskakboolmate}{false}}\relax
+\expandafter \def \csname Xskak.export.13.b.lostpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.13.b.lostpiecechar\endcsname {}\relax
+\expandafter \def \csname Xskak.export.13.b.pgnlostpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.13.b.movefrom\endcsname {f6}\relax
+\expandafter \def \csname Xskak.export.13.b.pgnmovefrom\endcsname {}\relax
+\expandafter \def \csname Xskak.export.13.b.moveto\endcsname {d5}\relax
+\expandafter \def \csname Xskak.export.13.b.move\endcsname {f6-d5}\relax
+\expandafter \def \csname Xskak.export.13.b.enpassant\endcsname {\setboolean {xskakboolenpassant}{false}}\relax
+\expandafter \def \csname Xskak.export.13.b.enpassantsquare\endcsname {-}\relax
+\expandafter \def \csname Xskak.export.13.b.promotion\endcsname {\setboolean {xskakboolpromotion}{false}}\relax
+\expandafter \def \csname Xskak.export.13.b.promotionpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.13.b.promotionpiecechar\endcsname {}\relax
+\expandafter \def \csname Xskak.export.13.b.addpieces\endcsname {nd5}\relax
+\expandafter \def \csname Xskak.export.13.b.clearfields\endcsname {f6}\relax
+\expandafter \def \csname Xskak.export.13.b.comments\endcsname {}\relax
+\expandafter \def \csname Xskak.export.13.b.nextfen\endcsname {r2k1b1r/pb1nq1p1/2p1p1Bp/1p1n4/P2P1B2/5N2/1PP2PPP/R2QR1K1 w - - 3 14}\relax
+\expandafter \def \csname Xskak.export.13.b.pastfen\endcsname {r2k1b1r/pb1nq1p1/2p1pnBp/1p6/P2P1B2/5N2/1PP2PPP/R2QR1K1 b - - 2 13}\relax
+\expandafter \def \csname Xskak.export.13.b.nag\endcsname {}\relax
+\expandafter \def \csname Xskak.export.13.b.san\endcsname {\textsymfigsymbol {N}d5}\relax
+\expandafter \def \csname Xskak.export.13.b.lan\endcsname {\textsymfigsymbol {N}f6\xskakmovehyphen d5}\relax
+\expandafter \def \csname Xskak.export.13.b.opennr\endcsname {13\blackopen \beforeblack }\relax
+\expandafter \def \csname Xskak.export.14.w.movenr\endcsname {\Xskak.export.14.w.movenr }\relax
+\expandafter \def \csname Xskak.export.14.w.player\endcsname {\Xskak.export.14.w.player }\relax
+\expandafter \def \csname Xskak.export.14.w.moveid\endcsname {\Xskak.export.14.w.moveid }\relax
+\expandafter \def \csname Xskak.export.14.w.pgnpiece\endcsname {B}\relax
+\expandafter \def \csname Xskak.export.14.w.piece\endcsname {B}\relax
+\expandafter \def \csname Xskak.export.14.w.piecechar\endcsname {B}\relax
+\expandafter \def \csname Xskak.export.14.w.castling\endcsname {\setboolean {xskakboolcastling}{false}}\relax
+\expandafter \def \csname Xskak.export.14.w.longcastling\endcsname {\setboolean {xskakboollongcastling}{false}}\relax
+\expandafter \def \csname Xskak.export.14.w.capture\endcsname {\setboolean {xskakboolcapture}{false}}\relax
+\expandafter \def \csname Xskak.export.14.w.check\endcsname {\setboolean {xskakboolcheck}{false}}\relax
+\expandafter \def \csname Xskak.export.14.w.mate\endcsname {\setboolean {xskakboolmate}{false}}\relax
+\expandafter \def \csname Xskak.export.14.w.lostpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.14.w.lostpiecechar\endcsname {}\relax
+\expandafter \def \csname Xskak.export.14.w.pgnlostpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.14.w.movefrom\endcsname {f4}\relax
+\expandafter \def \csname Xskak.export.14.w.pgnmovefrom\endcsname {}\relax
+\expandafter \def \csname Xskak.export.14.w.moveto\endcsname {g3}\relax
+\expandafter \def \csname Xskak.export.14.w.move\endcsname {f4-g3}\relax
+\expandafter \def \csname Xskak.export.14.w.enpassant\endcsname {\setboolean {xskakboolenpassant}{false}}\relax
+\expandafter \def \csname Xskak.export.14.w.enpassantsquare\endcsname {-}\relax
+\expandafter \def \csname Xskak.export.14.w.promotion\endcsname {\setboolean {xskakboolpromotion}{false}}\relax
+\expandafter \def \csname Xskak.export.14.w.promotionpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.14.w.promotionpiecechar\endcsname {}\relax
+\expandafter \def \csname Xskak.export.14.w.addpieces\endcsname {Bg3}\relax
+\expandafter \def \csname Xskak.export.14.w.clearfields\endcsname {f4}\relax
+\expandafter \def \csname Xskak.export.14.w.comments\endcsname {}\relax
+\expandafter \def \csname Xskak.export.14.w.nextfen\endcsname {r2k1b1r/pb1nq1p1/2p1p1Bp/1p1n4/P2P4/5NB1/1PP2PPP/R2QR1K1 b - - 4 14}\relax
+\expandafter \def \csname Xskak.export.14.w.pastfen\endcsname {r2k1b1r/pb1nq1p1/2p1p1Bp/1p1n4/P2P1B2/5N2/1PP2PPP/R2QR1K1 w - - 3 14}\relax
+\expandafter \def \csname Xskak.export.14.w.nag\endcsname {}\relax
+\expandafter \def \csname Xskak.export.14.w.san\endcsname {\textsymfigsymbol {B}g3}\relax
+\expandafter \def \csname Xskak.export.14.w.lan\endcsname {\textsymfigsymbol {B}f4\xskakmovehyphen g3}\relax
+\expandafter \def \csname Xskak.export.14.w.opennr\endcsname {14\whiteopen \beforewhite }\relax
+\expandafter \def \csname Xskak.export.14.b.movenr\endcsname {\Xskak.export.14.b.movenr }\relax
+\expandafter \def \csname Xskak.export.14.b.player\endcsname {\Xskak.export.14.b.player }\relax
+\expandafter \def \csname Xskak.export.14.b.moveid\endcsname {\Xskak.export.14.b.moveid }\relax
+\expandafter \def \csname Xskak.export.14.b.pgnpiece\endcsname {K}\relax
+\expandafter \def \csname Xskak.export.14.b.piece\endcsname {k}\relax
+\expandafter \def \csname Xskak.export.14.b.piecechar\endcsname {K}\relax
+\expandafter \def \csname Xskak.export.14.b.castling\endcsname {\setboolean {xskakboolcastling}{false}}\relax
+\expandafter \def \csname Xskak.export.14.b.longcastling\endcsname {\setboolean {xskakboollongcastling}{false}}\relax
+\expandafter \def \csname Xskak.export.14.b.capture\endcsname {\setboolean {xskakboolcapture}{false}}\relax
+\expandafter \def \csname Xskak.export.14.b.check\endcsname {\setboolean {xskakboolcheck}{false}}\relax
+\expandafter \def \csname Xskak.export.14.b.mate\endcsname {\setboolean {xskakboolmate}{false}}\relax
+\expandafter \def \csname Xskak.export.14.b.lostpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.14.b.lostpiecechar\endcsname {}\relax
+\expandafter \def \csname Xskak.export.14.b.pgnlostpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.14.b.movefrom\endcsname {d8}\relax
+\expandafter \def \csname Xskak.export.14.b.pgnmovefrom\endcsname {}\relax
+\expandafter \def \csname Xskak.export.14.b.moveto\endcsname {c8}\relax
+\expandafter \def \csname Xskak.export.14.b.move\endcsname {d8-c8}\relax
+\expandafter \def \csname Xskak.export.14.b.enpassant\endcsname {\setboolean {xskakboolenpassant}{false}}\relax
+\expandafter \def \csname Xskak.export.14.b.enpassantsquare\endcsname {-}\relax
+\expandafter \def \csname Xskak.export.14.b.promotion\endcsname {\setboolean {xskakboolpromotion}{false}}\relax
+\expandafter \def \csname Xskak.export.14.b.promotionpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.14.b.promotionpiecechar\endcsname {}\relax
+\expandafter \def \csname Xskak.export.14.b.addpieces\endcsname {kc8}\relax
+\expandafter \def \csname Xskak.export.14.b.clearfields\endcsname {d8}\relax
+\expandafter \def \csname Xskak.export.14.b.comments\endcsname {}\relax
+\expandafter \def \csname Xskak.export.14.b.nextfen\endcsname {r1k2b1r/pb1nq1p1/2p1p1Bp/1p1n4/P2P4/5NB1/1PP2PPP/R2QR1K1 w - - 5 15}\relax
+\expandafter \def \csname Xskak.export.14.b.pastfen\endcsname {r2k1b1r/pb1nq1p1/2p1p1Bp/1p1n4/P2P4/5NB1/1PP2PPP/R2QR1K1 b - - 4 14}\relax
+\expandafter \def \csname Xskak.export.14.b.nag\endcsname {}\relax
+\expandafter \def \csname Xskak.export.14.b.san\endcsname {\textsymfigsymbol {K}c8}\relax
+\expandafter \def \csname Xskak.export.14.b.lan\endcsname {\textsymfigsymbol {K}d8\xskakmovehyphen c8}\relax
+\expandafter \def \csname Xskak.export.14.b.opennr\endcsname {14\blackopen \beforeblack }\relax
+\expandafter \def \csname Xskak.export.15.w.movenr\endcsname {\Xskak.export.15.w.movenr }\relax
+\expandafter \def \csname Xskak.export.15.w.player\endcsname {\Xskak.export.15.w.player }\relax
+\expandafter \def \csname Xskak.export.15.w.moveid\endcsname {\Xskak.export.15.w.moveid }\relax
+\expandafter \def \csname Xskak.export.15.w.pgnpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.15.w.piece\endcsname {P}\relax
+\expandafter \def \csname Xskak.export.15.w.piecechar\endcsname {p}\relax
+\expandafter \def \csname Xskak.export.15.w.castling\endcsname {\setboolean {xskakboolcastling}{false}}\relax
+\expandafter \def \csname Xskak.export.15.w.longcastling\endcsname {\setboolean {xskakboollongcastling}{false}}\relax
+\expandafter \def \csname Xskak.export.15.w.capture\endcsname {\setboolean {xskakboolcapture}{true}}\relax
+\expandafter \def \csname Xskak.export.15.w.check\endcsname {\setboolean {xskakboolcheck}{false}}\relax
+\expandafter \def \csname Xskak.export.15.w.mate\endcsname {\setboolean {xskakboolmate}{false}}\relax
+\expandafter \def \csname Xskak.export.15.w.lostpiece\endcsname {p}\relax
+\expandafter \def \csname Xskak.export.15.w.lostpiecechar\endcsname {p}\relax
+\expandafter \def \csname Xskak.export.15.w.pgnlostpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.15.w.movefrom\endcsname {a4}\relax
+\expandafter \def \csname Xskak.export.15.w.pgnmovefrom\endcsname {a}\relax
+\expandafter \def \csname Xskak.export.15.w.moveto\endcsname {b5}\relax
+\expandafter \def \csname Xskak.export.15.w.move\endcsname {a4-b5}\relax
+\expandafter \def \csname Xskak.export.15.w.enpassant\endcsname {\setboolean {xskakboolenpassant}{false}}\relax
+\expandafter \def \csname Xskak.export.15.w.enpassantsquare\endcsname {-}\relax
+\expandafter \def \csname Xskak.export.15.w.promotion\endcsname {\setboolean {xskakboolpromotion}{false}}\relax
+\expandafter \def \csname Xskak.export.15.w.promotionpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.15.w.promotionpiecechar\endcsname {}\relax
+\expandafter \def \csname Xskak.export.15.w.addpieces\endcsname {Pb5}\relax
+\expandafter \def \csname Xskak.export.15.w.clearfields\endcsname {a4}\relax
+\expandafter \def \csname Xskak.export.15.w.comments\endcsname {}\relax
+\expandafter \def \csname Xskak.export.15.w.nextfen\endcsname {r1k2b1r/pb1nq1p1/2p1p1Bp/1P1n4/3P4/5NB1/1PP2PPP/R2QR1K1 b - - 0 15}\relax
+\expandafter \def \csname Xskak.export.15.w.pastfen\endcsname {r1k2b1r/pb1nq1p1/2p1p1Bp/1p1n4/P2P4/5NB1/1PP2PPP/R2QR1K1 w - - 5 15}\relax
+\expandafter \def \csname Xskak.export.15.w.nag\endcsname {}\relax
+\expandafter \def \csname Xskak.export.15.w.san\endcsname {a\capturesymbol b5}\relax
+\expandafter \def \csname Xskak.export.15.w.lan\endcsname {a4\capturesymbol b5}\relax
+\expandafter \def \csname Xskak.export.15.w.opennr\endcsname {15\whiteopen \beforewhite }\relax
+\expandafter \def \csname Xskak.export.15.b.movenr\endcsname {\Xskak.export.15.b.movenr }\relax
+\expandafter \def \csname Xskak.export.15.b.player\endcsname {\Xskak.export.15.b.player }\relax
+\expandafter \def \csname Xskak.export.15.b.moveid\endcsname {\Xskak.export.15.b.moveid }\relax
+\expandafter \def \csname Xskak.export.15.b.pgnpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.15.b.piece\endcsname {p}\relax
+\expandafter \def \csname Xskak.export.15.b.piecechar\endcsname {p}\relax
+\expandafter \def \csname Xskak.export.15.b.castling\endcsname {\setboolean {xskakboolcastling}{false}}\relax
+\expandafter \def \csname Xskak.export.15.b.longcastling\endcsname {\setboolean {xskakboollongcastling}{false}}\relax
+\expandafter \def \csname Xskak.export.15.b.capture\endcsname {\setboolean {xskakboolcapture}{true}}\relax
+\expandafter \def \csname Xskak.export.15.b.check\endcsname {\setboolean {xskakboolcheck}{false}}\relax
+\expandafter \def \csname Xskak.export.15.b.mate\endcsname {\setboolean {xskakboolmate}{false}}\relax
+\expandafter \def \csname Xskak.export.15.b.lostpiece\endcsname {P}\relax
+\expandafter \def \csname Xskak.export.15.b.lostpiecechar\endcsname {p}\relax
+\expandafter \def \csname Xskak.export.15.b.pgnlostpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.15.b.movefrom\endcsname {c6}\relax
+\expandafter \def \csname Xskak.export.15.b.pgnmovefrom\endcsname {c}\relax
+\expandafter \def \csname Xskak.export.15.b.moveto\endcsname {b5}\relax
+\expandafter \def \csname Xskak.export.15.b.move\endcsname {c6-b5}\relax
+\expandafter \def \csname Xskak.export.15.b.enpassant\endcsname {\setboolean {xskakboolenpassant}{false}}\relax
+\expandafter \def \csname Xskak.export.15.b.enpassantsquare\endcsname {-}\relax
+\expandafter \def \csname Xskak.export.15.b.promotion\endcsname {\setboolean {xskakboolpromotion}{false}}\relax
+\expandafter \def \csname Xskak.export.15.b.promotionpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.15.b.promotionpiecechar\endcsname {}\relax
+\expandafter \def \csname Xskak.export.15.b.addpieces\endcsname {pb5}\relax
+\expandafter \def \csname Xskak.export.15.b.clearfields\endcsname {c6}\relax
+\expandafter \def \csname Xskak.export.15.b.comments\endcsname {}\relax
+\expandafter \def \csname Xskak.export.15.b.nextfen\endcsname {r1k2b1r/pb1nq1p1/4p1Bp/1p1n4/3P4/5NB1/1PP2PPP/R2QR1K1 w - - 0 16}\relax
+\expandafter \def \csname Xskak.export.15.b.pastfen\endcsname {r1k2b1r/pb1nq1p1/2p1p1Bp/1P1n4/3P4/5NB1/1PP2PPP/R2QR1K1 b - - 0 15}\relax
+\expandafter \def \csname Xskak.export.15.b.nag\endcsname {}\relax
+\expandafter \def \csname Xskak.export.15.b.san\endcsname {c\capturesymbol b5}\relax
+\expandafter \def \csname Xskak.export.15.b.lan\endcsname {c6\capturesymbol b5}\relax
+\expandafter \def \csname Xskak.export.15.b.opennr\endcsname {15\blackopen \beforeblack }\relax
+\expandafter \def \csname Xskak.export.16.w.movenr\endcsname {\Xskak.export.16.w.movenr }\relax
+\expandafter \def \csname Xskak.export.16.w.player\endcsname {\Xskak.export.16.w.player }\relax
+\expandafter \def \csname Xskak.export.16.w.moveid\endcsname {\Xskak.export.16.w.moveid }\relax
+\expandafter \def \csname Xskak.export.16.w.pgnpiece\endcsname {Q}\relax
+\expandafter \def \csname Xskak.export.16.w.piece\endcsname {Q}\relax
+\expandafter \def \csname Xskak.export.16.w.piecechar\endcsname {Q}\relax
+\expandafter \def \csname Xskak.export.16.w.castling\endcsname {\setboolean {xskakboolcastling}{false}}\relax
+\expandafter \def \csname Xskak.export.16.w.longcastling\endcsname {\setboolean {xskakboollongcastling}{false}}\relax
+\expandafter \def \csname Xskak.export.16.w.capture\endcsname {\setboolean {xskakboolcapture}{false}}\relax
+\expandafter \def \csname Xskak.export.16.w.check\endcsname {\setboolean {xskakboolcheck}{false}}\relax
+\expandafter \def \csname Xskak.export.16.w.mate\endcsname {\setboolean {xskakboolmate}{false}}\relax
+\expandafter \def \csname Xskak.export.16.w.lostpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.16.w.lostpiecechar\endcsname {}\relax
+\expandafter \def \csname Xskak.export.16.w.pgnlostpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.16.w.movefrom\endcsname {d1}\relax
+\expandafter \def \csname Xskak.export.16.w.pgnmovefrom\endcsname {}\relax
+\expandafter \def \csname Xskak.export.16.w.moveto\endcsname {d3}\relax
+\expandafter \def \csname Xskak.export.16.w.move\endcsname {d1-d3}\relax
+\expandafter \def \csname Xskak.export.16.w.enpassant\endcsname {\setboolean {xskakboolenpassant}{false}}\relax
+\expandafter \def \csname Xskak.export.16.w.enpassantsquare\endcsname {-}\relax
+\expandafter \def \csname Xskak.export.16.w.promotion\endcsname {\setboolean {xskakboolpromotion}{false}}\relax
+\expandafter \def \csname Xskak.export.16.w.promotionpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.16.w.promotionpiecechar\endcsname {}\relax
+\expandafter \def \csname Xskak.export.16.w.addpieces\endcsname {Qd3}\relax
+\expandafter \def \csname Xskak.export.16.w.clearfields\endcsname {d1}\relax
+\expandafter \def \csname Xskak.export.16.w.comments\endcsname {}\relax
+\expandafter \def \csname Xskak.export.16.w.nextfen\endcsname {r1k2b1r/pb1nq1p1/4p1Bp/1p1n4/3P4/3Q1NB1/1PP2PPP/R3R1K1 b - - 1 16}\relax
+\expandafter \def \csname Xskak.export.16.w.pastfen\endcsname {r1k2b1r/pb1nq1p1/4p1Bp/1p1n4/3P4/5NB1/1PP2PPP/R2QR1K1 w - - 0 16}\relax
+\expandafter \def \csname Xskak.export.16.w.nag\endcsname {}\relax
+\expandafter \def \csname Xskak.export.16.w.san\endcsname {\textsymfigsymbol {Q}d3}\relax
+\expandafter \def \csname Xskak.export.16.w.lan\endcsname {\textsymfigsymbol {Q}d1\xskakmovehyphen d3}\relax
+\expandafter \def \csname Xskak.export.16.w.opennr\endcsname {16\whiteopen \beforewhite }\relax
+\expandafter \def \csname Xskak.export.16.b.movenr\endcsname {\Xskak.export.16.b.movenr }\relax
+\expandafter \def \csname Xskak.export.16.b.player\endcsname {\Xskak.export.16.b.player }\relax
+\expandafter \def \csname Xskak.export.16.b.moveid\endcsname {\Xskak.export.16.b.moveid }\relax
+\expandafter \def \csname Xskak.export.16.b.pgnpiece\endcsname {B}\relax
+\expandafter \def \csname Xskak.export.16.b.piece\endcsname {b}\relax
+\expandafter \def \csname Xskak.export.16.b.piecechar\endcsname {B}\relax
+\expandafter \def \csname Xskak.export.16.b.castling\endcsname {\setboolean {xskakboolcastling}{false}}\relax
+\expandafter \def \csname Xskak.export.16.b.longcastling\endcsname {\setboolean {xskakboollongcastling}{false}}\relax
+\expandafter \def \csname Xskak.export.16.b.capture\endcsname {\setboolean {xskakboolcapture}{false}}\relax
+\expandafter \def \csname Xskak.export.16.b.check\endcsname {\setboolean {xskakboolcheck}{false}}\relax
+\expandafter \def \csname Xskak.export.16.b.mate\endcsname {\setboolean {xskakboolmate}{false}}\relax
+\expandafter \def \csname Xskak.export.16.b.lostpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.16.b.lostpiecechar\endcsname {}\relax
+\expandafter \def \csname Xskak.export.16.b.pgnlostpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.16.b.movefrom\endcsname {b7}\relax
+\expandafter \def \csname Xskak.export.16.b.pgnmovefrom\endcsname {}\relax
+\expandafter \def \csname Xskak.export.16.b.moveto\endcsname {c6}\relax
+\expandafter \def \csname Xskak.export.16.b.move\endcsname {b7-c6}\relax
+\expandafter \def \csname Xskak.export.16.b.enpassant\endcsname {\setboolean {xskakboolenpassant}{false}}\relax
+\expandafter \def \csname Xskak.export.16.b.enpassantsquare\endcsname {-}\relax
+\expandafter \def \csname Xskak.export.16.b.promotion\endcsname {\setboolean {xskakboolpromotion}{false}}\relax
+\expandafter \def \csname Xskak.export.16.b.promotionpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.16.b.promotionpiecechar\endcsname {}\relax
+\expandafter \def \csname Xskak.export.16.b.addpieces\endcsname {bc6}\relax
+\expandafter \def \csname Xskak.export.16.b.clearfields\endcsname {b7}\relax
+\expandafter \def \csname Xskak.export.16.b.comments\endcsname {}\relax
+\expandafter \def \csname Xskak.export.16.b.nextfen\endcsname {r1k2b1r/p2nq1p1/2b1p1Bp/1p1n4/3P4/3Q1NB1/1PP2PPP/R3R1K1 w - - 2 17}\relax
+\expandafter \def \csname Xskak.export.16.b.pastfen\endcsname {r1k2b1r/pb1nq1p1/4p1Bp/1p1n4/3P4/3Q1NB1/1PP2PPP/R3R1K1 b - - 1 16}\relax
+\expandafter \def \csname Xskak.export.16.b.nag\endcsname {}\relax
+\expandafter \def \csname Xskak.export.16.b.san\endcsname {\textsymfigsymbol {B}c6}\relax
+\expandafter \def \csname Xskak.export.16.b.lan\endcsname {\textsymfigsymbol {B}b7\xskakmovehyphen c6}\relax
+\expandafter \def \csname Xskak.export.16.b.opennr\endcsname {16\blackopen \beforeblack }\relax
+\expandafter \def \csname Xskak.export.17.w.movenr\endcsname {\Xskak.export.17.w.movenr }\relax
+\expandafter \def \csname Xskak.export.17.w.player\endcsname {\Xskak.export.17.w.player }\relax
+\expandafter \def \csname Xskak.export.17.w.moveid\endcsname {\Xskak.export.17.w.moveid }\relax
+\expandafter \def \csname Xskak.export.17.w.pgnpiece\endcsname {B}\relax
+\expandafter \def \csname Xskak.export.17.w.piece\endcsname {B}\relax
+\expandafter \def \csname Xskak.export.17.w.piecechar\endcsname {B}\relax
+\expandafter \def \csname Xskak.export.17.w.castling\endcsname {\setboolean {xskakboolcastling}{false}}\relax
+\expandafter \def \csname Xskak.export.17.w.longcastling\endcsname {\setboolean {xskakboollongcastling}{false}}\relax
+\expandafter \def \csname Xskak.export.17.w.capture\endcsname {\setboolean {xskakboolcapture}{false}}\relax
+\expandafter \def \csname Xskak.export.17.w.check\endcsname {\setboolean {xskakboolcheck}{false}}\relax
+\expandafter \def \csname Xskak.export.17.w.mate\endcsname {\setboolean {xskakboolmate}{false}}\relax
+\expandafter \def \csname Xskak.export.17.w.lostpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.17.w.lostpiecechar\endcsname {}\relax
+\expandafter \def \csname Xskak.export.17.w.pgnlostpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.17.w.movefrom\endcsname {g6}\relax
+\expandafter \def \csname Xskak.export.17.w.pgnmovefrom\endcsname {}\relax
+\expandafter \def \csname Xskak.export.17.w.moveto\endcsname {f5}\relax
+\expandafter \def \csname Xskak.export.17.w.move\endcsname {g6-f5}\relax
+\expandafter \def \csname Xskak.export.17.w.enpassant\endcsname {\setboolean {xskakboolenpassant}{false}}\relax
+\expandafter \def \csname Xskak.export.17.w.enpassantsquare\endcsname {-}\relax
+\expandafter \def \csname Xskak.export.17.w.promotion\endcsname {\setboolean {xskakboolpromotion}{false}}\relax
+\expandafter \def \csname Xskak.export.17.w.promotionpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.17.w.promotionpiecechar\endcsname {}\relax
+\expandafter \def \csname Xskak.export.17.w.addpieces\endcsname {Bf5}\relax
+\expandafter \def \csname Xskak.export.17.w.clearfields\endcsname {g6}\relax
+\expandafter \def \csname Xskak.export.17.w.comments\endcsname {}\relax
+\expandafter \def \csname Xskak.export.17.w.nextfen\endcsname {r1k2b1r/p2nq1p1/2b1p2p/1p1n1B2/3P4/3Q1NB1/1PP2PPP/R3R1K1 b - - 3 17}\relax
+\expandafter \def \csname Xskak.export.17.w.pastfen\endcsname {r1k2b1r/p2nq1p1/2b1p1Bp/1p1n4/3P4/3Q1NB1/1PP2PPP/R3R1K1 w - - 2 17}\relax
+\expandafter \def \csname Xskak.export.17.w.nag\endcsname {}\relax
+\expandafter \def \csname Xskak.export.17.w.san\endcsname {\textsymfigsymbol {B}f5}\relax
+\expandafter \def \csname Xskak.export.17.w.lan\endcsname {\textsymfigsymbol {B}g6\xskakmovehyphen f5}\relax
+\expandafter \def \csname Xskak.export.17.w.opennr\endcsname {17\whiteopen \beforewhite }\relax
+\expandafter \def \csname Xskak.export.17.b.movenr\endcsname {\Xskak.export.17.b.movenr }\relax
+\expandafter \def \csname Xskak.export.17.b.player\endcsname {\Xskak.export.17.b.player }\relax
+\expandafter \def \csname Xskak.export.17.b.moveid\endcsname {\Xskak.export.17.b.moveid }\relax
+\expandafter \def \csname Xskak.export.17.b.pgnpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.17.b.piece\endcsname {p}\relax
+\expandafter \def \csname Xskak.export.17.b.piecechar\endcsname {p}\relax
+\expandafter \def \csname Xskak.export.17.b.castling\endcsname {\setboolean {xskakboolcastling}{false}}\relax
+\expandafter \def \csname Xskak.export.17.b.longcastling\endcsname {\setboolean {xskakboollongcastling}{false}}\relax
+\expandafter \def \csname Xskak.export.17.b.capture\endcsname {\setboolean {xskakboolcapture}{true}}\relax
+\expandafter \def \csname Xskak.export.17.b.check\endcsname {\setboolean {xskakboolcheck}{false}}\relax
+\expandafter \def \csname Xskak.export.17.b.mate\endcsname {\setboolean {xskakboolmate}{false}}\relax
+\expandafter \def \csname Xskak.export.17.b.lostpiece\endcsname {B}\relax
+\expandafter \def \csname Xskak.export.17.b.lostpiecechar\endcsname {B}\relax
+\expandafter \def \csname Xskak.export.17.b.pgnlostpiece\endcsname {B}\relax
+\expandafter \def \csname Xskak.export.17.b.movefrom\endcsname {e6}\relax
+\expandafter \def \csname Xskak.export.17.b.pgnmovefrom\endcsname {e}\relax
+\expandafter \def \csname Xskak.export.17.b.moveto\endcsname {f5}\relax
+\expandafter \def \csname Xskak.export.17.b.move\endcsname {e6-f5}\relax
+\expandafter \def \csname Xskak.export.17.b.enpassant\endcsname {\setboolean {xskakboolenpassant}{false}}\relax
+\expandafter \def \csname Xskak.export.17.b.enpassantsquare\endcsname {-}\relax
+\expandafter \def \csname Xskak.export.17.b.promotion\endcsname {\setboolean {xskakboolpromotion}{false}}\relax
+\expandafter \def \csname Xskak.export.17.b.promotionpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.17.b.promotionpiecechar\endcsname {}\relax
+\expandafter \def \csname Xskak.export.17.b.addpieces\endcsname {pf5}\relax
+\expandafter \def \csname Xskak.export.17.b.clearfields\endcsname {e6}\relax
+\expandafter \def \csname Xskak.export.17.b.comments\endcsname {}\relax
+\expandafter \def \csname Xskak.export.17.b.nextfen\endcsname {r1k2b1r/p2nq1p1/2b4p/1p1n1p2/3P4/3Q1NB1/1PP2PPP/R3R1K1 w - - 0 18}\relax
+\expandafter \def \csname Xskak.export.17.b.pastfen\endcsname {r1k2b1r/p2nq1p1/2b1p2p/1p1n1B2/3P4/3Q1NB1/1PP2PPP/R3R1K1 b - - 3 17}\relax
+\expandafter \def \csname Xskak.export.17.b.nag\endcsname {}\relax
+\expandafter \def \csname Xskak.export.17.b.san\endcsname {e\capturesymbol f5}\relax
+\expandafter \def \csname Xskak.export.17.b.lan\endcsname {e6\capturesymbol f5}\relax
+\expandafter \def \csname Xskak.export.17.b.opennr\endcsname {17\blackopen \beforeblack }\relax
+\expandafter \def \csname Xskak.export.18.w.movenr\endcsname {\Xskak.export.18.w.movenr }\relax
+\expandafter \def \csname Xskak.export.18.w.player\endcsname {\Xskak.export.18.w.player }\relax
+\expandafter \def \csname Xskak.export.18.w.moveid\endcsname {\Xskak.export.18.w.moveid }\relax
+\expandafter \def \csname Xskak.export.18.w.pgnpiece\endcsname {R}\relax
+\expandafter \def \csname Xskak.export.18.w.piece\endcsname {R}\relax
+\expandafter \def \csname Xskak.export.18.w.piecechar\endcsname {R}\relax
+\expandafter \def \csname Xskak.export.18.w.castling\endcsname {\setboolean {xskakboolcastling}{false}}\relax
+\expandafter \def \csname Xskak.export.18.w.longcastling\endcsname {\setboolean {xskakboollongcastling}{false}}\relax
+\expandafter \def \csname Xskak.export.18.w.capture\endcsname {\setboolean {xskakboolcapture}{true}}\relax
+\expandafter \def \csname Xskak.export.18.w.check\endcsname {\setboolean {xskakboolcheck}{false}}\relax
+\expandafter \def \csname Xskak.export.18.w.mate\endcsname {\setboolean {xskakboolmate}{false}}\relax
+\expandafter \def \csname Xskak.export.18.w.lostpiece\endcsname {q}\relax
+\expandafter \def \csname Xskak.export.18.w.lostpiecechar\endcsname {Q}\relax
+\expandafter \def \csname Xskak.export.18.w.pgnlostpiece\endcsname {Q}\relax
+\expandafter \def \csname Xskak.export.18.w.movefrom\endcsname {e1}\relax
+\expandafter \def \csname Xskak.export.18.w.pgnmovefrom\endcsname {}\relax
+\expandafter \def \csname Xskak.export.18.w.moveto\endcsname {e7}\relax
+\expandafter \def \csname Xskak.export.18.w.move\endcsname {e1-e7}\relax
+\expandafter \def \csname Xskak.export.18.w.enpassant\endcsname {\setboolean {xskakboolenpassant}{false}}\relax
+\expandafter \def \csname Xskak.export.18.w.enpassantsquare\endcsname {-}\relax
+\expandafter \def \csname Xskak.export.18.w.promotion\endcsname {\setboolean {xskakboolpromotion}{false}}\relax
+\expandafter \def \csname Xskak.export.18.w.promotionpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.18.w.promotionpiecechar\endcsname {}\relax
+\expandafter \def \csname Xskak.export.18.w.addpieces\endcsname {Re7}\relax
+\expandafter \def \csname Xskak.export.18.w.clearfields\endcsname {e1}\relax
+\expandafter \def \csname Xskak.export.18.w.comments\endcsname {}\relax
+\expandafter \def \csname Xskak.export.18.w.nextfen\endcsname {r1k2b1r/p2nR1p1/2b4p/1p1n1p2/3P4/3Q1NB1/1PP2PPP/R5K1 b - - 0 18}\relax
+\expandafter \def \csname Xskak.export.18.w.pastfen\endcsname {r1k2b1r/p2nq1p1/2b4p/1p1n1p2/3P4/3Q1NB1/1PP2PPP/R3R1K1 w - - 0 18}\relax
+\expandafter \def \csname Xskak.export.18.w.nag\endcsname {}\relax
+\expandafter \def \csname Xskak.export.18.w.san\endcsname {\textsymfigsymbol {R}\capturesymbol e7}\relax
+\expandafter \def \csname Xskak.export.18.w.lan\endcsname {\textsymfigsymbol {R}e1\capturesymbol e7}\relax
+\expandafter \def \csname Xskak.export.18.w.opennr\endcsname {18\whiteopen \beforewhite }\relax
+\expandafter \def \csname Xskak.export.18.b.movenr\endcsname {\Xskak.export.18.b.movenr }\relax
+\expandafter \def \csname Xskak.export.18.b.player\endcsname {\Xskak.export.18.b.player }\relax
+\expandafter \def \csname Xskak.export.18.b.moveid\endcsname {\Xskak.export.18.b.moveid }\relax
+\expandafter \def \csname Xskak.export.18.b.pgnpiece\endcsname {B}\relax
+\expandafter \def \csname Xskak.export.18.b.piece\endcsname {b}\relax
+\expandafter \def \csname Xskak.export.18.b.piecechar\endcsname {B}\relax
+\expandafter \def \csname Xskak.export.18.b.castling\endcsname {\setboolean {xskakboolcastling}{false}}\relax
+\expandafter \def \csname Xskak.export.18.b.longcastling\endcsname {\setboolean {xskakboollongcastling}{false}}\relax
+\expandafter \def \csname Xskak.export.18.b.capture\endcsname {\setboolean {xskakboolcapture}{true}}\relax
+\expandafter \def \csname Xskak.export.18.b.check\endcsname {\setboolean {xskakboolcheck}{false}}\relax
+\expandafter \def \csname Xskak.export.18.b.mate\endcsname {\setboolean {xskakboolmate}{false}}\relax
+\expandafter \def \csname Xskak.export.18.b.lostpiece\endcsname {R}\relax
+\expandafter \def \csname Xskak.export.18.b.lostpiecechar\endcsname {R}\relax
+\expandafter \def \csname Xskak.export.18.b.pgnlostpiece\endcsname {R}\relax
+\expandafter \def \csname Xskak.export.18.b.movefrom\endcsname {f8}\relax
+\expandafter \def \csname Xskak.export.18.b.pgnmovefrom\endcsname {}\relax
+\expandafter \def \csname Xskak.export.18.b.moveto\endcsname {e7}\relax
+\expandafter \def \csname Xskak.export.18.b.move\endcsname {f8-e7}\relax
+\expandafter \def \csname Xskak.export.18.b.enpassant\endcsname {\setboolean {xskakboolenpassant}{false}}\relax
+\expandafter \def \csname Xskak.export.18.b.enpassantsquare\endcsname {-}\relax
+\expandafter \def \csname Xskak.export.18.b.promotion\endcsname {\setboolean {xskakboolpromotion}{false}}\relax
+\expandafter \def \csname Xskak.export.18.b.promotionpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.18.b.promotionpiecechar\endcsname {}\relax
+\expandafter \def \csname Xskak.export.18.b.addpieces\endcsname {be7}\relax
+\expandafter \def \csname Xskak.export.18.b.clearfields\endcsname {f8}\relax
+\expandafter \def \csname Xskak.export.18.b.comments\endcsname {}\relax
+\expandafter \def \csname Xskak.export.18.b.nextfen\endcsname {r1k4r/p2nb1p1/2b4p/1p1n1p2/3P4/3Q1NB1/1PP2PPP/R5K1 w - - 0 19}\relax
+\expandafter \def \csname Xskak.export.18.b.pastfen\endcsname {r1k2b1r/p2nR1p1/2b4p/1p1n1p2/3P4/3Q1NB1/1PP2PPP/R5K1 b - - 0 18}\relax
+\expandafter \def \csname Xskak.export.18.b.nag\endcsname {}\relax
+\expandafter \def \csname Xskak.export.18.b.san\endcsname {\textsymfigsymbol {B}\capturesymbol e7}\relax
+\expandafter \def \csname Xskak.export.18.b.lan\endcsname {\textsymfigsymbol {B}f8\capturesymbol e7}\relax
+\expandafter \def \csname Xskak.export.18.b.opennr\endcsname {18\blackopen \beforeblack }\relax
+\expandafter \def \csname Xskak.export.19.w.movenr\endcsname {\Xskak.export.19.w.movenr }\relax
+\expandafter \def \csname Xskak.export.19.w.player\endcsname {\Xskak.export.19.w.player }\relax
+\expandafter \def \csname Xskak.export.19.w.moveid\endcsname {\Xskak.export.19.w.moveid }\relax
+\expandafter \def \csname Xskak.export.19.w.pgnpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.19.w.piece\endcsname {P}\relax
+\expandafter \def \csname Xskak.export.19.w.piecechar\endcsname {p}\relax
+\expandafter \def \csname Xskak.export.19.w.castling\endcsname {\setboolean {xskakboolcastling}{false}}\relax
+\expandafter \def \csname Xskak.export.19.w.longcastling\endcsname {\setboolean {xskakboollongcastling}{false}}\relax
+\expandafter \def \csname Xskak.export.19.w.capture\endcsname {\setboolean {xskakboolcapture}{false}}\relax
+\expandafter \def \csname Xskak.export.19.w.check\endcsname {\setboolean {xskakboolcheck}{false}}\relax
+\expandafter \def \csname Xskak.export.19.w.mate\endcsname {\setboolean {xskakboolmate}{false}}\relax
+\expandafter \def \csname Xskak.export.19.w.lostpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.19.w.lostpiecechar\endcsname {}\relax
+\expandafter \def \csname Xskak.export.19.w.pgnlostpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.19.w.movefrom\endcsname {c2}\relax
+\expandafter \def \csname Xskak.export.19.w.pgnmovefrom\endcsname {}\relax
+\expandafter \def \csname Xskak.export.19.w.moveto\endcsname {c4}\relax
+\expandafter \def \csname Xskak.export.19.w.move\endcsname {c2-c4}\relax
+\expandafter \def \csname Xskak.export.19.w.enpassant\endcsname {\setboolean {xskakboolenpassant}{false}}\relax
+\expandafter \def \csname Xskak.export.19.w.enpassantsquare\endcsname {c3}\relax
+\expandafter \def \csname Xskak.export.19.w.promotion\endcsname {\setboolean {xskakboolpromotion}{false}}\relax
+\expandafter \def \csname Xskak.export.19.w.promotionpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.export.19.w.promotionpiecechar\endcsname {}\relax
+\expandafter \def \csname Xskak.export.19.w.addpieces\endcsname {Pc4}\relax
+\expandafter \def \csname Xskak.export.19.w.clearfields\endcsname {c2}\relax
+\expandafter \def \csname Xskak.export.19.w.comments\endcsname {}\relax
+\expandafter \def \csname Xskak.export.19.w.nextfen\endcsname {r1k4r/p2nb1p1/2b4p/1p1n1p2/2PP4/3Q1NB1/1P3PPP/R5K1 b - c3 0 19}\relax
+\expandafter \def \csname Xskak.export.19.w.pastfen\endcsname {r1k4r/p2nb1p1/2b4p/1p1n1p2/3P4/3Q1NB1/1PP2PPP/R5K1 w - - 0 19}\relax
+\expandafter \def \csname Xskak.export.19.w.nag\endcsname {}\relax
+\expandafter \def \csname Xskak.export.19.w.san\endcsname {c4}\relax
+\expandafter \def \csname Xskak.export.19.w.lan\endcsname {c2\xskakmovehyphen c4}\relax
+\expandafter \def \csname Xskak.export.19.w.opennr\endcsname {19\whiteopen \beforewhite }\relax
+\def \xskakcurrentgameid {export}\xskakendgamedata
+%
+%Start of game exportb
+%
+\expandafter \def \csname Xskakexportbinitfen\endcsname {rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1}\relax
+\expandafter \def \csname Xskakexportbinitplayer\endcsname {w}\relax
+\expandafter \def \csname Xskakexportbinitmovenr\endcsname {1}\relax
+\expandafter \def \csname Xskakexportbinitmoveid\endcsname {1w}\relax
+\expandafter \def \csname Xskakexportblastfen\endcsname {rnbqkbnr/pppp1ppp/8/4p3/4P3/8/PPPP1PPP/RNBQKBNR w KQkq e6 0 2}\relax
+\expandafter \def \csname Xskakexportblastplayer\endcsname {b}\relax
+\expandafter \def \csname Xskakexportblastmovenr\endcsname {1}\relax
+\expandafter \def \csname Xskakexportblastmoveid\endcsname {1b}\relax
+\expandafter \def \csname Xskakexportbnextplayer\endcsname {w}\relax
+\expandafter \def \csname Xskakexportbnextmovenr\endcsname {2}\relax
+\expandafter \def \csname Xskakexportbnextmoveid\endcsname {2w}\relax
+\expandafter \def \csname Xskakexportbdiagramlist\endcsname {}\relax
+\expandafter \def \csname Xskakexportbgameid\endcsname {exportb}\relax
+\expandafter \def \csname Xskakexportbresult\endcsname {*}\relax
+\expandafter \def \csname Xskakexportbsite\endcsname {}\relax
+\expandafter \def \csname Xskakexportbevent\endcsname {}\relax
+\expandafter \def \csname Xskakexportbdate\endcsname {}\relax
+\expandafter \def \csname Xskakexportbround\endcsname {}\relax
+\expandafter \def \csname Xskakexportbwhite\endcsname {none}\relax
+\expandafter \def \csname Xskakexportbblack\endcsname {none}\relax
+\expandafter \def \csname Xskakexportbblackelo\endcsname {}\relax
+\expandafter \def \csname Xskakexportbwhiteelo\endcsname {}\relax
+\expandafter \def \csname Xskak.exportb.1.w.movenr\endcsname {\Xskak.exportb.1.w.movenr }\relax
+\expandafter \def \csname Xskak.exportb.1.w.player\endcsname {\Xskak.exportb.1.w.player }\relax
+\expandafter \def \csname Xskak.exportb.1.w.moveid\endcsname {\Xskak.exportb.1.w.moveid }\relax
+\expandafter \def \csname Xskak.exportb.1.w.pgnpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.exportb.1.w.piece\endcsname {P}\relax
+\expandafter \def \csname Xskak.exportb.1.w.piecechar\endcsname {p}\relax
+\expandafter \def \csname Xskak.exportb.1.w.castling\endcsname {\setboolean {xskakboolcastling}{false}}\relax
+\expandafter \def \csname Xskak.exportb.1.w.longcastling\endcsname {\setboolean {xskakboollongcastling}{false}}\relax
+\expandafter \def \csname Xskak.exportb.1.w.capture\endcsname {\setboolean {xskakboolcapture}{false}}\relax
+\expandafter \def \csname Xskak.exportb.1.w.check\endcsname {\setboolean {xskakboolcheck}{false}}\relax
+\expandafter \def \csname Xskak.exportb.1.w.mate\endcsname {\setboolean {xskakboolmate}{false}}\relax
+\expandafter \def \csname Xskak.exportb.1.w.lostpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.exportb.1.w.lostpiecechar\endcsname {}\relax
+\expandafter \def \csname Xskak.exportb.1.w.pgnlostpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.exportb.1.w.movefrom\endcsname {e2}\relax
+\expandafter \def \csname Xskak.exportb.1.w.pgnmovefrom\endcsname {}\relax
+\expandafter \def \csname Xskak.exportb.1.w.moveto\endcsname {e4}\relax
+\expandafter \def \csname Xskak.exportb.1.w.move\endcsname {e2-e4}\relax
+\expandafter \def \csname Xskak.exportb.1.w.enpassant\endcsname {\setboolean {xskakboolenpassant}{false}}\relax
+\expandafter \def \csname Xskak.exportb.1.w.enpassantsquare\endcsname {e3}\relax
+\expandafter \def \csname Xskak.exportb.1.w.promotion\endcsname {\setboolean {xskakboolpromotion}{false}}\relax
+\expandafter \def \csname Xskak.exportb.1.w.promotionpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.exportb.1.w.promotionpiecechar\endcsname {}\relax
+\expandafter \def \csname Xskak.exportb.1.w.addpieces\endcsname {Pe4}\relax
+\expandafter \def \csname Xskak.exportb.1.w.clearfields\endcsname {e2}\relax
+\expandafter \def \csname Xskak.exportb.1.w.comments\endcsname {}\relax
+\expandafter \def \csname Xskak.exportb.1.w.nextfen\endcsname {rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNR b KQkq e3 0 1}\relax
+\expandafter \def \csname Xskak.exportb.1.w.pastfen\endcsname {rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1}\relax
+\expandafter \def \csname Xskak.exportb.1.w.nag\endcsname {}\relax
+\expandafter \def \csname Xskak.exportb.1.w.san\endcsname {e4}\relax
+\expandafter \def \csname Xskak.exportb.1.w.lan\endcsname {e2\xskakmovehyphen e4}\relax
+\expandafter \def \csname Xskak.exportb.1.w.opennr\endcsname {1\whiteopen \beforewhite }\relax
+\expandafter \def \csname Xskak.exportb.1.b.movenr\endcsname {\Xskak.exportb.1.b.movenr }\relax
+\expandafter \def \csname Xskak.exportb.1.b.player\endcsname {\Xskak.exportb.1.b.player }\relax
+\expandafter \def \csname Xskak.exportb.1.b.moveid\endcsname {\Xskak.exportb.1.b.moveid }\relax
+\expandafter \def \csname Xskak.exportb.1.b.pgnpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.exportb.1.b.piece\endcsname {p}\relax
+\expandafter \def \csname Xskak.exportb.1.b.piecechar\endcsname {p}\relax
+\expandafter \def \csname Xskak.exportb.1.b.castling\endcsname {\setboolean {xskakboolcastling}{false}}\relax
+\expandafter \def \csname Xskak.exportb.1.b.longcastling\endcsname {\setboolean {xskakboollongcastling}{false}}\relax
+\expandafter \def \csname Xskak.exportb.1.b.capture\endcsname {\setboolean {xskakboolcapture}{false}}\relax
+\expandafter \def \csname Xskak.exportb.1.b.check\endcsname {\setboolean {xskakboolcheck}{false}}\relax
+\expandafter \def \csname Xskak.exportb.1.b.mate\endcsname {\setboolean {xskakboolmate}{false}}\relax
+\expandafter \def \csname Xskak.exportb.1.b.lostpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.exportb.1.b.lostpiecechar\endcsname {}\relax
+\expandafter \def \csname Xskak.exportb.1.b.pgnlostpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.exportb.1.b.movefrom\endcsname {e7}\relax
+\expandafter \def \csname Xskak.exportb.1.b.pgnmovefrom\endcsname {}\relax
+\expandafter \def \csname Xskak.exportb.1.b.moveto\endcsname {e5}\relax
+\expandafter \def \csname Xskak.exportb.1.b.move\endcsname {e7-e5}\relax
+\expandafter \def \csname Xskak.exportb.1.b.enpassant\endcsname {\setboolean {xskakboolenpassant}{false}}\relax
+\expandafter \def \csname Xskak.exportb.1.b.enpassantsquare\endcsname {e6}\relax
+\expandafter \def \csname Xskak.exportb.1.b.promotion\endcsname {\setboolean {xskakboolpromotion}{false}}\relax
+\expandafter \def \csname Xskak.exportb.1.b.promotionpiece\endcsname {}\relax
+\expandafter \def \csname Xskak.exportb.1.b.promotionpiecechar\endcsname {}\relax
+\expandafter \def \csname Xskak.exportb.1.b.addpieces\endcsname {pe5}\relax
+\expandafter \def \csname Xskak.exportb.1.b.clearfields\endcsname {e7}\relax
+\expandafter \def \csname Xskak.exportb.1.b.comments\endcsname {}\relax
+\expandafter \def \csname Xskak.exportb.1.b.nextfen\endcsname {rnbqkbnr/pppp1ppp/8/4p3/4P3/8/PPPP1PPP/RNBQKBNR w KQkq e6 0 2}\relax
+\expandafter \def \csname Xskak.exportb.1.b.pastfen\endcsname {rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNR b KQkq e3 0 1}\relax
+\expandafter \def \csname Xskak.exportb.1.b.nag\endcsname {}\relax
+\expandafter \def \csname Xskak.exportb.1.b.san\endcsname {e5}\relax
+\expandafter \def \csname Xskak.exportb.1.b.lan\endcsname {e7\xskakmovehyphen e5}\relax
+\expandafter \def \csname Xskak.exportb.1.b.opennr\endcsname {1\blackopen \beforeblack }\relax
+\def \xskakcurrentgameid {exportb}\xskakendgamedata