为什么选择狮子呢?Yannis Haralambous写道(原文法语,此为转译后的英文):Not for nothing is TeX represented by a lion. Donald Knuth has told us that lions are to him the guardians of libraries in the United States because there is a statue of a lion in front of the entrance of each large library there. Guardian of libraries, guardian of the Book—is that not indeed what TeX ultimately aspires to be? 或许吧。
(顺便说一句,TeX和MetaFont都用了狮子,TeX是公狮子,MetaFont是母狮子,多么和谐的一对啊。如果你还是忽略MetaFont的存在,那你还没有认识到它的重要性。) 作为插图,首要的一点就是贴切,然后是有趣。在TeX社区里面,have fun是一个很重要的词组,也有人说Happy TeXing。我知道有不少人不喜欢TeX,但是能有什么理由呢?如果你用不到它,那么浅尝辄止即可。如果你会用到很频繁,最好慢慢修炼做到精通。如果你只是偶尔用到,那么可以搬个模版什么的,甚至也可以找人帮你(不要指望别人会用足够的空闲时间来帮你,他没有这个义务,请支付报酬,最少也得请吃个红烧肉吧)。下面的插图,是TeX TeXbook中的,我也希望这个新年的假期,能有人有空来看看这本书。即使不能把所有的东西都看懂,那么也会对TeX的设计有了一定的了解,拿到扳手就好。
先来看看题图好了(我不做解释了):
第一章:The Name of the Game。这一章呢,解释了TeX的名字来源,包括拼法。
第二章:Book Printing versus Ordinary Typing。这一章介绍了输入和输出的区别。比如,我们在TeX中输入--和---是会得到不同的结果的(这个其实是被输出作ligature了)。
第三章:Controlling TeX。这一章,讲的是control sequence的概念,如本章的题目,就是控制TeX行为的东西。一般来说,control sequence是以“\”开头的,有一部分是属于primitive类别,相当于其他语言里面的关键字,而另一部分是macro,基于primitive的。
第四章:Fonts of Type。The TeXbook主要是讲plain TeX的,这一章讲到了一系列在TeX中用到的字体。顺便提一句,本章例子中的cmr10和cmr5,是Computer Modern Roman字体的两种尺寸,分别为10pt和5pt设计(这叫做optical size)。
第五章:Grouping。这个group呢,就是一对{},当然,如果你愿意也可以换成别的符号。这个在其他的语言里面就是语句块啊。{}的作用就是作用就是在不影响全局的前提下,改变某个局部的效果。
第六章:Running TeX。这一章是讲怎么运行的。对于我这种开个cmd或者terminal的人,似乎没什么难度,但很对于那些被IDE惯坏了的人,似乎真是很疑惑呢。红烧肉虽好,但吃腻了,换口腌芥菜也是个不错的选择啊,还有点美味呢。TeXLive里面大多程序都是cli程序,基于命令行的,提供GUI的很少,在某种程度上也没有必要。当然,有提供GUI的TeX(没错,是一个TeX),就是TrueTeX,这个实现就是提供了一个GUI的,但是只是加了按钮,让你选择文件来生成DVI或者fmt的。Knuth的TeX使用Pascal写的,现在能完全编译过去这个代码的Pascal代码的编译器几乎没有,包括Free Pascal,那个能编译过去的Pascal编译器,还在PDP-7上。现在的TeX是使用web2c来完成代码转换的(由Pascal转C),比如今年Knuth发布新版本的TeX的时候,用了两个版本的TeX,头一版本是使用来测试兼容性的,用的是Debian源里面的TeX,后一个版本是新版本的TeX,用web2c编译过去的。在最原始的TeX实现中,可以以&为命令行参数载入fmt文件,这个在一些早期的TeXLive版本(即teTeX)是可以的,但是现在的TeX是按照你输入的命令来调用格式的,比如你输入pdflatex,就会运行pdftex,而载入pdflatex.fmt。以&为参数的实现,目前还有一个,就是我维护的Y&Y TeX,不过对于Windows NT,&在命令行参数上是有另外的意义的,所以新加了一个+的替代,也就是说用tex +latex就能载入latex.fmt。
第七章:How TeX Reads What You Type。这一章讲了catcode。什么是catcode?TeX是把你输入的字符分为几大类的,每一类代表一个特定含义。如果你改变了\catcode,那么就会影响到以后读取文本,进行解析的处理。如果想恢复常态,就必须再把\catcode改回来。\catcode是TeX里面最“黑暗”的内容,因为对于没心思读The TeXbook的人来说,这玩意完全是黑魔法。TeX分了16类,但是pTeX又扩展了三个类别,请先弄懂这16个。
第八章:The Characters You Type。这里讲到了的character,其实是映射到字体里面某个编号的glyph的。请注意本章中的^^ff这种用法,这对于你读某些代码会很有帮助。当然,本章,也有一些\catcode的联系。have 饭,不对,have fun。
第九章:TeX's Roman Fonts。这一章说的是TeX里面的Computer Modern字体。当然这个系列的字体太多了,很多语言学家做一些特殊字符,都是基于Computer Modern的,最典型的时东京大的福井玲的TIPA包。在你使用XeTeX或者LuaTeX的时候,尤其是使用fontspec包的时候,会切换成Latin Modern,这也是CM字体的扩展。注意,Erdős的ő是{\H o},我总是碰见很多人莫名其妙地打错成{\"o},你们有意思嘛?
第十章:Dimensions。这一章讲的是TeX里面的各种长度单位。即使你对这章没兴趣,但是你必须知道TeX的内部长度单位是scaled point,这个单位的选择是跟TeX内部运算有关,TeX内部是没有浮点数运算的,因为在80年的早期,浮点数运算的实现还有着各种各样的实现,多于依赖于操作系统,Knuth比较注意移植性,所以自己设计了一套fixed-point arithmetic的函数(部分内容,请参考TAOCP第二卷,MetaFont中的随机数/乱数算法也是不依赖于系统的)。
第十一章:Boxes。这一章谈到的叫做盒子,而方正的手册里面也有盒子的概念,而TeX的出现早于方正的东西,我感到很疑惑(你看,方正书版里面也是用一对$输入数学公式的嘛)。盒子是TeX的断行算法中很重要的一个概念,它肯定是一个容器啊。TeX不关心你的盒子里面放的是什么,你放一个巴甫洛夫的狗都没问题,TeX只关心盒子的高度/宽度/深度,这个直接影响到断行时的运算。盒子里面也可以套盒子的,像俄罗斯套娃那样。
第十二章:Glue。这个也是断行算法的核心概念之一。Glue会让人很迷惑,为甚么需要这个东西?你想想,词与词之间该放入什么啊?“空格”。你要真这么回答,我就糊你一脸。你可能用惯了文本处理器或者Word这类的东西,分隔词,肯定是空格,在TeX中输入的时候也是空格。但是TeX在内部处理的时候,是会将空格处理成一个glue,别问我怎么转换的,请回头复习\catcode的编号为10的类。Glue,其实也可以叫做spring(弹簧,不是春天!),它由三个部分构成,第一个参数是宽度,第二个是伸展宽度,第三个是收缩宽度,这几个参数可正可负。有两个无限长的宽度fil和fill,这两个无限的效果不同,怎么理解呢?(实数集和无理数集,都是无限的,区别在哪里?)这一章该注意\nonfrenchspacing和\frenchspacin的区别。
第十三章:Modes。这里将到的是模式,你可以这样理解,这几种模式,是编译过程中要判断的东西,比如:是要断行了,是要分页了,是要输出数学公式了?
第十四章:How TeX Breaks Paragraphs into Lines。这一章当然不会告诉你断行算法到底是怎么实现的,只是告诉你怎么做可以影响到断行。注意\discretionary的用法。
第十五章:How TeX Makes Lines into Pages。这一章是解决分页的问题的。其实和上一章一样,你可以用一些primitive开启调试或者tracing模式,这样能够更好看出问题在哪里。分页算法呢,我以前说过,还有足够的改进余地,在我的TeX里面,是有这个计划的,如果谁能提供捐赠,请联系我。分页算法之所以重要,是因为这关系到浮动体的插入位置的,按照阅读一本书/一篇论文的顺序,图片的位置不能够影响到文本的阅读顺序,比如要参考19号图,不能往前翻十几页才能找到。TeX当前的分页算法只能说不错,但说不上最佳,所以LaTeX社区一直希望改进分页算法(但是以前没人做,我正在做)。分页这一章讲到了一些操作盒子的primitive,这个有必要好好看看的。
第十六章:Typing Math Formulas。这一章的例子,必须背下来。来说说插图,数学的排版,最麻烦的就是公式的处理,对于传统的铅印术,要靠一整套的铅空来控制公式的位置,所以在以前,很多排字工最抱怨的还是公式的处理,而且,排铅字还得反着来,如果你觉得不难,那你可以试试。TeX在输出公式的时候,要使用的参数非常多,这些参数都是放在TFM文件里面的,这些参数的作用,比如,我们输出一个积分号,要有上标和下标,下标要向左移动一定的距离,这就需要读取TFM中的参数(在支持Unicode Math的数学字体里面,有一个math表,也有类似的参数)。此外,和\catcode类似,TeX也把数学模式下的各种字符分了一下类,请看下一章。
第十七章:More about Math。这里讲的当然是进阶内容了。首先介绍的是数学模式下的四大style(其实是四种字体尺寸),这数学字体的尺寸是不太好容易变的,所以如果你不太了解这部分内容,那么最好别瞎改尺寸。这一章的习题最好全做全会,背下来,比如习题17.9,九阴真经不理解,你可以背下来慢慢琢磨啊。这里面有13类atom,也就是数学公式元素的13大类,你看分类是个好办法啊。
第十八章:Fine Points of Mathematics Typing。这一章的阅读方法:背下来。
第十九章:Displayed Equations。这一章讲的是独显公式(没有集显啊,管我要也没有),为什么翻译成独显,那是因为这种公式是单独一行,穿插于段之间的。也有翻译成特显的,爱咋咋地吧。这类公式有一个比较实际的问题,就是长公式的断行,这几乎都是手动断开的,断开的门道,尤其是在operator附近,是有一些区别的,以欧美为一派,以前苏联为一派,你看看19.17这习题后,思考一下。
第二十章:Definitions (also called Macros)。这一章是触及到宏编程的地方了。我必须为宏编程说几句,宏语言相对于其他类型的语言比较难学,但是结构简单,不需要函数,也不需要类。凡是需要剪刀的地方,没必要用电锯。如果还有什么人在抱怨,那就让他们去抱怨吧,抱怨造可造不出几万行parser的代码。定义宏,有全局的,有局部的。很重要的一个概念就是token的展开,token是什么,你可以随便找本书了解一下就好,TeX对于这种展开有着不同的策略,比如我们定义一个宏,定义了,但没有使用,我们就没法知道这个宏里面是不是有错误,那么我们就需要在定义的时候,就让宏里面的token展开,还比如,我们在群组里面顶一个一个宏,但是我们想在这个群组后还继续使用这个宏,那就需要进行全局的定义。是不是有点晕了,那还不去看书!
第二十一章:Making Boxes。这一章首先要注意到的时\hrule这个东西,这个东西啊,算是TeX里面的唯一画图功能了,我们在书写某些证明的时候,不是需要有证毕的符号嘛?有些包用了特定字体来实现,而有时候,就是用一个\hrule来实现的。有人说不对啊,他是画线得到,那好,请你画一个长高均为一厘米的线,谢谢。这一章,另一个需要注意的东西叫做leader,这个东西通常用来做引线,无论是线状的,还是点状的,都是用这个来实现的。
第二十二章:Alignment。这一章讲的其实是做表格,在LaTeX中,你可能看到过相当多的包用来做表格,但是归根到底,都是要靠底层的一些东西来实现的,这一章介绍的就是底层的表格是怎么做出来的。如果你是开发者,做表格的代码,是TeX源码里面最难理解的部分。如果你想做个特殊的矩阵,你也得需要对齐的功能,这一章要好好看啊。
第二十三章:Output Routines。这章的插图啊,使我觉得最妖娆的一张。TeX输出到页面的时候要做一定的处理,要通过\shipout来实现。最基本的处理,那就是在一个页面上插入页眉和页脚,一般都会把这两个部分放到两个盒子里面,在输出的时候,把这两个盒子插到每个页面中。这一章中,值得注意的代码是什么呢?附录中有一段排双栏的代码,就需要这一章的知识。
第二十四章:Summary of Vertical Mode。这是对该模式下的总结。
第二十五章:Summary of Horizontal Mode。这是对该模式下的总结。
第二十六章:Summary of Math Mode。这一章背下来。
第二十七章:Recovery from Errors。这一章是讲报错的,说起来,很算比较人道的报错,信息很全,这一章,在运行TeX的时候必须要有一定的了解的,因为TeX的报错信息,基本上除了告诉你那里错了之外,还会让你去看The TeXbook,别偷懒。剩下的部分啊,是附录,很难翻译成汉语,看下图,你们感受下:这是应该是本文的结尾了,如果你能在8小时(一个工作日内)能读完这本书,并能做出30到习题,那应该一周就能写点包传到CTAN上去了。
最后,Happy TeXing!
发表评论 取消回复