该\ifcommandkey方法

该\ifcommandkey方法

我正在尝试创建一个带有可选参数的键盘命令,但无法让它工作。我查看了当参数是使用 etoolbox 命令的结果时,将参数与字符串进行比较尽管那里的示例可以运行,但我无法让它与 keycommand 一起使用,也无法ifcommandkey按预期运行。我最近从 Tex Live 2009 升级到 Tex Live 2011,在 2009 中ifcommandkey可以运行。

在 Tex Live 2011 中,如何检查是否给出了密钥?

下面是我尝试不同方法的示例。没有一个达到预期的效果;在第三次调用中,我希望结果是“无垃圾邮件。无鸡蛋。无纸张。无盐”,但每次运行都得到“有垃圾邮件”。为什么?

\documentclass{minimal}
\usepackage{keycommand}
\usepackage{etoolbox}
\begin{document}
\newcommand\myifstrempty{\expandafter\ifstrempty\expandafter}
\newkeycommand{\testkc}[spam,eggs,paper,salt][][0]{
\ifcommandkey{spam}{Spam: ``\commandkey{spam}''}{No spam}.
\ifcommandkey{eggs}{Eggs: ``\commandkey{eggs}''}{No eggs}.
\ifcommandkey{paper}{Paper: ``\commandkey{paper}''}{No paper}.
\ifcommandkey{salt}{Salt: ``\commandkey{salt}''}{No Salt}.
\ifcommandkey\expandafter{salt}{Salt: ``\commandkey{salt}''}{No Salt}.
\myifstrempty{\commandkey{spam}}{Not has spam}{Has spam}
\expandafter\ifstrempty{\expandafter{\commandkey{spam}}}{Not has spam}{Has spam}
}

\testkc[spam=bad, eggs=good, salt=horrid]

\testkc[paper=gold]

\testkc

\newcommand{\aORb}[1]{%
        \expandafter\ifstrequal\expandafter{#1}{a}{"a" was given}{not a}, %
        \expandafter\ifstrequal\expandafter{#1}{b}{"b" was given}{not b}%
}


\aORb{a}

\aORb{b}

\end{document}

结果如下:

结果

答案1

\ifcommandkey方法

(2010/04/27 v3.1415)的定义中有一个错误\ifcommandkey。它缺少了扩展的一个阶段\commandkey(参见下面部分的分析),因此没有测试价值的键。(即使使用未定义的键,您也会得到 TRUE。)加载后,尝试在序言中进行以下定义keycommand

\begingroup
  \makeatletter
  \catcode`\/=8 %
  \@firstofone
    {
      \endgroup
      \renewcommand{\ifcommandkey}[1]{%
        \csname @\expandafter \expandafter \expandafter 
        \expandafter \expandafter \expandafter  \expandafter
        \kcmd@nbk \commandkey {#1}//{first}{second}//oftwo\endcsname
      }
   } 

\ifstrempty方法

这里的问题是你没有对测试进行足够的扩展\ifstrempty。你需要确保它接收的参数是传递给键的值,而不是某种中间形式。因此,你需要扩展\commandkey到它所代表的内容。现在,有三种方法可以解决这种问题。首先,我们可以使用\edef

\newcommand\myifstrempty[1]{%
  \begingroup
    \edef\x{%
      \endgroup
       \noexpand\ifstrempty{#1}%
    }%
    \x
}

问题在于您不知道键值可能是什么,因此\edef可能会出错。

更可控的方法是使用正确的 s 数量\expandafter。如果你这样做

\show\commandkey

你会发现它扩展为

\csname keycmd->testkc@#1\endcsname

在你的使用键的宏中。因此要扩展到价值键需要三次扩展:第一次扩展\commandkey,第二次扩展\csname基元,第三次扩展生成的控制序列。由于 TeX 扩展的工作方式,这导致

\newcommand\myifstrempty{%
    \expandafter\expandafter\expandafter\expandafter
      \expandafter\expandafter\expandafter\ifstrempty
        \expandafter\expandafter\expandafter\expandafter
          \expandafter\expandafter\expandafter
 }

第三种方法是利用 的特殊性质来\romannumeral进行 LaTeX3 所称的“完全”扩展。这类似于执行 ,\edef但会在任何无法扩展的内容上完全停止:

\newcommand\myifstrempty[1]%
  {\expandafter\ifstrempty\expandafter{\romannumeral -`0#1 }}

后者在当前情况下很有用,因为它减少了所需的原语数量\expandafter

相关内容