将包作为可选参数加载

将包作为可选参数加载

我正在创建我的个人包。我想使用一个选项来打开/关闭包提供的行号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和。这样,如果不需要该包,就不会不必要地加载它。linenomystylineno\linenumberslinenolineno
  • 在包文件的选项部分期间不能加载包(因为这会导致 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将不会加载。

相关内容