如何让包在类中加载时忽略它不知道的参数?

如何让包在类中加载时忽略它不知道的参数?

我正在定义一个扩展类,article该类加载内部的包(automultiplechoice)。我正在尝试使用命令的参数来配置包和类\documentclass

当我测试其他包(例如hyperref)时,它可以工作(参见下面的代码)。

\RequirePackage{filecontents}
\begin{filecontents*}{test.cls}
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{test}[2012/02/10 Mini class for testing proposal]

\DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}}
\ProcessOptions\relax
\LoadClass{article}

% toggle this
\PassOptionsToPackage{linkcolor=blue}{hyperref}
\DeclareOption*{\PassOptionsToPackage{\CurrentOption}{hyperref}}
\ProcessOptions\relax
\RequirePackage{hyperref}

\end{filecontents*}
\documentclass[colorlinks=true,legalpaper]{test}

\begin{document}
\section{Test}\label{foo}

\ref{foo}

\end{document}

但是,当我将其更改为automultiplechoice包时,它却没有(参见下面的代码)

\RequirePackage{filecontents}
\begin{filecontents*}{test.cls}
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{test}[2012/02/10 Mini class for testing proposal]

\DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}}
\ProcessOptions\relax
\LoadClass{article}

% with this
\PassOptionsToPackage{lang=EN}{automultiplechoice}
\DeclareOption*{\PassOptionsToPackage{\CurrentOption}{automultiplechoice}}
\ProcessOptions\relax
\RequirePackage{automultiplechoice}

\end{filecontents*}


\documentclass[legalpaper,lang=ES]{test}

\begin{document}
\section{Test}\label{foo}

\ref{foo}

\end{document}

在后者中,类的未知参数article(在本例中legalpaper)会在包中触发错误,但我希望它们被忽略。我得到了错误

!LaTeX 错误:legalpaper包的未知选项automultiplechoice

我遗漏了什么?这与定义有关吗xkeyvalue

我希望能够将参数传递给包和具有相同定义中的类\documentclass我怎样才能实现这一点?

答案1

除非您使用的包/类具有某种机制来处理它们不知道的选项(通过忽略它们或仅发出警告),否则如果您不加区分地传递选项(使用带星号的选项\DeclareOption),您将会遇到麻烦。您需要自己处理“哪个选项放在哪里”。

  • 在调用之前应该声明所有选项\ProcessOptions
  • \ProcessOptions仅在您的类文件中调用一次。
  • 指定每个选项应传递给哪个类/包。为了实现更多自动化,您可以\batchPassOptionsToClass使用 LaTeX 的 for 循环结构定义一个宏(下面称为)。

看一下适用于课程和软件包编写者的 LaTeX2e有关类/包编写的良好教程。

在此处输入图片描述

\RequirePackage{filecontents}
\begin{filecontents*}{test.cls}
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{test}[2012/02/10 Mini class for testing proposal]

% helper macros (for more automation)
\makeatletter
\newcommand\batchPassOptionsToClass[2]
{%
  \edef\@tempa{#1} % option list
  \@for\@tempb:=\@tempa\do{
    \DeclareOption{\@tempb}{\PassOptionsToClass{\CurrentOption}{#2}}
  }
}

\newcommand\batchPassOptionsToPackage[2]
{%
  \edef\@tempa{#1}% option list
  \@for\@tempb:=\@tempa\do{%
    \DeclareOption{\@tempb}{\PassOptionsToPackage{\CurrentOption}{#2}}%
  }%
}
\makeatother

% declare all options that should be passed to article
\batchPassOptionsToClass
  {a4paper,legalpaper} % list all options that should be passed to article here
  {article}

% pass all other options to the automultiplechoice package
\DeclareOption*{\PassOptionsToPackage{\CurrentOption}{automultiplechoice}}
% (or use \batchPassOptionsToPackage, if need to pass some options to other packages)

% process options (only once in your class file)
\ProcessOptions\relax

\LoadClass{article}

\RequirePackage[lang=EN]{automultiplechoice}
\end{filecontents*}


\documentclass[legalpaper,lang=ES]{test}

\begin{document}
\section{Test}\label{foo}

\ref{foo}


\end{document}

相关内容