我使用 kvoptions 作为键值语法。但是我需要一个 switch 语法来进行评估。由于 boolexpr 存在问题(请参阅这里)我现在使用另一种解决方案这个问题。
然而开关没有按预期工作(总是产生相同的值)。
这是我使用的代码:
\documentclass[]{scrbook}
\makeatletter
\RequirePackage{kvoptions-patch}
\RequirePackage{kvoptions} % options
\RequirePackage{pdftexcmds} % string comparison
\SetupKeyvalOptions{family=demo,prefix=demo@}
% parallel, stacked
\DeclareStringOption[stacked]{style}
\ProcessKeyvalOptions{demo}
\newcommand{\PrintDemoUsingKeys}{%
\ifnum\pdf@strcmp{\demo@style}{parallel}=0%
parallel%
\else\ifnum\pdf@strcmp{\demo@style}{stacked}=0%
stacked%
\else%
\PackageError{templatedemo}{%
\MessageBreak%
value >\tplbugs@style< unkown \MessageBreak%
}{}%
\fi\fi%
}%
% Print code and result using the key-value syntax
\newcommand{\PrintDemo}[2][]{%
% #1 is the optional keyval argument
% #2 is a mandatory argument
\begingroup%
\setkeys{demo}{#1}%
% Do stuff with #2
\PrintDemoUsingKeys%
\endgroup%
}
\makeatother
\begin{document}
\PrintDemo{style=parallel}
\PrintDemo{style=stacked}
\end{document}
答案1
你的宏中有两个错误:你说
\setkeys{demo}{#1}
和#1
是 的可选参数\PrintDemo
,根据定义,默认情况下为空。因此,如果调用 ,则当然不会进行任何求值\PrintDemo{whatever}
。
但也呼吁
\PrintDemo[style=parallel]{whatever}
你会感到惊讶:由于和\begingroup
对的存在,执行完后\endgroup
的值\demo@style
将恢复为默认值,因此 before被展开。因此应该是stacked
\endgroup
\PrintDemoUsingKeys
\newcommand{\PrintDemo}[2][]{%
% #1 is the optional keyval argument
% #2 is a mandatory argument
\setkeys{demo}{#1}%
% Do stuff with #2
\PrintDemoUsingKeys
}
称为
\PrintDemo[style=parallel]{whatever}
如果你想这样调用它\PrintDemo{style=parallel}
,只需将定义更改为
\newcommand{\PrintDemo}[1]{%
\setkeys{demo}{#1}%
\PrintDemoUsingKeys
}