TeX 传统版式写作的曲折道路

发布于 2022-12-04 17:03:32

选自:https://github.com/821/821.github.io/blob/master/_Notes/IT/TeX.md

(文章动笔于 2013/02/25 ,初稿完成于 2013/03/11 ,修订于 2016/04/28 ——主要是 TeX 开发活跃,文章的维护性更新很有必要;同时为了维持文章篇幅,做了一些减法。这里基本上把 LaTeX 也混着讲了,有点混乱,不过 TeX 体系向来就是这样。)

本文的主题是用 TeX 进行传统版式写作。分析一下句子成分,首先是「写作」而不是单纯排版,其次所写内容排出来是传统版式的。单纯排版, Adobe InDesign 更简单,不过其性能不适合写作。单纯的写作同时稍微排版一下,嘛,我不就在用 textile 写本文吗?但这种排版是比较简单的,很多地方只能将就。所以说,这里讨论的内容极端特殊,有人会觉得有点变态的。
TeX 的功能就是写作的同时顾及排版,故而 TeX 用户羣在写作能力上远超其他软件用户羣,网上各种文档还是比较丰富的,只是由于 TeX 更新较快且体系庞杂,纔会让人误以为这货很难驾驭。本文书写重点是网络上较少谈到,或较少以我能正常阅读的文字为载体讨论的。

缺点

个人认为,谈论一款软件不应从优点说起,而是缺点。受众先了解缺点,就能从而及时放弃,不要浪费时间去学习。

学习曲线

像 Word 那样,一个半文盲民工打开软件,打一段话,点点鼠标,就能排出点什么东西,有时看看还挺复杂。这是商业软件的特点,一开始给你一点美好憧憬,到你习惯了、舍不得丢开了,纔知道有多难。
TeX 就不能这样,什么文档也不读的话,最简单的东西都不能排。

麻烦

TeX 啰嗦程度略小于 html 。但事实上我更常用 html ,而非 TeX 。为什么?
首先, html 不存在编译问题,开头、结尾声明不错就行。 TeX 则涉及命令定义和宏包等问题,较复杂,失败率高,而且编译环境安装起来有点烦人。
其次,虽然 html 和 TeX 都有点啰嗦,但 html 有简化的 markdown 和 textile , TeX 没有。

两年一小变,五年一大变

对于很多商业软件,比如同类型的方正书版,或 Adobe InDesign ,再或毫无干系但常有人拿来对比的 Office ,他们都有个特点:从某个版本起,就有一种较稳定的感觉了。方正书版,现在很多人还在用上世纪的版本;而 Office ,使用 2003 和 2007 的非常多; Adobe InDesign 用户也往往不那么急着更新。为什么?稳定了,就不追求升级了。
这在 TeX 世界完全不可行。就说中文,十年前还在 CCT ,后来 CJK ,再后来 pTeX 和 XeTeX ,接着是 LuaTeX-ja ,现在 ApTeX 又掀起 pTeX 狂潮。所学知识两三年要大更新一次,只有一些最基础的知识可以五十年不变。就像很多母程序猿的抱怨一样:生完小猿回来,什么都不会了。公猿如果休假长一点也会这样。
特别是中文直排这种小众需求,现在还有很多问题,用户自己也会期待更新。

总有那么一点点区别

TeX 可以排得很美,也可以比 Word 还丑。美丑间是一些初学者不容易掌握的细微设置和环境差异。
在网上看到别人一个极美观的排版时,不要过度鸡冻,因为我们排不出的可能性是 99% ——除非你能把对方的环境和设置完美 copy 到自己计算机里,但有时一个宏包的升级,一个细小的升级(这在频繁更新的某些发行版,比如 W32TeX ,就显得特别严重),就能轻易的将模板毁容。有点差别还算好情况了,更糟的是编译失败……
这个情况随着 TeX 及各种发行版的进步有所缓解,不过仍常有陷阱。而且很奇怪的是,网上很多人发模板,但很少人提到该模板的编译环境——你这样可能根本通不过编译的好吗!

坑爹的环境,庞杂的体系

一个可运行的 TeX 环境,文件数量一般都上万( TeX Live 套装早已突破十万),体积当然也不小。对于单文件绿色版的用户来说,无疑是痛苦的。
都是 TeX 的子孙,引擎一换,很多宏包无法互通,自己写命令的时候也要很小心。如果要从 LaTeX 跳槽 ConTeXt ,会有一段时间感到无所适从(中文涉及的宏包太多,所以没学 ConTeXt ,这里不涉及)。
更该死的是,有些需要的文档并不那么好找,或者找到了却发现不是英文的,再或者根本没文档(这种情况常见于跑单帮作者开发的包)。

中文、中式排版资源匮乏

中国人缺乏钻研精神,对美的要求也不高,所以 TeX 的中文资源相对较少。
由于 TeX 是针对西方语言编写的,对传统中式排版和中文并非先天支持,这本来需要一个强大的本地小区,偏偏这小区很弱小,大家只好努力锻炼个人技能了。
中日,按李鸿章说的,属「同文同种」关系,所以没办法的时候就等日本人好了

最后越学越底层

宏包过时?兼容问题?很多时候用宏包还不如直接用 LaTeX 或者 TeX 的命令呢。
source3, classes 和一堆 cls 文件纔是你的好基友。

用户条件

基于以上,我归纳了玩好 TeX 的最最基本条件:
一、无障碍阅读英文科技短文(必须)
二、耐心和好学(必须)
三、对编码、字体有基本了解(要弄字体则必须)
四、开源软件使用及配置经验(几乎必须,这是一种习惯)
五、习惯边构思边打字(非必须,但如果非要先写手稿纔上机,还眞比较痛苦,除非打字像 Knuth 那么快)
六、初中平面几何无不及格记录(非必须,但如想弄点复杂的东西,估计够呛——有个重要宏包就叫 geometry)
七、脑袋从未被驴踢或门夹(必须,比如有人坚持认为在 InDesign 里一个个加样式比用文本编辑器批量替换容易,我还眞没办法了)
八、能够科学上网,不管肉翻机翻,反正要能接触 Google 和 GitHub (要解决稍微复杂一点的问题就必须)
顺带说一下,虽然我不认为 TeX 一般使用太难(就算 Plain TeX 也没什么),不过台湾有个叫侯捷的程序猿,因觉 TeX 难,就用 Word ,还出了一本叫「 Word 排版艺术」的书(这本书产生的年代 TeX 排中文确实有点烦,但也不至于那么夸张)——虽然我不认为 Word 这种字处理软件做的事能算得上排版,更不要说什么艺术,不过这也说明了 TeX 并非可以一蹴而就的傻瓜软件。

优点

如果还没吓退读者,这位读者必定心灵坚强,对美有自己的追求,九成以上可能性是研究生/博士生/研究机构人员/独立研究人员/有计划从事研究的大学生/出版业工作者/计算机狂人,这些人多数都符合条件,可以了解一下 TeX 的优点并考虑使用。

善于处理巨著

我们都知道 Word 处理长篇文档时多么不可爱。 TeX 的文件都是文本文档,而且你可以做成一章一个文件,然后整体一起编译。
不过换句话说,排一两页临时文件没必要使用 TeX ,排长篇且比较挑剔的再 TeX 。

远离版权纠纷

前面提到的其他软件都是商业软件,要钱的。如果你是学生或者居住在中国当然无所谓,但若跑到美国去做研究,至少用美国盗版软件是有风险的。
不过别用商业字体文件,还有如果你的文本编辑器和作图软件是商业软件我也没办法。

文档较为丰富

TeX 的用户肯定都会写论文,对于 TeX 用户来说写文文件就像呼吸一样简单。而且 TeX 比较复杂,宏包作者不写文档可能都忘记怎么用,所以主流宏包都有文文件,就是语言不一定是英文罢了。

高精度

TeX 本就是个挑剔强迫症患者主持开发的,所以适合高精度排版。软件设计的时候,精度为 sp ,什么概念呢, 65536 sp = 1 pt 。 Office 做不到 TeX 的精度(所以那本「 Word 排版艺术」说 Word 排出来的书稿可以直接给出版社印,那说明作者接触的出版社很毛糙), InDesign 做得到但一般用户也经常因犯错而打乱精度。
不过要小心的是很多宏包精度达不到出版级别。

秘书式人机交互

假设你写了一本旷世巨著,叫你的秘书做成 PDF ,你会怎么说?
你肯定这么说的:把大章节给我用一号字、黑体,小章节用三号字、黑体、下划线,正文用四号字、宋体,奇数页用大章节标题做页眉,偶数页用书名,章节末尾如果是奇数页就加一页空白,后面做个人名索引,前面做个目录,还有参考文献帮我用 MLA 格式整理一下。
于是秘书打开他的 Word 或者 InDesign ,想着你的吩咐,先把全文设置成四号宋体,然后找到第一章,改成一号黑体,再找到第一章第一节,改成三号黑体下划线,如此类推。他伸伸懒腰,把各章节页数找一下,做了一个目录并逐个改好页眉和章节末尾,又上网看看 MLA 格式的要求,帮你改好。最后带着诅咒的心情熬夜一个一个的查了人名,做了索引。
来到 TeX ,你写文章的时候,写到大章节,就标记一下,这是大章节;到了人名,再标记一下,这是人名。最后软件会按照你的构想把需要的样式排出来。

后期调整

回到你和秘书那个 case 。
说不定过了两天,你又不满意了,于是对秘书说:小秘,我对宋体有点审美疲劳,你给我把正文和小章节换仿宋,顺便开本改 B5 ,参考文献格式换哈佛。
于是秘书抓狂了。字体重新设置,目录、索引、参考文献都要重做……
如果你没有秘书,抓狂的就是你自己。
所以 Word 和 InDesign 的用户多半不能对美过于执着,又尤其不能有千变万化的心情和设计,更不能同一本书有三四种排版。当然,现在 Word 的宏是不错的,有些东西可以比较方便的批量处理,不至于像前面那位秘书那么辛苦,比如目录和索引都是可以自动的。不过前提是你得是 Word 高手,而成为 Word 高手的人不多于 TeX 高手,就好像高中数学联赛国三 1 得主不比数学博士多。至少我觉得学个 VBA 就比学 TeX 要难。
在这个 case 中, TeX 只要在导言区改几个字,就能让全文的设计焕然一新了。甚至可以写好后套用十几个模板,来个一稿 N 投——来,想象一下,用 Word 写好后出版社再提要求的感觉该有多恶心,再想想 TeX 的恶心处,你就会觉得,还是 TeX 没那么恶心。所以就有了这句话:

I hope to die before I have to use Microsoft Word.

Device Independent

Device Independent 本来是形容 TeX 的编译结果 dvi 文件可以在各种设备上打印。不过对于用户来说,又有不同意义。
现在平板计算机流行,用户往往经常转战多平台。如果使用商业软件,难免会在某些平台下不好书写。 TeX 就不存在这问题,他是文本文件,手机编辑也不用担心出问题。
Device Independent 还有一个意义,即,我们可以用任何自己觉得舒服的文本编辑器去处理他,而不必忍受略慢的 Word 或奇慢的 InDesign 。

团队作业与版本控制

Word 也有专门的团队作业功能,不过各种坑爹,而且团队作业显示与作业结果不能并存。版本控制方面, Word 文件卽使使用了外部程序,具体每个版本修改了什么都不能直观反映。
TeX 是一堆文本文件,结合 Git 就是当下在程序猿里最流行的团队作业与版本控制方式,所有修改都非常淸楚。

干净

Word 和 InDesign 的文件都较脏。而 TeX 是纯文本,除非你自己不讲卫生,不然都很干净。
什么叫脏?比如在 Word 把一段话设置为红色再蓝色再绿色最后改回黑色,然后保存,结果文件竟然变大了,因为程序在你变一次颜色的时候不是消掉原来的颜色再加上新颜色,而是直接加。 Word 内部也有他的标记语言,比如刚纔的修改,他可能是这样的:文字——[红色]文字[红色]——红色文字蓝色——红色[绿色]文字绿色[红色]——红色绿色文字黑色蓝色。所以你越改动,文件就越大。

扩展性

TeX 是开源软件,只要水平够,你可以用来排任何古怪但有规律的东西。换句话说,没有解决不了的问题,只有解决不了问题的人。
当然,如果不是高手,很难搞定一些困难的问题。不过 Plain TeX 已经有了六百个命令,现在宏包的量又那么大,低手也想不到太多奇怪的问题。

缩写

其实 TeX 也可以像 html 有 CSS 那样偷懒的,那就是用户自定义。你可以把一长串命令定义为一个斜杠加一对大括号再加若干个字母,甚至可以用一个符号开启一串命令。

装逼

如果要找出世界上逼格最高的软件, TeX 自然排名第一。原因是他的用户基本上全都是学界里的人,特别西方理工科语境下,如果一个人说不知道 TeX ,可以断定他的文凭不高于本科。

歧途

TeX 是我见过学习歧途最多的软件——可能是开源而且庞杂的缘故罢?姑且罗列几条。

发音

TeX 的发音彷佛世界难题一样,总是要讨论一番。其实很简单,国际音标是 [tex] 2。我看到学过英语的中国朋友在后排举手,表示不认识这个 [x] ,藉此断定我老人家的音标写错了。
我老人家怎么会写错呢,是你英语老师没学过完整的国际音标啊。比如他一定不懂 [h] 和汉语拼音的 h 的辅音部分发音上的区别。事实上, [x] 的发音就个汉语拼音的 h 的辅音部分完全相同,读起来就和「河」去掉「鹅」的音一样。

TeX 很难

对个性不强的人来说, TeX 的难度基本是体系混乱造成的。基本功能的实现比 HTML 还简单。不修 Plain TeX 和 ConTeXt ,单玩 LaTeX 的话,还是挺快上手的。
TeX 也许跟许多用户所熟悉的体系非常不同,故而彷佛不易掌握。没关系,一次学不会,删掉,半年后再学学,再删掉,再等半年一年。不单是 TeX ,很多事都可以用这种手段处理。

高手纔能排出 fancy 的东西

学了就是高手。
当然前提是智商没问题。
大学都考不上就算了。

离开 WinEdt/TeXworks 就不会用 TeX

CTeX 用户容易犯的毛病,该发行版对二者的设置很好,又不去教用户如何进一步设置。
这个问题我会在下一部分的「编辑器」小节谈到。
如果是中文写作,用这两款编辑器是很抓狂的。

使用他人模版

你妹的模版,初学者绝对不该使用!一个模版往往包含十几个宏包,一堆写得乱七八糟的命令,新手不乱纔怪!
别人的模版是熟练者需要应付不同格式,或者是制作模版时偷构思用的!

概念混淆

网上经常看到有人自称用了将近十年 TeX 的,却搞不清发行版、引擎、编辑器、宏包之间关系。老实讲这种人该用商业软件,而且实在不适合做研究。

使用参考

虽然 Plain TeX 也没有多难,但 LaTeX 更简单,可用宏包、命令更多(你当然不会希望所有东西都要从最基本的命令构建对罢),所以初学一般从 LaTeX 开始比较好。上手后可以再考虑慢慢向其他过渡。

入门文档

lnotes2 ,作者姓黄,署名包太雷,个人判断出生时间不晚于 1970 年,因为他用了「马尾巴的功能」 3 的典故。文章风趣诙谐,八卦信手拈来,而且排得较 fancy 。不过他的立场是 XeLaTeX ,直排不如 LuaLaTeX ,精度也不高就是了。
大家来学 LaTeX ,台湾李果正撰,对中文的讨论过时,不过 LaTeX 基础都已覆盖。
很多人认为 lshort 或其中文版也不错,个人觉得太啰嗦,仅最后一章有意思。
入门文档本来不需看太多,但 TeX 很多基本概念必须掌握,多读几本入门文档有助于将之灌入大脑。

The TeXbook

Knuth 写给 TeX 初学者的书,但不建议直接就读他。该书也被广大低手视为「传说中」的书,其实没这么恐怖。不关注公式编辑的,可以读一下 10-15 和 20-25 这些章节,重点理解盒子。
阅读此书对进一步理解 TeX 宏包中的命令以及制作宏包有很大作用,适合对美有独特追求的人。

其他

基本上,用到什么就读到什么文档,这是开源软件亘古不变的道理。
一般文档和示例都是随包的,搜一下就有了。比如 Windows 下用 Everything 找文档,有时比用 TeX Live 的命令行还方便(这个命令是 texdoc packagename ,但一次就看见一个文档,而用 Everything 可以顺带搜出一堆示例文件什么的,还可以顺带看看源码)。

log

编译如果出错, log 往往能给予极大提示。
不过要完全看懂 TeX 的 log ,要先看很多文檔——比如 badness 什么的。

TeX Reference Manual

Plain TeX 有一堆 primitive ,掌握这些, Plain TeX 当然也就入门了。这本书就是专门讲解这些知识点的,不过讲得比较粗糙,很多地方还是看 The TeXbook 比较好。
网页版是 TeX Primitive Control Sequences

TeXbyTopic

TeX Live 自带的一篇文档,也解释了 primitive 。

方正书版的入门文档

看这个不会直接有助于学习 TeX ,但可以了解中国出版业对版心、行距等方面的习惯。
网上有很多不符合行规的模板,不忍直视。

A Guide to LaTeX

有点长,可以作为初级工具书来读。该书分解了很多命令,比如一个 \footnote 包含了 thefootnote, \footnotemark, \footnotetext 等。读到这本书说明你的要求很多很特殊,一般的模板和各种入门文档已经不能满足你了。

source3 + classes

前者包含 LaTeX3e 源码,后者包含常用内部 classes 。这两本书的内容都能吃透,堪称 LaTeX 高手。
这两个文档和 lshort 都集成在很多发行版中,所以安装发行版要记得勾选文檔。用 TeX 的秘诀就是读文档,改码,测试编译,再读文档……

环境

引擎

CTAN 有详细列表,这里重点说一下汉字文化圈常提到的。
pdfTeX: 顾名思义,直接转成 PDF 。
pTeX/upTeX: 日本引擎,后者是 unicode 的。古老且日本国家特殊性强,外人用起来很痛苦。
XeTeX: 对字体很有一套,编译时后台直接把中间产物 xdv 转成 PDF ,所以较方便。
LuaTeX: 吸收 pdfTeX ,支持直转 PDF 和方便的字体。 Lua 是脚本语言,速度差点。现在发展出 LuaTeX-ja 来(本质上是宏包),方便的同时部分继承了 pTeX 。
ApTeX: 据 pTeX 继续开发,等于让他跟上时代罢,比如 pTeX 不能直接出 PDF 而这货可以。

Plain TeX: Knuth TeX 太难用了,所以 Knuth 本人封装了这个包。相关知识掌握后不会过期,且在所有 TeX 引擎上均能使用,缺点是他用起来繁琐且内建功能少。
LaTeX: 主要是加了文档类和大量命令,并留下很好的发展空间。友好且认可度很高,知识保质期也很长。
ConTeXt: LaTeX 内核精炼,功能实现大量依赖宏包,但宏包间常有冲突。而 ConTeXt 是自身强大,以避免宏包冲突的问题——强得有点像商业软件。
引擎和包搭配,就有了很多编译方式。比如 pTeX 可以搭配 Plain TeX 和 LaTeX ,搭配后者就变成了 pLaTeX 。

发行版

纠结这问题的新手居多。
目前 Windows 下较常用的发行版有 TeX Live, MiKTeX, W32TeX 。其他多是衍生物。
TeX Live: 宏伟的跨平台发行版,很大,很全,适合新手—— Live 都这样嘛。不过如果你需要使用一些宏包的最最新版,这货一年能让你痛半年——每年一个发行版,发行后半年就冻了,不给更新到最新。
MiKTeX: 也很大很全,因为有个 basic 版和便携版,加上添宏包很方便,很多人都根据他来二次打包。
W32TeX: 小鬼子作品,没有整体打包下载,东西也不齐,安装器如 AbTeXInstaller 也不太好用。日本人讨论时喜欢以这货为例,适合二鬼子和需要日本宏包的。
TnXTeX: 棒子根据 TeX Live 出的发行版。
CTeX: 国人据 MiKTeX 制作,据说要来个大更新,看呗。
我的看法:上手用 TeX Live ,学日本或熟练各种配置了用 W32TeX ,介于二者之间且图方便可考虑 MiKTeX 。
其他发行版见 CTAN

编辑器

任何一款合格的文本编辑器都可以编辑并设置编译。比如常见的 Vim, Emacs, SciTE, Notepad++, EditPlus, EmEditor, UltraEdit, AkelPad... 目前我用 EverEdit 来写。
日文 TeX Wiki 里有个「统合环境」,介绍了主流开源文本编辑器的配置方法。
本文给一个该站没有的例子—— EmEditor 下 upLaTeX 一次性二步编译为 PDF:
先写好一个 bat 文件放在 upLaTeX 的活页夹里——比如 W32TeX 就是在 bin 活页夹。

@echo off
uplatex -synctex=1 -jobname="%~n1" -kanji=utf8 -guess-input-enc "%1" && dvipdfmx "%~n1"

(外部工具是 language agnostic 的,不一定要 bat ,但 Windows 下 bat 还是比较简便的……)

再在 EmEditor —工具—外部工具—自定义工具下,标题随便写,命令写刚纔那个 bat 的完整路径,比如我的就是 D:\W32TeX\bin\pdfuplatex.bat ,自变量 $(Path) ,源目录 $(Dir) ,如果需要看 log 就勾选 「使用输出窗」并把编码设为 UTF-8 。其实这就是个文本编辑器使用外部工具的典型例子而已。
upLaTeX 设定相对比较复杂,因为他编译成 PDF 需要两步且有一堆参数而且 EmEditor 不是直接调用 cmd 。
网上也有很多专门针对 TeX 开发的文本编辑器,比如 WinEdt, WinShell, Kile, TeXstudio, TeXnicCenter, TeXworks, SWP, Bakoma 等等,其中有的是商业软件。我个人的观点还是用自己喜欢的 general 文本编辑器,而非专门为 TeX 找,免得不习惯。

相关宏包、工具

geometry/lltjp-geometry

geometry 方便人们进一步控制整个页面布局,主要是尺寸方面的设计。
lltjp-geometry 是使用 pTeX 时需要放在 geometry 前,纔能让 geometry 起效的一个包。

fancyhdr

制作很 fancy 的页眉和页脚。能基于页面奇偶性来设置不同页眉、页脚,但奇偶性必须开启 documentclass 中的 twoside 选项。

color/xcolor

一本书都没别的颜色吗?
如果是实际印刷,多色较贵,一般用单色。但电子版多几种颜色更好,就像我们写代码喜欢做高亮。

sidenotes/marginnote/marginfix

LaTeX 内部有一条叫 marginpar 的命令,可以制作边注。
但 marginpar 是浮动对象,所以就有了 marginnote 宏包。同时加了一串不痛不痒的功能。
而 sidenotes 基于 marginnote ,还可以在边注中加入图片、表格。
marginfix 是自动修正边注的位置,不改命令,一般用不错。用了 marginnote ,当你在同一位置添加多条批注时,批注会重迭起来没法看,而 marginfix 是平铺。

titlesec, titleps, titletoc

默认的目录和章节号是英文的,呆板丑陋。自己动手一下,自然丰衣足食。

hyperref

为 pdf 文件添加超链接,等于方便读者。
这个宏包好像比较容易和别人打架。
目录默认每个章节一个很丑陋的大框,而且定了颜色之后只自动给标题变色,不给「第一章」之类的内容变色。

fancybox, tikz

如果需要版框,就用这两个宏包画一下。这样看起来就更中式了。

ltj-warichu/gezhu

都是排割注用的,不很完善。没有集成在发行版里。

zhnumber

用于处理数字中文化问题,功能强大。比如中文的页码、章节之类,处理得还不错,比 CJKnumb 强多了。
比较年轻, CTeX 宏集自带。

ctexheading

一个比较方便改标题各种格式的宏包。如果不需要搞「学而第一」之类的奇葩格式可用。

ifthen

顾名思义,很编程的一个包,帮助实现更多变态要求。

zhmakeindex

用法跟 makeindex 差不多,但支持拼音、笔画、康煕部首排序的工具。
需要手工下载安装。

字体

字体是 TeX 一个重大问题,目前在直排下鼓捣字体相当痛苦。

字符集

如果中文只有小学水平,一般不用担心——除非用日本的字体。然而我们的识字量是否有必要稍微提升一些呢?于是字符集问题就来了。
近期来讲,中国的字体最少是 GB2312 (业余字体会根据自己喜好来),大公司出的字体一般有到 GBK ,有时会给到 Unicode 没有 Ext 。台湾一般在 Big5 基础上加点字。日本的字体是 JIS ,老标准是 JIS90 ,较新的是 JIS2004 。
日本人善于制定和遵守规则(这一点我喜欢),重点说一下。很多字体后面常附上表示该字体字符集覆盖面的标识,比如 Std StdN Plus PlusN Pro ProN Pr6 Pr6N 。日本人把汉字使用频率分为六等,覆盖 1-3 的算 Std , 1-4 的算 Pro , 1-5 的算 Pr5 ,1-6 的算 Pr6 。照我的理解,不带 N 的 CMap 是 JIS90 ,新字形;带 N 是 JIS2004 ,旧字形。
很显然,如果使用日本字体,如果不是标榜字多如花园明朝的, Pr6N 为最善。但是 Pr6N 也缺很多常用字,比如够、躲、嗯、抛、尝等。日本货就是日本货,不可能完全适应中文环境。

书体

这问题是个重点——如果你是比较 demanding 的人。我就很龟毛,所以我对现有的字体都不满意。
我个人觉得最好看的书籍字体是仿宋(宋朝体),但现在多数仿宋一排长文就很难看。仿宋不是主流,一般字符集较小,日本的 Iwata Souchou Pro M 稍好,也不能满足我的日常需求,所见最大的 AdobeFangsongStd-Regular 总有一种很呆板的感觉。
退而求次,宋体(明朝体)也马马虎虎,但新字形宋体总觉得太虚。完整的旧字形字体貌似也就那「康煕字典体」,还是个 boundingbox 不正确的货,排书宛如狗啃。现在暂用 SonyReader Ming 4 和 苹果在用的 Hiragino-Mincho-ProN-W3 (下载不到 Pr6N , W3 屛幕显示有点粗,印刷还好)。另外还有个 I.BMing 5 ,字是非常全了,但还有一些问题。
至于楷书,长文看着累,短文不错,但还是要看原形和质量。 A-OTF-OutaiKaiStd-Light 的质量是不错,方正的瘦金也马马虎虎,不过楷书字体普遍字少,还是不好用。
行书和草书呢?这两个我基本上不认为是印刷体。特别是草书,游丝引带怎么解决?未来有什么黑科技,那又是另一回事,但我眞的怀疑等到黑科技诞生,已经没人会写草书了。
黑体是我最不想用的字体,但现在很多人在计算机上就是喜欢。眞是不明白啊,汉字不就是一种以变化为美的字吗?这种所有笔画宽度都一样的字体怎么可能好看?
至于隶书和篆书,这两个我眞不懂,也没资格评论。
嘛,总之我很明白 Knuth 为什么会写了 TeX 又写 METAFONT 。够情怀就该给自己的书做字体,可是汉字不是只有 26 个字母那么简单,一个个做不知道命有没有那么长。现在我一般用日本出的字体为主。

XeTeX/XeLaTeX

要在 XeTeX 直排,须是支持 vertical 命令的字体,一般是 otf 。标点需要完美的 vert 命令,而一般字体不完美。
解决方案:
一、用强大的字体,如 AdobeSongStd-Light.otf ,支持的命令更丰富,可保持标点符号正确性。
二、用更复杂的命令,比如标点一律使用 AdobeSongStd-Light.otf 的标点。

LuaTeX-ja

有了 luatexja-fontspec ,字体很好弄。 LuaTeX-ja 环境下直排时字体的问题相对少一点,但仍让人心烦。

常用命令

记录一下没有坏处。

定义

大到宏的制作,小到自己定一堆便捷命令,都需要用到这里。
应参看 The TeXbook 第 20 章。
\def: TeX, 定义新命令。最常见是 \def\foo{\bar} 的样子,也可以把字符定义成命令,如 \def|{\bar} 。有时,命令只打算作用于很小范围,想用大括号框起来,可以这样定义: \def\foo#1{\bar{#1}} ,如果有多个变量: \def\foo#1#2{\bar{#1}\fb{#2}} , #1 之类可出现多次,随你高兴。大括号内的东西可以折行以便浏览。定义会覆盖已有命令。定义不能带有 \par ,要 \par 需在前面加上 \long
\let: TeX, 让一个命令等同于另一命令。用法: \let\foo=\bar 。(所以 Knuth 一定是个像我这么无聊的人,)
\newcommand: LaTeX, 定义新命令。跟 \def 很像,可以用 \par ,但不能定义 end 开头的命令,而且如果已有同名命令,则不起效。用法: \newcommand{\foo}[2]{\bar{#1}\fb{#2}}
\renewcommand: LaTeX, 重新定义命令,用来覆盖已有命令。

引入

如果事无巨细全都自己写,未免太痛苦,所以用点宏包什么的不要太正常。
自己写模板来用,为了方便管理,也会把模板和正文分开——这种做法在方正书板里甚至是强制的。
\input: TeX, 最原始的拉来就用。用法: \input filename\input{filename}
\include: LaTeX, 会开新一页。用法: \include{filename} ,默认带 .tex 扩展名。
\includeonly: LaTeX, 同 \include 用于引入多文件。用法: \includeonly{filename1,filename2,...}
\usepackage: LaTeX, 套用宏包。如果宏包允许还可写参数。用法: \usepackage[optional]{thepackage}
\documentclass: LaTeX, 套用一个文档类。用法: \documentclass[optional]{theclass}
\RequirePackage: LaTeX, 用于宏包文件内,效果同 \usepackage
\ProvidesPackage: LaTeX, 用于宏包文件内,给出宏包的名字和版本。
\LoadClass: LaTeX, 用于 class 文件内,效果同 \documentclass
\ProvidesClass: LaTeX, 用于 class 文件内,给出 class 的名字和版本。

盒子

TeX 在设好后,会自动拆行拆页各种拆,盒子的基本功能是把一串东西装起来,不许拆。中文盒子的槪念不很强,因为一个字就像一个盒子,一般不会拆分。西文词一般不拆,但太长的也可以拆了用连字符,所以盒子槪念的提出与西文环境有关。不过现在中文也不时会用到盒子,比如现在横排是主流,为了强调直排,我们往往要用到 vbox
可参看 The TeXbook 第 11 章。
\hbox: TeX, 横向不拆的盒子。用法: \hbox{foobar}
\vbox: TeX, 纵向不拆的盒子。用法: \vbox{foobar}
\setbox: TeX, 注册盒子,盒子编号从 0 到 255 (很像 \def )。用法: setbox0=\vbox{foobar}
\box: TeX, 使用并淸空注册的盒子。用法: \box0
\mbox: LaTeX, 什么都没有的盒子。用法: \mbox{foobar}
\fbox: LaTeX, 带框的盒子。用法: \fbox{foobar}
\makebox: LaTeX, 功能盒子,可以设定宽度、对齐。用法: \makebox[100pt][c]{foobar} ,其中 c 表示居中,还可以是 l, r, s ,分别表示靠左、靠右、分散。
\framebox: LaTeX, \makebox 基础上多个边框。
\rotatebox: LaTeX, 旋转。用法: \rotatebox[origin=c]{55}{foobar} 。 55 是角度,中扩号里的内容可选的就比较多了。如 origin 可以选 l, r, c, t, b, B ,其中 B 是 baseline ,其他都好猜;还可以写 x=100, y=200 这种,是以左下角为原点画的坐标;还有一个参数 units 是设弧度的,平面几何学得好的可以试试。
\scalebox: LaTeX, 缩放。用法: \scalebox{0.5}[1.5]{foobar} ,前一个数是水平缩放,后一个个是垂直缩放。

位移与粘连

位移如果可以写数字,这些数字都是可以正也可以负的。这些数字后面通常要带单位,单位可以是 pt, pc, in, bp, cm, mm, dd, cc, sp, em, ex 。单位的解释在 The TeXbook 第 10 章,粘连是 12 章。
h 开头的换成 v 开头就是纵向,不专门写了(懒)。
\noindent: TeX, 使当前行、段无缩进。用法:照写。
\parindent: TeX, 设置后文的段落缩进。用法: \parindent=0em
\raise: TeX, 上移。用法: \raise1emfoobar
\raisebox: LaTeX, 上移。用法: \raisebox{1em}{foobar}
\kern: TeX, 右移,定长,不可换行,到了边缘就凸出去。用法: \kern1emfoobar
\hskip: TeX, 右移,可伸展,可换行。用法: \hskip1em
\hfil: TeX, 向右塡充,相当于让命令两侧的字符对齐两侧边缘。用法:照写。
\hfill: TeX, 向右塡充,阻断 \hfil ,而不被 \hfil 阻断,相当于升级版。
\hfillneg: TeX, 也就是 \hfill 的负数。

LaTeX 种种

LaTeX 大槪是 TeX 家族里最常用的一个。虽然很多命令写得比较啰嗦,让我很烦,不过毕竟比较方便写一些普通的东西——比如 report, thesis, resume, slides 。
先扔基本格式出来:

\documentclass[12pt]{ctexart} % 这里类别选了个很懒人就支持中文的 ctexart
\usepackage{hyperref} % 交叉引用
\usepackage[margin=25mm]{geometry} % 边距、布局懒人包,预设边距有点大
\title{}
\author{}
\date{}
\begin{document}
\maketitle % 生成标题
\tableofcontents % 生成目录
正文
\end{document}

类别

名称特点
article无部无章无奇偶,标题不独页
report无部有章分奇偶,总标题占一页
book什么都有
letter写信的,不常用
slides幻灯,横版
minimal什么都没有,反过来讲也最多东西可以加

结构

名称级别
part-1
chapter0
section1
subsection2
subsubsection3
paragraph4
subparagraph5

举例: \part{题目}
编译时自动带数字编号,如果不想要,也不打算加进目录,可以加 * 号。如 \section*{小节} 。如果想要中文数字——那就比较烦了。

ApTeX

2016 年是 ApTeX 之年(大槪)。为什么这么说?因为 CTeX 宏包(是宏包不是发行版)终于支持了 pTeX ,且(据说) ApTeX 要打入 TeX Live 2016 ,这样就会有更多人能够方便的用到 ApTeX 。那么,本文也稍微跟上一下时代好了(从 pTeX 到 XeTeX 到 LuaTeX-ja 再到 ApTeX ,眞折腾)。

安装

看作者写的怎么在Windows下的TeX Live里面装pTeX-ng?

吐槽

从一个 Word 用户的视角来看,希望某个字符出现在页面的某个位置是件很简单的事——开一个文本框,放进去,用鼠标调整一下就好了嘛。当然了, TeX 用户也可以用命令做类似的事情,但 TeX 用户通常还希望使用了一个命令后,所有类似情况都自动执行,不需要更多的人工干预。
直排很特殊,很多问题暂时没有完美解,于是我就利用类似 Word 视角但基本上不用再加人工干预的方式解决。不过,有时解决得很糟糕,那又是另一回事了……
这里就是其记录。

\tate 与奇偶性

pTeX 选择横排的时候,奇偶性是正确的。
在直排的时候,奇偶性经常是反的。比如,一个章节本来应该是从奇数页开始的,不是奇数页就要空一页。而 pTeX 在直排(全局使用命令 \tate )的情况下,是从偶数页开始。为了避免这种情况发生,我们只能先使用 openany 参数,然后用 ifthen 宏包改过来。比如我的渣代码(cleardoublepage 不好用,还用一个空的 mbox 来出空白页,眞是够了):

\def\cpt#1{\newpage \ifthenelse{\isodd{\value{page}}}{\chapter{#1}}{\mbox{}\newpage\chapter{#1}}}

LuaTeX-ja 的直排位移与旋转

一般情况下, vert 可以使大部分标点符号看起来正常些,但也有些符号死不悔改,非要强制纠正。
对于 ttf 字体,我们往往就束手无策了,需要借用 otf 字体来改。

冒号

冒号在直排下本来和横排看起来一样,但是很多字体加了 vert 会睡下来。这就需要专门为冒号指定字体,但直接切换字体必然导致源文件看起来很丑且输入麻烦,比如把冒号写成 {\sung{:}} (这还是设置过字体以后,比较简洁的写法了)。
这对平时以源文件编辑及检阅为主的本人根本不能忍,于是决定在导言区申明。然而卽使用 def 命令,也最多只能做到每次输入冒号时写作 \: ,还是不能忍,于是就把冒号用 active 写进控制序列去了。

破折号

破折号的编码有好几种。
U+2014 是最正确的,但他在直排情况下很多字体显示为横的。
U+FE31 是专排直排的,显示没问题,但源文件肯定不会这么写。
U+2500 是划线符号,不过看起来和破折号很像,而且很多字体里要横便横要竖便竖。
U+2015 两根线之间有明显缝隙,但也勉强能用
问题虽然可以解决,却也和冒号的情况一样。

引号

可能是 box 的缘故,引号普遍靠上,本来应该显示为「这样」的,却有点像是「 这样」,看起来很不舒服。
于是在控制序列定的命令里又加上了 \kern0.3em ,动到盒子,后面又用 \kern-0.3em 改回。
所以说我写的代码处女座看了眼睛会瞎。

位置

虽然一般是放右上角,直排还是居中较美观。特别是圆嘟嘟的句号,放中间多对称啊。
xeCJK 下可以用 MiddlePunct ,但 LuaTeX 不能用这个包。哪天心情好我做个字体,再把更多标点符号放进控制序列里好了……

「一」字

在 LuaTeX-ja 直排里,「一」字的位置不知什么原因上移了 0.3em 。
使用控制序列修正后,用 \kansuji 转的页码、章节名还是错的。
给字体加上 [NoEmbed] 属性也可以,但我觉得能 embed 到 pdf 更好。

专名与书名

专名用直线、书名用波浪线,这是比较好看的标点。以前由于波浪线难弄,改成了俄文引号,现在大可恢复。不过,在直排 TeX 的世界里,这又是一件大工程。
ulem 是个鼓捣下划线的宏包。但在中文环境下不自动折行。
CJKulem 提供了中文环境下划线文字的自动折行,运行需要 ulem 。不过 XeTeX 直排时基线是错的,所以划线的位置也是错的。况且他的直排在左边,不在我喜欢的右边(我的习惯很日本是不是)。
udline 是日本人做的,不但有下划线,还有上划线,且在 pTeX 环境下自动适应为下划线在右侧。但是在 XeTeX/XeLaTeX 下不整齐,在 LuaTeX-ja 环境下不能完美适应直排(比如波浪线是横着的)。
搞半天发现,还是 udline 这块烂泥较可能糊上墙,于是改了一句代码,能在直排下用专名和书名就行了,其他不管。

有用的网站

CTAN TUG 宏包、文档、发行版大全。当然,不会太全。
LaTeX 官网
Wikibooks - LaTeX
TeXdoc online
TeX Wiki 日本人写的 Wiki 式网站。
ShareLaTeX 在线写 LaTeX 项目,自用免费,文档丰富。等于免环境用 LaTeX 。

1 先初赛,再省级联赛,各省省一前若干名可参加全国联赛,全国联赛参加人数约一百。联赛的作用在于选拔人员参加国际奥数「为国争光」,有特定题型和知识范围。卽使是天才,若不高强度备考,国三无望。
2 这是英式英语的发音,美式英语当作 [tɛx] (要显示中间这个字符需要字体支持)。笔者的耳朵和嘴巴都无法区分 [e] 和 [ɛ] 这两个音,只能通过看 IPA chart 看出是嘴巴张开幅度不同。中国很长一段时间都以英式英语作为标准英语进行敎学(从语言而非交流角度来讲这也是正确的),小伙伴们将就着看罢。
3 典故来自 1975 年的电影「决裂」,讲述一个南方的大学,学生想了解养牛的农技,但教授坚持学术,讲授南方较少的马,而且电影为了讽刺教授,专说这名教授在讲「马尾巴的功能」。电影的思想是极左的,认为大学不如农田,学术不如经验,「马尾巴的功能」当然不如如何养牛重要——其实这些学生根本不该上大学,职高比较适合他们。这种思想在改革开放后受到完全的否定,因此其后观看此片的人极少。笔者也是因一个偶然的机会看到了电影的大纲,纔下载来看的。在此笔者顺带将此片推荐给青年及外籍中国史研究者,相信大家一定会喜欢。
4 字符集达到 Unicode CJK+Ext-A ,是目前能用的旧字形字体里最大的。网上有根据他修改的「宋明体」,颇有点名气。然而修改者似乎不知 Ext-A ,又似乎和简化字有仇,强行乱改了很多字,流毒不浅。我一直奇怪,「宋明体」除了那些白痴问题以外,制作精良,字形一致,不太可能是单枪匹马的业余人士制作,就很想找源头,但是修改者完全删掉了字体原有的信息,发帖时又不指出所据字体,很长时间都没找到。最后机缘巧合,终于发现是 Sony Reader 上的字体。而且这套字体还有楷、隶、黑三体,只有楷体无 Ext-A ,实在难得。
5 修改自 IPAmjMincho ,收字达到了 Ext-D 。但不知是字体精度不够还是什么缘故,总觉得不太平滑,而且他对所有在编码上区分了新旧字形的字一律采用旧字形,这有时会让用户感到困扰。


  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
0 条评论

发布
问题