我正在尝试使用这些包肖斯卡克和动画将国际象棋问题及其解决方案排版为 PDF,并嵌入可重播解决方案的动画小部件。
据我从文献中得知xskak
(和棋盘和斯卡克在这种策略下,他们假设白棋和黑棋会交替着手。
在系列问题,一名玩家进行一系列连续的移动。另一名玩家在移动之间不进行任何移动。该系列中的每一步都有一个移动编号。除了在连杀中,玩家是白方,在连杀中,黑方先进行一系列移动,然后白方将死。
\hidemoves
可用于输入xskak
一系列动作——但只能输入一系列黑白交替的动作。如何输入一系列不交替黑白的动作,并让动画工作,以便每次按下>
(“向前一步”)按钮都会使显示前进一步?(我担心,在实际动作之间交错虚拟“动作”的解决方案意味着只有交替按下按钮才能使显示前进,这不是很好。)
如果能够直接在一个命令中输入国际象棋符号就好了,比如
\hidemoves{1. Ra4 2. g4 3. g5 4. g6 5. g7 6. g8=R 7. Rgg4 8. Rgb4#}
如果做不到这一点,有没有办法通过xskak
一次输入一步棋,然后在每一步之后告知xskak
下一步由白棋(或黑棋,视情况而定)来做到这一点?我尝试了xskak
文档建议的各种命令,但没有成功。
我有包裹
- xskak v.1.4(2015 年 1 月 13 日打包;文档 2015 年 1 月 2 日),
- skak v.1.5.3(2018 年 2 月 8 日打包;文档 2018 年 1 月 8 日)
- animate(2019 年 4 月 10 日打包;文档 2019 年 4 月 9 日)
\documentclass[12pt,a4paper]{article}
\usepackage[utf8]{inputenc}
\usepackage[LSBC4,T1]{fontenc}
\usepackage{animate}
\usepackage{chessboard}
\usepackage{xskak}
\setlength{\unitlength}{1mm}
\setboardfontencoding{LSBC4}
\begin{document}
\newchessgame[setfen=8////6R/1k/3K2P]
\hidemoves{1. Ra4}
%\xskakset{player=w} % "2 is not the correct move number."
%\xskakset{moveid=2w} % "2 is not the correct move number."
%\xskakset{stepmoveid=2} % "2 is not the correct move number."
%\xskakset{nextplayer=w} % key doesn't exist
%\xskakset{nextmoveid=2w} % key doesn't exist
%\hidemoves{2. g4}% 3. g5 4. g6 5. g7 6. g8=R 7. Rgg4 8. Rgb4#}
\noindent
\begin{tabular}{cl}
\begin{minipage}[c]{63mm}
\begin{animateinline}[controls]{1}%
\begin{picture}(65,67)
\put(0,6){\chessboard[setfen=\xskakgetgame{initfen}]}%
\end{picture}
\newframe
\xskakloop{%
\begin{picture}(65,67)
\put(0,6){\chessboard[setfen=\xskakget{nextfen}]}%
\end{picture}%
\newframe}%
\begin{picture}(65,67)
\put(0,6){\chessboard[setfen=\xskakgetgame{lastfen}]}%
\end{picture}
\end{animateinline}
\end{minipage}&
\begin{minipage}[c][64mm]{112mm}
\textbf{Erich Bartel}
\textit{feenschach} Jul-Oct 1977, no. 12
ser-\#8
\vfill
3+1
\vspace{7mm}
\end{minipage}
\end{tabular}
Solution: \printchessgame
\end{document}
答案1
skak(以及基于 skak 的 xskak)假设白棋和黑棋交替移动,但可以存储游戏并重新加载,并在此步骤中更改玩家颜色。以下是一个例子。还有改进的空间,例如添加最后的位置等。这A
是该系列的 ID。
\documentclass[12pt,a4paper]{article}
\usepackage[utf8]{inputenc}
\usepackage[LSBC4,T1]{fontenc}
\usepackage{animate}
\usepackage{chessboard}
\usepackage{xskak,xparse}
\setlength{\unitlength}{1mm}
\setboardfontencoding{LSBC4}
\ExplSyntaxOn
\NewDocumentCommand\seriesmoves{ m }
{
\int_if_exist:cTF {g__rosie_series_#1_int }
{
\int_gzero:c {g__rosie_series_#1_int }
}
{
\int_new:c {g__rosie_series_#1_int }
}
\group_begin:
\char_set_catcode_other:N \#
\__rosie_seriesmoves:nn { #1 }
}
\NewDocumentCommand\printseriesmoves {m}
{
\int_step_inline:nn { \int_use:c { g__rosie_series_#1_int } }
{
##1.\,\use:c {Xskak.#1##1.\use:c{Xskak#1##1initmovenr}.\use:c{Xskak#1##1initplayer}.san}~
}
}
\cs_new:Nn \__rosie_seriesmoves:nn
{
\group_end:
\clist_map_inline:nn {#2}{\__rosie_seriesmove:nn{#1}{##1}}
}
\cs_new:Nn\__rosie_seriesmove:nn
{
\int_gincr:c { g__rosie_series_#1_int }
\use:c{@storegame}{tmp}%
\newchessgame[setfen=\use:c{chessgame.tmp},moveid=\int_use:c{ g__rosie_series_#1_int }w,
id=#1\int_use:c{ g__rosie_series_#1_int }
]%
\hidemoves{#2}
}
\newcommand\serieslast[1]{\int_use:c{ g__rosie_series_#1_int }}
\ExplSyntaxOff
\begin{document}
\newchessgame[setfen=8////6R/1k/3K2P]
\seriesmoves{A}{1. Ra4,2. g4,3. g5,4. g6,5. g7,6. g8=R,7. Rgg4,8. Rgb4#}
\noindent
\begin{tabular}{cl}
\begin{minipage}[c]{63mm}
\begin{animateinline}[controls]{1}%
\multiframe{\serieslast{A}}{id=1+1}{%
\xskakset{id=A\id}
\begin{picture}(65,67)
\put(0,6){\chessboard[setfen=\xskakgetgame{initfen}]}%
\end{picture}%
}
\end{animateinline}
\end{minipage}&
\begin{minipage}[c][64mm]{112mm}
\textbf{Erich Bartel}
\textit{feenschach} Jul-Oct 1977, no. 12
ser-\#8
\vfill
3+1
\vspace{7mm}
\end{minipage}
\end{tabular}
\bigskip
\printseriesmoves {A}
\end{document}