我正在尝试创建我的第一个类,它基本上只是带有一组选项的普通序言。这些选项使用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: secondoption
在firstoption
不为空的情况下输出,但只有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: }