[LaTeX 引擎] XeLaTeX + macOS,通过字体名调用发行版字体
本文已加入专栏文章目录,归入「基本使用」文章系列。
约定
- 本文所称字体,特指
ttf
、otf
格式的字体 - 本文讨论的情况,是使用 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-truetype
和 texlive-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 \;
补充
- 在使用
xecjk/ctex宏包集
设置中文字体时,以上信息依然有效
没写的内容
- 用户其他目录下的字体与
texmf
的OSFONTDIR
变量 - 对未加入字体册的字体,查看它们的信息
- 参考资料
部分参考资料
[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
参考
- ^use hard links for fonts instead of symlinks https://github.com/Homebrew/homebrew-cask/pull/2258
- ^https://web.archive.org/web/20150512115110/http://www.macdevcenter.com/pub/a/mac/2001/07/24/osx_fonts1.html?page=2
- ^https://apple.stackexchange.com/questions/446227/can-you-install-fonts-by-symlinking-them-into-library-fonts