LaTeX3——l3seq 和 l3clist 模块之间有什么区别?

LaTeX3——l3seq 和 l3clist 模块之间有什么区别?

LaTeX3 提供了两个模块seqclist

有什么不同?

该模块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。出于所有这些原因,根本不需要使用clists。

事实上,这一点并不那么明显。为了完善约瑟夫的回答,重点在于什么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⟩

相关内容