概述

多数企业都使用电脑进行办公,企业的员工经常需要浏览网页或撰写文档。在这些场景中,使用者大部分时间都是透过屏幕上显示的文字来接受及输出信息的。文本在屏幕上显示的效果会影响用户阅读的效率及舒适性,影响使用者的工作效率。

近期,个人对 GNU/Linux 发行版系统内部通用文本显示流程进行了一些梳理,整理了一些文档,以积累一些与文字渲染相关的知识基础。如其中有事实问题或内容建议,强烈欢迎大家指正。

本文主要内容:本文主要围绕字体,讲述与现代数字排印相关的一些概念。内容包括:

  • 排印技术的简要历史;
  • 字体相关基本名词及基本过程。

本文为系列 “数字化的活字印刷术” 的上篇。在本系列下篇《字型渲染》中,还将介绍:

  • 以一个内存中的字符串从其初始状态(字符数组)到最终上屏显示的完整过程,来展现字体格式、Linux 系统字体管理机制及一般的文本渲染方式;
  • 穿插介绍与排版、印刷、字体、字体渲染有关的一些常见概念。
  • 使用字体的合法合规性。

排印技术的简要历史

  • 本文所称的字体 (Font) 是随着排印技术一起产生的概念,是印刷时使用的能复用的字体风格,与手写、雕刻的的字形风格有所不同。
  • 汉字字体的历史:
    • 在公元 7 世纪唐朝 雕版印刷术 (Woodblock Printing) 被发明,中文排印字体随之诞生。
    • 宋朝印刷正体:在宋朝,官方和民间曾发展出一套用于印刷的正体字,也就是我们所知的 “宋体字” 的前身。但是,宋朝的字形和我们今天看到的 “宋体字” 有许多不一致的地方,它更像我们认知中的 “楷体”。
    • 明朝印刷正体:在明朝,印刷正体逐渐演化成与今天看到的 “宋体字” 相似的风格。由于明朝改良的字形易于雕刻,字形便于走刀,能满足当时的印量,而得以在国内及同在汉字文化圈的日本、朝鲜、越南等地发扬。

宋朝的《姓解》宋朝的《姓解》
明朝的《南齐书》明朝的《南齐书》

  • “宋体字”:在中国 “宋体” 指的是现在采用的标准印刷正体,而不是宋朝的印刷正体。事实上在日本、南韩,由于明朝的推动作用而,与中国 “宋体” 相似字形的字体被称为 “明体” 或者 “明朝体” (Ming / Min Cho)。
  • 当代的宋体字:为了适应电子印刷和屏幕显示,步入 20 世纪后中国和日本等地又对宋体字进行一番改造。现在电脑中使用的宋体字字形是中、日两地相互借鉴后演化而成的,更加端正锐利,书法味变弱,符合现代设计哲学中所需的明快感。

  • 西文字体的历史:
    • 最早的西文排印字体:德国人 Johannes Gutenberg 于 15 世纪中期发明西文活字印刷术时,使用的字形是当时在正式的手写文献中普遍采用的 Gothic 风格字体。
    • 最早的罗马体:欧洲活字印刷被发明后,很快就随着贸易路线在欧洲各国被广泛使用。但是欧洲各地区采用的手写字体的风格不尽相同。当时在意大利有一种手写字体 “Rotunda” 在印刷中广受欢迎,它随后就成为了我们今天熟知的 Roman 字体的前身。
    • 现代罗马体:Roman 字体在诞生初期,还保留着一些旧式 Gothic 风格。在 15 世纪后期,文艺复兴的浪潮使一种由 Nicholas Jenson 改良的 Roman 字体风靡欧洲。对当时的 “人文主义者” 而言,Gothic 风格象征着 “黑暗的历史”,而新式 Roman 体则象征着新时代的到来。

  • Times New Roman 字体:我们所熟悉的 Times New Roman 字体是 Monotype 公司在 20 世纪初为英国《泰晤士报》 (Times) 制作的正文字体,其中规中矩、四平八稳,具有易读性及能降低印刷成本,后来被内置在 Windows 系统中向公众分发。

计算机字体相关基本名词解释及基本过程

与字体相关的名词较多,而有的是我们平常经常见到和用到的。这里介绍的字体相关名词及过程,是在计算机字体语境下的定义,不涉及活字印刷、雕版印刷的语境。

字体的分类法

汉字字体多以风格分类,如宋体、黑体、楷体、行楷等。但是,西文(拉丁字母)由于使用的人数 / 地区较多且分散,历史上产生了风格各异的字体,以风格来分类会比较困难。
在排印中,一般将西文字体按照 字母形状 分类,即:

  • Monospace (等宽):如 Ubuntu Mono。字符宽度相同的字体,我们可以说它属于 monospace 字体族。这种字体用于需要字符严格对齐的场合,例如源代码、终端界面。对于中文字体而言,并不存在等宽与比例的差别,因为所有中文字都是等宽的。我们平常所说的 “xx等宽中文” 其实只是说该字体的西文部分是等宽的。
  • Sans Serif (无衬线):如 Helvetiva。是指笔画末端没有修饰 (衬线) 的字体,通常用于屏幕显示。中文的黑体与圆体就属于此类字体。很多非专业人士会将粗体与黑体混为一谈,造成概念上的混淆,应注意区分。

“Sans” 是法语,意思是 “无”。

  • Serif (衬线):如 Times。是指笔画末端有修饰 (衬线) 的字体,通常用于打印。

衬线 / 非衬线字体的特点衬线 / 非衬线字体的特点

字体及排印的概念

  • 字形(Glyphs)是用来描述字体形状的数据结构。有 矢量字形 和 点阵字形 之分。
    • 矢量字形:这种字形以 连续曲线 的方式存储在电脑中。由于曲线是连续的,因此即使在也不会产生失真。
    • 点阵字形:这种字形以 2D 像素表 (位图 / Bitmap) 的方式存储在电脑中。由于像素是离散的,因此对其进行放大会造成失真。

  • 字体(Font)是一系列字形的集合。

字体是一系列字形的集合字体是一系列字形的集合

  • 栅格化、光栅化、位图化 (Rasterise):屏幕、打印机是以位图进行显示和印刷的的。文字在进行屏幕显示及打印时,如果使用的是 矢量字形,则其需要被先处理成 一定分辨率(像素密度 / PPI)及尺寸 的 2D 的图像格式。
  • 字体风格(Style):我们一般说的 Regular、Italic、Oblique、Small Caps 都是字体风格。需要注意 Italic 和 Oblique 的区别。

斜体字类型斜体字类型

  • 字体族(Font Family):是一组相关字体的集合。
    • 字体族中一般包含多种 风格(Style)的 变体(Variant),如常规、粗体、斜体、粗斜体等。
    • 常见的 Times、Arial、Helvetica,思源黑体、思源宋体 等字体都提供了一组字体族。
    • 我们一般说的 xx字体,实际上指的就是 xx字体族。比如我们说 “这篇文档的英文部分请使用 Times New Roman 字体”,实际上说的是 “这篇文档的英文部分请使用 Times New Roman 字体族”。

  • 通用字体族:
    • 我们已经知道,Serif、Sans Serif、Monospace 并不代表特定的字体,而代表字体所属的风格分类。
    • 但是,在大部分 GNU/Linux 发行版系统的字体列表中,确实能够看到到 “Serif” “Sans Serif” 或 “Monospace”。
    • 事实上,字体列表中的 “Serif” “Sans Serif” 或 “Monospace” 也确实并不表示特定的字体 —— 它其实指向的是系统为这三种风格配置的默认字体。
      • 例如,在 Ubuntu 系统上,默认的 “Monospace” 字体是 Ubuntu Mono。因此,如果在字体列表中选择 “Monospace” 字体,实际上选择的是 “Ubuntu Mono”;

KDE Konsole 的字体列表中,确实能够看到到 “Serif” “Sans Serif” 或 “Monospace”。它其实指向的是系统为这三种风格配置的默认字体。KDE Konsole 的字体列表中,确实能够看到到 “Serif” “Sans Serif” 或 “Monospace”。它其实指向的是系统为这三种风格配置的默认字体。

字体列表里包含 “Serif” “Sans Serif” 或 “Monospace” 是为了提供一种检索默认字体的方式。App 不必知道系统配置,也能加载到正确的默认字体。

例如,App 在遇到要显示 “衬线” 字体的地方时,只需加载名为 “Serif” 的字体即可,不必关心在系统上 “Serif” 最终会映射到哪一个字体。

屏显和印刷使用的单位

  • 磅(Point,缩写 pt)是 印刷单位,描述字号。磅的尺寸有多种定义,一般我们使用 PostScript 标准的磅尺寸,1pt = 1/72 inch = 0.35 mm。
  • 像素(Pixel)是 屏显、印刷都适用的单位,描述清晰度。
    • 通常采用 分辨率(Resolution)来描述屏幕容纳像素的能力,其单位是 像素x像素。
    • 通常采用 像素密度(Pixel Density)来描述屏幕、打印机等设备出图时的细腻程度,其单位是 每吋像素数(Pixel per Inch,PPI)。

拉丁字体排版的概念

注:以下内容多数参编自 Google Fonts 知识库

  • Serif(衬线),有点像是汉字的笔锋。
  • Ligature(连字),指的是将相邻字符连在一起。

  • Small Cap(小型大写字母),指的是一种排版风格,令字符串中的小写字母排版出来跟小写字母尺寸相似、但是形状和大写字母保持一致。

  • Baseline(基线)
  • x-height:小写字母的统一高度,常用字母 x 的高度来衡量。
  • Cap height:大写字母的统一高度
  • ascender、descender:小写字母中高过 x-height 的部分及低于 baseline 的部分。

  • Old-fasion Numerals(旧式数字)如上图分别展示了普通数字、普通旧式数字,等宽数字、等宽旧式数字。
    • In fact they work even better for body text because of the way we’re used to reading: They have ascenders and descenders, and therefore don’t interrupt the flow of reading lowercase characters, resulting in a more comfortable reading experience.

后续篇章

在本系列下篇《字型渲染》中,还将介绍:

  • 以一个内存中的字符串从其初始状态(字符数组)到最终上屏显示的完整过程,来展现字体格式、Linux 系统字体管理机制及一般的文本渲染方式;
  • 穿插介绍与排版、印刷、字体、字体渲染有关的一些常见概念。
  • 使用字体的合法合规性。