LaTeX3 提供了两个模块seq
和clist
。
有什么不同?
该模块clist
由
逗号列表包含有序数据,其中项目可以添加到列表的左端或右端。
该模块seq
由
LaTeX3 实现了一种“序列”数据类型,其中包含一个有序的条目列表,其中可能包含任何平衡的文本。
这些模块的优点和缺点是什么?
答案1
这两个模块有很多共同的功能,而且原则上,很多任务都可以用其中任何一个来解决。为了理解这两个模块存在的原因,我首先要强调一下它们seq
能做什么和clist
不能做什么。
逗号分隔的列表类似于
a,b,c,d,,
这意味着最明显的是,项目不能包含逗号(没有括号保护)。另一方面,seq
数据类型的构造使得项目可以包含任何平衡的文本。这不仅包括逗号,还包括至关重要的空条目。
后一点之所以发生,是因为逗号列表本质上是一种“面向用户”的结构,而序列是为程序员设计的。如果您尝试在逗号列表中添加空格,您也会看到这一点:空格会从逗号列表项中被修剪掉,因此类似
a, b , , c , d
处理方式与
a,b,c,d
由于序列具有支持程序员的内部结构,因此与逗号列表相比,还可以对实现进行更多优化。在某些情况下,这会影响性能。
因此,在哪种方式合适方面,我倾向于在处理用户层面的内容时使用逗号列表,例如需要用户输入/输出的地方。另一方面,完全任意的项目列表最好以序列形式处理。中间立场(两种方式都可以)有个人偏好的因素。
过去,我曾建议clist
完全放弃除转换层之外的函数(这样我们就可以拥有一个单一的“真实方法”)。但是,如果基本上所有事情都可以使用逗号列表来处理,那么这会对性能造成影响,这是很难证明的。
答案2
根据interface3.pdf
(texdoc interface3),seq
比 更“安全”、更快,并且提供更多功能clist
。此外,seq
被模块使用regex
。出于所有这些原因,根本不需要使用clist
s。
事实上,这一点并不那么明显。为了完善约瑟夫的回答,重点在于什么seq
能做而什么clist
不能做,下面是相反的。
首先我们有\clist_reverse:n
,我们可以为其生成变体,而只有\seq_reverse:N
。同样,有一个方便的\clist_map_inline:nn
。
最重要的是对论点的管理:
\seq_put_left:Nn ⟨sequence⟩ {⟨item⟩}
\clist_put_left:Nn ⟨comma list⟩ {⟨item1⟩,...,⟨itemn⟩}
clist
允许通过单个指令一次添加多个项目。
clist
可以作为序列项和属性值添加,就像标记列表一样。是否同样可以实现这一点seq
尚不清楚(事实上是可能的,但可能不受支持)
\l_my_clist
是以下的快捷方式\clist_use:Nn \l_my_clist {,}
在l3keys
模块中,tl
使用的变量一般有clist
,例如,
\keys_set_known:nnN {⟨module⟩} {⟨keyval list⟩} ⟨clist var⟩