Archive for the ‘TeX’ Category.
27th November 2007, 01:24 pm
近来在水木上讨论文档标记语言的优劣,想起前些天查资料时正好又碰到了一个熟悉的名字: Scribe,于是多花了一点时间查找,没想到找到的资料仍然非常稀少。
Scribe,是 Brian Reid 在 Carnegie Mellon 的 Ph.D Thesis,也是对文档格式研究中所绕不开的一个重要的名字 (另一个,当然是 Don Knuth 的 TeX),这个项目大概在 1976 年开始,1980 年 Reid 发表这篇 Scribe: A Document Specification Language and its Compiler 以后,就甚少有什么改进了,尽管 Reid 的论文中也研究了 Knuth 的工作,但可以认为 Scribe 和 TeX 是同时代的作品。从对后续文档格式的影响说,Scribe 还更大一点,我们熟悉的 SGML (XML 的前身),BibTeX 都受了 Scribe 的影响。在 1982 年,Reid 还因为这一贡献 (Ground-breaking text-formatting language.) 获得了 Grace Hopper Medal。
可是 Scribe 在应用上的成就却远远地被 TeX 所抛离,TeX 的生命力,被证明持久至今,而 Scribe 现在却在网上连一个正式的文档格式规范都找不到,一篇超过两页的详细描述都找不到!这是为什么呢?从 wikipedia 的文章中我们或许可以猜到一些隐情。
与 Knuth 慷慨地将 TeX 放入 public domain 不一样,1979 年 Reid 就把 Scribe 卖给了一个叫做 Unilogic 的公司,后来这个公司还持续和 Carnegie Mellon 大学就 Scribe 的知识产权问题扯皮,直到 CMU 放弃。最愚蠢的还不在这里,Scribe 居然在免费提供的 Scribe 程序中安插了后来被称为“time bomb”的东西,也就是说,90 天后如果用户不购买,这个软件就会执行自毁程序。
从 Scribe 如此猥琐的历史看,这个软件、这套格式最终为大众所抛弃,实在一点也不奇怪。
21st November 2007, 06:32 pm
临近年末,TeX Live 2008 的发行就成为了一个有趣的话题,我们都知道 TeX Live 2007 最大的改进是 XeTeX 的集成,那 TeX Live 2008 呢,会有什么新东西?
LuaTeX? 有可能,LuaTeX 恐怕是今年来在 TeX 引擎开发上的又一创新,不过虽然今年 LuaTeX 的底层代码已经有了很大的完善 (参考这个由开发者 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
对急于想了解这个新架构大要的朋友,这里是我的一点理解。
在 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 的设计主要为了描述的简洁和跨平台,详细内容可以看这份文档。
以 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 的开发,统一实现细节,并提供最好的处理性能。
如果你有兴趣,可以参考:
6th November 2007, 03:06 am