有多个互相矛盾的选择,如何处理?

有多个互相矛盾的选择,如何处理?

假设您正在编写一个包,它具有常见的draftfinal模式对。

但是,如果这个包有全局选项final和本地选项,我该如何处理draft

考虑以下例子:

\NeedsTeXFormat{LaTeX2e}[1999/12/01]
\ProvidesPackage{ex}[2014/07/26 v1.00 This is just an example]
\DeclareOption{draft}{\newcommand\@draftmode{true}}
\DeclareOption{final}{\let\@draftmode=\@undefined}
\ProcessOptions\relax
\ifdefined\@draftmode
  \newcommand\example{%
    an example text, only visible in draft mode}
\else
  \let\example=\relax
\fi

在以下 main.tex 中使用它:

\documentclass[final]{article}
\usepackage[draft]{ex}
\begin{document}
some example text and eventually some more text: \example.
\end{document}

结果输出“一些示例文本,最终是一些更多文本:”。如果我交换\DeclareOptionfinal首先,然后draft),那么至少我会得到输出\example。但如果我交换 main.tex 中的选项,它就不会起作用了……

那么 LaTeX 如何处理这个问题呢?

  • 检查两个选项是否都设置了然后引发错误?(以及如何检查两个选项?)
  • 检查两个选项是否都设置了然后发出警告?
  • 优先选择全局选项而不是局部选项?(如何检查给定的选项是全局的还是局部的?)
  • 更喜欢本地选项而不是全局选项吗?
  • 就按照我的做法去做,并忍受它的问题?(如何决定哪个顺序可能更合理?)
  • 使用一个我还没有找到但确实对这类东西有帮助的包?

答案1

从我作为用户的角度来看,如果本地选项与全局选项相互矛盾,我希望本地选项优先于全局选项。如果您希望您的包表现如下,那么我会这样做:

我会定义一个条件,\newif\ifex@draft比如说,让选项将该条件设置为真或假:

\DeclareOption{draft}{\ex@drafttrue}
\DeclareOption{final}{\ex@draftfalse}

然后剩下要做的就是\ProcessOptions\relax变成\ProcessOptions*clsguide关于带星号的版本:

这很像\ProcessOptions,但它按照调用命令中指定的顺序执行选项,而不是按照类或包中的声明顺序执行。对于包来说,这意味着首先处理全局选项。

因此,示例包的修改版本可能如下所示:

\RequirePackage{filecontents}
\begin{filecontents*}{ex.sty}
\ProvidesPackage{ex}[2014/07/26 v0.0 This is just an example]
\newif\ifex@draft % implicitly false. Set to true if you want a different default behaviour

\DeclareOption{draft}{\ex@drafttrue}
\DeclareOption{final}{\ex@draftfalse}
\ProcessOptions*

\ifex@draft
  \newcommand*\example{Package `ex' in draft mode}
\else
  \newcommand*\example{Package `ex' in final mode}
\fi
\end{filecontents*}

\documentclass[final]{article}
\usepackage[draft]{ex}
\begin{document}
\example
\end{document}

相关内容