假设您正在编写一个包,它具有常见的draft
和final
模式对。
但是,如果这个包有全局选项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}
结果输出“一些示例文本,最终是一些更多文本:”。如果我交换\DeclareOption
(final
首先,然后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}