我不是 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
,这会强制扩展名称而不扩展其他任何内容(因此有很多\noexpand
s)。