将选项从父类传递到子类

将选项从父类传递到子类

这个问题与前一个:假设我正在使用以下代码根据现有类定义一个新类:

\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

课程选项处理是一件棘手的事情,至少有两个原因:

  1. 所有选项都累积在\@classoptionlist宏中,并且从该列表中删除项目相对困难,
  2. 标准类,例如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

相关内容