不同软件包的一些示例

不同软件包的一些示例

我想创建一个样式文件来捕获定理环境的布局。具体来说,我想将一个选项传递给指定定理计数器级别的包。因此,这是一个最小的工作示例:

样式文件:

\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{mytheorem}

\RequirePackage{amsthm}
\newcommand{\level}{}

\DeclareOption{section}{\renewcommand{\level}{section}}
\DeclareOption{chapter}{\renewcommand{\level}{chapter}}
\ProcessOptions\relax

\theoremstyle{plain}
\newtheorem{theorem}{Theorem}[\level]
\newtheorem{corollary}[\level]{Corollary}

该文件:

\documentclass{book}
\usepackage[section]{mytheorem}
\begin{document}
    \begin{corollary}
        Inhalt...
    \end{corollary}
\end{document}

不过,最好通过键值语法来指定选项,如下所示:

\usepackage[theoremlevel=section]{mytheorem}

如何才能做到这一点?

答案1

使用和xkeyval为包提供键值非常简单,解析键并执行相关的选项/重新定义。\DeclareOptionX\ProcessOptionsX

为了预设一些默认值,\ExecuteOptionsX{theoremlevel=section}例如使用。

\DeclareOptionsX*用于处理未知选项。

打包文件:

\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{mytheorem}

\RequirePackage{amsthm}
\RequirePackage{xkeyval}

\newcommand{\level}{}

\DeclareOptionX{theoremlevel}{\renewcommand{\level}{#1}}
\DeclareOptionX*{\PackageWarning{mytheorem}{`\CurrentOption' ignored}}% For unknown options
\ExecuteOptionsX{theoremlevel=section}% Preset keys, 'section' being the default here

\ProcessOptionsX\relax

\theoremstyle{plain}
\newtheorem{theorem}{Theorem}[\level]
\newtheorem{corollary}[\level]{Corollary}

\endinput

驱动文件:

\documentclass{book}
\usepackage[theoremlevel=chapter,foo]{mytheorem}% foo should provide a warning!
\begin{document}
    \begin{corollary}
        Inhalt...
    \end{corollary}
\end{document}

答案2

不同软件包的一些示例

当保存为 时,以下所有包示例均可与以下文档一起使用mytheorem.sty

\documentclass[]{report}

\usepackage[level=chapter, foo, bar=baz]{mytheorem}

\begin{document}
\begin{corollary}
  Inhalt
\end{corollary}
\end{document}

expkv家庭

免责声明:我是该软件包的作者。

expkv系列中,包expkv-opt允许使用集合来解析包和类选项expkv。您可以为此使用的主要宏是\ekvoProcessGlobalOptions(将解析提供给的选项\documentclass)和\ekvoProcessLocalOptions(将解析直接提供给当前类/包的选项)。

您可以使用 方便地定义常见的键类型expkv-def。它提供了将解析 key=value 列表以定义新键的宏(其他包如、或\ekvdefinekeys也采用了类似的方法)。l3keyspgfkeysoptions

包文件

\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{mytheorem}

\RequirePackage{amsthm}
\RequirePackage{expkv-opt,expkv-def}

\ekvdefinekeys{mytheorem}
  {
     store   level = \mytheorem@level
    ,initial level = section
    % specify what happens for unknown keys
    ,unknown code  =
      \PackageWarning{mytheorem}
        {Unknown option `\detokenize{#1}' received `\detokenize{#2}'}
    ,unknown noval =
      \PackageWarning{mytheorem}{Unknown option `\detokenize{#1}'}
  }

% process options given to \documentclass
\ekvoProcessGlobalOptions{mytheorem}
% for the next ekvoProcess... use the unknown handlers like defined for the set
\ekvoUseUnknownHandlers*
% process options given to this package
\ekvoProcessLocalOptions{mytheorem}

\theoremstyle{plain}
\newtheorem{theorem}{Theorem}[\mytheorem@level]
\newtheorem{corollary}[\mytheorem@level]{Corollary}

LaTeX 内核

这根本不需要任何包。最近的内核内置了此功能。此列表中仅有的两个解决方案支持 LaTeX 的新机制,即在第一次加载后(截至撰写本文时)传递给包的选项,即这个和expkv-opt(使用\ekvoProcessFutureOptions)。在底层,使用的 key=value 系统与l3keys(参见下一个示例)相同。

包文件

\NeedsTeXFormat{LaTeX2e}
\ProvidesExplPackage{mytheorem}{}{}{}

\RequirePackage{amsthm}

\DeclareKeys
  {
     level   .tl_set:N         = \l__mytheorem_level_tl
    ,level   .initial:n        = section
    ,level   .value_required:n = true
    ,unknown .code:n           =
      \PackageWarning{mytheorem}{Unknown~ option~ `\l_keys_key_str'}
  }

\ProcessKeyOptions

\theoremstyle{plain}
\newtheorem{theorem}{Theorem}[\l__mytheorem_level_tl]
\newtheorem{corollary}[\l__mytheorem_level_tl]{Corollary}

或者如果您愿意,只使用 LaTeX2e 语法(几乎唯一,据我所知,目前没有 2e 名称.value_required:n):

\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{mytheorem}

\RequirePackage{amsthm}

\DeclareKeys
  {
     level   .store            = \mytheorem@level
    ,level   .value_required:n = true
  }
\SetKeys{level=section}
\DeclareUnknownKeyHandler{\PackageWarning{mytheorem}{Unknown~ option~ `#1'}}

\ProcessKeyOptions

\theoremstyle{plain}
\newtheorem{theorem}{Theorem}[\mytheorem@level]
\newtheorem{corollary}[\mytheorem@level]{Corollary}

l3keys

l3keys软件包提供了一个非常稳定且经过深思熟虑的 key=value 解决方案。它使用expl3编程约定。最新版本的 LaTeX 中对软件包和类选项的支持是开箱即用的(请参阅上面的 LaTeX-kernel 部分),对于较旧的 LaTeX 版本,该功能由提供宏的软件包\ProcessKeyOptions添加。l3keys2e\ProcessKeysOptions

键是使用\keys_define:nnkey=value 接口定义的。

包文件

\NeedsTeXFormat{LaTeX2e}
\ProvidesExplPackage{mytheorem}{}{}{}

\RequirePackage{amsthm}
\RequirePackage{l3keys2e}

\keys_define:nn { mytheorem }
  {
     level   .tl_set:N         = \l__mytheorem_level_tl
    ,level   .initial:n        = section
    ,level   .value_required:n = true
    ,unknown .code:n           =
      \PackageWarning{mytheorem}{Unknown~ option~ `\l_keys_key_str'}
  }

\ProcessKeysOptions { mytheorem }

\theoremstyle{plain}
\newtheorem{theorem}{Theorem}[\l__mytheorem_level_tl]
\newtheorem{corollary}[\l__mytheorem_level_tl]{Corollary}

pgfkeys

pgf是& Ti的一部分Z。它可能是最常用的 key=value 解决方案之一,对l3keys和等软件包产生了重大影响。该软件包通过宏options添加了对类和包选项的支持。使用或通过 key=value 接口定义键。pgfopts\ProcessPgfOptions\pgfkeys\pgfqkeys

包文件

\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{mytheorem}

\RequirePackage{amsthm}
\RequirePackage{pgfopts}

\pgfqkeys{/mytheorem}
  {
    .is family
    ,level/.store in = \mytheorem@level
    ,level/.initial  = section
    ,.unknown/.code  =
      \PackageWarning{mytheorem}{Unknown option `\pgfkeyscurrentname'}
  }

\ProcessPgfOptions{/mytheorem}

\theoremstyle{plain}
\newtheorem{theorem}{Theorem}[\mytheorem@level]
\newtheorem{corollary}[\mytheorem@level]{Corollary}

options

options是一个很少使用的软件包,受到 的很大启发pgfkeys。它支持开箱即用的软件包选项。定义新键看起来与 非常相似pgfkeys

包文件

\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{mytheorem}

\RequirePackage{amsthm}
\RequirePackage{options}

\newcommand*\mytheorem@level{section}

\options
  {
    /mytheorem/.new family, /mytheorem/.cd
    ,level/.is def = \mytheorem@level
    ,@unknown/.new cmd 2 = \PackageWarning{mytheorem}{Unknown option `#1'}
  }

\options@ProcessOptions{/mytheorem}

\theoremstyle{plain}
\newtheorem{theorem}{Theorem}[\mytheorem@level]
\newtheorem{corollary}[\mytheorem@level]{Corollary}

相关内容