带有 kvoptions 和 switch 结构的 keyvalue

带有 kvoptions 和 switch 结构的 keyvalue

我使用 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
}

相关内容