可以将选项传递给包

可以将选项传递给包

我正在寻找为其他包提供附加选项的可能性。
我已经尝试过了\PassOptionsToPackage

我的想法是我可以使用类似的东西\documentclass[hyperref={bookmarksnumbered=true}]{asjgdhoia}

cls 文件:

\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{asjgdhoia}[2012/02/10 Mini class for testing proposal]
\RequirePackage{ifthen}
\newboolean{isDraft}
\setboolean{isDraft}{false}
\DeclareOption{hyperref}{\PassOptionsToPackage{\CurrentOption}{hyperref}}
\DeclareOption*{\PassOptionsToClass{\CurrentOption}{scrartcl}}
\ProcessOptions\relax
\LoadClass[fontsize=11pt,twoside=false,paper=a4,numbers=noenddot,captions=tableheading]{scrartcl}
\usepackage[pdfdisplaydoctitle=true,%
                 pdfstartview={Fit},%
                 bookmarksopen,%
                 colorlinks=true,%
                 linkcolor=black,%
                 urlcolor=black,%
                 citecolor=black]%
                 {hyperref}

tex 文件:

\documentclass{asjgdhoia}

\begin{document}
\section{Test}
{
\raggedright
Finally there is a simple solution using \textsc{\textbf{XMLResource.OPTION\_RECORD\_UNKNOWN\_FEATURE}} option. And the
text must go on \ldots.
\par
And another example the show must go on, but we have too less text (\textbf{createUnspecifiedNodeWarningMarker} and
\textbf{createUnspecifiedNodeErrorMarker}, sdjklashjksa \textbf{createUnspecifiedLinkWarningMarker} and
\textbf{createUnspecifiedLinkErrorMarker}).
}
\end{document}

答案1

你想设置一个所谓的核心价值语法。LaTeX 默认不支持该语法。您必须使用 keyval 包。

问题每个 keyval 包的大列表列出所有 keyval 包。

使用示例可以在这里找到:

我相信您还会发现更多相关问题。

我不想提供一个例子,因为你应该用你最喜欢的 keyval 包问一个单独的问题。



顺便说一下,documentclass 的选项将被传递给每个加载的包:

\RequirePackage{filecontents}
\begin{filecontents*}{asjgdhoia.cls}
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{asjgdhoia}[2012/02/10 Mini class for testing proposal]
\RequirePackage{ifthen}
\newboolean{isDraft}
\setboolean{isDraft}{false}
%\DeclareOption{hyperref}{\PassOptionsToPackage{#1}{hyperref}}
\DeclareOption*{\PassOptionsToClass{\CurrentOption}{scrartcl}}
\ProcessOptions\relax
\LoadClass[fontsize=11pt,twoside=false,paper=a4,numbers=noenddot,captions=tableheading]{scrartcl}
\usepackage[pdfdisplaydoctitle=true,%
                 pdfstartview={Fit},%
                 bookmarksopen,%
%                 colorlinks=true,%
                 linkcolor=black,%
                 urlcolor=black,%
                 citecolor=black]%
                 {hyperref}

\end{filecontents*}
\documentclass[colorlinks=true]{asjgdhoia}

\begin{document}
\section{Test}\label{foo}

\ref{foo}

\end{document}

答案2

带花括号的全局选项:

\documentclass[hyperref={bookmarksnumbered=true}]{asjgdhoia}

如果该类加载了 KOMA-Script 类,则将无法工作,因为 KOMA-Script 在处理选项时存在限制/错误。

但可以支持以下语法:

\documentclass[hyperref=bookmarksnumbered=true]{asjgdhoia}

kvoptions处理类和包的键值选项,包kvsetkeys定义一个不会被多个等号混淆的键值解析器。第一个等号将键与值分开。

班级asjgdhoia

\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{asjgdhoia}[2012/02/10 Mini class for testing proposal]

\RequirePackage{ifthen}
\newboolean{isDraft}
\setboolean{isDraft}{false}

\RequirePackage{kvoptions}
\RequirePackage{kvsetkeys}
\SetupKeyvalOptions{
  family=asjgdhoia,
  prefix=asjgdhoia@,
  setkeys=\kvsetkeys,
}

% hyperref options:
\define@key{asjgdhoia}{hyperref}{%
  \PassOptionsToPackage{#1}{hyperref}%
}

% bookmark options:
\def\asjgdhoia@bookmark{% default setting
  open,%
  numbered%
}
\define@key{asjgdhoia}{bookmark}{%
  \g@addto@macro\asjgdhoia@bookmark{,#1}%
}

\DeclareLocalOptions{bookmark}

\DeclareDefaultOption{%
  \PassOptionsToClass{\CurrentOption}{scrartcl}%
}

\ProcessKeyvalOptions*

\PassOptionsToPackage{paper=a4}{typearea}
\LoadClass[
  fontsize=11pt,
  twoside=false,
  numbers=noenddot,
  captions=tableheading
]{scrartcl}
\usepackage[
  pdfdisplaydoctitle=true,%
  pdfstartview={Fit},%
]{hyperref}[2011/02/05]
\usepackage{bookmark}  
\expandafter\bookmarksetup\expandafter{\asjgdhoia@bookmark}

\endinput

评论:

  • 有一个新的hyperref选择hidelinks
  • 添加了包bookmark(更多功能,更少甚至不需要 LaTeX 重新运行)。
  • option 的处理bookmark展示了 的方法的替代方法\PassOptionsToPackage。如果 options 被多次调用,则选项将像 option 中一样连接起来hyperref。如果 option 应该覆盖先前的选项设置,则bookmark可以按如下方式定义 option:

    \DeclareStringOption{bookmark}
    
  • 选项paper=a4已传递给包typearea

答案3

关于使用相同选项名称的包的问题,​​在这种情况下没有问题。如果你使用键值包,您只需谨慎使用\ProcessOptionsX*,特别是在类文件中。请参阅文档第 19 页键值以包为例。以下是其中的一段引文:

在类文件中使用\ProcessOptionsX*可能会比较棘手,因为该类也可能被用作另一个使用 的包或类的基础\LoadClass。在这种情况下,根据文档类的选项系统,使用 加载的类的行为\LoadClass 可能会与使用 加载的情况有所不同 \documentclass。但是,由于从技术上讲可以创建两个协作的类,因此键值\ProcessOptionsX*包允许在类文件中使用 。

请注意,使用 LaTeX 的\ProcessOptions\ProcessOptions*,类文件无法复制文档类选项。如果您想验证您的类是否已加载\documentclass\LoadClass,您可以使用\XKV@documentclass包含当前文档类的宏。

有许多键值解析器(请参阅以下列表一大串键值包),下面我对其中的一些提出一些看法。

键值

对于键值包,您可能需要注意以下几点:

键值包有许多有趣的功能,例如使用指针、预设和后设置密钥、家族过滤以及rm根据需要多次设置(剩余密钥)。它在计算资源利用率方面也很高效。要定义和设置密钥,它的运行时间比鍵盤,并且它定义的宏比鍵盤

但是,像每个软件包一样,它也有一些缺点(如果这个词在这里用得合适的话)。它的一些缺点包括:

  1. 之前无法加载\documentclass,但你可以加载键盘阅读器包之前\documentclass键盘阅读器包重新定义了一些内部内容键值并提供前端键值

  2. 这不是一个严重的缺点,但是键值包不能接受带有参数字符的默认值。也许 David Carlisle 最初的键值系统想法排除了此功能的需要。例如,以下 (A) 失败。

  3. 它会删除键值中最多三层的外部括号。如果保留括号对您来说很重要,那么您需要用额外的括号填充键值。

  4. 它的堆栈管理系统还有改进的空间。为了允许\setkeys无限重入(Oberdiek 测试),它在\setkeys调用 之前保存了 的当前“状态向量” \setkeys。这样做的方式是键值效率不高:每次调用时,都要进行两次构建堆栈的迭代(一次用于推送堆栈,一次用于弹出堆栈)\setkeys键盘阅读器包仅使用一次迭代来向下和向上移动堆栈。

  5. \CurrentOption状态向量中缺少宏键值\setkeys。当 嵌套时,这可能会导致问题\setkeys。在这方面,我有过不愉快的经历。该软件包的 v2.6b 版本(2012/10/14)更正了这一遗漏。

  6. 不同于鍵盤, 这键值软件包没有提供 (a) 在设置键时扩展键的值、(b) 在运行时更新现有键的回调、(c) 样式/观察者键、(d) 多参数回调、(e) 系列过滤 - 尽管它有通过 rm 键进行键过滤的功能。这些功能由版本 1.1 (2012/08/01) 的斯基瓦尔包裹。

  7. selective sanitization为应对 babel 而部署的 Uwe Kern 方案还有改进空间。它比search-replace清理方案更昂贵。

  8. 的发展键值自 2008 年起已停止使用。版本 v2.6b(2012/10/14)修正了一些错误,但没有提供新功能。

代碼(A):

\define@key[KV]{fam}{key1}[\def\x##1{*##1*}]{}
\setkeys[KV]{fam}{key1}

代碼 (B):

\setkeys[KV]{fam}{key2=\dimexpr\usevalue{key1}*5\relax}

鍵盤

对于鍵盤包,您可能需要注意以下几点:

  1. 系统handler鍵盤是一个很棒的景点,但您需要一些经验才能有效地使用它。由于此功能和 pgf/tikz 图形包,鍵盤尽管其计算开销相对较高,但仍然很受欢迎。

  2. 如果巴别塔加载了某些选项,密钥解析鍵盤可能会失败,除非你加载密钥包裹。

  3. 鍵盤包本身不处理包或类选项。对于选项处理,您需要普格福普特包裹。

  4. 这是个人观点。我发现使用 key 和 family 过滤不太方便鍵盤键值斯基瓦尔包。将会很有趣鍵盤' 处理程序机制实现键值软件包或具有类似语法的支持软件包。这是由版本 1.1(2012/08/01)的斯基瓦尔包。使用斯基瓦尔包中,您只需调用处理程序即可过滤出键、系列或路径.ignore。例如,

    \directkeys{
      % Start off on two separate paths:
      .paths = {KV1/fam1,KV2/fam2},
      .initialize keys after define,
      .define keys = {
        .exec code = \def\iden#1{#1},
        % Define 1 ordinary key. Only the keyname field is mandatory, but
        % we have filled all the fields here:
        .ord/key1/default1/\def\codeA##1{#1*##1},
        % Define 2 choice keys with the same attributes. Choice keys can have 
        % default value, state pattern or binding set, code for valid value, and 
        % code for illegal value. Only the keyname field is mandatory.
        .choice/{key2,key3}/justified/{
            center.do=\def\curralign##1{\hfil##1\hfil},
            right.do=\def\curralign##1{\hfill##1},
            left.do=\def\curralign##1{##1\hfill},
            justified.do=\let\curralign\iden
          }/\def\codeB##1{#1**##1}/
             \let\curralign\iden
             \typeout{Value of key `\skvcurrentkey' is invalid; `justified' assumed}
          ,
        % The starred (*) form of choice key will always use the lowercase of the 
        % user input to match the singleton:
        .choice*/key4/{A/X}/{
            A/X.do=\def\currcolor{blue},
            A/Y.do=\def\currcolor{green},
            B/X.do=\def\currcolor{red},
            B/Y.do=\def\currcolor{magenta}
         }/\def\val{Value of key4: #1}
      },
      .exec code = \def\acenter{center},
      % In Java speak, keya and keyb are subjects of the observer key1.
      % The observer can subscribe to attributes of the subject. In the
      % following example, the observer (key1) asks to be notified of the value
      % of the subject:
      .style = {keya,keyb}/key1=#1,
      % Don't set key1 and key2 on path KV1/fam1:
      .ignore path = KV1/fam1,
      % Ignore key3 and key4 on all active paths:
      .ignore keys = {key3,key4},
      .set keys = {
         % Check the logfile for a warning about the invalid value of key2:
         key1=value1, key2=value2, key3=.expand once{\acenter}
      },
      .restore keys = {key3,key4},
      .restore path = KV1/fam1
    }
    

相关内容