这个问题与前一个:假设我正在使用以下代码根据现有类定义一个新类:
\ProvidesClass{foo}
\DeclareOption{handout}{\PassOptionsToClass{10pt,twocolumn}{article}}
\DeclareOption{speaker}{\PassOptionsToClass{12pt,onecolumn}{article}}
\DeclareOption*{\relax}
\ExecuteOptions{handout}
\ProcessOptions*
\LoadClass{article}
\endinput
为什么当我调用\documentclass[speaker]{foo}
包时不符合要求并且仍然选择默认handout
选项?
答案1
课程选项处理是一件棘手的事情,至少有两个原因:
- 所有选项都累积在
\@classoptionlist
宏中,并且从该列表中删除项目相对困难, - 标准类,例如
article
,通过指令以相当困难的方式定义它们的默认类选项\ProcessOptions\relax
。
因此,标准类中后来声明的选项article
(我们在此关注的)往往会覆盖先前的选项,即使它们在中一起出现\@classoptionlist
。
因此,就我而言,解决方案需要非常小心地考虑如何以及何时推翻默认选项,甚至可能需要借助内核/类宏来实现所需的结果。
\ProvidesClass{foo}
\DeclareOption{handout}{%
\PassOptionsToClass{twocolumn}{article}}% 10pt is default in article,
% no need to declare it again
\DeclareOption{speaker}{%
\PassOptionsToClass{12pt}{article}% overrules default 10pt option,
% without removing it from the list
\AtEndOfClass{\@twocolumnfalse}% overrules default class option twocolumn directly
}
\DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}}
\ExecuteOptions{handout}
\ProcessOptions*
\LoadClass{article}
\endinput