数学字体艺术探索
1. 引言
长期以来,大多数包含数学公式的文档都使用特定的字体进行排版,如Knuth的Computer Modern字体。近年来,也设计出了一些替代字体,如Stix字体和TEX Gyre字体。这些手工制作的字体质量很高,但开发成本较大。现在有数千种非数学用途的字体,那么在多大程度上可以将这些字体用于数学文本、演示或网页呢?
在GNU TEXmacs科学文本编辑器中,有一些新的开发成果致力于更好地支持通用字体。主要关注在包含数学公式的结构化文档中使用现有字体的全自动技术。虽然在缺少粗体、斜体变体或重要字符的字形时,使用字体存在明显限制,但很多时候仍能实现一些效果,尽管质量可能不如手动设计。
将现有字体转变为成熟数学字体家族的总体策略是弥补字体的不足,常见问题如下:
- 缺乏科学文档所需的重要字体变体,如粗体、斜体、小型大写字母、无衬线字体、打字机字体。
- 缺少特定字形,如非英语语言字符、数学符号,特别是大运算符、可扩展括号和宽重音符号。
- 存在不一致性,一些对数学很重要的字形设计粗糙,导致不统一。
主要的对策是字体替换和字体模拟。字体替换是从其他字体借用缺失的字形,可针对整个字体或单个字符进行;字体模拟是组合和改变字体中符号的字形以生成新的字形,同样可针对整个字体或单个字形进行。
2. 字体分析与字体替换
为了从其他字体借用缺失的字符,需要能够确定设计相似的字体,使外来字形能很好地融入正文。通常,字体替换规则是为每个字体手动指定的,虽然这样结果精确可预测,但编写规则很繁琐。因此,也实现了一种更自动的机制来确定合适的替代字体。
自动字体替换算法的前提是对所有支持字体的主要特征进行详细分析,结果存储在数据库中。利用该数据库可计算两种字体之间的距离。当字体F1中缺少符号σ时,只需找到支持该符号σ的最接近字体F2。最佳替换字体可能取决于系统中安装的字体。
数据库中使用离散和连续的字体特征,大多数特征通过分析字体名称(离散特征)或单个字形(连续特征)自动确定,部分“字体类别”可手动指定。其中,“x”符号的高度是重要特征之一,当字体F1从字体F2借用符号时,首先根据两者“x”高度的商进行缩放。
常见的字体特征还包括斜体倾斜度、“M”符号的宽度、上升和下降高度等。此外,还会仔细分析字形本身,以确定“o”和“O”符号的水平和垂直笔画宽度、大小写字母的平均纵横比以及字形的平均填充面积。
当前的实现能够找到合理的字体替换,但有时也会出现问题,例如无衬线字体与衬线字体过于匹配,失去了使用无衬线字体的目的。
下面是字体替换的流程:
graph LR
A[开始] --> B[分析字体特征]
B --> C[存储特征到数据库]
C --> D[计算字体距离]
D --> E{符号是否缺失}
E -- 是 --> F[找到最接近支持符号的字体]
E -- 否 --> G[结束]
F --> G
3. 简易字体模拟
各种字体变体,如粗体、斜体和小型大写字母,可以通过一些简单的方法进行模拟,但会有明显的质量损失:
-
粗体模拟
:通过用小线条替换像素来实现,还可对某些字符进行水平拉伸,使用与Computer Modern字体对应的拉伸因子通常能得到合理结果。
-
斜体模拟
:用倾斜字体近似,还可进一步变窄以获得更好效果,但这种方法往往无法正确生成某些字符的斜体版本。
-
小型大写字母模拟
:通过缩放大写字母,大致将“X”变为“x”,同时稍微加宽字符,变换后的“X”可略高于“x”。
通过更多工作,上述简易策略可以进一步改进。例如,用缩短的“d”代替“a”来更好地近似斜体“a”;为了改进粗体模拟,可使用巧妙调整长度的小线条替换像素。
更复杂的模拟策略可能需要一个用于“逆向工程”现有字体设计的工具包。例如,根据轮廓确定“笔”的曲线以及笔在曲线上各点的大小或形状,这样就能轻松生成高质量的变窄和加宽版本的字体,以及更好的粗体字体。还可以探讨是否能自动检测衬线并添加或移除它们。
已经开始试验更复杂的模拟算法来生成字形的“黑板粗体”变体。最简单的策略是生成可能加粗的输入字形的轮廓版本,但这种方法效果不太理想。实现了一种算法来检测需要“双笔画”的轮廓部分,然后加粗该部分并挖空。
以下是字体模拟的方法对比表格:
| 模拟类型 | 方法 | 缺点 | 改进方向 |
| ---- | ---- | ---- | ---- |
| 粗体模拟 | 用小线条替换像素,水平拉伸字符 | 质量有损失 | 用调整长度的小线条替换像素 |
| 斜体模拟 | 用倾斜字体近似,进一步变窄 | 某些字符斜体版本生成不准确 | 用缩短的“d”代替“a” |
| 小型大写字母模拟 | 缩放大写字母,加宽字符 | | |
4. 虚拟字符
可以使用以下主要技术的组合,从现有字形自动生成缺失的字形,按复杂度递增排列:
-
多个字形叠加
:如“+”和“-”可组合成“±”,两个“<”符号并列可得到“≪”。
-
裁剪矩形区域
:将“→”和“↠”从中部切割并组合可得到新符号。
-
线性变换
:组合压扁的“O”和“I”可生成希腊大写字母“Φ”,将“→”旋转可得到“↑”。
-
简单图形构造
:如使用圆形和线条生成“⊂”缺失的半圆。
-
特殊临时变换
:直接对字形的像素(或可能的轮廓)进行操作,如设计“卷曲化”方法将“<”变换,实现“填充”算法将“◁”变换为“◀”。
还需要各种查询机制,因为所有字形都有逻辑和物理边界框,但有时需要计算某些笔画的精确宽度或获取其他信息。
开发了一种小语言来根据现有字形定义新的“虚拟”字符。每个新虚拟字形的设计就像一个谜题,要使用语言中的原语将现有字形组合成所需的字形。
以箭头的构造为例,单尖括号“<”和“>”通常适合作为箭头头部,箭头杆从减号“-”获取,但确定合适的减号并不容易,破折号宽度通常太大,下划线是更好的选择,也可将加号切成几块并重新组合。
假设已有合适的箭头杆和头部,可使用以下代码生成实际箭头:
(rightarrow (right-fit arrowbar (align righthead arrowbar * 0.5)))
“align”原语用于将箭头头部垂直对齐到箭头杆的中心,“right-fit”原语用于将箭头头部从右向左滑动,直到箭头杆在其右侧通过头部。更直接的方法生成箭头不太可靠。左箭头和左右箭头可定义如下:
(leftarrow (left-flip rightarrow))
(leftrightarrow (join (part leftarrow * 0.5) (part rightarrow 0.5 *)))
这些定义可能会利用基本字体中已有的“rightarrow”。“part”原语在中间和两端之间进行两次水平裁剪,“join”用于叠加。
模拟希腊字符也是一个有趣的挑战,小写符号较难实现,但大写字母有一定可能性。例如,将罗马字母“L”上下翻转可得到“Γ”,前面提到了生成“Φ”的方法。“Π”可通过将“H”的水平条移到顶部得到,但在某些字体中提取该条并不容易,因此可将“H”切成几块,重新组合并调整水平条。
5. 弹性字符
数学字体的一个特定问题是需要弹性字符,主要有四种类型:大运算符、大分隔符、宽重音符号和长箭头。
使用与上一节类似的技术来生成这些弹性字符,水平和垂直缩放以及将符号切割成几部分并重新组装非常有用。
例如,适度放大括号“(”通常在垂直方向有更高的拉伸因子,但放大到较大尺寸时,结果会过粗。此时,将括号切成顶部、底部和一个小中间部分,重复中间部分以获得所需大小的括号。
缩放的使用很微妙,例如方括号及其派生符号在水平放大时更容易变胖;宽重音符号通常需要很大的水平拉伸因子,效果不佳;放大的“”和“”通常看起来还可以,但“”效果较差。
目前仍在对实现进行微调,为了获得更好的结果,一个主要挑战是开发能更精细控制笔画宽度的放大方法,特别是需要一种能保留所有相关宽度的可靠放大方法。
以下是弹性字符生成的流程:
graph LR
A[开始] --> B{是否需要放大}
B -- 是 --> C{放大尺寸是否合适}
C -- 是 --> D[完成放大]
C -- 否 --> E[切割符号为三部分]
E --> F[重复中间部分]
F --> D
B -- 否 --> D
D --> G[结束]
6. 结论与展望
经过适度的开发投入,现在能够将许多现有字体用于数学排版,结果质量从“聊胜于无”到“专业排版质量”不等。虚拟字体的实现可被视为真正的“元字体”。
在开发虚拟数学元字体的过程中,一个有趣的问题是“字体的本质”:哪些字体特征包含了重现整个字体的所有必要信息,以及如何实现。例如,大多数数学符号可以从几个基本字形重建,希腊大写字母也可从一些基本字母重建。
开发更多更好的字形模拟工具对字体设计师可能很有价值,一方面可自动生成大量字形,另一方面可让设计师将手工制作的字形与自动生成的替代字形进行比较,有助于发现错误并提高对个人设计独特特征的认识。
目前,所有字体替换和模拟工具都在TEXmacs中开发。可以考虑创建一个单独的库,提供更系统的字体分析、逆向工程和字形模拟工具,还可配备命令行工具来生成数学增强字体、加粗或变窄版本等。目前,一些算法仅限于处理位图,未来希望能仅使用矢量图形进行系统工作。
最后,关于替代字体的用途也值得探讨。某些字体主要用于产生特定图形效果,但这些效果是否总是通过使用特殊字体来实现最佳呢?例如,通过动态生成同一字母的不同版本可能更好地模仿手写,通过对整段文本应用合适的图形滤镜可能获得更好的复古和3D效果,在有分数、平方根或几何图形时更是如此。
数学字体艺术探索
7. 虚拟字符构造示例分析
在前面提到了虚拟字符的构造方法,这里进一步详细分析一些示例。以箭头的构造为例,其过程涉及多个步骤和原语的使用。
首先,选择合适的箭头头部和杆是关键。单尖括号“<”和“>”常作为箭头头部,而箭头杆从减号“-”获取时,需要考虑符号的宽度等因素。如破折号宽度太大不适合,下划线是较好选择,也可将加号切割组合。
下面对生成箭头的代码进行详细解释:
(rightarrow (right-fit arrowbar (align righthead arrowbar * 0.5)))
-
align原语:其作用是将箭头头部垂直对齐到箭头杆的中心。例如,当有一个箭头头部和箭头杆时,该原语会自动调整头部的垂直位置,使其处于杆的中心位置,保证箭头的整体美观和协调性。 -
right-fit原语:该原语会将箭头头部从右向左滑动,直到箭头杆在其右侧通过头部。这一操作确保了箭头头部和杆的连接自然,避免出现不协调的情况。
对于左箭头和左右箭头的定义:
(leftarrow (left-flip rightarrow))
(leftrightarrow (join (part leftarrow * 0.5) (part rightarrow 0.5 *)))
-
left-flip原语:用于将右箭头进行左右翻转,从而得到左箭头。这是一种简单而有效的利用已有箭头定义新箭头的方法。 -
part原语:在中间和两端之间进行两次水平裁剪。例如,对于左箭头或右箭头,使用part原语可以将其分成两部分,方便后续的组合操作。 -
join原语:用于将两部分叠加。在定义左右箭头时,将左箭头和右箭头的部分通过join原语叠加在一起,形成左右箭头。
再看希腊字符的模拟,以“Π”为例。其模拟过程较为复杂,因为在不同字体中提取和调整水平条的难度不同。具体步骤如下:
1. 将“H”切割成几部分,提取出相关部分。
2. 重新组合这些部分形成类似“II”的形状。
3. 取中央条的一小部分,将其扩展到所需长度。
4. 将扩展后的水平条移动到顶部,形成“Π”。
这个过程需要考虑字体的具体情况,以确保在不同字体中都能得到较为理想的“Π”字符。
8. 弹性字符处理的挑战与解决方案
弹性字符的处理在数学字体排版中是一个重要且具有挑战性的任务。前面提到了弹性字符的四种类型以及基本的处理方法,但在实际应用中还面临着诸多挑战。
8.1 缩放问题
缩放是生成弹性字符的常用方法,但不同类型的弹性字符对缩放的反应不同。例如:
| 弹性字符类型 | 缩放问题 | 解决方案 |
| ---- | ---- | ---- |
| 方括号及其派生符号 | 水平放大时更容易变胖,提前达到不可接受的效果 | 当放大尺寸不合适时,将其切割成顶部、底部和中间部分,重复中间部分来调整大小 |
| 宽重音符号 | 需要很大的水平拉伸因子,效果不佳 | 探索更精细的拉伸算法,结合其他图形构造方法来优化 |
| 大运算符(如“”“”“”) | “”和“”放大后效果尚可,“”效果较差 | 针对“”研究特殊的放大策略,可能需要单独调整其笔画宽度和形状 |
8.2 笔画宽度控制
在缩放过程中,笔画宽度的控制是一个关键问题。目前很多算法在放大时难以保证笔画宽度的一致性和合理性。为了解决这个问题,可以采取以下步骤:
1. 对字体的原始笔画宽度进行详细分析,记录关键信息。
2. 在缩放过程中,根据原始笔画宽度和放大比例,动态调整笔画宽度。
3. 开发专门的算法来模拟笔画在放大过程中的变化,确保放大后的字符仍然清晰可辨。
9. 字体模拟技术的未来发展方向
字体模拟技术在当前已经取得了一定的成果,但仍有很大的发展空间。以下是一些未来可能的发展方向:
9.1 更智能的模拟算法
目前的字体模拟方法存在质量损失等问题,未来可以开发更智能的算法。例如,利用机器学习技术,对大量字体进行学习和分析,自动生成更接近真实字体的模拟版本。可以通过训练神经网络,让其学习字体的特征和变化规律,从而在模拟时能够更准确地生成各种字体变体。
9.2 跨平台和多格式支持
随着技术的发展,字体的使用场景越来越多样化。未来的字体模拟工具应该支持更多的平台和文件格式,如在移动设备、网页等不同环境中都能实现高质量的字体模拟。同时,要确保生成的字体在不同格式下的兼容性,避免出现显示问题。
9.3 与图形处理技术的融合
将字体模拟技术与图形处理技术相结合,可以创造出更多独特的字体效果。例如,通过应用图形滤镜、纹理等效果,为字体增添更多的艺术感和视觉冲击力。还可以利用图像处理算法来优化字体的边缘、阴影等效果,使字体更加生动逼真。
10. 替代字体用途的深入探讨
前面提到了替代字体的一些用途以及对其实现方式的质疑,这里进一步深入探讨。
某些字体用于产生特定图形效果,如模仿黑板书写、复古风格或3D效果。但这些效果不一定总是通过使用特殊字体来实现最佳。
以模仿手写为例,传统方法是使用特殊的手写字体,但通过动态生成同一字母的不同版本可能更好。可以设计算法,根据字母的基本形状和书写习惯,随机调整字母的倾斜度、笔画粗细、长度等参数,生成多种不同的手写风格。
对于复古和3D效果,通过对整段文本应用合适的图形滤镜可能是更好的选择。例如,使用模糊、噪点等滤镜来模拟复古效果,通过光照、阴影等效果来实现3D感觉。在有分数、平方根或几何图形时,这种方法可以更好地与周围元素融合,避免因使用特殊字体而出现不协调的情况。
以下是不同效果实现方式的对比表格:
| 效果类型 | 传统实现方式 | 改进实现方式 | 优点 |
| ---- | ---- | ---- | ---- |
| 手写效果 | 使用特殊手写字体 | 动态生成同一字母不同版本 | 更自然、多样化 |
| 复古效果 | 使用特殊复古字体 | 应用图形滤镜 | 与文本整体融合更好 |
| 3D效果 | 使用特殊3D字体 | 应用图形滤镜 | 可根据文本内容灵活调整 |
综上所述,数学字体艺术在字体替换、模拟、虚拟字符构造和弹性字符处理等方面已经有了很多成果,但在未来的发展中还有许多问题需要解决和探索。无论是字体设计师还是开发者,都可以从这些方面入手,不断推动数学字体排版技术的进步。
超级会员免费看

535

被折叠的 条评论
为什么被折叠?



