需要帮助理解 xkeyval 示例

需要帮助理解 xkeyval 示例

我找到了一个如何使用 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选项处理程序,默认情况下,该处理程序只接受逗号分隔的选项列表,没有=语法。这就是\DeclareOptionXthen\ProcessoptionsX的扩展版本,内部\ProcessOptions调用\setkeys,以便

\usepackage[style=default]{myemph}

调用关键定义。

相关内容