更改文档类的默认选项?

更改文档类的默认选项?

我想定义一些base-class.cls,带有一些选项及其默认值,然后提供一些机制,以便其他派生类可以重用现有的选项更改默认值。此外,我希望base-class将来添加到的选项也能传播到派生类,而无需进行任何进一步的更改。

这个问题与现有的问题有些相关新的和现有的课程选项。 在本质上,如何在定义新类时替换默认的选项集?

例如,假设某个基类具有article.cls三个互斥选项:10pt11pt12pt其中10pt是默认选项。现在想要定义一个新的文档类,假设nice-article它具有相同的三个选项,但是11pt是默认选项。

从链接问题的答案来看,解决方案是声明nice-article.cls使用中的三个选项\DeclareOption,将选定的操作存储在某些 if 或宏中,然后调用\ExecuteOptions{11pt}以设置新的默认值,最后\PassOptionsToClass{...}{article}使用适当的保存选项进行调用。

但这一切似乎太繁琐,而且不太模块化。比如说,稍后article会添加一个新13pt选项。理想情况下,我也希望nice-article从这个新选项中受益;特别是如果我明确表示

\DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}}

然而,使用该解决方案我还必须去进行修改nice-article.cls以使其意识到新的现有13pt

所以问题是 (a) 这个问题不是已经解决了吗?即是否存在一些我遗漏的包、扩展或命令,并且允许执行此操作?如果没有,(b) 我应该如何实现这样的功能?

假设我正在实现一个base-class.cls可以包含任何所需代码和宏的类;但是我希望能够在其基础上定义新类(例如nice-class.cls,,bright-class.clsfunny-class.cls,这些新类可以使用来自的选项base-class,定义它们自己的默认值,并且如果我碰巧更改了,则可以使用更多选项自动升级base-class

希望这个问题有意义。

答案1

您可以声明一个字符串选项,接受字体大小并默认为11 点。然而,这将以顶级类不再知道它到底在做什么为代价。但这是向上兼容性的一个主要问题。例如

\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{atop}[16/07/2011]

\RequirePackage{kvoptions}
% Declare a string option `fntsize' that is unique to the derived
% class `atop'. It will accept anything assuming `11pt' if
% unspecified.
\DeclareStringOption[11pt]{fntsize}
% probably more options...
\ProcessKeyvalOptions{atop}\relax
\PassOptionsToClass{\atop@fntsize}{article}

% Assume that any unknown option will be understood by the base class:
\DeclareOption*{%
  \PassOptionsToClass{\CurrentOption}{article}%
}
\ProcessOptions\relax

% Now load the base class with the `fntsize' option and any unknown
% option:
\LoadClass{article}

如果您恰好是基类的作者,因此可以自由地将其变成“好的基类”,那么您可以做一些更奇特的事情。例如,您可以添加一个宏,允许在类加载后执行选项。(例如超链接\hypersetup几何学's \geometry。)然后您可以进一步添加一个宏,例如\getOptionList,返回所有选项的逗号分隔列表。然后,您可以在派生类中检索基类接受的选项列表,并使用它来做出进一步的决定,而无需对基选项的现状进行硬编码。

最好的

相关内容