在 Linux 上安装的 TeX Live 2018 中,我想替换自由主义者TeX Live 附带的字体由其最新的 GitHub 版本提供。如果它们在 LuaLaTeX 中使用,例如通过
\usepackage{fontspec}
\setmainfont{Libertinus Serif}
新版本应该会自动使用。似乎(感谢 Thérèse)在旧版本的 TeX Live 中,将它们放在系统字体文件夹中就足够了,例如~/.fonts/
。这在 TeX Live 2018 中不再有效。本地树也/usr/local/texlive/texmf-local/fonts/
不起作用。
还请包括其他所需步骤,如运行命令来更新字体缓存等。
这对我来说并不重要,如果仍然安装或删除旧版本,我只是不想再使用它们了。
答案1
luaotfload
当给定字体名称时,使用两级查找,例如Libertinus Serif
:首先在缓存中查找名称以获取文件名,在本例中libertinusserif-regular.otf
,然后使用单独的查找来定位此文件。名称查找优先在系统目录中查找文件,而文件名查找在 TeX 树中查找字体。
为了避免这种情况,您必须避免对字体使用相同的文件名。例如,您可以在将文件名复制到时将 Libertinus 的版本号添加到文件名中~/.fonts
。然后只需运行luaotfload-tool -uf
即可luaotfload
获取更改。您不必运行fc-cache
或其他 fontconfig 命令,luaotfload
不使用fontconfig
,它只会读取相同的配置文件。
另一个解决方案是修补luaotfload
。如果文件luaotfload-database.lua
已使用
diff --git a/usr/local/texlive/2018/texmf-dist/tex/luatex/luaotfload/luaotfload-database.lua b/luaotfload-database.lua
index 9c8c298..ca1fca6 100644
--- a/usr/local/texlive/2018/texmf-dist/tex/luatex/luaotfload/luaotfload-database.lua
+++ b/luaotfload-database.lua
@@ -721,9 +721,9 @@ local get_font_file = function (index)
return true, basename, entry.subfont
end
else --- system, local
- local fullname = name_index.files.full [index]
+ local fullname = entry.fullpath
if lfsisfile (fullname) then
- return true, basename, entry.subfont
+ return true, fullname, entry.subfont
end
end
return false
@@ -1024,7 +1024,7 @@ local lookup_fontname = function (specification, name, style)
or face.fullname == name
or face.psname == name
then
- return face.basename, face.subfont
+ return face.fullpath, face.subfont
elseif face.familyname == name then
if typographicsubfamily == style
or subfamily == style
@@ -1043,10 +1043,10 @@ local lookup_fontname = function (specification, name, style)
end
end
if fallback then
- return fallback.basename, fallback.subfont
+ return fallback.fullpath, fallback.subfont
end
if lastresort then
- return lastresort.basename, lastresort.subfont
+ return lastresort.fullpath, lastresort.subfont
end
return nil, nil
end
直接使用名称缓存中的实际路径,这样就解决了问题。我还没有对此进行过大量测试,因此可能会产生其他后果。
答案2
当我(在 Windows 上)在多个位置使用字体时,所有位置都在 中luaotfload-names.lua
。我有些怀疑(但测试并不容易)这些字体位置的使用顺序是否明确定义( 中的表格lua
没有明确定义的顺序)。
所以我会避免在可访问的位置拥有多个字体副本。
这意味着对于通过 texlive 提供的字体,我要么
- 卸载原有的字体包
- 或将原始字体列入(本地)黑名单
luaotfload-blacklist.cnf
对于第二种情况:
添加例如
d:/texlive/2018/texmf-dist/fonts/opentype/public/libertinus/libertinusserif-regular.otf
例如
luaotfload-blacklist.cnf
texmf-local/tex/luatex/luaotfload
删除 luaotfload-names.lua.gz 和 luc
还从字体中删除 lua 和/luc 文件
\texlive\2018\texmf-var\luatex-cache\generic\fonts\otl
(它们也包含路径)使用 重新创建数据库
luaotfload-tool -uf
。
我认为应该将字体列入黑名单。遗憾的是,我认为无法将整个目录列入黑名单。