我找到了一个如何使用 xkeyval 的“简单”示例这里使用以下代码:
\ProvidesPackage{myemph}[2011/03/12 v1.0 a test package]
\providecommand\my@emphstyle{\em}
% Note that the argument must be expandable,
% or use xkvltxp package before \documentclass (see manual of xkeyval)
\RequirePackage{xkeyval}
\DeclareOptionX{style}{%
\def\my@emphstyle{\csname my@style@#1\endcsname}}
% predefined styles
\providecommand\my@style@default{\em}
\providecommand\my@style@bold{\bfseries}
\ProcessOptionsX
% For simple key-value commands, keyval would suffie
\define@key{myemph}{code}{%
\def\my@emphstyle{#1}}
\define@key{myemph}{style}{%
\def\my@emphstyle{\csname my@style@#1\endcsname}}
\newcommand\setemph[1]{%
\setkeys{myemph}{#1}}
\renewcommand\emph[1]{%
{\my@emphstyle #1}}
\endinput
测试文件:
\documentclass{article}
\usepackage[style=default]{myemph}
\begin{document}
Something \emph{important}
\setemph{style=bold}
Something \emph{important}
\setemph{code=\Large\sffamily}
Something \emph{important}
\end{document}
我的第一个问题是我不知道
\providecommand\my@emphstyle{\em}
我发现这里和这里通常情况下,“@”是类别 12 而不是 11 的字母,因此不能在宏中使用,除非您手动将“@”设置为类别 11,而上面的代码中并没有这样做。但是,我可以编译 latex 代码。为什么它可以工作?
忽略了这一点之后,我继续说
\DeclareOptionX{style}{%
\def\my@emphstyle{\csname my@style@#1\endcsname}}
这让我很高兴去探索\csname 的作用据我所知,它用于使用不包含在类别 11 中的字母的命令。但是,函数 '\my@style' 尚未定义,所以我看不出那里发生了什么。此外,我不知道 \DeclareOptionX 有什么用。我用谷歌找不到它。
毕竟,我读过 xkeyval 包的官方文档,其中解释了如何使用它,只需使用第 1 页上的命令“\define@key”和“\setkeys”即可。我想这是我的错,我正在寻找一个简单的示例来跳过文档。但是,现在我很好奇这个“简单”示例是如何工作的。
答案1
首先@
自动在包和类文件中创建一个字母。
\DeclareOptionX{style}{%
\def\my@emphstyle{\csname my@style@#1\endcsname}}
xkeyval 包使用它来定义在文档中执行以下操作时会发生什么:
\setemph{style=bold}
基本上,(x)keyval 解析器使用声明定义的宏,并将值(之后的部分=
)作为 TeX 参数传递给它#1
,因此style=bold
执行为
\def\my@emphstyle{\csname my@style@bold\endcsname}
大致相当于
\def\my@emphstyle{\my@style@bold}
但\csname
允许在运行时构造命令名称。
较早
\providecommand\my@style@bold{\bfseries}
已经定义\my@style@bold
,所以最终结果是导致执行的style=bold
原因,并且事情变得大胆。\bfseries
keyval 的基本用法是使用,\setkeys
但 xkeyval 还将机制注入\usepackage
选项处理程序,默认情况下,该处理程序只接受逗号分隔的选项列表,没有=
语法。这就是\DeclareOptionX
then\ProcessoptionsX
的扩展版本,内部\ProcessOptions
调用\setkeys
,以便
\usepackage[style=default]{myemph}
调用关键定义。