如何立即扩展 keyval 选项

如何立即扩展 keyval 选项

我正在尝试构建一个宏,该宏可以根据kvoptions' 选项创建其他宏。但是,输出的宏依赖于选项的实际状态,而不是创建宏时的状态。

这是一个简单的例子:

\documentclass[openany]{scrbook}
\usepackage{kvoptions}

\makeatletter
\SetupKeyvalOptions{family = fam, prefix = fam@}
\DeclareStringOption[]{prename}

\newcommand{\greetingsetup}[3]{%
        \setkeys{fam}{#3}
        \expandafter\newcommand\csname greeting#1\endcsname{Hallo \fam@prename, I am #2.}
}

\makeatother
\greetingsetup{john}{Johnny}{prename=Mike}
\greetingsetup{mark}{Mark}{prename=Michaela}

\begin{document}

\greetingjohn


\end{document}

我想要的是:写入\greetingsetup{john}{Johnny}{prename=Mike}会创建一个宏\greetingjohn,其内容为“你好,迈克,我是约翰尼。”

它能做什么:它创建一个宏\greetingjohn,写入“Hallo xyz,我是 Johnny。”,其中 xyz 被替换为选项 prename 的实际状态。在示例中,LaTeX 写入“Hallo Michaela,我是 Johnny。”。

有人知道我怎样才能得到裸露的细绳\fam@prename从写入新宏的选项中\greeting...?

答案1

\edef您可以使用或其更安全的 LaTeX 包装器强制扩展\protected@edef

\expandafter\protected@edef\csname greeting#1\endcsname{Hallo \fam@prename, I am #2.}

相关内容