使用 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