我正在尝试构建一个宏,该宏可以根据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.}