禁用包中的草稿选项

禁用包中的草稿选项

在我正在制作的包中,我想忽略默认的草稿行为并编写自己的行为。我尝试过:

\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}

我已将其设为通用:任何选项都可以通过这种方式清除。请注意,某些类,例如投影机对选项列表做不同的事情,所以这个技巧可能对它们不起作用。

更新

利用expl3LaTeX 内核(已经存在好几年了),我们可以大大简化业务。

\ExplSyntaxOn
\cs_new_protected:cpn { @clearglobaloption } #1
 {
  \clist_remove_all:cn { @classoptionslist } { #1 }
 }
\ExplSyntaxOff

相关内容