如何知道 LaTeX3 中 clist 中元素的数量?

如何知道 LaTeX3 中 clist 中元素的数量?

我在 LaTeX3 文档中找不到任何用于计算 中元素数量的函数clist。因此我编写了自己的代码,但它可能不是最理想的。

还有更好的选择吗?

准确地说,\clist_count:NN在其第一个参数(类型)中存储其第二个参数(a )int的长度clist

\cs_new:Nn \clist_count:NN
{
  \int_set:Nn \l_tmpa_int {0}
  \clist_set_eq:NN \l_tmpa_clist #2
  \bool_until_do:nn 
  {
    \clist_if_empty_p:N \l_tmpa_clist
  }{
    \clist_pop:NN \l_tmpa_clist \l_tmpa_tl
    \int_add:Nn \l_tmpa_int {1}
  }
  \int_set_eq:NN #1 \l_tmpa_int
}

n我还对选择a 的第个元素的函数感兴趣clist

答案1

编辑(作者 Bruno):现在要使用的正确函数是\clist_count:N,它本质上源自下面 Will 的实现。还有一个,\clist_count:n它需要一个明确的逗号分隔列表作为其参数,而不是存储在变量内的列表。这两个函数都扩展为一个明确的整数。


这是一个应该更快的解决方案(尽管我还没有测试过):

\cs_new:Npn \clist_length:N #1 {
  \int_eval:n {
    0 \clist_map_function:NN #1 \tl_elt_count_aux:n
  }
}

这里,\clist_length:N扩展为逗号列表的长度;它是可扩展的,因此\int_set:Nn如果您愿意,可以在里面使用它。

下面是一个可扩展地提取逗号列表的第 n 项的解决方案:

\cs_new:Nn \clist_nth:Nn {
  \int_compare:nTF { \clist_length:N #1 < #2 }
  { \ERROR }
  {
    \exp_after:wN \clist_nth_aux:nn \exp_after:wN {#1} #2
  }
}
\cs_new:Nn \clist_nth_aux:nn {
  \clist_nth_aux_i:nnnw {1}{#2} #1 , \q_recursion_tail \q_recursion_stop
}
\cs_new:Npn \clist_nth_aux_i:nnnw #1#2#3, {
  \quark_if_recursion_tail_stop:n {#3}
  \int_compare:nTF {#1==#2}
  { 
    \use_i_delimit_by_q_recursion_stop:nw {#3}
  }
  {
    \clist_nth_aux_i:fnnw { \int_eval:n {#1+1} } {#2}
  }
}
\cs_generate_variant:Nn \clist_nth_aux_i:nnnw {f}

感谢这些问题;我一直想将它们添加到 l3clist。PS 抱歉回复这么慢!

相关内容