![METAFONT 的替代品](https://linux22.com/image/304396/METAFONT%20%E7%9A%84%E6%9B%BF%E4%BB%A3%E5%93%81.png)
我对为基于计算机的书法(自由手写字母和字距调整)创建新的字符形式很感兴趣;奇怪的是,这种尝试在谷歌上几乎闻所未闻。最接近的可能是 METAFONT,但它也没有得到广泛使用,而且相当令人生畏(我多年来一直是 LaTeX 用户,但一直停留在表面层面)。我想知道,是否有类似的工具(用于从数学定义的笔划中创建类似字母的符号)可能具有更现代的编程框架?(考虑 luatex 与 tex)。
引用 Knuth 的 METAFONT 书
"It would be nice if a system like METAFONT were to simplify the task
of type design to the point where beautiful new alphabets could be created in a
few hours. This, alas, is impossible; an enormous amount of subtlety lies behind
the seemingly simple letter shapes that we see every day, and the designers of
high-quality typefaces have done their work so well that we don’t notice the
underlying complexity."
我的最终目标(远)更加雄心勃勃:我想为计算机图形文本表示创造一种新范式,尽可能接近人类手写。因此,字体格式不行,因为它的范围太过严格(必然是有限的、固定的、离散的),每个字符、连字符都应该根据给定的上下文即时绘制。
不过,关键因素始终是单个字符的创建,而这正是我寻找最佳(功能最全、速度最快)现有工具的原因。其余的只是(!)某种人工智能(学习如何绘制和组合这些字母)以及对手写书法的良好理解,以使其看起来不错。
注意:我提供了一些背景信息来解释我的目标,但问题实际上是关于 METAFONT 替代方案如何绘制单个字符。该项目的其他部分肯定太广泛了,无法在此讨论。
另一点需要注意的是:人工智能的最新趋势是模仿笔迹使用某种形式的神经网络。这是一种非常有趣的方法,已经取得了令人着迷的结果,但与我的问题完全无关。首先,目前尚不清楚如何将以这种方式生成的字形集成到更标准的文本编辑工作流程中,但这只是技术难题(与任何不基于现有字体技术的方法一样)。从长远来看,我认为更大的限制是,生成算法似乎没有文本结构的概念,例如句子和段落,更不用说单词的含义和“角色”。同样,这可以通过改进技术来缓解。真正区分这两个想法的是,我提出了一个系统来模拟将墨水涂在纸上(或其他介质)的物理过程,而训练集生成的字形无法做到这一点(值得注意的是,看起来不可能来自物理书写的笔画不应该出现)。
答案1
我一直在思考这个问题,并想出了一个使用lualatex
和luamplib
包的(非常)基本的初步解决方案。
\documentclass{article}
\usepackage{luamplib}
\def\a{%
\begin{mplibcode}
beginfig(1);
fudge := normaldeviate;
fudge := normaldeviate;
w = 12pt; h = 20pt;
pickup pencircle scaled 2;
fudge := normaldeviate;
z0 = (0+fudge,2h/3+fudge);
fudge := normaldeviate;
z1 = (w/2+fudge,h+fudge);
fudge := normaldeviate;
z2 = (w+fudge,2h/3+fudge);
fudge := normaldeviate;
z3 = (w+fudge,0+fudge);
fudge := normaldeviate;
z4 = (w+fudge,h/8+fudge);
fudge := normaldeviate;
z5 = (w/3+fudge,0+fudge);
fudge := normaldeviate;
z6 = (0+fudge,h/3+fudge);
fudge := normaldeviate;
z7 = (w+fudge,h/2+fudge);
draw z0..z1..z2..z3;
draw z4..z5..z6..tension 2..z7;
endfig;
\end{mplibcode}
}
\begin{document}
\a \a \a \a
\end{document}
这定义了一个宏,\a
它绘制一个非常简单的小写字母“a”,但绘制时所有点都经过了一定程度的随机化(介于 -1 和 1 个 Postscript 点之间)。这个解决方案既缺乏精确性也缺乏通用性,但确实表明 OP 想要的东西在某种形式的 LaTeX 中是可能的。运行此文档一次,结果如下:
我在这里定义了一个宏,但有可能(尽管可能相当困难)完全在活动字符中完成此操作,因此只需键入“aaa a”而不是“ \a \a \a \a
”。不过,最好将其限制在一个环境中,否则会破坏您的其他宏。我既没有时间也没有专业知识来定义这样的环境,但在我看来这是可能的。
我确实希望,如果你在这方面取得任何进展,你会将它们公之于众。我个人没有动力这样做,但我对看到更广泛的结果非常感兴趣。
答案2
我使用 Metafont 创建了几种书法字体(CTAN 上的 bookhands),这些字体基于罗马时期和 15 世纪之间的书写。后来我使用 FontForge 将其中一些字体转换为 type 1 字体,并添加了一些调整,例如对某些字母进行重音。
FontForge 是一款免费软件,具有图形用户界面,而不是文本界面。我知道它可以在 Linux 系统上运行,但不知道其他系统是否如此。