为什么要用 LaTeX - CTeX 老贴

发布于 2022-11-20 10:36:11
CTeX 论坛关闭很久了,论坛里有很多经典文章,大家看不到了。我从 aloft 拿到了 CTeX 论坛的帖子全数据库。后面我慢慢整理好的文章分享给各位。

这是一个很多人点赞的文章,时间在 2007 年。作者:lenny

内容有点长,希望你有耐心看完。注意有些知识不一定适合现在了,注意甄别。我加了些点评,希望对大家有用。

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 的缺点。

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

点评: CASthesis 是当年复用率很高的学位论文模板,现在已经有替代的模板了,看看这里:https://github.com/mohuangrui/ucasthesis

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

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

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

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

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

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

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

但是,我们还有更深层次的推荐 LaTeX 的理由,那就是 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 种红楼梦的读法了。

0 条评论

发布
问题