是否可以通过一组符号(约 700 个)创建自己的可扩展字体?SVG 格式。它们都是符号(如 Zapf Dingbats),因此不需要特殊设置,如连字、斜体校正等。基本上,我希望{\mysymbolfont\char123}
显示最初提供的符号123.svg
。如果 ~700 个符号太多,我不介意将其拆分为两种或多种字体。所有符号的高度大致相同,但宽度各不相同。
我认为首先需要将 SVG 转换为 MetaPost。执行此操作并以此创建基本字体的步骤是什么?声明字体需要什么 LaTeX 代码,即如何为其创建 LaTeX 包?
我意识到字体创建不是一件小事。欢迎提供任何提示。
附言:我意识到我可以将 SVG 转换为 PDF 并将它们作为小图像包含。这就是我目前正在做的事情,但如果将其作为字体就更好了,因为我觉得这样效率更高。
答案1
以下是使用以下方法生成字体的一些粗略分步说明:FontForge并使其可供 TeX 使用。
启动 FontForge 并创建新字体。
将 SVG 文件导入不同的字形。导入并不完美:例如,您可能需要删除一些虚假路径,并且您应该移动和缩放字形,以便它们位于基线上,并且其高度不超过 1000 个单位(大约 800 个单位就可以了)。另请参阅指示在 FontForge 网站上。
用于
File->Generate Fonts
生成 (二进制) PostScript Type1 字体。一个 PS Type 1 字体只能访问 256 个字符,因此如果您有 700 个符号,您实际上需要制作 3 种不同的字体(或者您可以制作一种字体,然后让 pdftex/dvips 重新编码它们,但这有点复杂。)或者,生成一个 OpenType 字体,您可以直接将其与 LuaTeX 或 XeTeX 一起使用。您也可以让 FontForge 创建 TeX 字体指标,或者您可以使用FontForge 生成的文件
afm2tfm
中生成这些指标。.afm
mysymbols.map
生成一个以以下格式列出字体的映射文件mysymbols1 MySymbols1 <mysymbols1.pfb mysymbols2 MySymbols2 <mysymbols2.pfb mysymbols3 MySymbols3 <mysymbols3.pfb
地图文件的语法在dvips 手册。
将所有(
.tfm
、.pfb
和.map
)文件复制到 texmf 树中:.tfm
文件进入 的子文件夹fonts/tfm/
,.pfb
文件进入 的子文件夹fonts/type1
,.map
文件进入 的子文件夹fonts/map/dvips
。您可能需要通过运行来重新生成文件数据库
mktexlsr
。激活地图文件。在 TeXLive 中,你可以运行
updmap-sys --enable Map mysymbols.map
作为超级用户(updmap
如果您没有管理员权限,请使用。)9. 现在您应该能够在 TeX 中使用字体。例如
\font\mysym=mysymbols1 at 10pt\mysym\char0
should print the first glyph in mysymbols1.
要将字体与 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 文档中轻松使用自定义字体!