Expl3-在 xskakloop 中填充 tabularray

Expl3-在 xskakloop 中填充 tabularray

我想使用xskak 包的命令来填充 tabularraytblrlongtblr环境。\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和之间的相关区别tabulartblr使用解析 tabularray 的规范l3regex。因此,&\\必须明确存在。它们不能被“隐藏”。这意味着你不能说

\begin{tblr}{ccc}
  \macroholdingspecification
\end{tblr}

有两种有限的解决方法。一种是使用\newcommand*环境外定义宏(如果没有可选参数)。然后,您可以使用expand=\macrodefinedwithnewcommand可选参数来tblr扩展\macrodefinedwithnewcommand一次。

另一个涉及使用\NewExpandableDocumentCommandexpand=\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则不可扩展。

由于这是一个与之不同的问题tblrtabular您可能需要研究使用这样的环境作为替代方案。

相关内容