使用 expl3 生成一个好列表

使用 expl3 生成一个好列表

我正在尝试-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(“ xinNx表示“详尽扩展”):

    %  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}

相关内容