我想知道 xkeyval 包是否允许定义键宏没有包含等号。
例如,我希望创建一个基于几何包的包,其关键定义如下:
这默认范围:边距=1厘米,
柯亚(覆盖默认值): 边距=2cm,
键b(附加参数):展示框,
是否可以定义宏以便:
\usepackage[keya,keyb]{mygeo}
将产生:
\usepackage{geometry}
\geometry{keya,keyb}
无需写:
\usepackage[keya=1cm,keyb]{mygeo}
基本且不完整的 MWE 结构:
\NeedsTeXFormat{LaTeX2e}[1994/06/01]
\ProvidesPackage{mygeo}
%
\DeclareOption{keya}{}
\DeclareOption{keyb}{}
\DeclareOption*{\PackageWarning{mygeo}{Unknown ‘\CurrentOption’}}
\ProcessOptions\relax
%
\usepackage{geometry}
\geometry{keya,keyb}
答案1
编辑:我添加了一个使用 key=value 接口的新答案,并允许转发包含逗号的值。如果您不需要这样做,请查看底部的原始答案。
新答案
如果您需要 key=value 接口并希望能够将包含逗号的参数传递给底层键,则需要安装最新的 LaTeX,因为相关功能(原始选项列表)是在 2021-06-01 添加的。许多软件包尚不支持解析该列表,据我所知,截至撰写本文时,只有软件包expkv-opt
真正支持这一点)。
结果是你必须更改 key=val 接口,并使用expkv
和 它是 家庭而不是xkeyval
。以下使用提供的接口定义您的基本键expkv-def
,并使用解析您的包选项expkv-opt
。
expkv
免责声明:我是该软件包系列的作者。
\begin{filecontents}{mygeo.sty}
\NeedsTeXFormat{LaTeX2e}[1994/06/01]
\ProvidesPackage{mygeo}
%
\PassOptionsToPackage{margin=1cm}{geometry}
\RequirePackage{expkv-opt,expkv-def}
\ekvdefinekeys{morzen}
{
% code will be executed when the key is called
protected code keya = \PassOptionsToPackage{#1}{geometry}
% sets the argument #1 in above code if no value is given
,default keya = margin=2cm
% noval will be executed when the key is called, the key doesn't accept
% values
,protected noval keyb = \PassOptionsToPackage{showframe}{geometry}
% will be used if an undefined key with a value is found
,protected unknown code =
\PackageWarning{mygeo}
{Unknown option `#1' you passed `\detokenize{#2}' to}
% will be used if an undefined key without a value is found
,protected unknown noval = \PackageWarning{mygeo}{Unknown option `#1'}
}
\ekvoProcessLocalOptions{morzen}
%
\RequirePackage{geometry}
\end{filecontents}
\documentclass[]{article}
%\usepackage{mygeo}
%\usepackage[keya]{mygeo}
%\usepackage[keya,keyb]{mygeo}
\usepackage[keya={headsep=1cm,headheight=1cm},keyb]{mygeo}
\begin{document}
This is a document.
\end{document}
原始答案
如果您的问题只是将包 A 的选项转换为包 B 的其他选项,那么您不需要xkeyval
(但是,如果您的包支持 key=value 选项,您将需要一些 key=value 解析器包):
\begin{filecontents}{mygeo.sty}
\NeedsTeXFormat{LaTeX2e}[1994/06/01]
\ProvidesPackage{mygeo}
%
\PassOptionsToPackage{margin=1cm}{geometry} % setting the default margin
\DeclareOption{keya}{\PassOptionsToPackage{margin=2cm}{geometry}}
\DeclareOption{keyb}{\PassOptionsToPackage{showframe}{geometry}}
\DeclareOption*{\PackageWarning{mygeo}{Unknown ‘\CurrentOption’}}
\ProcessOptions\relax
%
\RequirePackage{geometry}
\end{filecontents}
\documentclass[]{article}
\usepackage[keya,keyb]{mygeo}
\begin{document}
This is a document.
\end{document}