我正在尝试构建一个tblr
表并在其中包含扩展的对齐字符的多个宏,如下所示:
\documentclass{article}
\usepackage{tabularray}
\newcommand{\introrow}{Cat & Dog \\}
\newcommand{\outrorow}{Frog & Duck \\}
\begin{document}
\begin{tblr}{cc}
\introrow
Crow & Hawk \\
\outrorow
\end{tblr}
\end{document}
(背景:我正在尝试定义一个环境,该环境提供用户编写的表格的规范,并以宏的形式提供多个构建块,用户可以根据需要插入这些构建块。)
这不起作用,因为tabularray
需要查看所有对齐字符。通过传递expand=\introrow
或expand=\outrorow
,我可以为我的一个宏修复此问题。
有没有办法让tblr
环境扩展两个都宏?添加两个expand
键不起作用。
答案1
这是一个与我的其他答案不同的答案,它需要对 OP 的 MWE 进行最小程度的更改。基本上,不是使用 来\newcommand
定义他的简介和结尾,而是使用\newtoks
。这样,就可以使用 来[expand=\the]
让它们在 内部展开tblr
:
\documentclass{article}
\usepackage{tabularray}
\newtoks\introrow
\newtoks\outrorow
\introrow{Cat & Dog \\}
\outrorow{Frog & Duck \\}
\begin{document}
\begin{tblr}[expand=\the]{cc}
\the\introrow
Crow & Hawk \\
\the\outrorow
\end{tblr}
\end{document}
答案2
我不确定这是否符合游戏的预期,但是
\documentclass{article}
\usepackage{tabularray}
\newcommand{\introrow}{Cat & Dog \\}
\newcommand{\outrorow}{Frog & Duck \\}
\begin{document}
\begin{tblr}[expand=\expandafter]{cc}
\expandafter\empty\introrow
Crow & Hawk \\
\expandafter\empty\outrorow
\end{tblr}
\end{document}
答案3
根据您的结构类型tblr
,这可能就足够了。在这里,我使用 tokencycle 扫描新xtblr
环境的标记,以搜索控制序列。任何不是控制序列的标记都会被回显到标记列表中。宏\\
也会被回显到标记列表中。但是,当找到任何其他控制序列时,它会被扩展一次,然后再添加到标记列表中。
一旦对整个环境内容进行了扫描,标记列表就会被重新用作 的参数tblr
。
\documentclass{article}
\usepackage{tabularray,tokcycle,environ}
\newcommand{\introrow}{Cat & Dog \\}
\newcommand{\outrorow}{Frog & Duck \\}
\NewEnviron{xtblr}[1]{%
\resettokcycle
\Macrodirective{\ifx\\##1\addcytoks{##1}\else\addcytoks[1]{##1}\fi}%
\expandafter\tokcyclexpress\expandafter{\BODY}%
\begin{tblr}[expand=\the]{#1}\the\cytoks\end{tblr}%
}
\begin{document}
\begin{xtblr}{cc}
\introrow
Crow & Hawk \\
\outrorow
\end{xtblr}
\end{document}
答案4
这是 lvjr 的精彩回答(这里(如果你想让我接受,请随意写下你自己的答案),其技巧是使用\expanded
。它甚至可以与参数一起使用:
\documentclass{memoir}
\usepackage{xcolor}
\usepackage{tabularray}
\NewExpandableDocumentCommand{\yes}{O{Yes}m}{\SetCell{bg=green9}#1}
\NewExpandableDocumentCommand{\no}{O{No}m}{\SetCell{bg=red8}#1}
\begin{document}
\begin{tblr}[expand=\expanded]{cc}
What I want & is below \\
\SetCell{bg=green9} Yes & \SetCell{bg=red8} No \\
\SetCell{bg=green9} Great & \SetCell{bg=red8} Bad \\
What I get & is below \\
\expanded{\yes{}} & \expanded{\no{}} \\
\expanded{\yes[Great]{}} & \expanded{\no[Bad]{}}
\end{tblr}
\end{document}
请注意,您需要使用\unexpanded
命令保护其中的易碎命令(如果有)。