我正在尝试-1, -2
使用 expl3 和 TL 2020 生成一个列表。其想法是转换列表中的每个条目并获得没有尾随分隔符的漂亮列表分隔符。
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\generateList}{m}
{
\clist_set:Nn \l_mylist {#1}
\int_zero:N \l_tmpa_int
\str_clear_new:N \l_tmpa_str
\clist_map_inline:Nn \l_mylist {
\int_incr:N \l_tmpa_int
\str_set:Nn \l_tmpa_str {\clist_item:Nn \l_mylist \l_tmpa_int}
\int_compare:nNnTF { \l_tmpa_int } < { \clist_count:N \l_mylist }
{-\str_use:N \l_tmpa_str,~ }
{\str_use:N \l_tmpa_str}
}
}
\clist_new:N \l_mylist
\ExplSyntaxOff
\begin{document}
\generateList{1, 2}
\end{document}
但这并不奏效,因为我得到
-\clist_item:Nn \l_mylist \l_tmpa_int , \clist_item:Nn \l_mylist \l_tmpa_int
我究竟做错了什么?
答案1
您需要\clist_item:Nn
在设置字符串之前进行扩展,因此使用\str_set:Nx
而不是\str_set:Nn
(“ x
inNx
表示“详尽扩展”):
% expand V
\str_set:Nx \l_tmpa_str { \clist_item:Nn \l_mylist \l_tmpa_int }
但是,expl3
为您提供了使用带分隔符的列表的工具。您可以使用
\clist_use:Nn <clist-var> { <separator> }
但是由于您想修改列表中的项目(添加-
),那么将所有内容变成变量会更容易seq
:
\seq_set_from_clist:Nn \l_mylist_seq {#1}
然后将其添加-
到所有项目:
\seq_set_map:NNn \l_mylist_seq \l_mylist_seq { -##1 }
然后使用带有,~
作为分隔符的序列:
\seq_use:Nn \l_mylist_seq { ,~ }
它将打印:
完整代码如下:
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\seq_new:N \l_mylist_seq
\NewDocumentCommand{\generateList}{m}
{
\seq_set_from_clist:Nn \l_mylist_seq {#1}
\seq_set_map:NNn \l_mylist_seq \l_mylist_seq { -##1 }
\seq_use:Nn \l_mylist_seq { ,~ }
}
\ExplSyntaxOff
\begin{document}
\generateList{1, 2}
\end{document}