TeX Live 的新包管理架构

临近年末,TeX Live 2008 的发行就成为了一个有趣的话题,我们都知道 [TeX Live 2007][] 最大的改进是 [XeTeX][] 的集成,那 TeX Live 2008 呢,会有什么新东西?

[TeX Live 2007]: http://www.tug.org/texlive/
[XeTeX]: http://scripts.sil.org/xetex

[LuaTeX][]? 有可能,LuaTeX 恐怕是今年来在 TeX 引擎开发上的又一创新,不过虽然今年 LuaTeX 的底层代码已经有了很大的完善 (参考[这个](http://www.river-valley.tv/conferences/tex/tug2007/media/Hans_Hagen/)由开发者 Hans Hagen 在 TUG 2007 上的演讲),但上层结构: TeX 的排版格式定义:[Mark IV][] (下一代的 ConTeXt,基于 LuaTeX) 和 LuaTeX 兼容的 LaTeX2e 格式都未趋于稳定。当然,可能 LuaTeX 和相关格式会被包含在 TeX Live 2008 中,但多半会作为试验性特性来介绍。

事实上,自从 TeX Live 2007 发布后,TeX Live 的开发者们就开始讨论如何改进 TeX Live 的包管理架构,因为 TeX Live 无法像 MiKTeX 那样在线更新宏包是最为使用者所诟病的。毫无疑问,我们需要一个更灵活、更方便的包管理架构。今年 10 月的意大利 TUG 的会议 GuIT 2007 上,这个架构的主要开发者 Norbert Preining 就对此作了一个较为详细的介绍: [TeX Live’s New Infrastructure][]

[LuaTeX]: http://www.luatex.org/
[Mark IV]: http://wiki.contextgarden.net/Mark_IV
[TeX Live’s New Infrastructure]: http://www.river-valley.tv/conferences/guit2007/media/Norbert_Preining/

对急于想了解这个新架构大要的朋友,这里是我的一点理解。

在 2007 和以前的 TeX Live 中,使用 TPM 文件来组织软件包,这是一种 XML 格式的文件,有一套 Tpm.pm Perl 模块进行管理,TPM 的主要问题是:

* 混合了机器生成的动态信息和人工写入的静态信息
* 在许多不同的 TPM 中,同一个包的版本、授权和描述多次重复出现,来自不同时间的 TeX Catalogue 数据,因为缺乏及时的维护,导致很多数据事实上是过时的。
* 因为 TeX Live 使用 shell script 来安装软件包,而用 shell 来解析 XML 显然不现实,所以我们还需要从 TPM 文件生成 shell 比较好解析的 lists 文件

所以这套新的底层结构的目的是:

* 分离动态信息与静态信息
* 消除 lists 文件生成的必要
* 能够通过 web 安装单个软件包的更新
* 提供更好的文档组织,吸引更多围绕 TeX Live 的开发

最终的设计是这样的,围绕三种类型的文件进行开发: `tlpsrc`, `tlpobj` 和 `tlpdb`。

`tlpsrc` 是人工编辑的软件包描述文件,有包括 `name` (包名称), `category` (分类), `catalogue` (TeX Catalogue 名), `shortdesc` (短描述), `depend` (包依赖) 等诸项属性,每项都是简单的 UTF-8 文本,通过换行符分隔。

`tlpsrc` 中还通过 pattern 的形式描述安装这个软件包需要执行的操作,pattern 的设计主要为了描述的简洁和跨平台,详细内容可以看[这份文档](http://www.tug.org/svn/texlive/trunk/Master/tlpkg/doc/tlinfra-guit07.pdf)。

以 `latex.tlpsrc` 这个文件为例:

name latex
category Package
srcpattern d texmf-dist/source/latex/base
runpattern d texmf-dist/makeindex/latex
runpattern d texmf-dist/tex/latex/base
docpattern d texmf-dist/doc/latex/base

`tlpobj` 文件则是自动生成的,用于实际安装时的文件清单,类似如下:

name bin-dvipsk
category TLCore
revision 4427
docfiles size = 959434
texmf/doc/dvips/dvips.html

runfiles size=1702468
texmf/dvips/base/color.pro

texmf/scripts/pkfix/pkfix.pl
binfiles arch=i386-solaris size=329700
bin/i386-solaris/afm2tfm
bin/i386-solaris/dvips
bin/i386-solaris/pkfix
binfiles arch=win32 size=161280
bin/win32/afm2tfm.exe
bin/win32/dvips.exe
bin/win32/pkfix.exe

可以看出,这个文件的内容已经按照不同架构、不同类型组织好了,安装程序只需要按类别复制文件就可以了。

而 `tlpdb` 文件则是所有 `tlpobj` 文件的连接。

目前,TeX Live 的这套新结构已经完成了一个 Perl API 的参考实现,它将作为跨平台的 TeX Live 软件包安装程序的基础,但还有许多剩余的工作要做,包括改进效率、转换原来的 ctan 描述为新的 `tlpsrc` 描述,等等,而我目前在开发的是一套 C 的 API,目的是方便其他语言 binding 的开发,统一实现细节,并提供最好的处理性能。

如果你有兴趣,可以参考:

* [如何更新 TeX Live 中的软件包描述](http://www.tug.org/texlive/pkgupdate.html)
* [相关代码和文档](http://www.tug.org/svn/texlive/trunk/Master/tlpkg)
* 我正在开发中的 [C 实现](http://www.tug.org/svn/texlive/trunk/Master/tlpkg/lib/C/)

Author: Jiang Jiang

A software engineer from China, working on some OS for a fruit company. Interested in typography and science fiction.

Leave a Reply

Your email address will not be published. Required fields are marked *