classX
我正在使用接受类选项的类optionX
。因此,我可以写:
\documentclass[optionX]{classX} ...
现在,据我所知,作为一个类选项,在classX
处理完此选项后,optionX
它是全局定义的。一切都很好,除了随后,对于packageY
它也接受optionX
(相同的选项名称,无论语义上如何无关),这两行
\usepackage{packageY}
\usepackage[optionX]{packageY}
两者都(错误地)产生了相同的效果。如果我可以optionX
在执行之前取消定义,那么一切都会好起来\usepackage{packageY}.
(此时我还应该指出,为了避免有人担心这可能会影响 的classX
后续性能,没有必要担心——classX
在执行其类 之后,不需要此选项保持定义状态\ProcessOptions
)。
因此,我的问题的核心是,是否有人比我更了解 TeX\LaTeX,知道该怎么做?仅供参考,我尝试了几种常见的方法:在仔细阅读 source2e.pdf 后,我进行了\let\optionX\@undefined
几次毫无头绪的尝试。\let\<prefix>@optionX\@undefined
(JW:遗憾的是,我认为我无法抑制 LaTeX3 所承诺的封装命名空间解决方案。叹。)
答案1
相关宏似乎是\@classoptionslist
。它是传递给类的选项的逗号分隔列表。因此,通过删除不需要的选项来重新定义它将从后续包的视图中删除它们。
测试文档:
\documentclass[a4paper,draft,wibble]{article}
\makeatletter
\def\@classoptionslist{a4paper,draft}
\makeatother
\usepackage{options}
\begin{document}
\end{document}
测试包:
\ProvidesPackage{options}
\DeclareOption{draft}{\message{^^JGot draft^^J}}
\DeclareOption{wibble}{\message{^^JGot wibble^^J}}
\ProcessOptions
@classoptionslist
参考我对实际问题留下的评论,我会对当地的(在修改之前保存真实值并在包加载后恢复它)以避免与其他可能想要知道传递给该类的完整列表的包发生问题。
有关如何实际进行修改,请参阅这个问题关于迭代列表。