国际象棋类软件包 [skak 及类似软件包] – 每行一对棋步

国际象棋类软件包 [skak 及类似软件包] – 每行一对棋步

实际上是否有可能以一列的形式获得游戏的文本输出,每一步占一行,而不是像下面的 MWE 中那样将所有内容捆绑在一起的紧凑文本主体?

\documentclass[twocolumn]{book}

\usepackage{skak}
\usepackage{texmate}

\begin{document}

\whitename{Dubois} \blackname{Steinitz} \chessevent{London 1862} 3
\ECO{C50} \chessopening{Giucco Pianissimo}

|1 e4 e5 Nf3 Nc6 Bc4 Bc5 d3 Nf6 Bg5?! [Nc3] d6 O-O?! h6 Bh4 g5 Bg3 h5!
 Nxg5 h4! Nxf7 hxg3!! Nxd8 [Nxh8 Qe7! \threat<Qh7> Nf7 Bxf2+ Rxf2 gxf2+
 Kxf2 Ng4+ Kg3 Qf6 Qf3 Qg7\BBetter] Bg4 Qe1 Nd4 Nc3\onlymove [h3 Ne2+
 Kh1 Rxh3+ gxh3 Bf3\#] Nf3+! gxf3 Bxf3 \resigns|


\end{document}

下面是我所想到的一个例子:

在此处输入图片描述

提前感谢任何反馈。

答案1

可以获取您的输出,但我不知道它是否适用于 texmate 的输入——该包更倾向于简单输入而不是复杂的输出。使用该xskak包,您可以执行以下操作:

\documentclass[twocolumn]{book}

\usepackage{xskak,lipsum}

\begin{document}
\newchessgame
\xskakset{style=styleC}
\mainline
{1. e4 e5 2. Nf3 Nc6 3. Bc4}

blblbl blbllb

{\centering \chessboard[smallboard]\par}

\mainline{3... Bc5 4. d3 Nf6 5. Bg5?!}

\end{document}

在此处输入图片描述

答案2

texmate包定义了一些宏来控制移动后出现的内容和变化分隔符(参见手册)。通过重新定义这些宏,我们可以\hfill在每步棋前添加一个数字,在每步黑棋后添加另一个数字,以实现居中。同样,我们可以. \quad在每个数字后和\qquad白棋步棋后添加,以模仿示例中的间距。

问题是,您可能希望能够在注释内排版走子,而无需居中和较大的间距。因此,每次重新定义都需要使用 检查我们不在注释内\ifnum\@commlevel<2。此外,如果注释在黑棋走子之前开始,我们需要添加更多空格来弥补当前行中缺失的走子。此检查由 完成\if@white。完整的重新定义代码如下:

\makeatletter
    \renewcommand{\beforeno}{\ifnum\@commlevel<2 \null\hfill\fi}
    \renewcommand{\afterno}{\ifnum\@commlevel<2.\quad\else.~\fi}
    \renewcommand{\afterw}{\ifnum\@commlevel<2\qquad\else\ \fi}
    \renewcommand{\afterb}{\ifnum\@commlevel<2\hfill\null\\\else\ \fi}
    \renewcommand{\beforeb}{\ifnum\@commlevel<2\null\hfill\the\move\quad\dots\qquad\else\the\move\dots\fi}
    \renewcommand{\iiopen}{\ifnum\@commlevel<3\if@white\hspace{3em}\fi\hfill\null\par[\else\ [\fi}
    \renewcommand{\iiclose}{\ifnum\@commlevel<3]\hfill\null\\\else]\ \fi}
    \renewcommand{\iiopent}{\ifnum\@commlevel<3\if@white\hspace{3em}\fi\hfill\null\par\else\ \fi}
    \renewcommand{\iicloset}{\ifnum\@commlevel<3\hfill\null\\\else\ \fi}
\makeatother

您的代码无法编译,所以我尽力修复了它。似乎有一个非常奇怪的问题,每当车移动时都会产生编译器错误,所以我用 替换了所有Rr生成一个工作示例。如果我更改R为任何其他棋子(例如N),即使游戏没有意义,代码也会编译。这看起来像是软件包中的一个错误……

棋

\documentclass[twocolumn]{book}

\usepackage{skak}
\usepackage{texmate}

\makeatletter
    \renewcommand{\beforeno}{\ifnum\@commlevel<2 \null\hfill\fi}
    \renewcommand{\afterno}{\ifnum\@commlevel<2.\quad\else.~\fi}
    \renewcommand{\afterw}{\ifnum\@commlevel<2\qquad\else\ \fi}
    \renewcommand{\afterb}{\ifnum\@commlevel<2\hfill\null\\\else\ \fi}
    \renewcommand{\beforeb}{\ifnum\@commlevel<2\null\hfill\the\move\quad\dots\qquad\else\the\move\dots\fi}
    \renewcommand{\iiopen}{\ifnum\@commlevel<3\if@white\hspace{3em}\fi\hfill\null\par[\else\ [\fi}
    \renewcommand{\iiclose}{\ifnum\@commlevel<3]\hfill\null\\\else]\ \fi}
    \renewcommand{\iiopent}{\ifnum\@commlevel<3\if@white\hspace{3em}\fi\hfill\null\par\else\ \fi}
    \renewcommand{\iicloset}{\ifnum\@commlevel<3\hfill\null\\\else\ \fi}
\makeatother

\begin{document}

    \whitename{Dubois} \blackname{Steinitz} \chessevent{London 1862} 3
    \ECO{C50} \chessopening{Giucco Pianissimo}

    \makegametitle
    \noindent|1 e4 e5 \[|This is a comment. Comments can include moves (| d5 Nc3 |), which are typeset without extra space.|\] Nf3 Nc6 Bc4 Bc5 d3 Nf6 Bg5?! \[|This is a comment after White's move. It can also include moves (|Nc3|), and respects the spacing on the next actual move.|\] d6 O-O?! h6 Bh4 g5 Bg3 h5!
    Nxg5 h4! Nxf7 hxg3!! Nxd8 [Nxh8 Qe7! \threat<Qh7> Nf7 Bxf2+ rxf2 gxf2+ Kxf2 Ng4+ Kg3 Qf6 Qf3 Qg7\BBetter] Bg4 Qe1 Nd4 Nc3\onlymove [h3 Ne2+ Kh1 rxh3+ gxh3 Bf3\#] Nf3+! gxf3 Bxf3 \resigns|


\end{document}

相关内容