如何让与 xelatex 兼容的系统字体与 lualatex 兼容?

如何让与 xelatex 兼容的系统字体与 lualatex 兼容?

我正在尝试将文档从使用 xelatex+polyglossia 转换为使用 luatex+babel (按照建议这里)。

相关代码为:

\usepackage[english, bidi=basic]{babel}
\usepackage{fontspec}
\babelprovide[import,main]{hebrew}
\babelfont[*hebrew]{rm}{David CLM}

lualatex 开始缓慢地运行,然后说:

luaotfload | db : Reload initiated (formats: otf,ttf,ttc); reason: "Font DavidCLM not found.".
luaotfload | resolve : sequence of 3 lookups yielded nothing appropriate.

! Package fontspec Error: The font "DavidCLM" cannot be found.

David CLM 是一种系统字体(在我的 Devuan GNU/Linux 3.0 Beowulf 系统上);并且 xelatex 可以使用它。为什么 lualatex 不能使用它?我该如何让 lualatex 识别并使用该字体?

答案1

如果 XeTeX 可以找到字体,fc-match那么也应该可以。因此,你可以使用以下命令获取其索引下的所有名称

fc-match -v "David CLM"

在我的系统上,这告诉我文件名是DavidCLM-Medium.otf,系列是“David CLM”,样式是“Medium”,全名是“David CLM Medium”。XeTeX 将“David CLM”与“David CLM Medium”匹配,而 LuaTeX 则没有。

推荐的加载字体系列的方式是通过其文件名:

\documentclass{article}
\usepackage[bidi=basic, layout=sectioning.tabular]{babel}
\usepackage{fontspec}

\babelprovide[import=he]{hebrew}
\defaultfontfeatures{ Scale = MatchUppercase,
                      Ligatures = TeX }

\defaultfontfeatures[DavidCLM]{
  UprightFont = *-Medium,
  BoldFont = *-Bold,
  Ligatures = Discretionary,
  Extension = .otf,
  % For italics that slant right-to-left, use:
  ItalicFont = *-MediumItalic,
  BoldItalicFont = *-BoldItalic,
  % For italics that slant left-to-right, instead use:
  % AutoFakeSlant = 0.15
  }

\babelfont{rm}
          [Scale=1.0]{TeX Gyre Schola}
\babelfont[hebrew]{rm}
          {David CLM}

\begin{document}
\begin{otherlanguage}{hebrew}
שָׁלוֹם חֲבֵרִים
\end{otherlanguage}
\end{document}

David CLM 样本

这样就消除了所有的猜测,并告诉fontspec查找具有确切名称的文件DavidCLM-Medium.otfDavidCLM-Bold.otf等等。

更简单的 MWE 将是

\documentclass{article}
\usepackage[bidi=basic, layout=sectioning.tabular]{babel}

\babelprovide[import, main]{hebrew}

\babelfont{rm}
          [UprightFont=*-Medium]{DavidCLM}

\begin{document}
שָׁלוֹם חֲבֵרִים
\end{document}

David CLM 样本

请注意,我有安装了 Culmus Project 字体 1.33 版本。 如果您的系统上安装了不同的版本,您的文件可能会有不同的文件名。您还应该能够通过系列名称加样式来加载它UprightFont = {David CLM Medium}, BoldFont = {David CLM Bold}(不用担心您不想要的倾斜面)。

答案2

也许有更聪明的解决方案,但这就是我所做的。这个问题的答案:

如何获取 luaotfload 的所有可用字体列表?

允许您列出所有可以使用 lualatex 的字体(用于“使用”的一些定义)。我查找了字体名称的基本部分“David”,但忽略了大写,因为列表中的所有项目似乎都是小写的。所以:

$ ./listluatexfonts | egrep -i "david.*clm" | sort -u
davidclmbold
davidclmbolditalic
davidclmmedium
davidclmmediumitalic
taameydavidclmbold
taameydavidclmboldoblique
taameydavidclmmedium

而我的情况的底线答案是davidclmmedium我的{rm}字体。也许我还需要发出粗体命令。


为了完整性,该listluatexfonts文件的内容如下:

#!/usr/bin/env texlua

kpse.set_program_name("listluatexfonts")
cachefile  = kpse.expand_var("$TEXMFVAR")  .. "/luatex-cache/generic/names/luaotfload-names.luc"
fontlist = dofile(cachefile)
assert(fontlist,"Could not load font name database")

local tmp = {}

for _,font in ipairs(fontlist.mappings) do
  tmp[#tmp + 1] = font.fontname
end
table.sort(tmp)

for _,fontname in ipairs(tmp) do
  print(fontname)
end

相关内容