
Verwende TeXlive 2023, Linux, lualatex.
Zu meiner Überraschung \IfFileExists
scheint keine *.otf
Datei zu finden, unabhängig davon, ob die Datei in texmf-dist
meinem texmf
Home-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 lualatex
erwarte 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. \IfFileExists
Die 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 \IfFileExists
kann nur im $TEXINPUTS
Baum gesucht werden, also nach Dateien, für die es Sinn ergibt \input
(und ggf. auch nach etwas, das von Hand hinzugefügt wurde).
texmf-dist
Sie 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