LyX is a document preparation system.
按LyX用户指南所述,LyX是一个“文档准备系统”(document preparation system)。LyX 1.0诞生于1999年初,距今已有7103 20年。本文中,我将以一个练习时长两月半的个人排版用户的视角评价LyX 2.3.3。233。
作为一个历经二十多年风雨的开源软件,时至今日仍在龟速更新新版本,实属不易,这点非常值得表扬——虽然问题列表还是已经塞满了十几年前汇报的bug,但是新解决的问题也原本也已经持续了十几年了。
LyX虽然自称是文档准备系统,它本身并不涉及任何专业排版过程,而是先生成LaTeX脚本,实际排版工作完全交由LaTeX处理。LaTeX也自称是文档准备系统(……),它本身却还是不实现断字和分页算法,而是作为TeX宏集,实际排版工作交由TeX引擎处理。
TeX是文档排版系统,实现了美妙的断字和分页算法,拥有强大的数学公式排版功能,自带了标志性的Computer Modern字体,排出来的文档和书籍看上去十分精美,用过都说好。但它可说是一种所谓的“其他字处理软件”,没有语义标记,核心中只有字体切换和增加空格这样的命令;却又可说它是一种语义化系统,因为它具有一套完整的宏编程扩展方法,可以轻松实现语义化。TeX作者本人所著之书The TeXbook对如何用TeX实现各种各样的排版效果和如何编程给予了详尽的阐述。
LaTeX正是用TeX系统中的编程功能实现了一组通用的语义标记,并赋予它们合适的外观,从此风靡全球。(事实上LaTeX核心并没有花多少行代码,让我觉得它就像是一个人读了The TeXbook后做的练习参考答案一样。)LaTeX用户不需要知道底层的TeX里发生了什么,他们只需要用LaTeX提供的语义化标记封装,按一定的基于TeX语法构建的DSL撰写文本,便能得到好看的排版结果。
LyX更进一步,用统一的图形界面封装了LaTeX提供的许多功能。自称文档处理系统的LyX一定有着用户不需要知道底层LaTeX里发生了什么的远大理想,然而这一理想远比任何人的预想更远大,现实终究赶不上这远大理想。
LaTeX的核心功能非常少,也不能轻易更改文档样式。它确实对TeX提供的功能做了一次良好的封装,而且封装得非常好,可问题是它把几乎一切都封死了。漂亮的LaTeX文章、报告、书籍类,不过是修改不了的模板。排版世界的需求千变万化,纵然美丽,也不可能适用于所有情况。
即使是很普遍的自定义,比如令首段段首缩进(默认情况下,首段段首不缩进),也常常涉及到修改底层LaTeX的命令定义,这对普通用户来说是根本做不到的。对LaTeX系统有着深入理解的人们于是制作了宏包,提供了更多命令来帮助修改文档的样式和实现更多功能。LaTeX支持者常把CTAN上不计其数的宏包作为LaTeX功能强大的证据,然而常见的需求也需要不同人编写的宏包支持是可自定义性严重不足的体现。
[LyX] is a tool for producing beautiful manuscripts, publishable books, business letters and proposals, and even poetry. It is unlike most other “word processors” in the sense that it uses the paradigm of a markup language as its core editing style. That means that when you type a section header, you mark it as a “Section”, not as “Bold, 17 pt type, left justified, 5 mm space below”. LyX takes care of the typesetting for you; so you deal only with concepts, not with mechanics.
这里的“标记语言”大概是指语义化的标记。站在今天的视角看,对现在的字处理软件,语义化标记已经是标配。Word的样式功能早在2003版前就有了(尽管直到2013版才开始在内置文档中宣传它的作用,而且经常出bug);InDesign的样式功能则更为强大;HTML本身作为标记语言,早年功能很受限,也不使用样式表,恰是上段中“其他字处理软件”的典范,近年来随着互联网前端新标准推进,语义化和样式可定制化(借助CSS)程度大大提高,甚至有超过面向桌面出版的字处理程序的趋势。
这些工具都容易做到的自定义样式,在LaTeX中却需要各种宏包支持。titlesec修改标题的样式,enumitem修改项目符号和编号,caption修改题注,footmisc修改脚注和脚注符号,geometry修改页边距,multicol修改分栏,就连字下加线这种标准字处理软件的标配功能都要借助ulem宏包,或者使用xeCJK时调用xeCJKfntef。看似是可扩展,实则功能不足,且大量宏包各有各的用法,积累到最终用户上,要达到常见的一组需求,需要阅读的说明文档量可达上百页:
- 需要使用下划线:ulem,Basic Usage的1页。
- 需要使用超链接:hyperref,相关部分共计4页。
- 需要设置字体颜色:xcolor,38页。
- 需要插入图片:graphicx,7页。
- Times New Roman:需要XeTeX或LuaTeX才能使用系统上安装的TrueType字体。XeTeX的说明5页。
- 宋体,小四:要启用中文支持,需要加载xeCJK(XeTeX)或luatex-ja(LuaTeX),xeCJK的简介和基本用法2页。还好是小四,可以直接传递12pt参数给文档类,若是要求五号(10.5pt)字体,都不知道怎么才能实现。
- 2倍行距:setspace,1页。
- 四周页面边距1英寸:geometry,14页。
- 三栏排版:multicol,6页。
- 页眉横线0.5磅,页脚页码居中:titleps,3页。
- 标题黑体居中,段前12磅:titlesec,6页。
- 题注黑体小字:又要回去读xeCJK怎么设置黑体字体,10页。设置题注需要用caption宏包,读到能同时设置黑体和小字需要读10页。
- 题注按章节编号:chngcntr,2页。
- 表头加粗:makecell,5页。
不光一开始就要读114页文档,后续宏包冲突和升级不向后兼容带来的问题还会接踵而至。任何一个问题带来的结果都是灾难性的,会直接导致整个文档无法正常输出。
LyX尝试封装了许多LaTeX核心功能和常见宏包中的常用功能。然而,LaTeX核心功能本就不足,即使加上了常见宏包中的常用功能也不够。更大的问题是LyX连LaTeX核心功能都没有完全覆盖,比如\newcommand命令就完全不支持,只提供了数学宏。
要想创建自定义样式以实现自定义语义,LyX中根本没有用户友好的界面,\newcommand也不行,只能通过编写繁杂的配置文件和创建模块才能实现,而这被认为是高级用户才会用到的功能。更有趣的是,LyX宣传的语义化也没有一步到位,(行内)语义化标记还是作为LyX的一个可选模块出现的,而不是核心功能。即使是LyX用户手册,对用户可输入命令采用的粗体强调样式仍通过直接设置字体实现。自带的嵌入对象中也不乏\shadowbox这样没有任何语义(又难看)的对象,还有一些像\lyxarrow这样的私货。
LyX的可选模块所能做的事看上去相当有限:创建新的文本样式,创建新的段落样式,添加新的“自定义嵌入对象”(自定义指模块定义,并不能通过用户界面定义),除此之外就没有了。这些“样式”所做的往往也只是引用一个宏包,然后调用它最基本的功能。若要提供附加参数,只能自己参考宏包说明,在万能的LyX文档LaTeX导言区里写上一句\PassOptionsToPackage,在各种地方插入TeX代码,而这正是LyX文档所给出的解决方案。
Besides \ce the mhchem package provides the command \cf that has to be used for special cases. For more information about \cf and more examples have a look at the documentation of mhchem, [7].
一层层封装之后,留给最终用户的功能恐怕也只能用于写小说了。稍跨出写小说一步,就免不了读那冗长的LyX用户指南。下面是TeX用户最喜欢的“横线有四种写法”时间,就摘自The LyX User’s Guide。
- line- and page-breaks (hyphen)
- From A–Z (en dash)
- Oh — there’s a dash. (em dash)
- x² − y² = z² (minus sign)
类似这样的段落从The TeXbook一直到The Not So Short Introduction to LaTeX2e都有出现。哎,Unicode时代的写作也应该要有这样的说明——上面每一种横线都对应着一个码位,分别是U+2010(因为字体覆盖率太低,常仍采用U+002D代替)、U+2013、U+2014、U+2212。
LyX有好几本用户手册,英文版用户指南有183页,数学公式说明有80页,嵌入对象说明有117页,自定义说明有72页。除去一般用户没法用的自定义也有380页,更可怕的是,对基本使用方法的说明重新解释了大量LaTeX中的概念,最终要求用户拥有LaTeX的知识,对具体功能的说明又往往以“更多功能请参阅相应宏包手册”结束。
对LaTeX用户,似乎读文档是一件自然的事情,但是,不是。不需要经过特别训练就能上手使用是图形界面程序应具备的素质,LyX在这点上毫无疑问地输了。
不过,若回过来把LyX看作LaTeX核心功能的图形前端,抛开那些古怪的功能,LyX做得令人感到极度舒适。作为基于Qt的程序,LyX的启动速度可以说是相当快。在我配置不高的电脑上,除了数学符号面板第一次加载会卡死,其他部分的界面响应速度几乎是瞬时的,比Word感觉能快十几倍。即使是编写上百页数学公式密布的文字,大纲也能保持快速响应。大量使用自定义数学宏也不会造成太大的问题。纯文本的文件格式,不容易把文件弄坏,坏了也比较好修复。稳定性可和Word近来版本相比,两个月间仅崩溃过两次,且有恢复功能。如果只是跟风或被迫用LaTeX,不想仔细记住所有基本格式对应的LaTeX命令,并且不需要做出让自己满意的效果(或者对LaTeX默认版式很满意)的话,LyX就很妙。