[LaTeX 引擎] XeLaTeX + macOS,通过字体名调用发行版字体

本文已加入专栏文章目录,归入「基本使用」文章系列。

约定

  • 本文所称字体,特指 ttfotf 格式的字体
  • 本文讨论的情况,是使用 macOS 操作系统,安装了 TeX Live(或基于它的)发行版,使用 xelatex 编译 tex 文件

字体文件在哪里

一开始,字体在电脑的两个地方

  • macOS 系统预装
    • 主要在目录 /Library/Fonts//System/Library/Fonts/
    • 少量 Downloadable font assets 在目录 /System/Library/Assets/com_apple_MobileAsset_Font7(路径末尾的 7 可能为其他数字)
  • LaTeX 发行版安装
    • ttf 字体在目录 $TEXMFDIST/fonts/truetype
    • otf 字体在目录 $TEXMFDIST/fonts/opentype
    • 其中,$TEXMFDIST 是发行版主文件树的位置,一般为 /usr/local/texlive/<dist-info>/texmf-dist,可通过 kpsewhich --var-value TEXMFDIST 来获取

macOS 下的字体调用,问题的引入

在使用 fontspec 时,

  • 系统预装的字体,只能通过字体名来调用
  • 发行版预装的字体,只能通过文件名来调用

而在 Windows 里,系统和发行版预装的字体,都可以通过字体名和文件名两种方式来调用。这样,就会遇到 tex 文件的可移植性问题。

一种解决方案

对普通用户比较友好的解决方案是,在 Font Book.app(字体册应用)里,新建 Font Library(字体资源库), 然后把发行版预装字体的两个目录添加进去。

  • 优势
    • 发行版预装字体也能通过字体名调用了
    • 字体名可以在字体册里便利查询
  • 劣势
    • 发行版里新安装的字体,不会自动导入
    • 已经导入的字体,某些会在一段时间后被自动禁用,我不知道如何解决

另一种解决方案

往字体册添加字体,有两种方式

  • 打开字体文件(默认使用字体册应用打开),点击「安装」,这会把字体拷贝到 ~/Library/Fonts/ 目录。同时,在字体册里,该字体会列入名为「用户」 的字体资源库。
  • 使用字体册的「加入字体」功能,把字体加入某个字体资源库。这些字体不会被拷贝到 ~/Library/Fonts/ 目录。 (这是第一个解决方案里提到的方式)

打开终端,执行下面两行,将在 ~/Library/Fonts/ 目录创建发行版字体目录的符号链接,这样也可以让使用者在字体册里「见到」发行版中的字体。

ln -s `kpsewhich -var-value TEXMFDIST`/fonts/truetype ~/Library/Fonts/texlive-truetype
ln -s `kpsewhich -var-value TEXMFDIST`/fonts/opentype ~/Library/Fonts/texlive-opentype

与第一种方案相比,

  • 优势
    • 发行版新安装的字体,会在下次打开字体册应用时自动导入
  • 劣势
    • 所有字体都在名为「用户」的字体库里,不能分库也不能自定义库名
    • 2023-01-30 在 macOS 12.6.2 下,Font Book.app 不会刷新字体列表。即,先添加符号链接、然后通过 tlmgr 安装新的字体,最后打开 Font Book.app,新安装的字体不会出现在字体列表。
      • 删除并重建符号链接,有效。
      • 重建符号链接后,保持 Font Book.app 开着,用 tlmgr 安装的新字体,会自动加入字体册。

从比 macOS 13.6.3 稍早一点的版本开始,我发现上述建立的软链接(ln -s <source> <destination>)不奏效了,表现为 Font Book.app 里能看到链接到 texlive-truetypetexlive-opentype 的字体,但它们在 Font Book.app 里预览和被浏览器调用时,所有字符均显示为类似 � 的符号。

ln <source> <destination> 创建的硬链接依然奏效,但硬链接无法基于目录,于是有了和第一种方案类似的局限/劣势。

mkdir ~/Library/Fonts/texlive-opentype
mkdir ~/Library/Fonts/texlive-truetype
find `kpsewhich -var-value TEXMFDIST`/fonts/opentype -name '*.otc' -type f \
  -exec ln \{\} ~/Library/Fonts/texlive-opentype \;
find `kpsewhich -var-value TEXMFDIST`/fonts/truetype -name '*.ttf' -type f \
  -exec ln \{\} ~/Library/Fonts/texlive-truetype \;

相关讨论[1][2][3]

补充

  • 在使用 xecjk/ctex宏包集 设置中文字体时,以上信息依然有效

没写的内容

  • 用户其他目录下的字体与texmfOSFONTDIR 变量
  • 对未加入字体册的字体,查看它们的信息
  • 参考资料

部分参考资料

[1] Mac OS X:字体位置及其目的 (en-us) - support.apple.com
[2] 在 Mac 上的“字体册”中创建字体集和资源库 - support.apple.com
[3] fontspec (xelatex) finding fonts by name, installed or in TEXMFHOME - TeX.SX
[4] The fontspec package, Font selection for XeLaTeX and LuaLaTeX, sec. 2 - ctan.org/pkg/fontspec

参考

  1. ^use hard links for fonts instead of symlinks https://github.com/Homebrew/homebrew-cask/pull/2258
  2. ^https://web.archive.org/web/20150512115110/http://www.macdevcenter.com/pub/a/mac/2001/07/24/osx_fonts1.html?page=2
  3. ^https://apple.stackexchange.com/questions/446227/can-you-install-fonts-by-symlinking-them-into-library-fonts
编辑于 2024-01-01 22:52・IP 属地北京