![如何让包在类中加载时忽略它不知道的参数?](https://linux22.com/image/289660/%E5%A6%82%E4%BD%95%E8%AE%A9%E5%8C%85%E5%9C%A8%E7%B1%BB%E4%B8%AD%E5%8A%A0%E8%BD%BD%E6%97%B6%E5%BF%BD%E7%95%A5%E5%AE%83%E4%B8%8D%E7%9F%A5%E9%81%93%E7%9A%84%E5%8F%82%E6%95%B0%EF%BC%9F.png)
我正在定义一个扩展类,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}