显然 \IfFileExists 不能与 otf 一起使用?

显然 \IfFileExists 不能与 otf 一起使用?

使用 TeXlive 2023、Linux、lualatex。

令我惊讶的是,\IfFileExists似乎没有找到任何*.otf文件,无论该文件是安装到texmf-dist我的texmf主目录中。MWE:

% !TeX TS-program = lualatex
% !TeX encoding = UTF-8
\documentclass{article}
\usepackage{fontspec}
\IfFileExists{LibertinusSerif-Regular.otf}{
  \typeout{FOUND IT}
}{
  \typeout{NOT FOUND} % This is the response.
}
\setmainfont{Libertinus Serif}
\begin{document}
Hello World. % Prints in LibertinusSerif-Regular.otf.
\end{document}

使用 进行编译时lualatex,我期望命令行输出(和日志文件)包含FOUND IT,因为该文件肯定存在。如果它尝试使用 Libertinus Serif 字体系列作为我的主要字体,它可以工作。但\IfFileExists找不到具有正确文件扩展名的文件。

我知道有一个命令\IfFontExists,但如果没有字体,它可能需要很长时间,所以我不想那样做。

答案1

\IfFileExists只能搜索$TEXINPUTS树,即有意义的文件\input(以及可能手动添加的内容)。

您可以定义一个函数,使用 来查找整个texmf-dist树(几乎)kpsewhich

\documentclass{article}

\ExplSyntaxOn

\NewDocumentCommand{\IfFileInTEXTree}{O{}mmm}
 {
  \sys_get_shell:nnN { kpsewhich~#1~#2 } {\escapechar=-1\scan_stop:} \l_tmpa_tl
  \tl_if_blank:VTF \l_tmpa_tl { #4 } { #3 }
 }

\ExplSyntaxOff

\IfFileInTEXTree{LibertinusSerif-Regular.otf}{%
  \typeout{FOUND IT}%
}{
  \typeout{NOT FOUND}%
}

\IfFileInTEXTree{whatever.otf}{%
  \typeout{FOUND IT}%
}{
  \typeout{NOT FOUND}%
}

\stop

您还可以添加选项kpsewhich(参见其手册)

\IfFileInTEXTree[<options>]{<filename>}{<true>}{<false>

这不需要不受限制的 shell 转义,只需要默认的受限 shell 转义。

日志文件将显示

(|kpsewhich  LibertinusSerif-Regular.otf)
FOUND IT
(|kpsewhich  whatever.otf)
NOT FOUND

相关内容