安装 Open Type 字体的更新版本,以便在 TeX Live 2018 中与 LuaLaTeX 一起使用

安装 Open Type 字体的更新版本,以便在 TeX Live 2018 中与 LuaLaTeX 一起使用

在 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.cnftexmf-local/tex/luatex/luaotfload

  • 删除 luaotfload-names.lua.gz 和 luc

  • 还从字体中删除 lua 和/luc 文件\texlive\2018\texmf-var\luatex-cache\generic\fonts\otl(它们也包含路径)

  • 使用 重新创建数据库luaotfload-tool -uf

我认为应该将字体列入黑名单。遗憾的是,我认为无法将整个目录列入黑名单。

相关内容