我在 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 抱歉回复这么慢!