大鹰在邀请我回答这个问题的时候,我正在青海宁夏一带活动,所以没有时间来得及回答。
TeX这个语言的繁琐之处以前也有讲过不少了,和运算型语言比较,宏语言中大有trick可玩,简单的,直接改\catcode,在加上一定量的宏这样可以在TeX中实现Basic或者Lisp的解释器。使用\expandafter以及\let等的trick也有得玩,加上一些数寄存器或者dimen寄存器可以实现一些递归宏。对于这种可以把玩的东西,初学者使用The TeXbook即可,想要cookbook就需要看Victor Eijkhout的这本书:
这个书的时代比较早,最初在TUGboat上连载,基本上把标准的TeX82中的trick都完整覆盖了。下载地址为:VictorEijkhout / TeX by Topic
。当然,Victor Eijkhout还有本叫做The Computer Science of TeX and LaTeX的书,这个适合有一点计算机基础的人阅读(比如懂一点编译原理),可见The Computer Science of TeX and LaTeX
。
上面提到的改catcode的,最简单的最直观的可以参考下面地址:Introduction to Poor Man's Chinese TeX
。即
Poor Man's 中文 TeX 簡介,中央研究院計算中心,ASPAC計畫。我当年看到这个东西的时候,真是笨的要命,一点计算机基础都没有,把这个文章的代码抄下来看了半个月才明白。这种时间可以浪费,但也就适合在大学浪费了。以前的汉字编码都是双字节编码的时代,这种改catcode的方式是最简单也最高效的,但是现在已经不怎么完全适用了,尤其是有了Unicode之后。(顺便发现了我以前写的东西:如何快速查看 LaTeX 的宏命令的实现? - LaTeX)
九十年代的汉字处理,尤其是在DOS系统之下,有着大量的点阵字体处理的场景。无论是poorman方法,CJK方法,CCT方法,中间都绕不过点阵字体。在旧的CCT之中,有个工具是专门来拼点阵生僻字的,上个月我还接触过这一部分的内容,但是这种东西在现在基本上用不到了。这种东西说起来并不长脸,只是那个时代各种匮乏的结果。
还有一个值得提一提的东西是Omega。这个东西给TeX打的补丁的长度几乎是TeX代码本身的长度。Omega本身有着复杂的排版功能,OTP/OCP之类能够使它能够处理很多复杂的语言文本。但是,这东西本身已经过时了,因为它的配置繁琐以至于开发者都是很少的几个人。和其他的引擎不同,比如XeTeX中控制layout engine的东西,文档写的清楚,写宏来控制也不难。Omega的一部分功能,现在在LuaTeX之中还能看见,但是这些功能却也是不痛不痒的。
在绘图技术上,以前有Xy-pic和PSTricks。但是现在基本上是几个独立的绘图语言+TiKZ的天下了。一方面是这些语言以及TiKZ在设计上比较现代,在应用库上也很丰富,加之页面描述语言以及各种驱动宏的开发规模比较大,所以很多老的包都使用的不多了。PSTricks这个东西,就是通过\special中添加PostScript代码,最后在DVI解析的时候,把这部分代码插到PS文件里面,这种东西确实在九十年代比较流行,甚至有个专门处理到PS的引擎VTeX(MicroPress Home Page
)。但是随着2000年以来PDF的流行,PS的使用范围逐渐没落,社区里面的PS处理工具并没有比PDF丰富多少,或多或少都依赖GhostScript,甚至于dvips现在都不支持位图文件的插图。
有个有意思的东西,比如有德国的留学生说过德国现在还有不少人在使用plain TeX,我是不太惊讶的,对于英文等等,其实plain很好用,也有一部分俄罗斯人现在也用plain TeX。在plain TeX下面想要打汉字,除了pTeX系之外,XeTeX和LuaTeX或多或少都可以进行,这都依赖于特定的包和一串特定的宏。我在2012年开始写一些plain格式的小测试文件。自由度是很高的,当然这也仅仅是指语法,想要特定的样式,LaTeX还是方便不少。