我想准备一个带有可选参数的宏,例如[wide]
,使用xkeyval
。(无论是使用\figure
还是\figure*
在里面)我的下面的测试程序显示了输出
test0=false test1=false test2=false test3=false test4=false
我做错了什么?在我看来,默认情况在所有用例中都有效。
另外,我不确定它是否是完成我想要的工作的正确工具。xkeyval
文档指出,如果没有等号,通常会引发错误。我的测试程序不会出现这种情况。另外,我不想使用类似的东西[wide=]
。
\documentclass{report}
\usepackage{xkeyval}
\makeatletter
\define@key{METest}{wide}{\def\pb@wide{#1}}
\setkeys{METest}{wide=false}%
\newcommand\METest[2][]{
\begingroup%
#2=\pb@wide \
\endgroup%
}
\makeatother
\begin{document}
\METest[]{test0}
\METest[wide]{test1}
\METest[wide=]{test2}
\METest[wide=true]{test3}
\METest[wide=false]{test4}
\end{document}
答案1
该命令\setkeys{METest}{wide=false}
将此键设置为 false,因此您没有机会提供其他值。\setkey
应该使用语法在宏内部\setkeys{METest}{wide=false,#1}
,以便#1
处理键值内的可能覆盖。
[]
您可以使用我对选项键执行的语法为选项指定默认值wide
,但不能对otherwide
键执行该语法。
如果您想保证某个键具有确定的值,那么\presetkeys
这是正确的命令。
“错误”代码,错误使用
此代码将失败目的显示缺少的=value
选项otherkey
。
\documentclass{report}
\usepackage{xkeyval}
\makeatletter
\define@key{METest}{wide}[false]{\def\pb@wide{#1}}
\define@key{METest}{otherwide}{\def\pb@otherwide{#1}}
\presetkeys{METest}{wide=false}{}%
\newcommand\METest[2][]{
\setkeys{METest}{wide=false,#1}%
\begingroup%
#2=\pb@wide \
\endgroup%
}
\makeatother
\begin{document}
\METest[]{test0}
\METest[wide]{test1}
\METest[wide=]{test2}
\METest[wide=true]{test3}
\METest[wide=false]{test4}
\METest[otherwide]{test5} % will fail here
\end{document}
正确的行为
\documentclass{report}
\usepackage{xkeyval}
\makeatletter
\define@key{METest}{wide}[false]{\def\pb@wide{#1}}
\define@key{METest}{otherwide}{\def\pb@otherwide{#1}}
\presetkeys{METest}{wide=false}{}%
\newcommand\METest[2][]{
\setkeys{METest}{wide=false,#1}%
\begingroup%
#2=\pb@wide \
\endgroup%
}
\makeatother
\begin{document}
\METest[]{test0}
\METest[wide]{test1}
\METest[wide=]{test2}
\METest[wide=true]{test3}
\METest[wide=false]{test4}
\METest[otherwide=true]{test5} %
\end{document}
根据 OP 的要求,另一种解决方案
此版本#1
首先获取命令的参数并检查它是否为空。如果是,则根据要求将状态设置为 false。否则,\setkeys
将评估命令。但是,没有参数等错误用法wide=
尚未得到处理(到目前为止)
\documentclass{report}
\usepackage{etoolbox}%
\usepackage{xkeyval}
\makeatletter
\define@key{METest}{wide}[true]{\def\pb@wide{#1}}
\define@key{METest}{otherwide}{\def\pb@otherwide{#1}}
\newcommand\METest[2][]{%
\ifblank{#1}{%
\setkeys{METest}{wide=false}%
}{%
\setkeys{METest}{#1}%
}%
\begingroup%
#2=\pb@wide%
\endgroup%
}%
\makeatother
\begin{document}
\METest[]{test0}
\METest[wide]{test1}
\METest[wide=]{test2}
\METest[wide=true]{test3}
\METest[wide=false]{test4}
\METest[otherwide=true]{test5} %
\end{document}