我正在尝试创建一个环境,将其参数作为键值对,使用其中一些,然后将其余部分转发到tblr
tabularray 的环境。
这会导致 colspec 参数出现“列类型内无法扩展的命令 \l_foo_colspec_str”错误,虽然 style 变量不会产生错误,但也不会hlines
转发到tblr
。
我相当确定问题出在 l3keys 方面,而不是 tabularray 方面,因为tblr
用tabular
替换(并删除 hlines 位)也会失败(出现“Illegal pream-token”错误)。
我想任何一个:
- 将具体参数单独传递给 tblr
- 从 #1 中删除特定的键值对,然后执行
\begin{tblr}{#1}
(可以通过分别传递“外部”参数列表和 tblr 参数列表来使其工作(\begin{tbl}{colspec=llx,hlines}{foo=bar}
),但这是一个不太优雅的界面。)
\ExplSyntaxOn
\keys_define:nn { foo } {
bar .tl_set:N = \l_foo_bar_str,
colspec .tl_set:N = \l_foo_colspec_str,
style .tl_set:N = \l_foo_style_clist,
}
\newenvironment{tbl}[1]
{
\keys_set:nn{foo}{#1}
\l_foo_bar_str
\begin{tblr}{colspec=\l_foo_colspec_str,\l_foo_style_clist}%
}
{
\end{tblr}
}
\ExplSyntaxOff
\begin{document}
\begin{tbl}{
bar=baz,
colspec=llx,
style={hlines},
}
a & b & c \\
a & b & c \\
a & b & c \\
\end{tbl}
\end{document}
答案1
由于是tblr
根据 的+b
参数类型定义的\NewDocumentEnvironment
,因此通过它定义的环境也必须符合要求。您还需要在将参数提供给 之前对其进行扩展\begin{tblr}
。
\documentclass{article}
\usepackage{tabularray}
\ExplSyntaxOn
\keys_define:nn { foo } {
bar .tl_set:N = \l_foo_bar_tl,
colspec .tl_set:N = \l_foo_colspec_tl,
style .tl_set:N = \l_foo_style_clist,
}
\NewDocumentEnvironment{tbl}{m +b}
{
\keys_set:nn{foo}{#1}
\l_foo_bar_tl
\exp_args:Nne \begin{tblr}{colspec=\l_foo_colspec_tl,\l_foo_style_clist}
#2
\end{tblr}
}{}
\ExplSyntaxOff
\begin{document}
\begin{tbl}{
bar=baz,
colspec=llX,
style={hlines},
}
a & b & c \\
a & b & c \\
a & b & c \\
\end{tbl}
\end{document}
请使用,tl
而不是str
用于标记列表变量。