我有一个不断增长的序言,它包含\su
如下\so
命令s特别你一元化和s特别o正交群代数,只是\mathfrak{SU}
。后来我想用这个soul
包删除一些文字。它的命令\so
是s三轮车out。这两个缩写确实有意义,当我尝试 lo load 时soul
,当然出现了错误。
在编程语言中通常有命名空间(Python,C ++),但我的命令必须更长并且输入起来很麻烦。
还有其他方法可以预先防止这种情况发生吗?或者这是 LaTeX 的一个根本困难?
答案1
对于内部包名,许多包都有一个伪命名空间方案,即在命令前加上一个(希望)唯一的前缀,因此longtable
内部包名都是\LT@...
,tabularx
内部包名都是\TX@...
对于使用expl3
约定的包,内部前缀更加正式,并且有一个前缀名称寄存器以避免冲突。
https://github.com/latex3/latex3/blob/master/l3kernel/l3prefixes.csv
在顶层,您可以这样做(不使用非字母分隔符),例如longtable
有一些长度\LT
以不带字母分隔符开头@
\LTpre
,但大多数情况下,您只是不这样做并“抓取”一些有用的简短名称。
通常顶级命令较少,而且更容易为它们添加别名:如果两个包定义,\foo
通常(并非总是:-)使用类似的东西就足够了
\usepackage{pkga}
\let\fooa\foo
\let\foo\undefined
\usepackage{pkgb}
\let\foob\foo
这样,您就可以同时使用这两种功能,但名称为\fooa
和\foob
。
再次,底层编程模型expl3
试图将其形式化,其思想是,您使用前缀名称和expl3
语法约定编写您的功能,但随后可以使用调用底层代码来定义一个或多个顶级用户界面命令xparse
,因此如果您需要不同的名称,您最多必须更改声明xparse
,所有主要功能都应该在唯一前缀的包代码中。