在我正在制作的包中,我想忽略默认的草稿行为并编写自己的行为。我尝试过:
\DeclareOption{draft}{
MYCOMMANDS
...
\OptionNotUsed
}
\ProcessOptions
如果draft
使用,则运行我的命令,但该draft
选项的所有其他功能(例如禁用图像和超链接)仍然启用。
我想draft
从我的包的文档类级别禁用该选项,并阻止将其传递给任何包。可以从我的包中执行此操作吗?
答案1
如果draft
指定了选项,\documentclass
它将传递给全部知道此选项的软件包。相反,如果仅在您的软件包中指定此选项,则不会将其传递给其他软件包。
\documentclass[<global options>]{<class>}
\usepackage[<local options>]{<package>}
列表中的选项<global options>
将由类和序言中加载的任何包尝试,但如果包不知道,则不会显示错误或警告。
列表中的选项<local options>
将被传递给<package>
(可能会通过 将它们传递给之后加载的其他包\PassOptionsToPackage
)。
因此
\documentclass[draft,...]{article}
所有软件包都会尝试遵守该draft
选项,但某些软件包中的代码却无法解决这个问题。
但是,如果您的包在类之后立即加载,并且您知道如何修改全局选项列表,那么就可以做您想做的事情。以下是“秘密”代码:
\def\@clearglobaloption#1{%
\def\@tempa{#1}%
\let\@tempb\@gobble
\@for\next:=\@classoptionslist\do
{\ifx\next\@tempa
\message{Cleared option \next\space from global list}%
\else
\edef\@tempb{\@tempb,\next}%
\fi}%
\let\@classoptionslist\@tempb
\ifx\@tempb\@gobble
\let\@classoptionslist\@empty
\fi}
\@clearglobaloption{draft}
我已将其设为通用:任何选项都可以通过这种方式清除。请注意,某些类,例如投影机对选项列表做不同的事情,所以这个技巧可能对它们不起作用。
更新
利用expl3
LaTeX 内核(已经存在好几年了),我们可以大大简化业务。
\ExplSyntaxOn
\cs_new_protected:cpn { @clearglobaloption } #1
{
\clist_remove_all:cn { @classoptionslist } { #1 }
}
\ExplSyntaxOff