我正在尝试创建一个带有可选参数的键盘命令,但无法让它工作。我查看了当参数是使用 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
。