如果字体不存在,fontspec 可以提供后备字体吗?

如果字体不存在,fontspec 可以提供后备字体吗?

我正在与一位对字体选择很挑剔的合作者合作编写文档。我的合作者向我提供了字体文件,但在我使用的特定机器上,我没有管理员权限,无法在系统范围内安装字体。不过,我可以通过fontspec(我们用作lualatex引擎)显式加载字体,但这意味着我们的文档略有不同,因为我的合作者从系统加载字体,而我从文件加载字体。

我们能否让一个前导码同时适用于两者?我设想它会告诉您fontspec查找特定字体,如果找不到,则查找另一种字体。

请注意,这是关于加载整个字体,而不仅仅是单个字符。

一些可供玩的代码。

\documentclass{article}

\usepackage{fontspec}

% One person has this installed system-wide
\setmainfont{TeX Gyre Termes}
% Try misspelling the above and watch lualatex complain loudly about the missing font

% The other only has the file
\setmainfont{texgyretermes-regular.otf}

\begin{document}
Wouldn't it be nice if this were Termes?
\end{document}

注意:我知道这个问题的答案,而且它实际上是一个 RTM,但我确实花了一段时间在网上徒劳地寻找答案,甚至没有得到任何可能的提示,所以我觉得值得在这里发布以改善搜索引擎结果。我会等一下再发布我的答案,因为我很懒,在我还没来得及回答之前,其他人可能会发布一个更好的答案和漂亮的代码。一旦答案发布,我就会删除此注释。

答案1

有一个命令\IfFontExists(TF)可以fontspec提供所需的功能:

\documentclass{article}
%\url{https://tex.stackexchange.com/q/438577/86}
\usepackage{fontspec}

% Check to see if this font is installed system-wide
\IfFontExistsTF{TeX Gyre Termes}{%
% One person has this installed system-wide
  \setmainfont{TeX Gyre Termes}
}{
% If not, load it from the file
  \setmainfont{texgyretermes-regular.otf}
}

\begin{document}
Wouldn't it be nice if this were Termes?
\end{document}

如果TeX Gyre Termes系统上安装了字体,lualatex则会找到它,并因此选择 true 分支,从系统中加载它。如果系统中不存在字体,则会从文件中加载它。

这意味着在系统上安装了它的人不必拥有不必要的文件,而系统上没有安装它的人不必安装仅在单个文档中使用的字体(或者可以使用他们无法安装的字体)。

答案2

您的描述听起来不像是想要声明后备,而更像是想要告诉 fontspec/luaotfload 如何找到字体。

我会将字体放在 中的本地 texmf 树中texmf/fonts/opentype(或fonts/truetype)。如果这不行,您可以创建一个TeXGyreTermes.fontspec文件并在其中声明字体。例如,使用此声明

\defaultfontfeatures[TeX Gyre Termes]
{
 Extension=.ttf,
 UprightFont=Arial
}

您的例子\setmainfont{TeX Gyre Termes}将使用 arial:

在此处输入图片描述

相关内容