如何检查 fontspec(使用 LuaLaTeX)是否可以加载字体?

如何检查 fontspec(使用 LuaLaTeX)是否可以加载字体?

我想检查fontspec(使用 LuaLaTeX)是否可以加载某种字体,如果不能,则尝试加载另一种字体。对于 pdflatex,我通过检查包文件是否存在来做到这一点;但我找不到一种简单的方法来做到这一点fontspec

答案1

更新答案

此处最初描述的补丁不再需要(并且可能在最近的版本中不起作用)。

根据 fontspec 手册中的记录,fontspec现在有一个

\IfFontExistsTF{字体名称}{是代码}{没有代码}

命令允许您测试字体是否存在。



原始答案

您可以捕获错误并将其设为警告,只需设置一个标志,然后测试该标志并加载其他内容,请参阅下面的代码。请注意,这是在探究内部接口,因此如果它在字体规范更新时中断,请不要抱怨:-)

\documentclass{article}

\usepackage{fontspec}

\newif\ifgoodfont
\makeatletter
\ExplSyntaxOn
\cs_set:Nn \__fontspec_load_font:
 {
  \__fontspec_font_set:Nnn    \l_fontspec_font
     { \__fontspec_fullname:n {\l_fontspec_fontname_up_tl} } {\f@size pt}
  \__fontspec_font_if_null:NT \l_fontspec_font { 
\global\goodfontfalse
\__fontspec_warning:nx {font-not-found} {\l_fontspec_fontname_up_tl} }
  \__fontspec_set_font_type:
  \__fontspec_font_gset:Nnn   \l_fontspec_font
     { \__fontspec_fullname:n {\l_fontspec_fontname_up_tl} } {\f@size pt}
  \l_fontspec_font % this is necessary for LuaLaTeX to check the scripts properly
 }

\cs_set:Nn \__fontspec_load_fontname:n
 {
    \__fontspec_load_external_fontoptions:Nn \l_fontspec_fontname_tl {#1}
    \prop_get:NVNF \g__fontspec_fontopts_prop \l_fontspec_fontname_tl \l__fontspec_fontopts_clist
     { \clist_clear:N \l__fontspec_fontopts_clist }
    \__fontspec_font_set:Nnn \l_fontspec_font {\__fontspec_fullname:n {\l_fontspec_fontname_tl}} {\f@size pt}
    \__fontspec_font_if_null:NT \l_fontspec_font { 
\global\goodfontfalse
\__fontspec_warning:nx {font-not-found} {#1} }
 }


\ExplSyntaxOff
\makeatother

{\scrollmode\global\goodfonttrue
\setmainfont{zzzz}
}

\ifgoodfont
\typeout{(zzzz found (strange:-)}
\else
\typeout{zzzz not found, trying TeX Gyre Bonum}
\global\goodfonttrue
\setmainfont{TeX Gyre Bonum}
\ifgoodfont
\typeout{OK}
\else
\typeout{not found that either, stopping}
\stop
\fi
\fi


\begin{document}
zzz
\end{document}

相关内容