LATEX文档本就是对字符的排版,一般地,字符会涉及字体、字号、字形等多个属性。TEX项目刚开始建立的时候(1979年),只有十几种字体。后来随着需求的增加、样式的丰富,字体也变得越来越多。
本节主要介绍什么是字体,读者对字体有一个简单的了解,能够掌握如何应用即可。一个字符必然会有一定的大小,所以字号常常是读者更加关心的。标准LATEX预定义了一些字号的命令,根据所依赖的宏包,可能还有其他特定命令控制字号。英文写作常遇到大小写转换问题,本节也做了简单介绍。最后介绍字体、字号、插入一个字符间距问题。
按不同的分类标准,字体可以分为有衬线与无衬线两大类,也可以分为单间距与比例间距两大类,所谓衬线就是字符末端的收尾笔画(或锋利,或圆润),单间距字符按照预置大小排列,比例间距字符按照字符大小比例排列。
字体族有相同的设计原则,可以通过大小、粗细、宽度、形状区分。标准LATEX预定义字体族有:罗马字体(roman family)、无衬线字体(sans serif family)、打字机字体(typewriter family)。
要修改文本字体,有两种方式:一种是直接用字体声明,如\bfseries;一种是用带参数的命令修改,如\textbf{...}。这两种方式的区别在于,前者可以影响声明后面所有的文本,后者只会影响部分文本(即括号里面的文本,且括号里面的文本允许断行)。如果是一段文本或者某些个别单词,还可以用对应的环境包围,如\begin{bfseries}...\end{bfseries}。
类似地,根据字体的属性,可以从所属的字体集、字体粗细、字体宽度、字体形状等方面修改字体,标准字体修改命令和声明如表2.7所示。
表2.7 标准字体修改命令和声明
例 打印如表2.7所示不同字体文本时,可以有以下三种方式,以 typewriter 类型字体为例:
上述LATEX命令打印效果如下:
typewriter typewriter typewriter
需要注意的是,\ttfamily声明中不能带有参数,即不能有\ttfamily{...}这样的形式,否则会导致后面的字体加粗。案例中用花括号将\ttfamily包围,是为了缩小其作用范围。这条规则适用于表2.7中所有的命令。
表2.7中的\textrm、\textsf、\texttt 命令用于切换字体族,\textmd、\textbf命令用于设置字体粗细,\textup、\textit、\textsl、\textsc 命令用于设置字体的形状。可以从字体族、粗细、形状三个维度同时描述一个字体,即不同维度可以叠加,同一维度不能叠加,叠加后的效果如表2.8所示。
表2.7中描述的\normalfont字体声明表示普通格式,相当于\rmfamily\mdseries\upshape,适用于复杂字体环境下恢复普通字体,使用方法相同。
相较于英文等语言,中文的字体相对简单,不会有很多复杂成套的字体。在xeCJK和CJK 宏包下,中文字体与英文字体选择的命令分离,选择中文字体族用\CJKfamily 命令,如\CJKfamily{hei}。在ctex宏包下,简化了这种表示方式,直接把字体名称作为命令,如\heiti。ctex宏包中预定义的中文字库如表2.9所示,如果要禁用中文字库,就设置 fontset=none。在表2.9所示的中文字库中,ctex 宏包还预定义了一些字体命令,如表2.10所示。
表2.8 从字体族、粗细、形状三个维度描述字体
表2.9 ctex宏包中预定义的中文字库
表2.10 ctex宏包中预定义的字体命令
在数学公式编辑中,经常遇到字母斜体、加粗等形式,在LATEX中预定义了一批字体命令,专门用于公式书写,如表2.11所示。表2.11所示命令都带有一个参数,即被作用的文本。需要提醒的是,这些命令既然用于数学公式编辑,就需要放在公式环境中。最简单的行内公式环境为$...$,更多公式环境的介绍,请阅读第3章。
除了表2.7~表2.10中预定义的方式之外,还有很多个性化字体及符号,如表2.12所示。表2.12中包含了很多字体宏包,包括文本字体和数学公式字体,读者可以查阅对应的说明文档学习。表2.12中还列举了一些特殊符号(如常用的勾叉)的宏包,部分宏包提供的符号也可以用于数学公式编辑,在对应的宏包里面查询即可。
表2.11 公式中预定义的字体
表2.12 个性化字体宏包
字号指文字符号的大小,被NFSS当作字体的坐标之一。标准LATEX中预置了10个可以设置全局文档字号的命令,如表2.13所示。表2.13所示命令可以带一个参数,即作用的文本,也可以不带参数,作用于后面全部的文本。为了缩小作用范围,还可以将表2.13中的命令放在一个分组(一对花括号)中。
表2.13 标准LATEX预置的字号
表2.13所示的字号大小由 LATEX 标准定义,为绝对大小,不随文档环境改变字号大小。但是定义的字号大小依赖于文档类型,也就是说,文档类型或文档大小选项会影响字号的具体大小,如表2.14所示 。
表2.14 不同类型(大小)文档下的字号大小
如果希望文档中的某些字号跟随文档当前字号大小设置,则可以引入 relsize 宏包实现。relsize 宏包中定义的\relsize 命令,需要传入一个整型参数,表示相对当前字号增减的步长。例如当前字号为\Large,\relsize{-2}即相对于\Large减小2个单位,变成了\normalsize(见表2.13)。
例 下面的LATEX文本,利用\relsize命令可相对于当前文本调整文本字号。
上述LATEX命令打印效果如下:
这是\Large字号的文本,设置为\relsize{-2} 字号的文本,后者相对于前者明显变小。
通过花括号限定\Large作用的范围,\relsize{-2}相对于当前字号减小2个单位。为了方便,relsize宏包还定义了如表2.15所示命令。
表2.15 relsize宏包中定义的命令
例 表2.15所示命令控制字号大小。
上述LATEX命令打印效果如下:
这是\Large字号的文本,设置为\smaller字号的文本,后者相对于前者明显变小,与\large字号相同。或者用\textsmaller命令,字号与\normalsize 相同
在表2.15所示命令中,\textsmaller 命令与\textlarger 命令中的参数都是整数,relsize宏包还支持分数类型的参数,使用\relscale命令或者\textscale命令,如表2.16所示。例如\textscale{1.2}{text}表示根据当前文本字号扩大20%,\relscale{0.8}{text}表示根据当前文本字号缩小20%。
表2.16 relsize宏包中定义的其他命令
例 表2.16中的\mathsmaller 命令和\mathlarger 命令适用于数学模式,使用两个\mathlarger对字符进行双倍放大。
上述LATEX命令打印效果如下:
a×b/=a×b
a×b/=a×b
仔细观察,×,×,×三者的大小,的确是从大到小。也就是说,\mathsmaller 和\mathlarger等命令可以叠加使用。
除了表2.13中定义的字号命令之外,在ctex宏包中还可以用\zihao{num}命令定义字号,该命令带有一个参数,如表2.17所示。表2.17中的参数均为整数,例如\zihao{0}表示初号字。参数-6~8分别代表了对应的字号大小,单位为dp,对应中文字号由初号到八号。
上述LATEX命令打印效果如下:
表2.17 ctex宏包中的zihao命令(单位为dp)
在英文文档中,常遇到全大写或全小写的段落,在标准 LATEX 中有\MakeUppercase命令和\MakeLowercase 命令,分别实现英文字母的大写转换为小写和小写转换为大写,例如要将“text”转换为“TEXT”,使用\MakeUppercase{text}即可。
使用\MakeUppercase命令和\MakeLowercase命令时存在这样一个问题:当文本中包含数学公式、\label、\ref、\cite等命令时,可能会导致不必要的错误,如引用错误。为此,textcase宏包提供了\MakeTextUppercase命令和\MakeTextLowercase命令,如表2.18所示,能够智能识别数学公式和交叉引用等命令。
例 有下面这样的LATEX文本,将字母全部转换成大写形式,并给出打印结果。
上述LATEX命令打印效果如下:
\MakeTextUppercase AND\MakeTextLowercase SHOWN IN TABLE2.18ARE DE-FINED IN TEXTCASE PACKAGE.
从这个案例中我们看到,\MakeTextUppercase里面包含了\ref,依然能够正确引用。如果\MakeUppercase中包含\ref等,将出现引用错误。
在一大段文本中,有时候希望个别位置的内容独立于\MakeTextUppercase 或者\MakeTextLowercase,即部分内容不做全部大写或者小写的转换,可使用textcase宏包中的\NoCaseChange命令,如“I Love YOU,CHINA!”,其命令为
\MakeTextUppercase命令和\MakeTextLowercase命令还可以与\textbf、\emph等命令结合使用,打印粗体。
表2.18 大小写智能转换命令
除了空格,还有必要谈一谈两个字符之间的距离,这是水平距离。既然要谈到距离,就要先介绍一下长度单位,如表2.19所示。表2.19中所示单位可以用在各种表示长度的地方。
除了后面第3章的表3.23中列举的间距控制之外,还有\enspace、\nobreakspace(简写为~)等命令,这些命令都可以在水平方向上产生一定的间距。需要注意的是,\符号与后面的字符不能断开,否则就表示\⊔(其中⊔符号表示空格),而它们所表示的间距是不同的。
表2.19 长度单位
例 \符号与后面的字符不可断开,否则表示间距为\⊔。
很明显,这两种方式产生的间距完全不同,除了\,符号,其他命令也是如此。所以,在使用的时候要格外小心。
还可以用\hspace 命令指定间距。\hspace 命令与\vspace 命令分别表示水平方向和垂直方向上的间距,在本书中多次提及,它们的使用范围非常广泛。它们都有一个参数,用于指定间距大小(记得带上长度单位),如\hspace{2cm},即在水平方向上增加2cm的间距。
有一个特殊的长度\fill,它的具体长度我们并不知道,是根据文档剩余空间确定的,可以作为\hspace的参数。类似地,\stretch命令也可以作为\hspace的参数,\stretch有一个参数,如\hspace{\stretch{2}},相当于2倍\fill。
例 用\hspace{\fill}打印一个间距,\hspace{\fill}可缩写为\hfill。
上述LATEX命令打印效果如下:
我是中国人。
我是中国人。
我爱我的祖国。
我爱我的祖国。
与\hfill类似的还有\hrulefill、\dotfill等,分别表示中间填充横线和圆点。例如用\dotfill作为填充:
上述LATEX命令打印效果如下:
我................是................中................国................人。
类似地,\vspace为垂直间距,也有\vfill,等价于\vspace{\fill}。LATEX中定义了一些表示垂直间距的命令:\smallskip、\medskip和\bigskip,分别由smallskipamount、\medskipamount和\bigskipamount定义。