tabularray:展开多个宏

tabularray:展开多个宏

我正在尝试构建一个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=\introrowexpand=\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命令保护其中的易碎命令(如果有)。

相关内容