从 SVG 符号创建符号字体

从 SVG 符号创建符号字体

是否可以通过一组符号(约 700 个)创建自己的可扩展字体?SVG 格式。它们都是符号(如 Zapf Dingbats),因此不需要特殊设置,如连字、斜体校正等。基本上,我希望{\mysymbolfont\char123}显示最初提供的符号123.svg。如果 ~700 个符号太多,我不介意将其拆分为两种或多种字体。所有符号的高度大致相同,但宽度各不相同。

我认为首先需要将 SVG 转换为 MetaPost。执行此操作并以此创建基本字体的步骤是什么?声明字体需要什么 LaTeX 代码,即如何为其创建 LaTeX 包?

我意识到字体创建不是一件小事。欢迎提供任何提示。

附言:我意识到我可以将 SVG 转换为 PDF 并将它们作为小图像包含。这就是我目前正在做的事情,但如果将其作为字体就更好了,因为我觉得这样效率更高。

答案1

以下是使用以下方法生成字体的一些粗略分步说明:FontForge并使其可供 TeX 使用。

  1. 启动 FontForge 并创建新字体

  2. 将 SVG 文件导入不同的字形。导入并不完美:例如,您可能需要删除一些虚假路径,并且您应该移动和缩放字形,以便它们位于基线上,并且其高度不超过 1000 个单位(大约 800 个单位就可以了)。另请参阅指示在 FontForge 网站上。

  3. 用于File->Generate Fonts生成 (二进制) PostScript Type1 字体。一个 PS Type 1 字体只能访问 256 个字符,因此如果您有 700 个符号,您实际上需要制作 3 种不同的字体(或者您可以制作一种字体,然后让 pdftex/dvips 重新编码它们,但这有点复杂。)或者,生成一个 OpenType 字体,您可以直接将其与 LuaTeX 或 XeTeX 一起使用。

  4. 您也可以让 FontForge 创建 TeX 字体指标,或者您可以使用FontForge 生成的文件afm2tfm中生成这些指标。.afm

  5. mysymbols.map生成一个以以下格式列出字体的映射文件

    mysymbols1 MySymbols1 <mysymbols1.pfb
    mysymbols2 MySymbols2 <mysymbols2.pfb
    mysymbols3 MySymbols3 <mysymbols3.pfb
    

    地图文件的语法在dvips 手册

  6. 将所有(.tfm.pfb.map)文件复制到 texmf 树中:.tfm文件进入 的子文件夹fonts/tfm/.pfb文件进入 的子文件夹fonts/type1.map文件进入 的子文件夹fonts/map/dvips

  7. 您可能需要通过运行来重新生成文件数据库mktexlsr

  8. 激活地图文件。在 TeXLive 中,你可以运行

    updmap-sys --enable Map mysymbols.map
    

作为超级用户(updmap如果您没有管理员权限,请使用。)9. 现在您应该能够在 TeX 中使用字体。例如

    \font\mysym=mysymbols1 at 10pt\mysym\char0

should print the first glyph in mysymbols1.
  1. 要将字体与 LaTeX 字体选择宏一起使用,您需要在包或字体定义文件中使用\DeclareFontFamily和来声明它\DeclareFontShape。例如,要声明第一个系列,您可以使用以下代码:

    \DeclareFontFamily{U}{mysymbols1}{} \DeclareFontShape{U}{mysymbols1}{m}{n}{ <-> mysymbols1}{}

After that, you can access the font in LaTeX like this:

    \usefont{U}{mysymbols1}{m}{n}\char0

See the [LaTeX 2e font selection guide][5] for more information.

答案2

假设您有带有 Python 脚本的 FontForge,当前目录中的所有 svg 文件编号从 1 到 700,以下内容应从中创建 Type1、OTF 和 TTF 字体。

import fontforge

# create empty font
font = fontforge.font()

# set font names
font.fontname = "FooBar"
font.fullname = "Foo Bar"
font.familyname = "Foo Bar"

# import svgs
for i in range(1, 701):
    # create a new glyph with the code point i
    glyph = font.createChar(i)

    # import svg file into it
    glyph.importOutlines("%s.svg" %i)

    # make the glyph rest on the baseline
    ymin = glyph.boundingBox()[1]
    glyph.transform([1, 0, 0, 1, 0, -ymin])

    # set glyph side bearings, can be any value or even 0
    glyph.left_side_bearing = glyph.right_side_bearing = 10

font.generate("foobar.pfb", flags=["tfm", "afm"]) # type1 with tfm/afm
font.generate("foobar.otf") # opentype
font.generate("foobar.ttf") # truetype

请注意,Type1/TFM 最多可以有 255 个字形,因此您必须将 SVG 分散到多个字体上,或者使用具有合适引擎的 OTF/TTF。查看 FontForge 的Python 脚本文档更多细节。

更新:脚本现在将基线上的所有字形底部对齐,并且还允许设置字形侧边距。

答案3

我想指出以下网站:

https://web.archive.org/web/20171211114543/http://math.stanford.edu:80/~jyzhao/latexfonts.php

此外,您还可以在 Font Forge 中制作自己的 True-Type 字体。使用 Font Forge 的 svg 文件和上述链接,您应该能够轻松创建和使用自己的字体。请务必严格遵循上述网站上的说明:实际复制一份名为 custom.ttf 的 True-Type 字体文件并使用它。

这将使您能够在单个 LaTeX 文档中轻松使用自定义字体!

相关内容