以下代码可以编译,但是不能实现我想要的效果:
\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
必须使用。