我想使用xskak 包的命令来填充 tabularraytblr
或longtblr
环境。\xskakloop
如果可能的话,我想使用 expl3。我尝试查看 xskak 源代码,但我仍然不知道它是否至少与 expl3 兼容。
据我所知,在参数\ExplSyntaxOn
中使用命令会导致意外结果。我尝试在 expl3 中重新定义一个等价项,但我不是 tex 专家。坦率地说,在我有限的时间内完成一个业余项目,要实现这个基本结果,我需要查阅的文档数量实在是太多了。\xskakloop
\xskakloop
如果可能的话,我想实现以下目标:
\documentclass[a4paper, 11pt]{article}
\usepackage{expl3}
\usepackage[l2tabu]{nag}
\usepackage[utf8]{inputenc}
\usepackage[LSBC4, T1]{fontenc}
\usepackage[english]{babel}
\usepackage{lmodern}
\usepackage{tabularray}
\usepackage{xskak}
\usepackage{chessboard}
\setboardfontencoding{LSBC4}%
\usepackage{pgfplots}
\pgfplotsset{compat=1.18}
\begin{document}
\newchessgame
\hidemoves{1.e4 f6, 2.d4 g5, 3.Qh5#}
\begin{tblr}{colspec = {@{} X[c] X[c] X[c] @{}}}
\xskakloop{%
{
\chessboard[tinyboard, setfen=\xskakget{nextfen}]
\\
\xskakget{opennr}\xskakget{san}%
}
% maybe putting this inside a command or something
\ExplSyntaxOn
\int_if_zero:nTF {\int_mod:nn {(\xskakget{movenr} - 1) * 2 + (\str_if_eq:eeTF {\xskakget{player}} {w} {1} {2})}{3}}
{ \\ }
{ & }
\ExplSyntaxOff
}
\end{tblr}
\end{document}
编辑:
上下文中,expl3 部分使用\xskakget{movenr}
和\xskakget{player}
命令来计算循环迭代次数。如果迭代次数是表格列数的倍数,则应该添加一个新行(可能不应该为最后一次迭代添加新行),否则应该开始一个新列。
答案1
首先,你不能在参数中间切换到 expl3 语法。catcode 已经修复,\ExplSyntaxOn
不能再更改它们。
在表格中的第二个循环通常很困难,因为每个单元格都是一个组,并且您经常会丢失定义(而在 tabularray 中则更加困难,因为 tabularray 希望看到内容以将其拆分为单元格)。
通常,最好直接创建框。例如:
\documentclass[a4paper, 11pt]{article}
\usepackage[l2tabu]{nag}
\usepackage[LSBC4, T1]{fontenc}
\usepackage[english]{babel}
\usepackage{lmodern}
\usepackage{xskak,chessboard}
\setboardfontencoding{LSBC4}%
\usepackage{pgfplots}
\pgfplotsset{compat=1.18}
\begin{document}
\newchessgame
\hidemoves{1.e4 f6 2.d4 g5 3.Qh5#}
\ExplSyntaxOn
\NewDocumentCommand\xskaksep{}
{
\int_if_zero:nTF {\int_mod:nn {(\xskakget{movenr} - 1) * 2 + (\str_if_eq:eeTF {\xskakget{player}} {w} {1} {2})}{3}}
{ \par }
{ \space }
}
\ExplSyntaxOff
\xskakloop{%
\noindent\begin{tabular}{c}
\chessboard[tinyboard, setfen=\xskakget{nextfen}]
\\
\xskakget{opennr}\xskakget{san}%
\end{tabular}
\xskaksep
}
\end{document}
答案2
tabularray
文档的第 30-31 页解释了tblr
和之间的相关区别tabular
。tblr
使用解析 tabularray 的规范l3regex
。因此,&
和\\
必须明确存在。它们不能被“隐藏”。这意味着你不能说
\begin{tblr}{ccc}
\macroholdingspecification
\end{tblr}
有两种有限的解决方法。一种是使用\newcommand*
环境外定义宏(如果没有可选参数)。然后,您可以使用expand=\macrodefinedwithnewcommand
可选参数来tblr
扩展\macrodefinedwithnewcommand
一次。
另一个涉及使用\NewExpandableDocumentCommand
和expand=\expanded
扩展一切可以扩展的东西。
无论哪种方式,你最终都会得到
\begin{tblr}[expand=\expandablemacro]{ccc}
\expandablemacro
\end{tblr}
但这只有在 的定义\expandablemacro
真正可扩展时才会起作用。不幸的是,您希望使用的几个宏都不是这样的。
> \xskakloop=macro:
->\@protected@testopt \xskakloop \\xskakloop {}.
l.181 \show\xskakloop
?
> \chessboard=macro:
->\@protected@testopt \chessboard \\chessboard {}.
l.183 \show\chessboard
这表明\chessboard
和\xskakloop
都是受保护的(\@protected
)并且不可扩展。因此,如果它们在 的定义中\expandablemacro
,\expandablemacro
则不可扩展。
由于这是一个与之不同的问题tblr
,tabular
您可能需要研究使用这样的环境作为替代方案。