动态生成 xkeyval 布尔键

动态生成 xkeyval 布尔键

我不是 TeX/LaTeX 专家,最近我编写了一个有关“问题”和“解决方案”的软件包,旨在显示在文档末尾,但它并不局限于此目的。为了实现该行为,除其他功能外,我xkeyval还使用了该软件包,其中包含许多关键宏和布尔键。

我想提供一个更好的版本,摆脱几十个关键的宏定义行和布尔键定义,它们基本上看起来很相似,但只是设置了一些标志,用一些简短的命令代替繁琐的 LaTeX 代码输入,比如

\GenerateBoolKey[true]{SomeKeys}{DummyBoolKey}

DummyBoolKey这应该定义属于家庭的布尔键SomeKeys,就像写的那样

\define@boolkey{SomeKeys}{DummyBoolKey}[true]{%
\ifKV@SomeKeys@DummyBoolKey%
%Do something if true%
\else%
%Do something different if false%
\fi%
}%

文档xkeyval(版本 2.6b)在第 7 页上说,定义了一个宏\ifKV@fam@key,如下所示\newif

好吧,我没能写出上述命令并使用\ifKV 宏,这是一个最小(非)工作示例,它在编译过程中失败并显示错误消息

     ! Too many }'s.

这是一个简单的例子

\documentclass{minimal}
\usepackage{xkeyval}

\makeatletter

\providecommand{\GenerateBoolKey}[3][false]{%
\define@boolkey{#2}{#3}[#1]{%
\csname ifKV@#2@#3 \endcsname%
\typeout{true}%  % Do something if true
\else%
\typeout{false}%   % Do something different if false
\fi%
}% End of  \define@boolkey
}% End of \providecommand

\makeatother

% Key Family is called SomeKeys
% Use a fake command for testing purposes

\providecommand{\DummyCommand}[1][false]{%
\setkeys{SomeKeys}{#1}%

% Do something useful inside this command...

}%

\begin{document}

\GenerateBoolKey{SomeKeys}{DummyBoolKey}%
\DummyCommand[DummyBoolKey=true]%

\end{document}

我如何\newif使用我的“包装器”代码动态提供命令以提供\ifKV布尔测试?

答案1

这看起来像是条件嵌套的问题。我认为最好的方法是强制扩展名称“预先”,这样你就可以获得与“手动”获得的定义相同的定义。

\documentclass{article}
\usepackage{xkeyval}

\makeatletter

\providecommand{\GenerateBoolKey}[3][false]{%
  \begingroup
  \edef\x{\endgroup
    \noexpand\define@boolkey{#2}{#3}[#1]{%
      \expandafter\noexpand\csname ifKV@#2@#3\endcsname%
        \noexpand\typeout{true}%  % Do something if true
      \noexpand\else%
        \noexpand\typeout{false}%   % Do something different if false
      \noexpand\fi%
    }% End of  \define@boolkey
  }% End of defintion of \x
  \x
}% End of \providecommand

\makeatother

% Key Family is called SomeKeys
% Use a fake command for testing purposes

\providecommand{\DummyCommand}[1][false]{%
\setkeys{SomeKeys}{#1}%

% Do something useful inside this command...

}%

\begin{document}

\GenerateBoolKey{SomeKeys}{DummyBoolKey}%
\DummyCommand[DummyBoolKey=true]%

\end{document}

这是通过定义\x一个组内部来工作的,当我们使用 \x,这会强制扩展名称而不扩展其他任何内容(因此有很多\noexpands)。

相关内容