From e0c6872cf40896c7be36b11dcc744620f10adf1d Mon Sep 17 00:00:00 2001 From: Norbert Preining Date: Mon, 2 Sep 2019 13:46:59 +0900 Subject: Initial commit --- macros/latex/contrib/xskak/README.md | 46 + .../latex/contrib/xskak/UF-xskak-documentation.sty | 220 ++ macros/latex/contrib/xskak/skak-comment-test.pdf | Bin 0 -> 21142 bytes macros/latex/contrib/xskak/skak-comment-test.tex | 7 + .../contrib/xskak/skak-longmoves-test-new.pdf | Bin 0 -> 21121 bytes .../contrib/xskak/skak-longmoves-test-new.tex | 8 + macros/latex/contrib/xskak/xskak.dtx | 2409 ++++++++++++++ macros/latex/contrib/xskak/xskak.ins | 72 + macros/latex/contrib/xskak/xskak.pdf | Bin 0 -> 622998 bytes macros/latex/contrib/xskak/xskak.tex | 3490 ++++++++++++++++++++ macros/latex/contrib/xskak/xskak_and_beamer.pdf | Bin 0 -> 151042 bytes macros/latex/contrib/xskak/xskak_and_beamer.tex | 63 + macros/latex/contrib/xskak/xskakgames.xsk | 1303 ++++++++ 13 files changed, 7618 insertions(+) create mode 100644 macros/latex/contrib/xskak/README.md create mode 100644 macros/latex/contrib/xskak/UF-xskak-documentation.sty create mode 100644 macros/latex/contrib/xskak/skak-comment-test.pdf create mode 100644 macros/latex/contrib/xskak/skak-comment-test.tex create mode 100644 macros/latex/contrib/xskak/skak-longmoves-test-new.pdf create mode 100644 macros/latex/contrib/xskak/skak-longmoves-test-new.tex create mode 100644 macros/latex/contrib/xskak/xskak.dtx create mode 100644 macros/latex/contrib/xskak/xskak.ins create mode 100644 macros/latex/contrib/xskak/xskak.pdf create mode 100644 macros/latex/contrib/xskak/xskak.tex create mode 100644 macros/latex/contrib/xskak/xskak_and_beamer.pdf create mode 100644 macros/latex/contrib/xskak/xskak_and_beamer.tex create mode 100644 macros/latex/contrib/xskak/xskakgames.xsk (limited to 'macros/latex/contrib/xskak') 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 Binary files /dev/null and b/macros/latex/contrib/xskak/skak-comment-test.pdf 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 Binary files /dev/null and b/macros/latex/contrib/xskak/skak-longmoves-test-new.pdf 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 +%%%% +%%%% 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 ($) 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 to #2 + %use empty #2 to copy to the skak original commands + %use empty #1 to copy from the original skak commands + %use xskak@styleitem@@ 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@@ to copy a named style item + \edef\@tempa{% + xskak@styleitem@% + \csname xskak@style@\xskak@val@stylename @#1@item\endcsname%= + @}% + \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-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-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{} + +% 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 Binary files /dev/null and b/macros/latex/contrib/xskak/xskak.pdf 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{/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 Binary files /dev/null and b/macros/latex/contrib/xskak/xskak_and_beamer.pdf 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 -- cgit v1.2.3