@@
当引入内部宏的 l3doc 名称间距约定时,LaTeX 3 团队中的老前辈肯定会感到怀念。
但至少现在我们有一个合理的命名间距方案,这离封装包代码更近了一步。我个人认为这是 LaTeX 3 中实现的最伟大的想法之一。
有些语言(例如 Go)基于目录的命名空间,例如,
package main
import "fmt"
import "golang-book/chapter11/math"
func main() {
xs := []float64{1,2,3,4}
avg := math.Average(xs)
fmt.Println(avg)
}
两个小的修改l3docstrip
,l3doc
可以很容易地从\jobname
\edef\replaceModuleInLine{%
\noexpand\replaceAllIn\noexpand\inLine{@@@@}{\string aa}%
\noexpand\replaceAllIn\noexpand\inLine{__@@}{__\jobname}%
\noexpand\replaceAllIn\noexpand\inLine{_@@}{__\jobname)%
\noexpand\replaceAllIn\noexpand\inLine{!@@}{\jobname}%
\noexpand\replaceAllIn\noexpand\inLine{@@}{__\jobname}%
\noexpand\replaceAllIn\noexpand\inLine{\string aa}{@@}%
}%
类似地,l3doc 中的代码可以更改为:
\tl_replace_all:Nnn #1 { _ _ @ @ } { _ _ \jobname }
这个!@@
构造是一个 hack,能够说明:
!@@_do_something:n
并得到:
\modulename_do_something:n
对于人们可能想要在编程 API 中导出的函数(例如 l3 \keys_define:nn
)。
在实际的包中,不需要守卫,而只需要在可能想要跳过名称空间的地方进行<@@=module>
守卫。<@@=>
现在我们拥有了大多数可以扩展这一想法的工具\RequirePackage
,\usepackage
如果有人想采用类似于 Golang 的基于路径的方案,那么这个想法就可以轻松扩展。这还有一个好处,即一个目录中的所有包都喜欢l3draw
命名空间中具有相同前缀的所有文件。
您认为这是一个好主意吗?它会破坏什么?如何改进?