LuaLaTeX 字体加载器从系统字体库中选择常规变体,但从 texmf-local 中选择粗体

LuaLaTeX 字体加载器从系统字体库中选择常规变体,但从 texmf-local 中选择粗体

我的系统上已经有好几年使用 TrueType 版本的(免费)字体(福尔科恩) 在我的texmf-local

我现在已经下载了较新的版本,它具有更多变体,并且使 OpenType 文件可以在系统范围内使用(更准确地说,它们在我的~/Library/FontsMac OS X 上)。

有了xelatex,没问题

\setmainfont{Vollkorn}[ItalicFont={* Italic},
                        BoldFont={* Bold}, BoldItalicFont={* Bold Italic}]

使用新的 (OpenType) 字体。完整代码:

\documentclass{article}

\usepackage{fontspec}
\setmainfont{Vollkorn}[%
%Numbers=Lining,
ItalicFont={* Italic},BoldFont={* Bold}, BoldItalicFont={* Bold Italic}]

\begin{document}

1234567890

\bfseries 1234567890

\itshape 1234567890

\mdseries 1234567890

\end{document}

但是lualatex,一开始我不知道如何使用luaotfload-tool(它似乎mkluatexfontdb已经消失了? 没有这样的链接texbin)但无论如何今天的 TL 更新有一个 luatex 更新,并且编译上面的文档lualatex触发了数据库重建:

luaotfload | db : Font names database loaded from /usr/local/texlive/2015/texmf-
var/luatex-cache/generic/names/luaotfload-names.luc
luaotfload | db : Version mismatch; expected 2.600, got 2.510.
luaotfload | db : Force rebuild.(load luc: /usr/lo

但是我的文档仅对常规变体使用了新的 OpenType:

luaotfload | load : Lookup/name: "Vollkorn" -> "Vollkorn-Regular.otf"

luaotfload | load : Lookup/name: "VollkornBold" -> "Vollkorn-Bold.ttf"
luaotfload | load : Lookup/name: "VollkornBoldItalic" -> "Vollkorn-BoldItalic.tt
f"
luaotfload | load : Lookup/name: "VollkornItalic" -> "Vollkorn-Italic.ttf"

我去查看了一下相关文件,

file /usr/local/texlive/2015/texmf-var/luatex-cache/generic/names/luaotfload-lookup-cache.lua

我懂了:

return {
 ["Vollkorn##655360"]={ "Vollkorn-Regular.otf", false },
 ["Vollkorn:mode=node;script=latn;language=DFLT;+tlig;+trep;##655360"]={ "Vollkorn-Regular.otf", false },
 ["VollkornBold##655360"]={ "Vollkorn-Bold.ttf", false },
 ["VollkornBold:mode=node;script=latn;language=DFLT;+tlig;+trep;##655360"]={ "Vollkorn-Bold.ttf", false },
 ["VollkornBoldItalic##655360"]={ "Vollkorn-BoldItalic.ttf", false },
 ["VollkornBoldItalic:mode=node;script=latn;language=DFLT;+tlig;+trep;##655360"]={ "Vollkorn-BoldItalic.ttf", false },
 ["VollkornItalic##655360"]={ "Vollkorn-Italic.ttf", false },
 ["VollkornItalic:mode=node;script=latn;language=DFLT;+tlig;+trep;##655360"]={ "Vollkorn-Italic.ttf", false },
}

但在

/usr/local/texlive/2015/texmf-var/luatex-cache/generic/names/luaotfload-names.lua.gz

我确实发现例如:

  ["base"]={
   ["local"]={},
   ["system"]={
 lines skipped
    ["Vollkorn-Bold.otf"]=1287,
    ["Vollkorn-BoldItalic.otf"]=1288,
    ["Vollkorn-Italic.otf"]=1289,
    ["Vollkorn-Medium.otf"]=1290,
    ["Vollkorn-MediumItalic.otf"]=1291,
    ["Vollkorn-Regular.otf"]=1292,
    ["Vollkorn-Semibold.otf"]=1293,
    ["Vollkorn-SemiboldItalic.otf"]=1294,
lines skipped
   ["texmf"]={
    ["Vollkorn-Bold.ttf"]=973,
    ["Vollkorn-BoldItalic.ttf"]=974,
    ["Vollkorn-Italic.ttf"]=975,
    ["Vollkorn-Regular.ttf"]=976,

因此所有文件似乎都已正确索引和识别。那么为什么只选择 Vollkorn Regular 作为新的 OpenType 字体,而对于 Bold、Italic 和 Bold Italic,文档使用旧ttf文件?

</usr/local/texlive/2015/texmf-local/fonts/truetype/friedrichalthausen/vollkorn/
Vollkorn-Italic.ttf></usr/local/texlive/2015/texmf-local/fonts/truetype/friedric
halthausen/vollkorn/Vollkorn-BoldItalic.ttf></usr/local/texlive/2015/texmf-local
/fonts/truetype/friedrichalthausen/vollkorn/Vollkorn-Bold.ttf></Users/XXXXXXXX/Librar
y/Fonts/Vollkorn-Regular.otf>
Output written on testvollkorn.pdf (1 page, 26788 bytes).

Ulrike Fischer 在她的文章中给出了一个解决方法回答我接受。

然而,天真的用户直觉认为,lualatex在这种情况下,字体加载时会发生一些不连贯的事情。因此,如果后面的答案解决或反驳了我的直觉,我会考虑验证它。


我在按照 的评论进行额外测试后添加了一些信息@phg。我将我的(这是 Mac OS)otf中较新的文件与中子目录位置中的较旧文件进行了交换。执行了和。此后,我观察到了完全相同的现象$HOME/Library/Fonts/ttftexmf-localtexhashluaotfload-tool --update

\setmainfont{Vollkorn}[ItalicFont={* Italic},
                        BoldFont={* Bold}, BoldItalicFont={* Bold Italic}]

与之前一样:文档中使用的直立字体最终是来自 的字体$HOME/Library/Fonts/,其他字体来自texmf-local

我当时想,解释是,只有当系统库中存在 文件名为 的字体时,才能Vollkorn-Regular.{otf,ttf}通过 找到该字体。但这种解释完全是错误的:luaotfload\setmainfontVollkorn

如果我只是otf从系统库中删除字体,请执行luaotfload-tool --update并重试:

\usepackage{fontspec}
\setmainfont{Vollkorn}[%
ItalicFont={* Italic},BoldFont={* Bold}, BoldItalicFont={* Bold Italic}]

则编译成功,日志显示:

</usr/local/texlive/2015/texmf-local/fonts/truetype/friedrichalthausen/vollkorn/
Vollkorn-Italic.ttf></usr/local/texlive/2015/texmf-local/fonts/truetype/friedric
halthausen/vollkorn/Vollkorn-BoldItalic.ttf></usr/local/texlive/2015/texmf-local
/fonts/truetype/friedrichalthausen/vollkorn/Vollkorn-Bold.ttf></usr/local/texliv
e/2015/texmf-local/fonts/truetype/friedrichalthausen/vollkorn/Vollkorn-Regular.t
tf>
Output written on testluaotfload.pdf (1 page, 25202 bytes).
Transcript written on testluaotfload.log.

所有文件均在 中找到texmf-local

otf如果我把文件移回~/Library/Fonts系统用户位置,它就会被使用。在这种情况下,奇怪的是这种情况只发生在直立形状上。对于粗体、斜体和粗体斜体,找到texmf-local的文件优先于中的字体文件~/Library/Fonts

答案1

提供多种字体版本并不是一个好主意(xelatex 也是如此)。要按名称查找字体,fontspec 和 lualatex 必须检查各种变体(和各种扩展),并且搜索必须是“模糊的”,因此很容易找到错误的字体。

您可以尝试\setmainfont{...}[Extension=.otf]使用文件名而不是字体名来强制使用正确的扩展名。

相关内容