被遗忘的宝藏——LaTeX发行版自带的字体&自己的一些字体心得

2008年8月5日星期二

原文发表于CTeX中文论坛(bbs.ctex.org)




可能有不少人像我一样在用LaTeX不久就开始跟字体较劲。我走的是这样一个过程:
- 最初用惯了Word,从而无法理解为什么LaTeX调用字体那么难;
- 为了在LaTeX中调用字体,想用现有的工具一蹴而就(像TTFshape,MTFI,xGBKfonts),往往不能轻易成功,沮丧;
- 之后重新静下心来逐渐了解了什么是字体,LaTeX中字体成功调用的方式,才注意到Mapping,TFM,vf等文件的相互关系,理顺了这一切后,把前面几个软件装不成功的字体装好(我印象中装上过Verdana,GE Quartz等几个);
- 后来发现也有些宏包有现成的字体可用,那个时候主要就是关心TrueType字体,所以见到了winfonts宏包(这个宏包不在MiKTeX的宏包列表中),开始用上一些系统中有的字体;
- 又发现OpenType字体更棒,再去看的时候才知道解包OpenType不但麻烦,还会失去glyphs;
- 在一个相当漫长的时间内没有动过LaTeX,再碰它时,又是从一篇Philipp Lehman的《The font installation guide》开始,这篇文章100多页从头到尾看完,已经比较清楚如何用fontinst来安装手头拥有的Type1字体。也正是从这篇文章开始喜欢上了 Minion字体并且成功安装。由于安装过程相当繁琐,我还写了一些安装Type1字体的批处理,有时间的话会整理出来(因为通用性太差);
- 再次碰字体就是在CTAN上看到MinionPro宏包,这时我已经开始搜集字体,所以MinionPro宏包要求的所有Optical Size我都有。MinionPro包特别大,装上它后刷新文件名数据库都慢几十秒,这也说明了OpenType字体的复杂性。我想要不是Adobe把这个经典字体免费提供,应该不会有谁有心去为它生成那么多的TFM文件(1511个之多)。Minion Pro字体对我而言真的是压倒性的,我估计学校允许的话我的论文都会申请用这个字体排版。
- 后来XeTeX被port到Windows,我这才终于把MiKTeX升级到2.7beta,并且花了大量时间研究XeTeX。XeTeX似乎就是为字体而生的,但同样需要有字体的相关知识,这些知识并不同于前面Type1字体,而更多是字体的OpenType features,这些features,Type1字体要么是根本没有(calt, salt),有也不容易打开(smcp, onum)。


但XeTeX同样有这样那样的问题,而且如果直接访问OpenType字体,编译速度就更不如PDFLaTeX访问Type1字体那么快,在长文章中表现得非常明显。所以才有了今天这个帖子,因为在这几天求助区的讨论过程中,自己又回去看了看。加上之前也注意到,其实打开$texmf/fonts目录就能发现LaTeX发行版中早就自带了不少字体,这些字体虽然是免费,功能上确不输专业字体。更重要的是,这些字体很多都是精心设计过的字体包,用来同时载入正文和数学环境的字体,保持文档统一的风格(在严谨的学术文章中,也确实不该想在哪改字体就在哪改)。

原来自己有个文本文件,就是记录机器上可以为我所用的现成字体包(主要来自于$texmf\doc\latex\psnfss\psnfss2e.pdf文档的介绍),但最近去到tug看过,早就有人写了完整的LaTeX字体巡礼:
http://www.tug.dk/FontCatalogue/
这个网站罗列了156个LaTeX中可以免费使用的字体,并且给出了例子和调用的源代码,需要注意的是这些字体并非默认安装在机器上,但至少都能从 CTAN得到——不光是宏包,还有字体文件(因为像winfonts,MinionPro这些宏包需要用户自己拥有相应的字体,CTAN上并没有)。不过拾人牙慧的工作还是要作,那就是推荐一下几个字体/字体包:

1. Palatino
Will Robertson的文档总是用Palatino,这字体的名气也不小。胖胖的很活泼,笔锋也优雅,有羽毛笔的进化痕迹。LaTeX中最省事的是用\usepackage{mathpazo}来统一修改正文和数学字体,这个宏包还有[sc, osf]参数,分别对应小大写字母和不齐线数字。此外还有一个palatinox宏包可以直接调用Windows系统中的Palatino Linotype(这是微软认证发布赫尔曼·察普夫的原作),相关网址是:http://www.ctan.org/tex-archive/fonts/truetypemetrics/palatinox/,需要手动安装。在这个URL的上一层还能看到另一个经典字体frutiger,只是我手头没有Linotype Frutiger。

2. Garamond
1530年诞生的经典字体,LaTeX中通过mathdesign可以使用:\usepackage[garamond]{mathdesign}来使用。Garamond字体十分大气,打印在纸张上也特别好看,法国很多口袋图书用的是Garamond。

3. Times
除了\usepackage{times}外,\usepackage{mathptmx}可以把数学字体也改成类似Times的字体。这个字体真的不需要再多说什么了,总之我觉得看久了眼睛会累。

4. Utopia
Utopia有点像Times,但更宽敞一些。\usepackage{fourier}统一修改正文和数学字体为Utopia,\usepackage[adobe-utopia]{mathdesign}则是mathdesign的调用方法,差别不太明显。

5. Avant Garde/Courier/Bookman/New Century Schoolbook
不是我懒,这几个字体在PSNFSS中是可以搭配着用的:
\usepackage{avant}只载入Avant Garde
\usepackage{bookman}则同时载入Bookman(衬线),Avant Garde(无衬线)和Courier(等宽)字体
\usepackage{newcent}同时载入New Century Schoolbook(衬线),Avant Garde(无衬线)和Courier(等宽)字体

6. Charter
十分饱满的衬线字体,适合屏幕阅读。\usepackage{charter}

7. Helvetica/Optima
这两个字体放一块是因为我觉得它们是无衬线字体,比较适合用来作幻灯片。Helvetica可以\usepackage{helvet},Optima没有写成宏包的形式,就可以用\renewcommand{\sfdefault}{uop}然后\renewcommand* \familydefault{\sfdefault}来调用。在幻灯片这样的尺寸上,Optima变化的线宽才显现出优美来。

8. 其他数学宏包
建议看看ftp://tug.ctan.org/pub/tex-archi ... t_Survey/survey.pdf 这篇文章,介绍得相当详细,而且有效果图展示。

9. Minion Pro
http://tug.ctan.org/tex-archive/fonts/minionpro/ 有详细的安装说明,只要不出错是肯定能安上的,装了Acrobat Reader 7.0以上的用户都能在Acrobat安装目录下找到MinionPro-Bold.otf, MinionPro-BoldIT.otf, MinionPro-It.otf, MinionPro-Regular.otf这四个文件,按照安装说明拆解它们四个已经能满足日常文档的需要。此外,MnSymbol宏包(MiKTeX 可以自动安装)是配合Minion Pro的数学宏包,最好装上,不过\usepackage{MinionPro}就够了,会自动载入MnSymbol宏包。

其实用来用去才发现,LaTeX自带的这些字体才是真正经过时间和实践检验的经典字体,是TUG智慧的结晶。而且,这150多种字体也涵盖了绝大部分(LaTeX能触及到的)字体使用领域。这是不应该被遗忘的宝藏。

懒人专用--用好SciTE的缩写功能



原文发表于CTeX中文论坛(bbs.ctex.org)


版面上用SciTE的人应该不少吧,这个编辑器一个相当强大的功能是他的缩写(Abbreviation)展开功能。简单说,就是把常用的代码段、单词甚 至句子和环境都定义成几个字母的缩写,打入这几个字母后ctrl+B就自动展开。开始的时候也觉得是挺平常的功能,但后来才知道简直就是Life saver

1. 使用abbrev.properties文件
  首先我想说当时为了用成这个功能就花了不少周折。我在SciTE的菜单中选择open abbreviations file,里面是空的,写了几个保存。发现没有写到SciTE目录下的abbrev.properties文件中去,满电脑找才知道写到 documents and settings里面去了。这个问题很多人碰到,作者在邮件列表中给出一个命令行的解决方法,也可以写成批处理。

set SCITE_HOME=D:\Program Files\Scintilla Text Editor\ start Scite.exe %1


存成start_SciTE.bat即可。用Total Commander的朋友可以把这个图标放在工具栏上,然后把文件往上拖就能用SciTE打开。SciTE关联.tex文件后,如果用双击启动tex 件,则要在双击tex前保证SciTE是用批处理开着的,否则SciTE还是会用doc&settings目录下的设置,包括还原上次打开的文件 session restore)。我干脆就把这个批处理加入到启动菜单,开机就开着SciTE

  然后,用SciTE打开abbrev.properties,输入你想要的缩写,规则很简单: abbreviation=expansion,例如

ltx=LaTeX


2. 定义缩写名
  关于缩写名(abbreviation) 喜欢在等号边上加空格的朋友注意了,等号的左边最好不要有空格,否则要输入ltx加上相应的空格才能展开。等号的右边也是一样,有空格就会展开出空格。缩 写名中不能用#开始,否则注释掉了,但后面可以;不能用空格和tab开始,缩写名不能有=号,因为只接受第一个=号,后面都会认为是展开式中的=号。如果 缩写名重名,后面出现的优先。

3. 定义展开式
  关于展开式(expansion):展开式的书写方式支持标准的转义符--反斜杠'\',比如

up=\\usepackage{}


即:两个连续的反杠输入一个反杠。展开式的书写方式支持一个光标定位符--竖线'|',这样展开后光标会留在这个位置,比如

up=\\usepackage{|}


这样你可以很方便地马上输入宏包名称。要输入一个真正的竖线,连续输入两个竖线'||'即可,例如c语言中的或逻辑

or=||||


展开式不允许回车换行,但转义符中的\n, \t都是有效的,所以换行和制表位都能轻松输入。例如c语言的if语句:

i=if (|) {\n\t\n}


表示展开后光标在小括号里,下面自动把大括号排版并且加入了一个tab。这在写多重循环的时候非常有用,你会发现只要用缩写功能,下面的右大括号都会自动地找到缩进位置。


这几个功能结合着用,可以写出相当复杂的环境,例如我的subfigure环境:

sbf=\\begin{figure}[!htb]\n\t\\centering\n\t\\subfigure[|]{\t % Caption of subfigure in []\n\t\\label{}\t % Label of subfigure in {}\n\t\\includegraphics[width=0.45\\textwidth ]{}}\n\t\\subfigure[]{\n\t\\label{}\n\t\\includegraphics[width=0.45\\textwidth ]{}}\n\t\\caption{}\t % Caption of figure\n\t\\label{}\t % Label of figure\n\\end{figure}


展开后的效果是:

\begin{figure}[!htb]
\centering
\subfigure[]{ % Caption of subfigure in []
\label{} % Label of subfigure in {}
\includegraphics[width=0.45\textwidth ]{}}
\subfigure[]{
\label{}
\includegraphics[width=0.45\textwidth ]{}}
\caption{} % Caption of figure
\label{} % Label of figure
\end{figure}


不但自动插入代码,还把注释原汁原味地加上,因为我老是要去查subfigure里面的中括号写什么,大括号写什么。

  只要花时间,甚至可以把你常用的导言区全部定义成一个展开式,连文档模板都可以写出来,省得学写cls文件。

4. 多重展开
  还有更有趣的,缩写功能支持多重展开!比 如,LaTeX的手动输入要按三次shift,十分麻烦,定义一个ltx=LaTeX就省事了,而LaTeX logo的代码是\LaTeX,并且为了保证不吞掉后面的空格,最保险的写法是\LaTeX{},真不是一般的麻烦,这时可以再定义一条LaTeX= \\LaTeX{},那么,在平时需要LaTeX这五个字母的时候,ltx后按一次ctrl+B,在需要输入logo的时候,ltx按两次ctrl+B OK了!像有一些关键字一般要切换字体来输入,也可以这样:

mt=MATLAB
MATLAB=\\textsf{MATLAB}

再举个例子,section, subsection, subsubsection这三兄弟可以用多重展开这样写

sec=\\section{|}
section{=subsection{
subsection{=subsubsection{

然后输入sec,按一下ctrl+B出来section,两下出subsection,三下出subsubsection,挺俏皮的……
5. 追加展开
  下面的追加展开功能也让人倾倒。比方说经常要给一 段文字/代码什么的两边加括号,SciTE的括号补齐功能本来是好功能,这时反而成了累赘:在左边补开括号后要按del键删掉自动补上的那个闭括号,然后 光标移到最后去加闭括号。SciTE支持选定这部分文字后按ctrl+shift+R打开缩写输入框,例如我的一对中括号是这样的:

ac={|}


那么,我选定文字后ctrl+shift+R再输入ac回车,括号就加上了。也就是说,选定的文字会替换竖线.
6. 合理定义缩写名
  根据熵编码原理(),建议最常用的编最短的码,所以我figure环境就一个f:

f=\\begin{figure}[!htb]\n\t\\centering\n\t\\includegraphics[width=\\textwidth ]{|}\\\\\t % e.g.,[scale=0.75], [width=0.75\\textwidth ]\n\t\\caption{}\n\t\\label{}\n\\end{figure}


因为只要你不按 ctrl+B就不会展开,就算不小心按出来了,ctrl+z马上会把展开式还原成缩写名。而且我还发现,在出现一个缩写名包括在另一个缩写名中的情况时,SciTE用的是贪婪匹配(SciTE说明文档中的说法不对)。SciTE帮助文档说,如果你定义ringgathering两个缩写名,那么在输 gathering后按ctrl+B,只会按ring来展开,事实上是按gatherring来展开的,也就是说,在按下ctrl+B的时 候,SciTE从光标处往前查找,一直匹配到abbrev文件中最长的那个缩写名并展开,并且这与缩写名的顺序无关,这个设置是相当好的(估计是后来改 了,但帮助文档没改)。不过,也可以养成让缩写名完全不互相包含的习惯,例如,section, subsection, subsubsection,我原来是定义成sec, ssec, sssec,这样一个包含一个如果你不放心的话(其实没问题),不如就改成s0, s1, s2(数字表示有几个sub)。


7. 根据文件类型定义单独的缩写文件
  当你开始滥用缩写后,你会发现冲突得厉害,但又不想把缩写名复杂成诸如for@c, for@matlab这样怎么办?SciTE支持每个文件类型单独一个缩写文件。例如,在matlab.properties最后加上
abbreviations.$(file.patterns.matlab)=$(SciteUserHome)/abbrev_matlab.properties
再新建一个abbrev_matlab.properties文件放在根目录下,就可以在打开matlab文件后,用菜单'options - open abbreviations file'来打开独立的缩写文件进行编辑。保存后不用重启SciTE立即生效。那么,在abbrev_matlab.properties里面写 for=for i=|\n\t\nend,在abbrev_cpp.properties里面写for=for(i=0;i<|;i++){\n},这样你只要记 一个forok了。

最后,警告:很容易中毒,现在我在这里回帖的时候经常想着缩写&展开....

TM 2008让我用回QQ



我对QQ的成见是非常大的,在旧的日志中曾经用大量篇幅阐述过,在此不赘述。为了这种成见我甚至放弃了大批的QQ上的同学、朋友。

在QQ之外,腾讯还模仿MSN/WLM开发了一个Tencent Messenger。TM出道已经很久,在国内也赢得过一些“白领”们的青睐。前不久,在学校的电脑上无聊,抱着“试试看”的心态装了TM 2008 Preview 3英文版。

受Vista影响而重新设计的TM让人眼前一亮:玻璃效果的面板、位置清晰的按钮、混然一体的框架以及一扫而光的广告,都让我觉得这是一个“可以用了”的聊天工具。与Windows Live Messenger相同的地方在于,TM的用户群明显也定位在非娱乐环境:QQ秀和Q空间完全不可见,没有闪屏功能等等,这一切正好满足我的需要。

有鉴于此,最近觉得自己能摆脱对QQ的厌恶情绪了。总之我用QQ只是为了聊天,腾讯的那些行为,影响不到我,故而眼不见心不烦就是了。