我正在创建我的个人包。我想使用一个选项来打开/关闭包提供的行号lineno
。
所以我的sty
文件包含
\RequirePackage{lineno}
\linenumbers
但是如果没有lineno
安装该包,则会产生错误。如果安装了该包,则会枚举行。
我想检查是否有lineno
第一个,如果是,我希望能够使用我的包作为
\usepackage[lineno]{mysty} % to turn on the numbering
或者
\usepackage{mysty} % default with no numbering if `lineno` does not exists
我试过这个
\RequirePackage{lineno}
\@ifpackageloaded{lineno}{%
\DeclareOption{lineno}{\linenumbers}%
\ProcessOptions%
}{}
如果安装了,它就可以正常工作lineno
。但如果没有安装怎么办?
答案1
- 可以通过 测试文件
\IfFileExists{file}{yes}{no}
。 - 以下代码片段使用一个开关来记住package 的
\if@mysty@lineno
选项设置。如果给出了选项,则仅执行package和。这样,如果不需要该包,就不会不必要地加载它。lineno
mysty
lineno
\linenumbers
lineno
lineno
- 在包文件的选项部分期间不能加载包(因为这会导致 LaTeX 选项代码的重入问题)。
包的代码片段mysty
:
\newif\if@mysty@lineno % default: false
% Option declarations of package `mysty'
\IfFileExists{lineno.sty}{%
\DeclareOption{lineno}{\@mysty@linenotrue}%
}{%
\DeclareOption{lineno}{%
\PackageWarning{mysty}{Package lineno is not installed}%
}%
}
% Execute package options
\ProcessOptions
% Afterwards it is again safe to load packages
\if@mysty@lineno
\RequirePackage{lineno}\relax
\linenumbers
\fi
回答评论:
LaTeX 的实现\IfFileExists
将第二个和第三个参数放在宏定义中。因此,进一步定义此参数中的参数会带来麻烦,因为需要#
加倍。可以使用以下解决方法:
\IfFileExists{color.sty}\@firstoftwo\@secondoftwo{%
\RequirePackage{color}\relax
\newcommand*{\alert}[1]{\textcolor{red}{#1}}%
}{%
\newcommand*{\alert}[1]{\textbf{#1}}%
}
答案2
您可以输入以下内容mysty.sty
:
\newif\ifmysty@lineno
\DeclareOption{lineno}{\mysty@linenotrue}
[...]
\ProcessOptions\relax
[...]
\ifmysty@lineno
\IfFileExists{lineno.sty}
{\RequirePackage{lineno}}
{\PackageWarningNoLine{mysty}{You requested `lineno.sty' which\MessageBreak
doesn't exist on your system}}
\fi
然后如果你调用,\usepackage[lineno]{mysty}
你将加载该包,否则会警告它不存在。否则lineno
将不会加载。