# How to make a package to ignore parameters it doesn't know when loading in a class?

I'm defining a class that extends article that loads a package inside (automultiplechoice). I'm trying to configure the package and the class using the parameters of the \documentclass command.

When I test for other packages (for example hyperref) it works (see code below).

\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}


However, when I change it to the automultiplechoice package, it doesn't (see code below)

\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}


In the latter, the unknown parameters for the article class (in this case legalpaper) trigger an error in the package, but I would like them to be ignored. I got the error

! LaTeX Error: Unknown option legalpaper for package automultiplechoice.

What I am missing? It has something to do with the xkeyvalue definitions?

I would like to be able to pass parameters to the package and to the class in the same definition in \documentclass. How can I make that happen?

• You need to specify which options are supposed to be passed to the article class and which are supposed to be passed to the automultiplechoice package. I think you're misusing the starred \DeclareOption, here. May 2 '14 at 16:44
• I think that, but didn't work. I tried something in the lines of \DeclareOption{lang=EN}{\PassOptionsToPackage{\CurrentOption}{automultiplechoice}}. Also, that solution has the limitation that I have to manually define all the available options, and if in the future there are more or less options I need to change my code. So, is not maintanable in time.
– adn
May 2 '14 at 16:48
• It is maintainable if you define a macro to automate option passing to one thing or the other. Also, I don't think you're supposed to invoke \ProcessOptions more than once. May 2 '14 at 16:50
• Can you show an example or provide information on how to do such automation?
– adn
May 2 '14 at 16:51

## 1 Answer

Unless the packages/classes you use have some mechanism to cope with options they don't know (by either ignoring them or by merely issuing a warning), you're going to be in trouble if you pass options around indiscriminately (by using the starred \DeclareOption as you do). You need to take care of "which option goes where" yourself.

• All your options should be declared before you invoke \ProcessOptions.
• Only invoke \ProcessOptions once in your class file.
• Specify to which class/package each option should be passed. For more automation, you can define a macro (called \batchPassOptionsToClass below) using LaTeX's for-loop construct.

Have a look at LaTeX2e for class and package writers for a good tutorial on class/package writing.

\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}