我需要在序言中引入一个条件结构,如果安装了完整版本,则加载包;如果存在,则加载其精简版本;否则加载某个标准包。需要这样做是因为我必须将代码转发给其他人,但我不知道她的 latex 安装的规格。包是mtpro2
,可以使用或不使用“精简”选项加载(“精简”是免费的,完整版不是)。
检查包是否存在很简单(使用\IfFileExists
)。检查包是否加载了某个属性集也很简单(使用ifpackagewith
)。但是我如何检查包是安装完整版还是精简版?
我当前的结构尝试了一种解决方法,即检查一些仅在完整版中可用的字体。但奇怪的是,这似乎不能正常工作。无论如何,这种方法不能扩展到其他软件包,因此我认为我的问题在更一般的情况下很有价值。
\IfFileExists{mtpro2.sty}{%this checks whether mtpro2 is installed
\IfFileExists{umt2hrb.fd}{%check whether there is this font: if the font is present, then full version is installed
\usepackage[noamssymbols,slantedGreek,zswash,mtpscr]{mtpro2}
}{%
\usepackage[lite,noamssymbols,slantedGreek,zswash]{mtpro2}
}%
}{%otherwise, load standard packages
\usepackage[cmintegrals]{newtxmath}
}%
谢谢您的帮助。希望对其他人也有用。
答案1
测试 fd 文件是没用的:它无论如何都存在,而且它只包含字体定义,而不是字体本身。您需要测试特定于完整版本的 tfm 和/或 pfb 字体。启用管道后,您可以执行类似以下操作(请参阅首先在 texmf 树中搜索文件):
\documentclass{article}
\pdfmapfile{=mtpro2.map}
\usepackage{etoolbox}
\newbool{fontexists}
\newread\mypipe
\openin\mypipe="|kpsewhich mt2syat.tfm"
\ifeof\mypipe
\else
\begingroup
\endlinechar=-1
\read\mypipe to \x
\ifdefempty{\x}
{\global\boolfalse{fontexists}}
{\global\booltrue{fontexists}}
\endgroup
\fi
\ifbool{fontexists}
{\usepackage[noamssymbols,slantedGreek,zswash,mtpscr]{mtpro2}}
{\usepackage[lite,noamssymbols,slantedGreek,zswash]{mtpro2}}
\begin{document}
a $a=b$
\end{document}