etoolbox ifblank 错误与 xkeyval

etoolbox ifblank 错误与 xkeyval

我正在尝试创建我的第一个类,它基本上只是带有一组选项的普通序言。这些选项使用xkeyval以下语法处理:

\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{myclass}[2013/07/19]

\RequirePackage{xkeyval}

\DeclareOptionX{firstoption}[]{\newcommand\myclass@firstoption{#1}}
\DeclareOptionX{secondoption}[]{\newcommand\myclass@secondoption{#1}}

\presetkeys{myclass.cls}{}{firstoption, secondoption} %sets all keys to their default values
                                     %unless set by the user


\ProcessOptionsX\relax

\LoadClass{memoir}
\RequirePackage{etoolbox}

\title{\ifblank{\myclass@firstoption}{% check if firstoption is blank
                %do nothing
    }{%
        \myclass@firstoption: %
    }%
    \myclass@secondoption%
}

最后一段代码本来是应该firstoption: secondoptionfirstoption不为空的情况下输出,但只有secondoption在相反的情况下才输出。

firstoption然而,由于奇怪的原因,无论是否设置,冒号总是会出现。

答案1

正确的测试方法是\ifdefempty

\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{gaussler}[2013/07/19]

\RequirePackage{xkeyval}

\def\myclass@firstoption{}
\def\myclass@secondoption{}

\DeclareOptionX{firstoption}[]{\def\myclass@firstoption{#1}}
\DeclareOptionX{secondoption}[]{\def\myclass@secondoption{#1}}


\ProcessOptionsX\relax

\LoadClass{memoir}
\RequirePackage{etoolbox}

\title{\ifdefempty{\myclass@firstoption}{% check if firstoption is blank
                %do nothing
    }{%
        \myclass@firstoption: %
    }%
    \myclass@secondoption
}
\endinput

\ifdefempty{⟨control sequence⟩}{⟨true⟩}{⟨false⟩}
⟨true⟩如果 ⟨控制序列⟩ 已定义且为无参数宏(其替换文本为空),则 扩展为,⟨false⟩否则扩展为 。与 不同\ifx,此测试忽略 的前缀⟨command⟩

答案2

来自以下文档etoolbox

\ifblank{<string>}{<true>}{<false>}
<true>如果 <string>为空白(空或空格),则 扩展为,<false>否则扩展为 。 <string>在测试中不会扩展 。

myclass.cls宏中调用:

\ifblank{\myclass@firstoption}{}{\myclass@firstoption: }

因此,未扩展的第一个参数包含的\myclass@firstoption不是“空白”。Two\expandafter的帮助:

\expandafter\ifblank\expandafter{\myclass@firstoption}{}{\myclass@firstoption: }

相关内容