提供没有值的可选键

提供没有值的可选键

我想准备一个带有可选参数的宏,例如[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}

在此处输入图片描述

相关内容