「转」我为什么要用$\LaTeX$ ?

2015.12.27 16:07 Sun| 27 visits tex| Text

0. 引言

清楚地记得大二大三的样子,在机房上机,有个数学系的老师狂啃LaTeX,当他打出漂亮的数学公式时的那种狂喜和自我成就感,感觉很不好理解。请记住当时的平台是DOS,WordStar是很高级的文字编辑器,普遍打印机是16针色带。20年后,当我用CTeX漂亮地排出我的博士论文后,我很能够理解那位老师的狂喜了。在我论文的致谢部分,写上了这样一段话:

“谢谢aloft,\CTeX 集成了中文支持,方便可靠。CASthesis宏包也为本文的排版提供了基础。偶然看到2005年NSF(China)榜单,aloft高中,当属水到渠成,可喜可贺。”

事实上,我已经把CASthesis改造成符合我们学校的论文模版,并强迫我的学生都必须使用。

一直以来都在这里潜水,很不好意思。为了表示对aloft的感谢和支持,并祝本论坛兴旺,涂鸦下下面一组文字,希望推广LaTeX这样一个好东西。

基本上计划写下面一些题目:1、所见所得和命令描述文档;2、文档的内容、形式和结构;3、文档的语义;4、Garbage in Garbage Out;5、LaTeX的缺点。

由于点点滴滴利用业余时间来写点感想,所以不承诺任何东西。

1. 所见所得和命令描述文档

通常文档的编辑制作模式有两种:所见所得和命令描述。前者的代表是Word,后者的代表是方正排版、LaTeX等。

要回答为什么要推荐用LaTeX的最简单直接的一个答案是:排版好看的数学公式。当然,Word也能排出一般的数学公式,但是不能排出所有稀奇古怪的数学公式,更不要奢谈好看的数学公式。导致这两者区别的本质原因就是所见所得的编辑模式和命令描述编辑模式的差别。

所见所得的编辑模式最大的好处是:直观和在线实时!但是由此而付出的代价是:用户必须对文档最终效果负一切的责任。由于用户可以随意摆弄出一种文档视觉效果,也就很轻易地能够用不正确的手法做出一个实时的局部满意的文档。但是,从文档的整体上来说,视觉效果就肯定的不一致了。回到排版数学公式这个例子,首先因为数学公式排版是个第三方的插件,它能够让你插入公式到word文档中,但是,不要奢望能够与word文档的其它视觉表现统一起来。即使是M$买下这个插件,成为Word的法律上的一部分,但是由于给了你所见所得的编辑手段,公式的整体表现(例如,大小、风格等)和正文文字的一致协调,这是终端用户的责任!公式每个局部部分的协调(例如,上、下标与主体的大小比例等),这也是用户的责任!Word的fans也许要说了,公式不是有默认的模版吗?当然,你可以使用公式的默认模版。但是,由于你可以随意改变正文的表现形式(例如,字体、版式),所以,默认的公式模版怎么可能与正文协调?这也就是为什么含有公式的word文档总体上视觉效果差的原因:行间稀落难看、字间宽松随性。

反观命令描述文档的编辑模式,首先,由于文档最终的视觉效果是由编译程序“生成”的!所以,文档总体的视觉效果比较容易(注意,是比较容易,而不是一定!)保持一致。各个插件部件之间的默认协调,也很容易一致。当然,用户也要为此付出代价:离线非实时地编辑文档。

小结成一句话,所见所得给了用户最大的最方便的灵活性,所以不正确地使用也就更容易把一个文档搞砸。而LaTeX提升了使用者对灵活性的把握门槛,一般来说,也就比较容易达到预设的专业出版级的效果。随便说一句Word用户不爱听的话,Word的目标是面向自娱自乐的大众用户,不是出版级的专业用户。笔者要郑重申明的是,用户层次的不同,并非代表用户的高低贵贱。

如果非要用一个简单理由来推荐LaTeX而非难Word的话,那也许就是文档的总体协调视觉效果。如果你不关心这一点,或者目标文档本身就不存在这个问题(例如,纯文字的文档),那么Word应该是一个好的选择。

但是,我们还有更深层次的推荐LaTeX的理由,那就是Word通常(注意,是通常,而不是绝对)把文档的内容、形式和结构混为一谈,而LaTeX可以很好地把这三者分开。

2. 文档的内容、形式和结构

传统的文档,是由文字构成。现代化的文档,嵌入了符号、图、表、甚至音、视频等等许多媒体形式。为了容易理解起见,我们暂且先考虑只由文字构成的文档。但是下面的叙述也可以简单推广到其它文档对象。

文档的内容,实际上就是文字字符本身!往往就是指文字的语义(音、形、义)。而每个文字,都有其表现形式,例如,仿宋体、黑体、1号字、6号字等等。文档的结构,就是句、段、节、章、顺序等等关于内容的组织。内容和表现形式应该是可以分离的。同样,文档的结构,也应该是一个独立的属性。(需要说明的是,笔者的观点是,把文档的形式和结构等,都作为内容的扩展来理解。这当然是从研究角度的需求。本文不准备这样采信。)

文档之美,首先在于内容之美。例如,金庸的武侠小说,不管用什么字体、字号,连载还是单行本,其给用户的总体感受,应该没有什么变化。小说想传递给读者的信息,应该是通过内容就能够做到了。当然,结构必须正确。设想把金大侠的小说的章节次序打乱了来看?

文档之美,还可以体现在形式之美上。设想金大侠的小说每一段文字换一种字体或字号试试?形式之美的另外一种体现是:“大道至简”的符号表达!谁也不能否认爱因斯坦相对论的那个代表性公式E=mc^2的美。“大道至简”体现了我们古人微言大义的理念。有时候形式能够达到内容所达不到的效果。例如,现代派的表达“我 恨 透 了 这 厮”确实与“我恨透了这厮”有不一样的效果。这也就是为什么有个诺奖获得者提倡“数学之美”一说。另外一个例子,数学上,不同的形式往往也约定俗成地代表了不同的内容,d表示一般的变量,粗体d就表示向量了。

那为什么说结构也是文档不可缺少的要素呢?我们都有这样的体验,昏昏欲睡地听着领导在大会上做着报告,“.…..下面,我谈第三大点……接下来我来谈谈第(二)点……第3个方面就是要加强对文档的正确理解…….”等等。事实上,如果换成表达“……3.2.3 加强对文档的正确理解”,我们应该很容易知道领导已经开讲第3大点了,而且进入了第2小点的第3个方面。这里,“3.2.3”既是内容,又是形式,同时也体现了结构。但是,其内容随结构变化,如果这之前插入一个方面内容,那么“……3.2.3 加强对文档的正确理解”就应该调整为“……3.2.4 加强对文档的正确理解”;如果这之前插入一小点,那么“……3.2.3 加强对文档的正确理解”就应该调整为“……3.3.3 加强对文档的正确理解”……,以此类推。另外形式上,“3.2.3”也可以成为“三(二)3”。

好了,做了这么多的准备工作,我们回到LaTeX和Word的主题上来。

Word的所见所得把用户宠成了将文档的内容、形式和结构混为一谈。

首先是文档内容和形式的混淆。初级的Word用户是不区分统领标题中的“3.2.3”和正文中的“3.2.3”,他们往往硬打出标题中的“3.2.3”。实际上,正文中的“3.2.3”不管拷贝粘贴到哪里,其意义都是不变的。而标题中的“3.2.3”将随结构变化而变化。在中英混合的文档中,虽然中文是统一的比如说是宋体字,但是,夹杂其中的英文字体,很多情况下是不一致的。由于中文和英文的区别足够地大,所以,这一缺点被掩盖掉了。设想一个等价的纯英文的文档,间或地夹杂着不一种字体,读起来会有什么感受?

其次,忽略对文档结构的应用。有多少Word用户注意到了文档的段落、章、节?他们只是很满足于达到视觉上的段落、章、节效果,而实际上,他们往往都是用“正文”模式通过随心所欲地变换字体、大小来达到结构上的效果。所以,也就不能够很容易让相同的结构保持相同的形式。例如,你可以看到第一点的标题是黑体4号字,到了第四点的标题,就成了加粗的黑体4号字了,因为用户忘记了标题结构的表现形式。

所以,Word允许用户把文档的内容、形式和结构混为一谈。直接的例子是:你能在word文档中找到正文中所有楷体斜体的4号字“我们”,并把它们替换成黑体小4号字“我们”?不能!因为这些形式信息被混在了内容之中了。想要把一个格式文本的内容拷贝到另外一个文档场景下?对不起,请将源格式和文字内容一起拷贝!

我们来看LaTeX的解决方案:用户被迫用plain text文本把文档的内容书写出来,并且有文档结构方面描述手段。文档的表现形式,除了默认地由编译程序处理外,特别的形式效果都必须显式地用命令描述出来。所以,最终的.dvi, .ps, .pdf文档只是用户文档的一种外在表示皮肤,LaTeX源文档才是其内在内容、形式和结构的描述实体。例如,LaTeX源代码\section{文档的内容、形式和结构}中,{}中是文档的内容,其结构信息由命令\section根据上下文确定,并用合适的节的符号带领内容的统一的表示形式,出现在最终文档中。

所以我很反对把word文档通过Adobe的工具直接转换成pdf文件,我把后者称为fake pdf文件,因为这样的pdf文件还不如word文件本身,与把word拍成照片没有什么两样。我有许多次评阅人家的论文,看到那种为满足投递要求而不得不把word转换成pdf的文章,而当这样的文章充斥着大块的符号公式时,我都会对作者提这样的建议:这么好的结果(假定它们都是正确的)为什么不用最好的形式来表达呢?事实上,学习使用LaTeX来表达这样好的结果,并不比做出这些结果困难多少。因为只要花时间,LaTeX总是学得会的,而论文的好结果不一定花时间就出得来的。

不可忽视的一个事实是,实际上Word是提供把内容、形式和结构区分的功能的,只是用户学会了一种抵达目的地的方法后,会认为另外一种更正确的方法太“难”而不去学习使用了,反正我到目的地了。你会发现有许多Word“高级”用户反而把一切自动功能全部取消,所有效果一律硬打出来。事实上,当你发现Word默认的自动功能与你的预期效果不一致时,很多情况下是你正在错误地使用Word。而这时,用户的选择往往是关闭Word的自动功能,而不是debug你文档的写法。

其实,正确地使用所见所得的编辑工具,也可以达到几乎和用命令描述编辑工具一样的效果,但是使用难度增加了:决不会像乱用Word一样“方便”了!就如同使用命令描述编辑工具一样“难学”。呜呼,人之初,性本惰?!

我们留下了一个小小的重要问题:为什么把文档的内容、形式和结构等区分出来是有价值的并值得推荐和鼓励的?

3. 文档的语义

最早接触语义文档的概念是1999年www8年会上,Tim Berners-Lee的大会主题报告中,提出要推广semantic web的概念。事实上,我们在浏览器中所看到的是一个超媒体文档,所以谈语义web,也就基本上在谈语义文档。

传统的文档是面用读者用户的,计算机在这个过程中只是起到了存储(store)、传递(communicate)和渲染(render)的作用,机器本身不能理解(understand)文档内容。是文档的读者在理解文档的信息。语义web是希望web也能够理解其负载的文档含义,这样就可以帮助用户预处理一些事情,从而更好地为web用户服务。一个简单的例子就是网络文档的查询:你希望查到“高兴”的文学表达。显然只用关键字“高兴”来检索达不到目的。因为有的文学作品通篇整段都没有“高兴”两个字,但是,却表达了无比高兴的情景(目前再高级的搜索引擎也做不到)。再比如,如何在网上查一查这个方程$x^n+y^n=z^n$的整数解?

实际上,上一节谈到的文档的内容、形式和结构等,都属于文档物理层面的组成部件,是文档生产者描写文档的手段。这里提出的文档的语义,属于文档消费者理解的逻辑层面的含义,是文档用途的真实体现。

目前解决语义文档需求的可行方案,就是让文档的作者标注文档的语义。那么,什么是文档的语义?实际上,文档的内容、形式、结构等,就是最基本的文档语义。XML就是热门的描述文档语义的工具。其实,LaTeX老早就已经是一个应用广泛的文档语义描述工具了。当html世界叫着要把内容和形式分离的时候,LaTeX文档已经早早地做到并应用得如此娴熟了。

在我的博士论文的致谢中,有下面一段话:(下面是LaTeX源文件,有语义的噢:-)

谢谢D. E. Knuth的~\TeX~的发明,大师随意一出手的小发明,让人只有敬仰的份。

本文用~\LaTeX~排版,一点也不感觉枯燥,相反乐在其中,真正体会到了数学之美、逻辑之美。

曾经有一个阶段在研究语义文件系统,苦苦思索语义文档的属性,

并坚持认为文档的结构是实现语义文档的重要属性之一。

看看~\TeX~文档,是多么漂亮的结构文档。

所以,如果只把~\TeX~作为排版工具,那太暴殄天物了

\footnote{当你辛苦地为《自动化学报》用~\LaTeX~排清样,你就会体会到这一点。}。

~\TeX~是表达文档逻辑的“程序语言”,它是文档语义的一种良好载体

\footnote{好像目前还没有用得如此普遍的支持如此丰富语义的描述载体了。

象我辈有了~XML~的底子,再回到~\TeX~的阵营,觉得很容易接受~\TeX~的理念。

但是,早在上世纪八十年代就接受了~\TeX~后,再接触九十年代后期抬头的~XML,

就会觉得~XML~是多么的小菜一碟了。}!

下面我来解释上面话中的两个脚注的含义。

首先是第二个脚注的解释:XML的思想很早在SGML中体现了,但是真正落实SGML思想并得到广泛应用的却是XML的功劳,那也是90年代后期的事情了。当时我在第一时间就跟踪了这项技术,并且应用得很acknowledge它的学术价值。到了00年后我学习使用LaTeX,竟然发现其实这两者之间是如此相同,所以不费吹灰之力就学会了LaTeX。于是反过来想,如果我在80年代后期就学会了LaTeX后,再来学习使用90年代后期推广的“新”技术XML,就不会有对XML的膜拜之情了。

接着是第一个脚注的由来:《自动化学报》的cct论文模版中要求把[8]号参考文献标引在字符的右上角,你猜如何完成?模版要求用$^{^{_{[8]}}}$实现。你说我该哭还是笑?这跟在Word中一切视觉效果全部通过硬打来实现没有什么两样。

我们国内计算机学科的三大中文杂志,《计算机学报》、《软件学报》和《计算机研究与发展》到现在也没有LaTeX的模版,天晓得最后发布的.pdf是怎么来的。就算是国内最顶尖的计算机杂志JCST杂志倒是提供了LaTeX模版,但是,且看该模版对节的处理:

\section*{\normalsize\bf1\quad Introduction}!

再看它怎么教你排参考文献:

\section*{\normalsize\bf References}

\vspace*{-2mm}

\quad\ \footnotesize

\small %The references should be listed at the end of the manuscript

%and numbered in the order they are referred to in the text.

\REF{[1]} Author1, Author2, Author3. Title of journal paper. {\it

Journal Name}, Vol-number(Issue-number): first-page--last-page.

不让人笑掉大牙才怪。(你不觉得好笑?那么就表示对我前面那些说教没有真正理解。我很失望:-)JCST网站常把Knuth写来的表扬信挂在网站上,不知道Knuth知道了他们这么使用TeX,会不会写批评信。(出现这种现象,不能都怪编辑。只有作者才对自己文章的语义最为清楚。换位一下,你作者自己都不把文档的语义描述清楚,我小小编辑又该负多大责任来理解并标注你的文档?这也催生了一批研究语义挖掘的研究者:-)我没有去看发布在本站上运筹学会论文的LaTeX宏包,因为我不会去投稿。但是如果aloft是那个包的始作俑者的话,绝对不会闹出上面笑话。

其实很少有人理解ASCII码(以及后继扩展)的重大作用:其一是国际标准,大家都遵守并不感到被强迫;其二是交换码用途,作为对一种信息描述的中间体!设想一个没有ASCII码的计算机世界,信息安全和保密问题,应该是迎刃而解,或者这个问题根本就不存在了!如果把ASCII码字符和文本这两个对象的粒度同步放大,那么,LaTeX协议就可以是ASCII码,LaTeX源文件就是具有语义文本。可惜LaTeX不是国际标准,目前只是个行业标准。上文提到的例子,“如何在网上查一查这个方程$x^n+y^n=z^n$的整数解?”,在LaTeX+web的世界中,也许就能够做到。所以,Tim选准semantic web的方向是有远见的。将近10年过去了,semantic web成果几何?只要看看LaTeX已经诞生几年了?!任重而道远啊!

其实,公平地说,Word也是能够做出和LaTeX一样视觉效果的文档,只是其麻烦程度可能不比反过来做好多少。我就曾经拿了三角尺用Word排出许多格式目标文档,然后用激光打印机套打在预制的表格上,把激光打印机当作传统的打字机一样用。但是,如果从语义文档的要求来看,Word就远不如LaTeX了,除非M$公布其Office格式协议,并且作为编辑工具,Word需要强制用户养成某些正确的使用习惯。但是,Wintel不就是要鼓励用户的坏习惯吗?否则他们就不能赚钱了。在商言商,可以理解。但是,明智的用户不应该照单全收。

4. Garbage in Garbage out

如果承认了文档有语义,也就承认了文档是可交互的活动体。以前文档的交互对象是人,而从现在开始,我们力图要让文档能够与机器交互。所以把含有语义的文档看作是一个程序,也不是太异想天开。于是,用LaTeX编写文档,就好比用一种程序设计语言在编写程序!既然是编写程序,那也就有正确的编写方法和错误的编写方法之分,不能只看程序的运行结果对就可以了。比如,你要编写两个数x和y相加的程序,你写下表达式(x+a)+(y-a)。程序的最终结果似乎是对的,但是,你的程序却是百分之百地错了!

LaTeX只是一个工具,不要因为这个工具能够做出好东西,就认为任何使用这个工具的人都能做出好东西。同样反过来说,不能因为Word的用户大多做不出好东西而认为Word不是一个好工具(大部分外文科技杂志和顶级学术会议逐渐提供并支持word文档了,并非清一色只要LaTeX文档)。关键还是看工具的使用者对工具的掌握理解和应用。这就是Garbage in Garbage out的含义。如果Garbage in Treasure out,那么这个工具了得!如果Treasure in Garbage out,那么砸烂那个工具。理想状态是Treasure in Treasure out,LaTeX用户应该向这个方向努力。

如果我们把用LaTeX编写文档当作写程序,那么,这个最终程序的对错,不仅取决于这个程序的最终体现结果(当然,首先要通过编译这一关。),还取决于程序代码是否有逻辑错误。所以,不正确的逻辑,即使出来视觉上正确的结果,也是相当危险的,应该纠正的。

使用LaTeX最容易犯的错误之一是:应该间接引用的地方却偷懒成直接引用。例如,所有\caption会产生图号、表号等等从属于上层环境的编号,如果在正文中需要引用,那么,就应该在\caption的下一行用\label来定义一个标签,在需要引用处,再用\ref来引用,哪怕这里产生的编号只有1和2之类很小,hardcode起来负担也不大。

不正确地使用LaTeX(包括Word)的用户,往往认为反正就那么一次引用,文档也是一次性的用途,所以,即使hardcode也无所谓。持有这种侥幸心理的用户往往认为,他们这些文档只是一次性的使用,将来不会被复用。但是,设想这样hardcode的LaTeX代码将来某个时候会被挪到另外一个文档环境中,或者编号换一种形式表示?

再如,参考文献的引用和本身的表示形式。正确的LaTeX手法是用\cite来引用,用bibtex记录描写完整的参考文献条目内容(注意:这里完全不涉及参考文献的表现形式)。这样积累起来的bib文件就是treasure。我因为做博士论文而化时间整理了bib文件,到现在积累了几百条记录,以后写其它的相关文档,引用这些文献绝对是效率很高的过程。

小结下来,LaTeX用户不能仅仅因为使用了LaTeX而沾沾自喜、高人一等,关键是要正确使用(包括LaTeX的适用场合),否则,你的LaTeX文档就成了garbage天书了。

5. LaTeX的缺点

从文档编制的实用角度,LaTeX解决方案最令人诟病之一,也许是图表制作问题。

首先说图的问题。虽然LaTeX层面提供了MetaPost之类的图制作解决方案,但是,如果说,在字符层面上,用命令描述的方式制作文档,普通用户还能够接受的话,那么,在图这个层面,仍然要求用命令描述的方式,显然对用户的要求稍高了点。所以,一般都采用第三方的所见所得的制图工具,然后转换成LaTeX能够接受的图格式。在转换过程中,需要注意的是,在LaTeX中插入的图,最好应该是ps,eps之类的描述图,而不是位图。所以,用所见所得的制图工具转换时,尽量转成ps或eps图。更进一步地,需要确认这些目标图是可以伸缩的描述图(在制图的世界中,这称为矢量图或向量图)。

其次是关于表的问题。其实中国人特别偏爱表格,而且使用上登峰造极,例如表中套表。在这方面,Word的表工具功能无与伦比。所以,我的解决方案是在Word中做表格,然后,用word2tex转换成LaTeX源代码,再在WinEdt中修修补补。不过我的原则是,尽量用简单的表结构,甚至多用几张简单表,来表达嵌套表的效果。

接下来一个我个人认为LaTeX世界的小缺点是,默认的版心太小,enumerate和itemize环境的item之间行距太大。虽然LShort说,这种版式设置符合印刷业和读者的审美习惯,但是,一般用户打印文稿毕竟不是每次都是印刷用途,而且从环保和节约型社会的要求来说,象Word那样顶天立地的版式也被用户所接受了。虽然对LaTeX来说这不是问题,可以通过导言部分重新设置版式。但是,我就很懒得在每个文件开始都插上一大段代码。建议CTeX的后继版本放大ctex宏包的默认版式。

最后一个我认为LaTeX的小问题是,浮动体漂移得太厉害。也许是由于版心太小的缘故,像图表之类的浮动体,漂移得你几乎失控。正是由于图表之类的文档对象不能在LaTeX下有实时在线编辑的效果,所以,对浮动体漂移控制更加费时费力。

后记

关于我所理解的为什么要推荐用LaTeX的随笔,就此告一段落。

看了有网友的回帖,提到文科学生用Word就够了。其实我这里贯穿始终的理念,是想提倡语义文档,而不是制作文档的工具。Word同样可以做到语义文档的某些需求,只是用户不那样做而已。

在工程和科学领域中,文档就尽量应该用语义标注。但是在人文领域,也许就不一定了。如果曹雪芹把《红楼梦》都标注了,就没有红学家了,也就没有100种红楼梦的读法了。