如何使字体等宽?

平面设计 字体
2021-12-30 12:40:25

假设我有一种流行格式( 、 等)的字体.ttf.otf并且我有修改它的合法权利。就目前而言,它是一种普通字体,具有不同的字符(字形?),宽度和间距各不相同。我将如何将所述字体转换为等宽字体(例如,所有字符的尺寸相同,等等)?

如果可能,是否有任何自动化工具可以为您做一些猜测?(结果不一定是完美的。)字体可能很大(很多字符),编辑它可能很乏味。

非常感谢任何有关该问题的建议!:)


免责声明:很抱歉,如果这被认为是一个简单的方法,但谷歌关于这个主题的信息很少,对于一个不怎么处理图形或字体的程序员来说,它肯定不简单另外,对不起,如果我的术语不正确...:P

4个回答

如果您还没有任何字体编辑软件,好消息是 Fontforge 是免费和开源的。坏消息是它有一个相对较高的学习曲线和一个有点不寻常的用户界面。

基本上,对于被视为等宽字体的字体,每个字形都必须具有相同的宽度,直到完全相同的单位数。这包括通常应该为零宽度或特定宽度(例如 em 空格、em 破折号等)的字形。

请参阅常见问题条目“如何将字体标记为等宽字体?”

要真正批量一次编辑所有字形的宽度,您可以转到菜单上的“Metrics”->“Set Width”,但我不希望它适用于所有字符。您可能必须手动编辑所有宽字符,例如“W”、“M”、“@”等,以免它们最终重叠。并且结合变音符号(旨在在渲染时与字母“组合”的重音)可能会使它们的所有位置都混乱(如果你是美国人/英国人并且你几乎从不使用它们,这很难测试)。

知道如何创建和编辑字体的人将能够完成这项任务,但它仍然不会简单。

我在尝试编辑大量使用 Unicode 符号的源代码时遇到了这个问题。在这种情况下,大部分源代码都以一种等宽字体显示,而一些未被该字体覆盖的符号最终会破坏对齐方式。

虽然“等宽”一个完整字体确实会产生可怕的结果(字距调整、笔划宽度和一般平衡都会完全搞砸),但将几个符号从可变宽度字体导入等宽字体会产生不错的结果。下面的动画显示了使用 Consolas + Symbola 作为后备,与使用 Consolas + Symbola 的 monospacified 版本:

单倍化前后

这对于高级排版毫无用处,但如果您想在源代码中使用符号而不破坏缩进,这是一个很好的折衷方案。但是有一些警告:

  • 宽字符会渗入相邻的空间(尽管可以稍微缩小它们以缓解问题)
  • 字距调整会很糟糕(不是太大的问题,因为它只是一个后备)

我已经启动了一个 GitHub 项目来自动处理这种字体转换。它包括预先生成的字体和使用 fontforge 的 Python 绑定的代码。

另请参阅此 emacs.se 问题

thomasrutter 提供了更多的技术答案;我将向你展示一些排版原则,以阻止你做你想做的事,除非你真的需要。

放大 Consolas 或 Courier 中的“i”和“m”,然后放大 Corbel 或 Verdana。请注意字母必须有多么不同才能使等宽工作。要将字体正确转换为等宽字体需要大量的知识和工作。任何称职的设计师都不赞成拉伸字体的一般想法,这就是为什么即使从普通变体变为压缩变体也需要重新绘制所有字形。

所以,看看这里的 Consolas vs. Corbel,看看当它被放大时,你可以看到 1) 字母之间的间距,2) 笔画粗细的一致性,以及 3) 每个字母如何适合它的盒子。查看等距面(第一个)与可变间距面(第二个)的比较,然后查看第三个和第四个,看看当您尝试拉伸和空间以使其相等时会发生什么。对于第四个,我让 Ms 挤压到 75% 才能进入盒子,但现在它们比 Is 瘦多了。使用时会很明显。

等宽字体和可变空间字体的比较

所以,简而言之:不要乱用字体;它们比你想象的要强大得多!

在文字处理器中,我:(1)创建了一个表;(2) 分列——每个字母一列;(3) 使字母居中;(4) 使所有边界,内部和外部不可见。