![如何在棋盘输出和国际象棋注释中仅使用白棋的走法](https://linux22.com/image/446143/%E5%A6%82%E4%BD%95%E5%9C%A8%E6%A3%8B%E7%9B%98%E8%BE%93%E5%87%BA%E5%92%8C%E5%9B%BD%E9%99%85%E8%B1%A1%E6%A3%8B%E6%B3%A8%E9%87%8A%E4%B8%AD%E4%BB%85%E4%BD%BF%E7%94%A8%E7%99%BD%E6%A3%8B%E7%9A%84%E8%B5%B0%E6%B3%95.png)
有没有办法在棋盘输出和棋局注释中捕捉并显示白棋的移动?
如果可能的话,可以不用三个占位符点。
\documentclass[a4paper]{article}
\usepackage{chessboard, xskak}
%\setchessboard{showmover=false, }
\begin{document}
\newchessgame[id=MyGame,
setwhite={Ke4},
%hideblack,
]
\mainline{1. Ke3 ... 2. Kd3 ... 3. Ke4 ... 4. Ke5}
\chessboard[id=MyGame,]
\end{document}
答案1
[请注意以下说法,因为我绝对不是这些软件包方面的专家。]
包裹的方式斯卡克和肖斯卡克操作要求从某个起始位置开始有一条“主线”的移动,形成游戏的进程。这很重要,因为在任何时间点,棋盘的状态都可以从起始位置开始构建,执行“主线”的移动。
不幸的是,在“主线”中你不能省略黑棋的走法,否则就无法构建棋盘的状态。
但是,您可以做的是为黑棋添加虚拟移动(如您已经做的一样,将它们保留为未指定...
),并确保不打印它们。命令\whitemainline
我下面定义的命令正是这样做的。它受到以下启发文档包xskak
,v.1.5,第 35 页。
\documentclass[a4paper]{article}
\usepackage{chessboard,xskak}
\newcommand\whitemainline[1]{%
\edef\thegameid{\xskakgetgame{gameid}}%
\edef\themoveid{\xskakget{moveid}}%
\hidemoves{#1}%
\mainlinestyle%
\xskakset{id=\thegameid,moveid=\themoveid}%
\whiledo{\xskaktestmoveid{\xskakget{movenr}}{\xskakget{player}}}%
{\xskakget{movenr}\,\xskakget{san}%
\hspace{.5em}\xskakset{stepmoveid=2}}}
\begin{document}
\newchessgame[id=MyGame,setwhite={Ke4}]
\whitemainline{1. Ke3 ... 2. Kd3 ... 3. Ke4 ... 4. Ke5 ...}
\par
\chessboard[id=MyGame,showmover=false]
\bigskip
\whitemainline{5. Kf5 ... 6. Kg6}
\par
\chessboard[id=MyGame,showmover=false]
\end{document}
这将产生以下内容:
两点说明:
我删除了表示轮到黑棋的黑色方框 (
showmover=false
),因为我认为它在你的设置中没有多大意义。如果你想要它,你必须确保你的走法在白棋走法时停止,然后继续黑棋走法:\whitemainline{1. Ke3 ... 2. Kd3 ... 3. Ke4 ... 4. Ke5} ... \whitemainline{4... ... 5. Kf5 ... 6. Kg6}
如果你想完全省略虚拟黑棋移动,并且有类似的东西:
\whitemainline{1. Ke3 2. Kd3 3. Ke4 4. Ke5}
然后,您将必须对着法进行一些解析,并在里面引入虚拟黑棋着法
\whitemainline
。这可能要复杂得多,具体取决于您要支持的 PGN 符号子集。
答案2
我用了
\makeatletter
\def\xskak@do@printmove{%
\ifthenelse{\equal{\xskak@val@player}{b}}{}{\xskakget{san}\xskakget{nag}}}
所以:
\documentclass[margin=5mm, varwidth]{standalone}
\usepackage{chessboard, xskak}
\setchessboard{showmover=false}
\begin{document}
\newchessgame[id=MyGame, setwhite={Ke4}]
\hidemoves{1. Ke3 ... 2. Kd3 ... 3. Ke4 ... 4. Ke5}
\chessboard
\makeatletter
\def\xskak@do@printmove{%
\ifthenelse{\equal{\xskak@val@player}{b}}{}{\xskakget{san}\xskakget{nag}}}
\section*{style=UF}
\printchessgame[style=UF]
\section*{style=styleC}
\printchessgame[id=MyGame, style=styleC]
\end{document}