我需要编写一个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
好吧,我可以用write18
TeX 文件调用这个命令,但我想知道是否有更简单的方法来做到这一点。
更新:好的,我可能应该更好地解释我想要什么。我想检查 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}
?