我正在尝试在几步之后打印棋盘。为此,我使用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 键会全局更改命令(我不记得具体原因,但可能是为了避免单元格创建组的表格样式出现问题)因此你的\mainline
styleC 仍然处于活动状态并因此\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}