新答案

新答案

我想知道 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}

相关内容