使用序列在 expl3 中构建数组行

使用序列在 expl3 中构建数组行

以下代码可以编译,但是不能实现我想要的效果:

\documentclass{article}

\usepackage{xparse}

\newcommand{\attribute}[1]{\mathbf{#1}}
\newcommand{\constant}[1]{\mathsf{#1}}

\ExplSyntaxOn
\NewDocumentCommand \extrelationrow { m m } {
  \seq_set_split:Nnn \shepi_vals {,} {#2}
  \seq_pop_right:NN \shepi_vals \shepi_last
  \seq_map_inline:Nn \shepi_vals {#1{##1}} % <=====
  %\seq_map_inline:Nn \shepi_vals {#1{##1} & }
  #1{\shepi_last}
  \\
}
\ExplSyntaxOff

\begin{document}

\[\begin{array}{llll}
  \extrelationrow{\attribute}{A,B,C,D}
  \extrelationrow{\constant}{e,f,g,h}
\end{array}\]

\end{document}

如果用注释掉的行来注释掉标记的行,那么编译将失败,并出现以下令人惊讶的错误(至少对我来说):

! Undefined control sequence.
<argument> \shepi_last 

l.21   \extrelationrow{\attribute}{A,B,C,D}

如果我#1{##1}在某些辅助列表中累积值并使用seq_use:Nn,它可以工作,但我必须在函数之外声明此辅助列表并使用。我认为累积需要更多资源,在这里是不必要的。无论如何,我想了解为什么当我在上面一行添加一个时seq_clear:N我的变量会消失。\shepi_last&

答案1

\seq_map_inline:Nn不能跨越对齐单元格。

您可以处理序列来装饰每个项目\seq_set_map:NNn,然后使用\seq_use:Nn

\documentclass{article}

\usepackage{xparse}

\newcommand{\attribute}[1]{\mathbf{#1}}
\newcommand{\constant}[1]{\mathsf{#1}}

\ExplSyntaxOn
\seq_new:N \l_shepi_vals_in_seq
\seq_new:N \l_shepi_vals_out_seq
\NewDocumentCommand \extrelationrow { m m }
 {
  \seq_set_split:Nnn \l_shepi_vals_in_seq {,} {#2}
  \seq_set_map:NNn \l_shepi_vals_out_seq \l_shepi_vals_in_seq { \exp_not:n { #1{##1} } }
  \seq_use:Nn \l_shepi_vals_out_seq { & }
  \\
}
\ExplSyntaxOff

\begin{document}

\[
\begin{array}{llll}
  \extrelationrow{\attribute}{A,B,C,D}
  \extrelationrow{\constant}{e,f,g,h}
\end{array}
\]

\end{document}

请注意变量的正确命名,变量应该有一个前缀和后缀,在本例中为l_(本地)和_seq(序列)。

在此处输入图片描述

与 不同\seq_map_inline:Nn\seq_use:Nn它会一次性提供结果,因此可以在对齐单元中使用。它只在第二个参数中添加标记之间物品,因此不需要 pop。

由于技术原因,的第三个参数已\seq_set_map:NNn完全展开,因此\exp_not:n必须使用。

相关内容