我有一些代码可以工作,但是当我尝试将其重构为函数时,它就停止工作了。这是一个 MWE:
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\seq_new:N \l_shepi_sub_seq:nnn
\cs_new_protected:Nn \shepi_seq:nnn {
\seq_set_split:Nnn \l_shepi_sub_seq {,} {#3}
\seq_set_map:NNn \l_shepi_sub_seq \l_shepi_sub_seq {\exp_not:n {#2}}
\seq_use:Nn \l_shepi_sub_seq {#1}
}
\NewDocumentCommand \works { m } {
\seq_set_split:Nnn \l_shepi_sub_seq {,} {#1}
\seq_set_map:NNn \l_shepi_sub_seq \l_shepi_sub_seq {\exp_not:n {l}}
\[\begin{array}{\seq_use:Nn \l_shepi_sub_seq {}}
\end{array}\]
}
\NewDocumentCommand \fails { m } {
\[\begin{array}{\shepi_seq:nnn {} {l} {#1}}
\end{array}\]
}
\ExplSyntaxOff
\begin{document}
\works{A, B, C}
\ExplSyntaxOn
\shepi_seq:nnn{}{l}{A, B, C}
\ExplSyntaxOff
%\fails{A, B, C}
\end{document}
取消注释 \fails 调用会中断编译并出现以下错误:
! Undefined control sequence.
<argument> \LaTeX3 error:
A sequence was misused.
l.55 \fails{A, B, C}
由于我的 \shepi_seq:nnn 函数被我的代码库的其他部分使用,我宁愿保持原样,但如果需要更改,那就这样吧。
有人能解释一下我做错了什么吗?
附带问题:像我一样调用 \seq_set_map:NNn 是一种好的做法吗?(前两个参数表示相同的序列)。
答案1
论点应该\begin{array}
是完全可扩展到正确的数组前导,但\shepi_seq:nnn
不可扩展。
此外\begin{array}
,不是如果包已加载,则无论如何都会扩展,array
因此您需要采用不同的方法。
您显然正在计算物品的数量,所以就这么做吧。;-)
\documentclass{article}
\usepackage{xparse}
\usepackage{array} % just in case
\ExplSyntaxOn
\seq_new:N \l_shepi_sub_seq
\NewDocumentCommand{\fabianarray}{m}
{
\[
\seq_set_split:Nnn \l_shepi_sub_seq { , } { #1 }
\begin{array}{ *{ \clist_count:n { #1 } } { l } }
\seq_use:Nn \l_shepi_sub_seq { & }
\end{array}
\]
}
\ExplSyntaxOff
\begin{document}
\fabianarray{A, B, C}
\end{document}