字体家族

字体家族有成百上千种,常见的例如 Times、Courier 和 Helvetica。这些字体家族通常可以分为三大类:衬线体(serif)、无衬线体(sans serif)和等宽字体(monospaced)。LaTeX 命令通常用简写形式分别表示它们:rmsftt

默认情况下,LaTeX 使用 Computer Modern,这是 Donald Knuth 为 TeX 设计的字体家族。它包含衬线、无衬线和等宽字体,每种字体都有多种粗细和光学大小。

LaTeX 文档的正文默认使用罗马字体(衬线体),但你可以通过设置字体家族的默认值来更改:

\renewcommand{\familydefault}{<family>}

其中 <family> 可以是以下之一:

  • \rmdefault

  • \sfdefault

  • \ttdefault

强调文本

TeX 识别两种类型的标记命令:

  • 语义\emph{text} —— 默认会使文本变为斜体。可以通过 \renewcommand\emph{\textbf} 来覆盖此行为,根据需要/偏好更换为加粗。

  • 视觉:实际应用所需格式的命令:

    • 字体家族:\textrm{}\textsf{}\texttt{}

    • 字重:\textbf{}(加粗)、\textmd{}(中等粗细)

    • 字形:\textup{}(直立)、\textit{}(斜体)、\textsl{}(倾斜)

这些是常用的视觉标记元素。有关更多字体样式的参考,请参见“字体样式”部分。

要为某个单词或短语添加强调,可以使用 \emph{text} 命令,通常会使文本变为斜体。

I want to \emph{emphasize} a word.

命令是动态的:如果你强调一个已经在强调句子中的词,它会恢复为正常字体。

\emph{In this emphasized sentence, there is an emphasized \emph{word} which looks upright.}

你可以通过加粗文本来更强烈地强调某个词或短语,尤其是当读者在阅读文本时可能需要找到的关键词。由于加粗文本通常是段落或页面上最先被阅读的部分,因此应适度使用。加粗文本也可以替代斜体,在使用无衬线字体时提供更大的对比度。加粗文本可以通过 \textbf{text} 命令生成。

\textbf{Bold text} may be used to heavily emphasize very important words or phrases.

字体样式

字体通常有多种样式和粗细,例如斜体和加粗。以下表格列出了访问常见字体形状所需的命令。

注意:在命令形式中不允许段落换行。

LaTeX 命令 等效的切换 输出样式 备注
\textnormal{...} {\normalfont ...} 文档字体家族 这是默认或常规字体。
\emph{...} {\em ...} 强调 通常是斜体。若在斜体文本中使用 emph{},会移除斜体效果。
\textrm{...} {\rmfamily ...} 罗马字体家族
\textsf{...} {\sffamily ...} 无衬线字体家族
\texttt{...} {\ttfamily ...} 等宽字体家族 这是固定宽度字体,通常用于打字机文本。某些字体中,零会有一个短横线,以区别于字母“O”。
\textup{...} {\upshape ...} 直立字体 与常规字体相同。
\textit{...} {\itshape ...} 斜体字体
\textsl{...} {\slshape ...} 倾斜字体 相较于斜体略有不同的倾斜效果。
\textsc{...} {\scshape ...} 小型大写字母
\uppercase{...} 大写字母(全大写) 同样适用于 \lowercase,但有一些注意事项,请参见相关文档。
\textbf{...} {\bfseries ...} 加粗字体
\textmd{...} {\mdseries ...} 中等粗细字体 常规字体粗细。
\textlf{...} {\lfseries ...} 轻型字体 比正常字体轻的字体粗细,并非所有字体都支持。

通常,推荐使用命令而不是其等效的切换,因为前者会自动修正紧接在所选样式后的空格问题。

你可能已经注意到 LaTeX 中缺少下划线,这主要是因为下划线是打字机时代的副产品,且不建议在有斜体和加粗字体可用时使用。然而,在某些情况下,如编辑过程中的变化突出,下划线可能仍然有用。虽然可以通过 \underline{...} 命令实现下划线,但这种方式下的文本不会正确换行。此时,使用 soul 包的 \ul{...}ulem 包的 \uline{...} 命令会更好。默认情况下,后者会覆盖 \emph,将其改为下划线而非斜体。如果这不是你的意图,可以使用 normalem 选项,即:

\usepackage[normalem]{ulem}

这两个包也提供了删除线文本,分别为 \st{...}\sout{...}

调整文本大小

内置字体大小

要相对于默认的正文大小调整文本大小,可以使用以下命令:

命令 输出
\tiny sample text
\scriptsize sample text
\footnotesize sample text
\small sample text
\normalsize sample text
\large sample text
\Large sample text
\LARGE sample text
\huge sample text
\Huge sample text

这些命令会在给定的范围内改变大小。例如,{\Large some words} 仅会改变部分文本的大小,并不会影响文档中其余部分的字体。它适用于文本的大部分部分。

{\Large\tableofcontents}

这些命令不能在数学模式中使用。不过,可以通过使用包含大小命令的 \mbox 命令,使公式的一部分设置为不同的大小。新的大小会立即生效;如果需要将整个段落或单位设置为某个特定大小,大小命令应包含空行或 \end{...} 来限定单位的范围。

默认情况下,\normalsize 是 10 磅,但可以在 \documentclass 声明中更改,例如 \documentclass[12pt]{article}。请注意,并不是所有文档类都有唯一的尺寸来适配上述所有大小命令。

绝对点大小

字体大小 标准类(除了幻灯片) beamer AMS 类,memoir 幻灯片
\tiny 5 6 6 6
\scriptsize 7 8 8 7
\footnotesize 8 9 10 8
\small 9 10 10.95 9
\normalsize 10 10.95 12 10
\large 12 12 14.4 10.95
\Large 14.4 14.4 17.28 12
\LARGE 17.28 17.28 20.74 14.4
\huge 20.74 20.74 24.88 17.28
\Huge 24.88 24.88 24.88 20.74

在 TeX 中,1 磅大约等于 0.35136 毫米。大多数现代计算机程序使用的标准点大小(即桌面排版点或 PostScript 点)使 1 磅约等于 0.3527 毫米,而标准的欧洲点大小(即 Didot 点)使 1 磅约等于 0.37597151 毫米(参见:point (typography))。

任意大小

\tiny...\Huge 命令通常已足够满足需求,但有时你可能需要一个任意的字体大小。可以使用命令 \fontsize{<size>}{<line space>}\selectfont 来实现。例如:

\fontsize{5cm}{5.5cm}\selectfont

这会将当前字体大小设置为 5 厘米,行间距设置为 5.5 厘米。

如果你使用 latexpdflatex 引擎,可能会收到类似以下的警告:

LaTeX Font Warning: Font shape `OT1/cmr/m/n' in size <142.26378> not available
(Font)              size <24.88> substituted on input line 103.

这是因为这些较旧的引擎只支持固定的字体大小(在 5 到 17 磅之间)。当 Donald Knuth 设计 Computer Modern 字体时,他为这些大小分别创建了单独的字体文件,每个文件的笔画宽度和间距都针对特定的大小进行了优化。为了避免扭曲,默认情况下禁用了这些字体的缩放。

使用 lualatexxelatex 时,这个问题会得到解决,因为它们使用 Latin Modern——Computer Modern 的矢量化版本——作为默认字体家族。这样,它仍然提供了每个原始光学大小的单独文件,但会自动缩放最接近的一个来满足任意大小要求。

使用替代字体

当 TeX 在 1970 年代末设计时,矢量字体在任何常见格式中都不存在——直到 1982 年 PostScript 才发布。因此,TeX 设计时使用了自己的字体系统 METAFONT。随着时间的推移,TeX(和 LaTeX)被扩展以支持 PostScript 字体,现代的 LaTeX 引擎还支持现代系统上常见的 TrueType(TTF)和 OpenType(OTF)字体。

使用 TTF 和 OTF 字体

如果你正在使用 lualatexxelatex,可以使用 fontspec 包来使用 TTF 和 OTF 字体:

\documentclass{article}

\usepackage{fontspec}
\setmainfont[Ligatures=TeX]{Georgia}
\setsansfont[Ligatures=TeX]{Arial}

\begin{document}
Lorem ipsum...
\end{document}

[Ligatures=TeX] 选项允许你使用标准的 TeX 字形连接符,而不是一些不太可能在键盘上找到的 Unicode 字符。例如,--- 可以用来创建 em 连字符(—),引号可以像这样输入 ``like this'',而不是 “like this”,依此类推。

fontspec 包非常可配置。详情请参考手册[3],下面将介绍一些基础内容。

选择字体文件

给定字体家族的不同粗细和样式通常会存储为单独的字体文件。例如,一个典型的字体可能提供四个文件来表示其常规粗细、斜体、加粗和加粗斜体。fontspec 通常可以推断出这些单独文件的名称。然而,许多字体有多个粗细版本——例如,Futura 的一些版本有 light、book、medium、demi、bold 和 extra bold 等多个粗细。有时,小型大写字母会被单独存储为文件。

我们可能需要手动选择某些粗细,以实现特定的外观或更好地匹配文档中其他字体的粗细。例如,使用 Futura 字体时,假设我们要使用 "book" 粗细作为默认粗细,"demi" 粗细作为加粗,那么这些字体文件可能如下所示:

  • Futura-Boo 表示正体书籍粗细

  • Futura-BooObl 表示倾斜书籍粗细

  • FuturaSC-Boo 表示小型大写字母,书籍粗细

  • Futura-Dem 表示正体半粗(加粗)

  • Futura-DemObl 表示倾斜半粗字

我们的字体设置可能如下所示:

\usepackage{fontspec}
\setmainfont[
    Ligatures=TeX,
    UprightFont = *-Boo,
    ItalicFont = *-BooObl,
    SmallCapsFont = *SC-Boo,
    BoldFont = *-Dem,
    BoldItalicFont = *-DemObl
]{Futura}

注意,不必输入完整的 Futura-BooFutura-BooObl 等名称,我们可以使用 * 来插入基本名称。

控制字体特性

OpenType(OTF)格式允许字体设计师嵌入可以开启或关闭的字体特性,例如:

  • 字形的替代版本

  • 线性和“旧式”数字,分别具有表格和比例间距[4]

  • 最多三组字形连接符:标准、上下文和历史

  • 上标和下标字形

  • 小型大写字母(与标准的大写和小写字符在同一文件中)

这些特性可以通过不同的 fontspec 选项开启或关闭。如果我们想设置正文文本为 Linux Libertine 字体并使用旧式比例数字,可以如下设置字体:

\setmainfont[
    Ligatures=TeX,
    Numbers={OldStyle, Proportional}
]{Linux Libertine}

可以使用 \addfontfeatures{...} 来开启或关闭特性。例如,如果你想设置表格为线性、表格数字,可以这样设置:

{\addfontfeatures{Numbers={Lining, Tabular}}
    \begin{tabular}{l r}
        Widgets: & 25 \\
        Gadgets: & 6 \\
        Whatsits & 24 \\
    \end{tabular}
}

更改 latexpdflatex 中的字体

如果你没有使用 Unicode 支持的引擎,字体选择会更复杂(见下面关于编码的讨论)。对于 latexpdflatex 的字体配置,以下是一些有用的资源:

  • LaTeX 字体目录

  • LaTeX 字体命令

  • 如何在 LaTeX 中更改字体

  • 理解 TeX 字体的世界并掌握字体安装的基础

  • 使用字体安装工具 "Fontinst" 进行字体安装:“对于一次性项目,你可以通过字体安装(即 Fontinst)来简化安装过程,从而得到更易管理的文件和更清洁的 TeX 安装。”

字体编码

数字化人类语言是一个复杂的话题,自 TeX 诞生以来已经有了显著的发展。

Unicode

如今,计算机系统通常使用 Unicode 来表示文本。简而言之:

  • 一个 Unicode 文本文件由一系列代码点组成,每个代码点可以表示一个字符、一个重音符号或其他结合符号,或者一些非打印字符,如指示打印随后的文本时从右到左显示。

  • 这些代码点中的一个或多个组合在一起表示一个字形集或字形(我们非正式地称之为“字符”)。

  • 现代字体格式如 TrueType 和 OpenType 包含编码表,将代码点映射到字体文件中包含的字形。

  • LuaLaTeX 和 XeLaTeX 使用这些工具将 Unicode 编码的输入文件(LuaLaTeX 接受 UTF-8 文件,而 XeLaTeX 更为灵活,接受 UTF-16 和 UTF-32 文件)渲染为 PDF 文档。

TeX 编码

原始的 TeX 和 LaTeX 是在 Unicode 出现之前设计的,使用了一个非常不同的编码方案。当使用 latexpdflatex 时,你必须选择一个输入编码,TeX 引擎使用该编码来解释你的文件,并选择一个输出编码,TeX 引擎用它来将输入映射到字形。默认的字体编码是 OT1,这是原始 Computer Modern 字体的编码。它仅包含 128 个字符,很多来自 ASCII,但也省略了一些字符,并包含了许多不在 ASCII 中的字符。当需要重音字符时,TeX 会通过将普通字符与重音符号结合来创建它们。虽然最终输出看起来正确,但与基于 Unicode 的方法相比,这种方法有一些缺陷:

  • 它会导致包含重音字符的单词中的自动断词功能失效。

  • 在 PDF 中搜索带有重音的单词将会失败。

  • 通过 PDF 查看器提取(例如复制粘贴)"Ä" 这种变音符号,实际上提取的是两个字符 '"A'

  • 一些拉丁字母无法使用这种方法创建,更不用说非拉丁字母的字母(例如希腊字母或西里尔字母)了。

为了克服这些不足,创建了几种其他的 8 位输出编码。T1 编码中的扩展 Cork(EC)字体包含了大多数使用拉丁字母的欧洲语言的字母和标点符号。LH 字体集包含了排版西里尔字母文档所需的字母。由于西里尔字形的数量众多,它们被安排为四种字体编码——T2A、T2B、T2C 和 X2。CB 套件包含了用于希腊文本排版的 LGR 编码的字体。通过使用这些字体,你可以改善/启用非英语文档中的断词功能。使用新的 CM 类似字体的另一个优点是,它们提供了 CM 字体家族的所有粗细、形状和光学大小的字体。

所有这些在 OT1 中是不可能实现的;这就是为什么你可能需要更改文档的字体编码。

注意,不同的字体支持不同的输出编码。例如,默认的 Computer Modern 字体不支持 T1。如果你没有这些字体,你可能会经常看到(取决于你的 TeX 安装)TeX 选择一种 Type3 字体,如 Type3 EC,这是一种位图字体。位图字体在放大或打印时看起来很难看。

如果在使用 T1 后,你发现字体质量非常低,那是因为系统中没有适当的字体。你需要安装 cm-superlmodern。这是一个非常常见的错误!

字体编码包

fontenc 包告诉 LaTeX 使用哪个字体编码。字体编码可以通过以下方式设置:

\usepackage['encoding']{fontenc}

其中 encoding 是字体编码。可以同时加载多个编码。

如果你使用 T1 编码(假设它已经安装),那么 CM Super 字体会自动加载。对于 lmodern,你需要在设置 T1 编码后加载该包:

\usepackage[T1]{fontenc}
\usepackage{lmodern}

ae 包(几乎是欧洲的)已过时。它为带有特殊字符的单词的断词提供了一些解决方法。如今,像 lmodern 这样的字体已不再需要这些方法。使用 ae 包会导致使用 pdflatex 生成的 PDF 文件中的文本编码问题(例如文本提取和搜索),并且还会出现排版问题。

PDF 字体和属性

PDF 文档可以嵌入字体文件。这使得它们具有便携性,因此得名可移植文档格式(Portable Document Format)。

许多 PDF 查看器具有属性功能,用于列出嵌入的字体和文档元数据。

许多 Unix 系统使用 poppler 工具集,其中包括 pdfinfo 用于列出 PDF 元数据,pdffonts 用于列出嵌入的字体。

参考文献

  • Matthew Butterick. "Bold or italic". Practical Typography.

  • Matthew Butterick. "Underlining". Practical Typography.

  • fontspec 手册

  • Matthew Butterick. "Alternate figures". Practical Typography.


Last modified: Sunday, 20 April 2025, 10:40 AM