从 FakeBold 创建新字体

从 FakeBold 创建新字体

fontspec 包提供了一种FakeBold=1.5创建具有各种粗细的假粗体的方法。它工作得很好,只是我觉得 Okular 中的抗锯齿效果不太好(我的理解是它为形状添加了轮廓,然后我猜它会扰乱锯齿)因为我希望我的文档在任何查看器上都能很好地打印,所以我想将这种假字体导出为正确的字体。我该怎么做?

如果有帮助的话,我需要创建一个半粗体来NimbusSanL-ReguItal

\newfontface\mySemibold{NimbusSanL-ReguItal.ttf}[
  FakeBold=1.8,
]

平均能量损失

\documentclass[11pt]{article}
\usepackage{fontspec}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{txfonts}
\renewcommand{\familydefault}{\sfdefault}

%% See also "Choosing additional NFSS font faces" for a cleaner solution
%% Downloaded here https://github.com/SufficientlySecure/document-viewer-fontpack/blob/master/font-sources/ghostscript%20urw/NimbusSanL-Regu.ttf
\newfontface\mySemibold{NimbusSanL-ReguItal.ttf}[
  FakeBold=1.8,
]

\begin{document}

Here is a test

{\mySemibold Here is a test} % <-- I want to create a font for this

\textbf{Here is a test}

\end{document}
%%% Local Variables: 
%%% mode: latex 
%%% TeX-engine: luatex
%%% TeX-master: t 
%%% End:

编辑

我尝试使用 Font Forge,但收效甚微。该工具使用起来很简单,但效果并不好。如果我尝试在 regulItal 和 BoldItal 两种字体之间进行插值,某些字形会得到很好的转换……而其他一些,比如,则a只是垃圾。

在此处输入图片描述

我也尝试选择字形并执行Element > Style > Change weight,结果更好但也不完美(例如参见弯曲的边缘):

在此处输入图片描述

不知道我是否做错了什么,但我现在无法重现正在FakeBold发生的事情。

答案1

你愿意使用 FontForge 字体编辑器吗?如果你使用的字符数量不多,这并不难。

尽管 FontForge 能够改变字形粗细,但我发现它的算法并不令人满意。相反,fontspec当它描画字形轮廓时,您可以执行正在执行的操作。我喜欢这个结果。

将字体加载到 FontForge,选择字形,然后将其复制到背景。然后使用菜单元素 > 扩展笔划。您不需要它提供的所有功能。只需查看长轴和短轴的数字即可。

这会将字形转换为轮廓形状(空心)。将背景(原始字形)复制到前景(空心轮廓),然后使用元素 > 重叠 > 删除重叠。您可能还希望执行常规任务,例如添加极值、简化、四舍五入为整数。

虽然这本质上是一个图形艺术问题,但它受到了启发fontspec。几周前我问过(这里)这是怎么做的。

请注意,扩展后的字形的最低点将低于基线,最高点将高于上升点,宽度将比以前更大。如果您愿意,您可以缩放/移动,但对于小的更改来说可能没有必要。

顺便说一句:FakeBold 实际上并不创建可提取的字形轮廓。它在创建 PDF 期间动态更改现有字形。如果您从 PDF 中提取字形,它们将与原始字体相同。

答案2

好吧,我最终将@rallg 和@marcel-krüger 的精彩回答改编成了一个脚本。这个脚本其实相当简单,基本上是这样的:

font = fontforge.open(filename)
for glyph in set(font):
    font[glyph].foreground = (font[glyph].foreground.stroke("circular", 40)
                              + font[glyph].foreground).removeOverlap().addExtrema().simplify().round()
font.generate(out_filename)

但我还是创造了脚本这样我们就可以轻松地从命令行使用它。如果你有 nix,你可以运行:

$ nix run github:tobiasBora/make-font-bolder -- --size 30 YourInputFont.ttf YourOutputFont.ttf

或者安装fontforge并运行make-font-bolderpyhon 脚本。请参阅文档以-h使用不同的方法/笔触形状等。结果:

在此处输入图片描述

相关内容