我现在非常熟悉 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
位置 ,例如或等等。#2
paper
width
\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
bookmark
enparen
epstopdf-base
grffile
pagegrid
pmboxdraw
rerunfilecheck
resizegather
selinput
zref-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
\edef
expkv-opt
raw
\edef
\clssetup