我想定义一些base-class.cls
,带有一些选项及其默认值,然后提供一些机制,以便其他派生类可以重用现有的选项和更改默认值。此外,我希望base-class
将来添加到的选项也能传播到派生类,而无需进行任何进一步的更改。
这个问题与现有的问题有些相关新的和现有的课程选项。 在本质上,如何在定义新类时替换默认的选项集?。
例如,假设某个基类具有article.cls
三个互斥选项:10pt
和11pt
。12pt
其中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.cls
)funny-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
,返回所有选项的逗号分隔列表。然后,您可以在派生类中检索基类接受的选项列表,并使用它来做出进一步的决定,而无需对基选项的现状进行硬编码。
最好的