我如何定义像 \hypersetup 这样的键值命令?

我如何定义像 \hypersetup 这样的键值命令?

我现在非常熟悉 switch(\if...\else...\fi)并阅读了许多关于键值主题的问题,但我找不到一个例子来创建选项列表命令,例如\hypersetup,以使

\documentclass[key1=...,key2=...,key3=...]{myclass}

相当于

\documentclass{myclass}
\myclssetup{%
    key1 = ...,
    key2 = ...,
    key3 = ...,
    .............
}

这些键都不是布尔值,所有这些值都有助于我切换到不同的布局方案。例如,key1 用于设置一种封面类型,key2 用于设置一种部分格式。我不需要绘制某些东西或设置一些几何属性(我不需要数值参数的值)。如果用户没有指定他们的选项,我还希望预设一些默认选项。

如果我使用 kvoptions 包,我所知道的只是我可能需要\newif\DeclareVoidOption(kvoptions 包)来创建选项(值)、\define@key(keyval 包)和\kvsetkeys命令(keyval 包)来链接值和键。然而,我一直在努力寻找类似且简单的例子来实现我需要的功能。

我认为有必要强调的是,我正在编写一个类(而不是包),并且它将基于另一个类(如书)。

答案1

这是一个xkeyval版本,其中自动定义键和它的keyval宏以及相应的\if...是否使用该选项。

精确的实现取决于要指定的内部选项,如果指定它们应该做什么。我假设,类选项将存储到宏中,例如具有相关含义的\classoption@myclass@#2位置 ,例如或等等。#2paperwidth

\documentclass{article}


\usepackage{xkeyval}

\makeatletter

\newcommand{\definemykey}[2]{%
  \expandafter\newif\csname ifmyclassname@#1\endcsname
  \define@key{myclass}{#1}{%
    \expandafter\gdef\csname classoption@myclass@#2\endcsname{##1}
    \global\expandafter\csname myclassname@#1true\endcsname
  }
}

\definemykey{keyA}{KeyA}
\definemykey{keyB}{KeyB}
\definemykey{keyC}{KeyC}


\newcommand{\myclasssetup}[1]{%
  \setkeys{myclass}{#1}%
}

\makeatother


\myclasssetup{keyB={upvote good answers!}, keyC={provide a MWE}}

\begin{document}

\makeatletter
\ifmyclassname@keyA
Yes, it was specified
\else
No, it is missing
\fi


\ifmyclassname@keyB
Yes, it was specified and has the value \textbf{\classoption@myclass@KeyB}
\else
No, it is missing
\fi

\makeatother


\end{document}

答案2

我的kvoptions包裹中的示例:accsupp,,,,,,,,,,,,,...attachfile2​​​​​bookmarkenparenepstopdf-basegrffilepagegridpmboxdrawrerunfilecheckresizegatherselinputzref-xr

Agrep -r kvoptions TDS:tex/latex将会揭示更多包裹。

例子rerunfilecheck

% Package start
[...]
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{rerunfilecheck}%
  [2011/04/15 v1.7 Rerun checks for auxiliary files (HO)]

% Option setup
\RequirePackage{kvoptions}[2010/02/22]
\SetupKeyvalOptions{%
  family=rerunfilecheck,%
  prefix=ReFiCh@%
}

% The setup command (a convenience wrapper for `\setkeys`:
\newcommand*{\RerunFileCheckSetup}{%
  \setkeys{rerunfilecheck}%
}

% The options
\DeclareBoolOption{mainaux}
\DeclareBoolOption{partaux}
\DeclareBoolOption{starttoc}
\DeclareBoolOption{index}
\DeclareBoolOption{glossary}
\define@key{rerunfilecheck}{aux}[true]{%
  \RerunFileCheckSetup{%
    mainaux={#1},%
    partaux={#1},%
    starttoc={#1},%
    index={#1},%
    glossary={#1}%
  }%
}

% Option processing: first configuration file, then package options
\InputIfFileExists{rerunfilecheck.cfg}{}{}
\ProcessLocalKeyvalOptions*

% Helper macro to disable options
\def\ReFiCh@DisableOption{%
  \DisableKeyvalOption[%
    action=warning,%
    package=rerunfilecheck%
  ]{rerunfilecheck}%
}

[...]

% The options are disabled after they have been used the last time:
\ReFiCh@DisableOption{mainaux}
\ReFiCh@DisableOption{partaux}
\ReFiCh@DisableOption{starttoc}
\ReFiCh@DisableOption{index}
\ReFiCh@DisableOption{glossary}
\ReFiCh@DisableOption{aux}

[...]

答案3

您可以使用expkv-opt为其定义的键来处理包/类选项expkv(可能通过辅助包expkv-def)。

例如,以下类文件存储为myclass.cls

\ProvidesClass{myclass}

\RequirePackage{expkv-opt,expkv-def}

% define the keys (see expkv-def's documentation for an overview on key types)
\ekvdefinekeys{myclass}
  {
     store key1 = \myclassA
    ,store key2 = \myclassB
    ,store key3 = \myclassC
  }
% define the setup macro (will be defined protected here)
\protected\ekvsetdef\myclssetup{myclass}

% process the options given to \documentclass
\ekvoProcessGlobalOptions{myclass}

% lets base on article
\LoadClass{article}

\endinput

如果与本文件一起使用:

\documentclass[key2=def]{myclass}
\myclssetup{key1=abc,key3=ghi}

\begin{document}
\myclassA\par
\myclassB\par
\myclassC\par
\end{document}

你会得到

在此处输入图片描述

\documentclass[<options>]{<class>}请注意,在任何情况下(以及对于任何包),和的使用\documentclass{<class>}\clssetup{<options>}都是不是相同。 给 的选项(通常)会被您使用的每个包(以及用 加载的类)\documentclass拾取,而给 的选项不会以这种方式传播。此外,给 的选项将使用一次进行扩展(不使用扩展的选项列表,而是使用最近版本的 LaTeX 提供的列表,但键仍将在内部扩展以实现向后兼容),而 则按原样接收其选项。\LoadClass\clssetup\documentclass\edefexpkv-optraw\edef\clssetup

相关内容