
TeXlive 2023、Linux、lualatex を使用します。
驚いたことに、ファイルがホーム ディレクトリにインストールされているかどうかに関係なく、ファイルが見つから\IfFileExists
ないようです。MWE:*.otf
texmf-dist
texmf
% !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>
これには、制限のないシェル エスケープは必要なく、デフォルトの制限されたシェル エスケープだけが必要です。
ログファイルには
(|kpsewhich LibertinusSerif-Regular.otf)
FOUND IT
(|kpsewhich whatever.otf)
NOT FOUND