Anscheinend funktioniert \IfFileExists nicht mit OTF?

Anscheinend funktioniert \IfFileExists nicht mit OTF?

Verwende TeXlive 2023, Linux, lualatex.

Zu meiner Überraschung \IfFileExistsscheint keine *.otfDatei zu finden, unabhängig davon, ob die Datei in texmf-distmeinem texmfHome-Verzeichnis installiert ist oder nicht. 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}

Beim Kompilieren mit lualatexerwarte ich, dass die Befehlszeilenausgabe (und die Protokolldatei) enthält FOUND IT, da die Datei definitiv vorhanden ist. Wenn ich versuche, die Schriftfamilie Libertinus Serif als meine Hauptschriftart zu verwenden, funktioniert es. \IfFileExistsDie Datei mit der richtigen Dateierweiterung wird jedoch nicht gefunden.

Mir ist bewusst, dass es dafür einen Befehl gibt \IfFontExists, aber es kann sehr lange dauern, wenn die Schriftart nicht vorhanden ist, deshalb möchte ich es nicht auf diese Weise machen.

Antwort1

Mit \IfFileExistskann nur im $TEXINPUTSBaum gesucht werden, also nach Dateien, für die es Sinn ergibt \input(und ggf. auch nach etwas, das von Hand hinzugefügt wurde).

texmf-distSie können eine Funktion definieren, die mithilfe von (fast) den gesamten Baum nachschlägt 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

Sie können auch Optionen hinzufügen kpsewhich(siehe Handbuch)

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

Dies erfordert kein uneingeschränktes Shell-Escape, sondern nur das standardmäßige eingeschränkte Shell-Escape.

Die Protokolldatei zeigt

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

verwandte Informationen