ConTeXt中文TTF字体安装
一份ConTeXt文档模板

TeX是什么?

LiYanrui posted @ 2007年12月19日 06:44 in ConTeXt之旅 with tags tex , 19889 阅读

本文主要翻译Hans Hagen先生所写的一篇文章What is TeX?。因为我的英文水平有限,翻译得并不是很准确,见谅,敬请路过的兄弟指出其中谬误之处,以防误导他人。

怎么有那么多的TeX?

与TeX相关的名词太多了,比如LaTeX、ConTeXt、PDFTeX、XeTeX、LuaTeX等,它们经常也被称为TeX。所以让初学者很为此困惑,怎么会有那么多的TeX?这种困惑对于初学者而言相当普遍,他们不知道PDFTeX(一个程序)与PDFLaTeX(一个宏包)的区别。

另外一种困惑就是TeX即可以对是一种排版标记语言的称呼,也可以这种排版标记语言的解释器/排版系统。TeX的开发者Knuth在其“The TeXBook”一书中对二者皆有讲解,此外还讲解了基于它们而实现的plain TeX格式。

国内许多中文TeX用户,他们在自己的Windows机器上安装了CTeX,不幸的是,这个TeX发行套件中默认是安装一个叫做WinEdt的文本编辑器,便有许多人也把这个东西当作是TeX了。我们在论坛中经常看到诸如“我的TeX出了xxxx问题了”一类的求助帖,实际上只是WinEdt出了问题。这就像一些在Windows下学习程序设计的初学者,他们经常颇为自信地认为Visual C++就是是C++。

在开始学习TeX之时,我们应当花一点点时间搞清楚下面这些概念:

  • 语言:一些基本的排版标记(命令),它们可以组合为宏标记(命令)。
  • 引擎:排版标记的解释器,可以将使用“语言”所写的文档处理输出为印刷文档或屏幕阅读文档。
  • 宏包:基于语言而实现的宏标记的集合。

将上述概念对应于具体的TeX术语,如下:

  • 语言:TeX排版标记,还有一些特殊的扩展标记,如eTeX标记。
  • 引擎:TeX(最早的TeX解释器)、PDFTeX、XeTeX、LuaTeX等。
  • 宏包:plain TeX、AMS-TeX、LaTeX、LAMS-TeX、ConTeXt等。

LaTeX用户可以使用以下命令来调用TeX引擎:

  • latex:可以调用TeX引擎(TeX、PDFTeX、XeTeX等)来处理使用LaTeX宏包所写的源文档。
  • pdflatex:调用PDFTeX引擎处理使用LaTeX宏包所写的源文档。
  • xelatex:调用XeTeX引擎处理使用LaTeX宏包所写的源文档。
  • ... ...

对于ConTeXt用户,采用了一种封装的形式来调用TeX引擎,如下:

  • texexec --pdf somefile.tex:调用PDFTeX引擎处理使用ConTeXt宏包所写的源文档。
  • texexec --xtx somefile.tex:调用XeTeX引擎处理使用ConTeXt宏包所写的源文档。

很久以来,TeX引擎产生DVI文档输出,然后借助一些程序可以将DVI文档处理成PostScript文档(适合打印或屏幕阅读),但由于现在PDF文档格式日趋流行,所以最终要使用一些工具将PostScript文档转化为PDF文档。现在,使用PDFTeX引擎可以直接由源文档生成PDF文档,所以也就没有必要再延用过去的文档生成方式(DVI->PS->PDF)。现在,在处理ConTeXt源文档时,使用“texexec somefile.tex”命令,默认就可以调用PDFTeX引擎,无需使用“--pdf”选项。

无论你怎样使用TeX,都应当搞清楚你所调用的命令的功用,否则你与他人进行TeX知识的交流或者去BBS寻求帮助时,别人可未必使用与你相同的命令。比如在较早的TeX发行套件中,PDFTeX默认输出的文档格式是DVI,除非你显示指定PDF格式输出;而在新的TeX发行套件中,PDFTeX默认输出的文档格式是PDF。怎么样?有点困惑了吧。

TeX可以实现精美的排版,但是它并不能给你什么承诺

有一些TeX的拥护者,他们为了让更多的人接受TeX,便经常地赞美TeX排版的精美。这种行为过于一厢情愿了。TeX排版的精美是没有什么疑问的,但是好多文档在排版设计上大同小异,因为它们通常都是使用相同的页面布局,只是对字体或一些格式进行了调整而已,所以,用TeX排版的文档一看就是用TeX排版的,就像MS Word输出的文档一看就是MS Word排版的,或者QUARK输出的文档,一看就是QUARK排版的。一些TeX用户经常取笑PowerPoint的演示文档的千篇一律,却未曾意识到他们使用TeX制作的演示文档也是千篇一律。他们向公众宣称TeX可以有效地自动处理段落文本断行问题,但是这一特性却导致了页面的竖直方向出现了较大的空区,不得不采用人为的方式来修补。由于TeX在文本对齐方面做的非常出色,因此一旦所排版的文档发生单词超出右边界,就非常显眼。在网络上张贴着的文档经常向我们展示这一“特效”,例子数不胜数。

TeX是易用的,但并非完全易用

TeX能够很聪明地处理图形与字体,但是邮件列表里 (BBS)的诸多帖子揭示这并非是小事情,即便对于那些TeX老手而言。TeX可以是一个易于使用的排版系统,但是用户如果要真正的驾驭它,也必须要经历一个痛苦的过程。有些东西纯粹是排版技巧,无关乎你使用的是哪一种排版系统。

使用TeX能得到一个极大的好处,那就是TeX用户能够普遍地热心帮助新手。由于TeX用户大都出于自己的意愿选择了TeX,因而他们通常也能够付出足够多的努力来掌握它。

有关TeX及其宏包的用法,我们能够在网络或书店里找到许多的学习资源(手册、答疑、Wiki、邮件列表、新闻组等等)。

成也TeX,败也TeX

在许多计算机语言中,程序员不得不明确地告诉机器有一些文本要输出。但是TeX却不同,TeX对于文本的任何修饰都可能会变成可见的。有人嘲笑MS Word排版的页面会出现一些不协调的空区,譬如一些重复的空格。事实上,使用TeX,如果你不了解一些宏标记的具体细节,也很容易引入许多很可笑的空区,导致页面乱糟糟的。在做一些宣判或开玩笑时,一定要小心谨慎才是。

在讨论MS Word与TeX的区别时,有人说MS Word从来也搞不清楚在何种情况下需要切换字体,比如一个粗体显示的单词之前的空格是否也要粗体显示?但实际上TeX在这方面并不比MS Word高明多少。

我们来看一下在TeX中如何能让一个段落变的狭窄一些,如下:

\def\StartNarrow{\bgroup\leftskip1em\rightskip1em\relax}
\def\StopNarrow {\egroup}
\StartNarrow some lines of text \StopNarrow

像上面这样的处理貌似可以将段落文本放置于一个已经作了限制的区域中。但实际上,上面的代码并不能得到一个狭窄的段落,除非你显式地添加上段落终止标记,如下:

\StartNarrow some lines of text \par \StopNarrow

对于这一问题,最好的解决方案是修改\StopNarrow宏定义,如下:

\def\StartNarrow{\bgroup\leftskip1em\rightskip1em\relax}
\def\StopNarrow {\par\egroup}

宏定义这样修改之后,虽然可以解决使段落狭窄的问题,但是它引入了一些空区。当另一个人在不知道内情的状况下使用了你写的宏定义,也许就会得到他不愿意看到的效果。

其实TeX是一把双刃剑,不是么?其实任何东西都是双刃剑。

TeX是稳定的、不变的,但我们真的希望是这样么?

Don Knuth一厢情愿地认为TeX引擎不需要任何修改或添加新的功能,它已经很完美。早期,有两个扩展TeX功能的例子:特效(special)与著述(write)。所谓TeX的特效扩展,使TeX具有一些特殊的功能,比如可以控制文本颜色或者向文档中插入类似图形之类的元素。如果没有特效扩展,那么TeX用户就要面临很大的麻烦,需要自行实现图片等元素的插入功能。TeX的著述扩展在撰写文献方面非常有用,它提供了目录、交叉引用以及其他特征,这些特征的实现都需要一种反馈回路的运行机制。这两种扩展都是以TeX宏包的方式实现的。通过这两个扩展,Don Knuth满怀自信的认为TeX引擎不需要修改,它可以通过宏包的形式不断地充实自身的功能。

事实上,有一些人对TeX引擎进行了扩展,但并不是很多。因为鲜有人愿意去写一个专用于某领域的排版系统,并使之与Knuth的TeX并驾齐驱,这完全可以采用TeX宏的形式来实现。也鲜有人提出真正有用的TeX程序扩展,譬如文本行号统计、并行输出或者其他一些更符合人性化及语言学的方案,因为这些扩展方案依然可以利用TeX宏开发的方式来实现。但是,TeX宏包的实现起来极为麻烦,有时那些以TeX排版为业的人会很庆幸,因为那些出版商没有提出多少要求。

无论TeX引擎的实现有多么完美,总是有人希望它能够继续的改进,功能上逐渐增强。目前,最值得称道的TeX扩展程序是e-TeX、PDFTeX、XeTeX等引擎。e-TeX引擎提供了TeX诉没有的一些功能;PDFTeX将TeX推进了21世纪,它提供了边注字距调整(marginal kerning)与视觉缩放aka hz优化功能,另外还实现了PDF后端处理功能;XeTeX使TeX具备了处理Unicode编码与OpenType字体的功能。实践证明,只有不断改进TeX引擎,才可以保证TeX不会被时代所遗弃。

当然,TeX的宏包也扮演了非常重要的角色。因为无论TeX引擎怎么变化,但这些宏包基本上还可以照常运行。这也就是说,很久以前写的TeX文档,利用扩展之后的TeX引擎还可以正常编译输出成印刷或屏幕阅读文档。

有人赞美TeX系统鲜有bug,但是对于23年之前使用\leaders排版标记的TeX文档,使用现在的TeX引擎就无法再编译了。因为在这期间,TeX引擎的一些bug得到了修正,因此对文档的处理机制多少都有些变化,尽管这些变化非常之小。不过,通常而言,说TeX系统鲜有bug也不为过,这种说法只是在你不刻意让今天的TeX系统来处理很久很久之前的文档或使用很久以前的宏包的前提下才成立的。顺便说一下,也有一些有关程序稳定不变的例子,譬如计算机语言编译器与解释器,实际上TeX本身就是一种计算机语言+编译器/解释器。

TeX是什么,我为何喜欢它?

TeX是一个允许你创建属于你自己的排版环境的系统。在它所存在的这20多年来,出现了许多的排版环境,譬如LaTeX与ConTeXt,它们让用户可以更方便的使用TeX。你可以根据自己的需要对它们进行功能上的扩展或者决定坚持使用它们所提供的功能,这完全取决于你个人。也有一些功能是你难以驾驭的,但这也是一个功能丰富的系统所带给你的一个必然结果。

如果你能够坚守着你所使用的排版环境的规范,比如保持你的文档源码清晰,那么你的文档就能够耐得住时间的考验。如果你采用结构化方式编辑文档,以抽象的方式定义文档的排版布局,那么最终可以实现在任何平台上都能够得到最终的编译输出结果。你可以将文档撰写任务分配给其他人,你们一起协同工作,这种协同工作方式有助于实现邮件列表的支持,形成一个气氛友好的社区、用户群体,实现书籍与手册的撰写。如果你想完全驾驭TeX系统(譬如LaTeX或ConTeXt),这需要耗费一段时间来掌握它们。学习周期过于漫长,这似乎是个难题,但是对于很对用户而言,他们终生都在使用TeX,并得益于此,所以学习周期的问题不再是问题。Don Knuth给予了我们创造精美文档的能力,但是你需要付出一定的努力才能够掌握它。Don Knuth也给出了一个重要的时间界限条件,即在100年后,印刷技术有了极大的进步,这些使用TeX标记所写的文档依然可以使用TeX引擎进行有效处理。我们所写的TeX文档,能够生存这么长久,这本身就是一件很让人舒服的事情。只是要小心,在这么漫长的时间里,你可能会碰到一些麻烦,要避免它们,就需要保持一种开放的心态去面对TeX的缺陷、神话以及一些奇怪的解决方案。

Avatar_small
hash 说:
2007年12月28日 08:19 不少细节之处翻译得不确切。例如下面这段的意思搞反了: ..., words sticking into the right margin (overfull boxes) stand out pretty noticeable. I don’t want to count the documents posted on the web that demonstrate this ‘feature’. ⋯⋯因此一旦发生单词超出右边界,就非常显眼。在网络上张贴着的文档经常向我们展示这一“特效”,例子数不胜数。
Head_small
silence 说:
2007年12月28日 19:16 To hash: 多谢指正。你说的这一句话我想了好长时间也没搞明白,全凭猜测造出来的。还有TeX与MS Word 比较那一块内容,我也是稀里糊涂。感觉 Hans 先生的英文不是很好懂。也许是我的英文水平有关系。

登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter