Oct 30, 2012

天下无双的LaTeX

我曾经以为,LaTeX的无敌之处在于适合写充满公式,图表,交叉引用和复杂结构的科学文献或者技术文档。

但是我最近发现,只有把问题简单到纯粹自然语言,才能更显LaTeX的强大。

我最近只用ASCII码字符写teaching statement和research statement. 为了方便,我用了Google Docs. 然后我发现,Google终于作出了一个让我感觉烂的产品——当然,不是Google技术水平烂,而是WYSIWYG的编辑器无法很好解决的问题:全局优化排版。当然,还有一个烂的地方是LaTeX上可以用的某些字体Google Docs里面没有,比如Bookman.

举个例子,因为英语26个字母宽度不同(除非你用monospace字体),单词包含的字母数量也不同,一个很明显的问题是一行的结尾未必是一个单词的结尾(若不打破一个单词)。但是,如果每行长度不同,很难看。地球人想了很多办法,最笨的办法即强迫每一行结尾都是靠右对齐,曰 justify。幸好英语单词之间有空格,Microsoft为了如此,只好把某些行单词间空格变的很长,在写公式或者网址的时候,这个问题很明显。LibreOffice/OpenOffice早于Microsoft就实现了地球人在活字印刷时代发明的办法——把单词破行加横线连起来。但是,还是很丑。

让我们来看看天下无双的LaTeX怎么办的。Donald E. Knuth同学想(这是我推测,未在Knuth的paper中发现),地球人看字符不是公平的。比如,句号后面的空格地球人就忽视了,因为那代表一句话的结尾。所以,空格应该是动态的,逗号后面的空格可以比单词之间空格大,句号后面的空格可以更大。短的单词之间间距可以大一些,长的单词之间间距小一些。不信你自己用LaTeX再用Micro$oft Word排版两段话,打印出来拿在手上,你会发现你根本意识不到LaTeX里面空格的长度是不同的,而看Word的结果,你一扫即可感觉有些单词很挤,有的很松。LaTeX里面有很多ZB的指令用来控制优化,比如,你可以用\hyphenpenalty=100000来几乎阻止LaTeX把单词破行。

而这样的优化,必须至少先把文档扫一遍——否则你都不知道某个单词该在哪一行。在WYSIWYG的编辑器上,除非你每敲一个单词就把优化算法拿出来跑一次,做不到的。但是这样计算量太大了。

以后给女生写情书,一定要用LaTeX写。

"Microsoft has no taste. Absolutely no taste. " - Steve Jobs

No comments:

Post a Comment