我想创建一个样式文件来捕获定理环境的布局。具体来说,我想将一个选项传递给指定定理计数器级别的包。因此,这是一个最小的工作示例:
样式文件:
\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
也采用了类似的方法)。l3keys
pgfkeys
options
包文件
\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:nn
key=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}