在 SKAK 中编写国际象棋走法的问题

在 SKAK 中编写国际象棋走法的问题

我是 LaTeX 新手,一直在尝试用它编写国际象棋走法。一切都很顺利,直到我编写了从鲍特维尼克的一场国际象棋比赛中摘录的国际象棋走法后,出现了一个大问题,我看不懂,也无法解决。还有一个细节:它不是从比赛开始,而是接近第二十步。

\documentclass[a4paper, 11pt]{report}

\usepackage[left=3cm, right=3cm, top=3cm, bottom=3cm]{geometry}
\usepackage{skak}

\begin{document}

\mainline{1. Nb2 Rc3 \, 2. Bd2 Rb3 \, 3. Qc2 Qb5 \, 4. Rc1 Bf8 \, 5. Rd1 Re2 \,  6. Qc1 
Rxh3+ ! \, 7. gxh3 d4  0--1}

\showboard

\end{document}

错误信息如下:

! Undefined control sequence.
<argument> \MoveFrom
l.132 ...e2 \, 6. Qc1 Rxh3+ ! \, 7. gxh3 d4 0--1}
The control sequence at the end of the top line
of your error message was never \def'ed. If you have
misspelled it (e.g., `\hobx'), type `I' and the correct
spelling (e.g., `I\hbox'). Otherwise just continue,
and I'll forget about whatever was undefined.

欢迎任何帮助。

答案1

正如 Ulrike Fisher 在评论中所说,代码中缺少了一些东西:游戏的第一步。skak可以从一开始就跟踪棋步,就像在下棋一样,并在最终状态下打印棋盘。此外,你可以通过将每个棋子放在自己的方格上来设置棋盘,然后打印一些相关的棋步和注释以及写好的棋步。出于这些目的,xskak这是该软件包的改进版本,因为它纠正了一些检测到的错误并添加了一些其他功能(请参阅xskak:skak 包的扩展

当仅显示移动游戏时,您必须从头开始编写它们,或者从某个移动到结束编写它们。

我在代码中做了这两件事。第一列是包含所有动作的完整游戏(我检索了斯托尔贝格 vs. 鲍特维尼克游戏)。 这里xskak 玩游戏— 正如费舍尔所说 —,并通过命令返回最终位置\chessboard

第二列是你假装的。但在这种情况下 - 由于xskak不知道如何解释没有前奏和中局的游戏的最后 7 步,会将棋子放在可能在每个方格上相互重叠的位置 - 你需要编写一个命令来告诉xskak忘记第一步并显示最后一步,方法是输入\xskakset{defaultmoveid=35w} (第 28 页,CTAN xskak),然后您可以根据需要手动确定棋盘上棋子的最终位置。

您的代码生成了两个错误,一个是因为最后写入的动作,另一个是因为在0--1的末尾\mainline{...}(这导致了错误The control sequence ... was never \def'ed)。您应该将密钥写入result=0--1其中\newchessboard,然后在\mainline{...}使用之后调用它\xskakgetgame{result}。在此环境中无需将\,动作分开。

在此处输入图片描述

\documentclass{article}
\usepackage{ragged2e}
\usepackage{chessboard}
\usepackage{xskak}

\textwidth=17cm
\oddsidemargin=-1cm

\begin{document}

\begin{minipage}{0.4\textwidth}
    \centering {\large\bf Stolberg vs. Botvinnik} 
    \justify\newchessgame[white=Stolberg,black=Botvinnik]
    \mainline{%
        1.      d4      Nf6    2.       c4      e6      3.      Nc3     Bb4
        4.      e3      O-O    5.       Bd3     d5      6.      cxd5    exd5
        7.      Nge2    c5     8.       O-O     Nc6     9.      a3      cxd4
        10.     exd4    Bd6    11.      h3      h6      12.     b4      Re8
        13.     Qb3     Be6    14.      Bd2     Qd7     15.     f4      Bf5
        16.     Qc2     Be4    17.      b5      Bxd3    18.     Qxd3    Na5
        19.     Ng3     Nc4    20.      Bc1     Rac8    21.     Ra2     Bf8
        22.     a4      Bb4    23.      Nd1     Ne4     24.     f5      Nxg3
        25.     Qxg3    Bd6    26.      Qf3     Be7     27.     Qg3     Bf6
        28.     Bxh6    Bxd4+  29.      Kh1     f6      30.     Bc1     Re4
        31.     Qd3     Ne5    32.      Qb1     Rc4     33.     a5      Bc5
        34.     b6      a6     35.      Nb2     Rc3     36.     Bd2     Rb3
        37.     Qc2     Qb5    38.      Rc1     Bf8     39.     Rd1     Re2
        40.     Qc1     Rxh3+  41.      gxh3!   d4}
    \chessboard
\end{minipage}
%
\hfill\vline\hfill
%
%Last 7 moves
%Chessboard has to be set by hand with keys \newchessgame[setwhite={...},setblack={...}]
\begin{minipage}{0.4\textwidth}
    \chessboard
    \vspace{5mm}
    \centering {\large\bf Stolberg vs. Botvinnik} \\ (last 7 moves) 
    \justify\xskakset{defaultmoveid=35w}
    \newchessgame[id=A,white=Stolberg,black=Botvinnik,
        setwhite={pa5,pb6,pf5,ph3,ra2,rd1,nb2,bd2,qc1,kh1},
        addblack={pa6,pb7,pd4,pf6,pg7,bf8,ne5,re2,qb5,kg8},result=0--1]
    \xskakgetgame{white}--\xskakgetgame{black}: %Competitors names
    \mainline{%
        35.     Nb2     Rc3     36.     Bd2     Rb3       37.       Qc2     Qb5
        38.     Rc1     Bf8     39.     Rd1     Re2       40.       Qc1     Rxh3+
        41.     pxh3!   pd4} \quad\mbox{\xskakgetgame{result}}
\end{minipage}

\end{document}

相关内容