如何从 LaTeX 检查 pfb 文件是否存在?

如何从 LaTeX 检查 pfb 文件是否存在?

我需要编写一个tex文件来检查库是否可以找到某些文件。检查是否可以找到 a 或 `fd 文件kpathsea很容易:sty

 \IfFileExists{hyperref.sty}{Hyperref found}{Hyperref is not found}
 \IfFileExists{t1stix.fd}{Stix FD found }{Stix FD is not found}

但是我想知道是否stix-mathrm.pfb可以找到。当然,我可以从命令行轻松完成此操作,如

kpsewhich stix-mathrm.pfb

好吧,我可以用write18TeX 文件调用这个命令,但我想知道是否有更简单的方法来做到这一点。

更新:好的,我可能应该更好地解释我想要什么。我想检查 TeX 的安装是否足够好acmart。我知道如何检查样式文件及其版本的存在性。

有时会发生这种情况:用户的字体安装不完整: fd和和sty存在,但字体本身不存在。我需要检查是否是这种情况。

由于检查必须由用户运行,因此我无法重新排列文件位置、输入路径,或者使用它write18,因为许多用户不知道如何启用它。

理想情况下,我想要一个tex可以生成 PDF 的文件,其内容为:“您的版本足够好hyperref,但缺少libertine字体。请从...安装它们。”

好吧,我想我需要解析日志文件:(

更新 2:。我真傻。 kpsewhich 在 TeXLive 和 MikTeX 中默认启用write18。我以为没有。

抱歉,我问了一个愚蠢的问题。

答案1

您可以使用catchfile,其界面比更简单\read。这不需要 shell 转义(适用于受限 shell),但可能无法在 MiKTeX 中使用(抱歉,无法测试)。

\documentclass{article}
\usepackage{catchfile}

\makeatletter
\newcommand{\IfExistsInTeXTrees}[1]{%
  \begingroup
  \CatchFileDef{\temp}{"|kpsewhich #1"}{\endlinechar=\m@ne}%
  \expandafter\endgroup
  \ifx\temp\@empty
    \expandafter\@secondoftwo
  \else
    \expandafter\@firstoftwo
  \fi
}
\makeatother

\begin{document}

\IfExistsInTeXTrees{stix-mathrm.pfb}{YES}{NO}

\IfExistsInTeXTrees{funny.pfb}{YES}{NO}

\end{document}

一种expl3实现方式:

\documentclass{article}
\usepackage{expl3}

\ExplSyntaxOn

\prg_new_protected_conditional:Nnn \boris_if_exists_in_tex_trees:n { T,F,TF }
 {
  \sys_get_shell:nnN { kpsewhich~#1 } { \endlinechar=-1 } \l__boris_if_exists_temp_tl
  \tl_if_blank:VTF \l__boris_if_exists_temp_tl
   {
    \prg_return_false:
   }
   {
    \prg_return_true:
   }
 }
\tl_new:N \l__boris_if_exists_temp_tl
\cs_new_eq:NN \IfExistsInTeXTreesTF \boris_if_exists_in_tex_trees:nTF
\cs_new_eq:NN \IfExistsInTeXTreesT \boris_if_exists_in_tex_trees:nT
\cs_new_eq:NN \IfExistsInTeXTreesF \boris_if_exists_in_tex_trees:nF

\ExplSyntaxOff

\begin{document}

\IfExistsInTeXTreesTF{stix-mathrm.pfb}{YES}{NO}

\IfExistsInTeXTreesT{stix-mathrm.pfb}{YES}

\IfExistsInTeXTreesTF{funny.pfb}{YES}{NO}

\IfExistsInTeXTreesF{funny.pfb}{NO}

\end{document}

答案2

如果你想避免 shell-escape 来使你能够运行kpsewhich另一种方法,那就是将字体放在 tex 输入路径中,这样你就可以使用 IfFileExists

\documentclass{article}

\begin{document}

\IfFileExists{stix-mathrm.pfb}{\show\yes}{\show\no}

\end{document}

这表示默认路径无效

$ pdflatex pp446
This is pdfTeX, Version 3.14159265-2.6-1.40.18 (TeX Live 2017) (preloaded format=pdflatex)
 restricted \write18 enabled.
entering extended mode
(./pp446.tex
LaTeX2e <2017-04-15>
Babel <3.13> and hyphenation patterns for 84 language(s) loaded.
(/usr/local/texlive/2017/texmf-dist/tex/latex/base/article.cls
Document Class: article 2014/09/29 v1.4h Standard LaTeX document class
(/usr/local/texlive/2017/texmf-dist/tex/latex/base/size10.clo)) (./pp446.aux)
> \no=undefined.
\reserved@a ->\show \no 

l.5 ...xists{stix-mathrm.pfb}{\show\yes}{\show\no}

? 

但是如果你调整路径以将 type1 字体路径附加到标准输入路径

$ TEXINPUTS=:\$T1FONTS pdflatex pp446
This is pdfTeX, Version 3.14159265-2.6-1.40.18 (TeX Live 2017) (preloaded format=pdflatex)
 restricted \write18 enabled.
entering extended mode
(./pp446.tex
LaTeX2e <2017-04-15>
Babel <3.13> and hyphenation patterns for 84 language(s) loaded.
(/usr/local/texlive/2017/texmf-dist/tex/latex/base/article.cls
Document Class: article 2014/09/29 v1.4h Standard LaTeX document class
(/usr/local/texlive/2017/texmf-dist/tex/latex/base/size10.clo)) (./pp446.aux)
> \yes=undefined.
\reserved@a ->\show \yes 

l.5 ...xists{stix-mathrm.pfb}{\show\yes}{\show\no}

? 

相关内容