xskakget 因 styleC 失败

xskakget 因 styleC 失败

我正在尝试在几步之后打印棋盘。为此,我使用xskakget获取移动次数并将其打印为标题。只要我使用默认样式或命令,它就可以正常工作styleA\mainline如果我使用styleC以表格形式打印棋步,xskakget 会失败opennr。我收到缺少 $ 插入的错误。我遗漏了什么?最小工作示例在这里。

\documentclass[11pt]{book}
\usepackage{xskak}

\begin{document}
\newchessgame\mainline[style=styleC]{1. e4 e5 2. Nf3 Nc6}

\xskakset{moveid=2b}\xskakget{opennr}\xskakget{san}
\end{document}

答案1

style 键会全局更改命令(我不记得具体原因,但可能是为了避免单元格创建组的表格样式出现问题)因此你的\mainlinestyleC 仍然处于活动状态并因此\xskakget{opennr}失败。

引用文档:

opennr包含打印数字的代码,就像 skak 包在您以此举开始或继续游戏时所做的那样。

这意味着它包含格式化信息。只要此格式化信息仅包含点或字体开关之类的内容,这实际上就不是问题,但对于 styleC,它包含制表符命令 - 并且此命令在制表符之外会给出错误。

因此,当使用 opennr 时,您应该确保在当前上下文中有效的样式是活动的(并且看起来像您希望的那样)。

例如

\documentclass[11pt]{book}
\usepackage{xskak}

\begin{document} \show\blackopen 
\newchessgame\mainline[style=styleC]{1. e4 e5 2. Nf3 Nc6}

\xskakset{style=styleB}%
\mainlinestyle %to activate the style
\xskakset{moveid=2b}\xskakget{opennr}\xskakget{san}
\end{document}

您还可以尝试在不全局更改样式命令的情况下它是否有效。但您必须在 \mainline 命令周围添加括号:

\documentclass[11pt]{book}
\usepackage{xskak}

\makeatletter
\renewcommand\xskak@do@copystyleitem[2]{% 
 \ifcsname #1beforeblack\endcsname
  \expandafter\let
     \csname #2whiteopen\expandafter\endcsname
     \csname #1whiteopen\endcsname
  \expandafter\let
     \csname #2blackopen\expandafter\endcsname
     \csname #1blackopen\endcsname
  \expandafter\let
     \csname #2beforewhite\expandafter\endcsname
     \csname #1beforewhite\endcsname
  \expandafter\let
     \csname #2beforeblack\expandafter\endcsname
     \csname #1beforeblack\endcsname
  \expandafter\let
     \csname #2afterwhite\expandafter\endcsname
     \csname #1afterwhite\endcsname
  \expandafter\let
     \csname #2afterblack\expandafter\endcsname
     \csname #1afterblack\endcsname
  \expandafter\let
     \csname #2beforenumber\expandafter\endcsname
     \csname #1beforenumber\endcsname
  \expandafter\let
     \csname #2opencommands\expandafter\endcsname
     \csname #1opencommands\endcsname
  \expandafter\let
     \csname #2closecommands\expandafter\endcsname
     \csname #1closecommands\endcsname
  %% two specific xskak command for the comments:
  \expandafter\let
     \csname #2xskak@beforecomment\expandafter\endcsname
     \csname #1xskak@beforecomment\endcsname
  \expandafter\let
     \csname #2xskak@beforeNAG\expandafter\endcsname
     \csname #1xskak@beforeNAG\endcsname
 \else
  \PackageError{xskak}{style template #1 doesn't exist!}{}%
 \fi}
\makeatother 
%

\begin{document}
\newchessgame
{\mainline[style=styleC]{1. e4 e5 2. Nf3 Nc6}}%group around mainline

\xskakset{moveid=2b}\xskakget{opennr}\xskakget{san}
\end{document}

答案2

@Surya,这是一个例子:

\documentclass[10pt,twocolumn]{article}
\title{xskak Dua Kolom}
\usepackage{xskak}

\begin{document}

\begin{center}
    \textbf{Botvinnik -- Smyslov} \\
    \textit{World Championship Match (17)} \\
    \textit{Moscow 1957} \\
    Gr\"{u}nfeld Defence
\end{center}

\newchessgame
\xskakset{style=styleC}

\mainline{1. Nf3 Nf6 2. g3 g6 3. c4 c6 4. Bg2 Bg7 5. Nc3 O-O 6. d4 d5 7. cxd5
cxd5 8. Ne5 b6}
\[ \showboard \]
A satisfactory way of developing.  After {\variation[invar]{8... Nc6 9. Nxc6
bxc6}} Black would be saddled with a weak pawn at c6.

\mainline{9. Bg5 Bb7 10. Bxf6 Bxf6 11. O-O}

In the variation {\variation[invar]{11. e4 dxe4 12. Nxe4 Bxe5 13. dxe5 Nd7
14. f4 Nc5}} Black has a good game.

\mainline{11... e6 12. f4}

If {\variation[invar]{12. e4 Nc6 13. exd5} (\variation[invar]{13. Nxc6 Bxc6
14. exd5 exd5}) \variation[outvar]{13... Nxe5 14. dxe5 Bxe5 15. dxe6 Bxg2 16.
exf7+ Rxf7 17. Kxg2 Bxc3 18. bxc3 Qxd1 19. Rfxd1 Rc8 20. Rd3 Rc4}}, and Black
can successfully battle for a draw in the rook ending.

\end{document}

相关内容