我编写了一个使用命令\@ifclassloaded{}
来处理文档类的包,例如,
\RequirePackage{pgffor}
\makeatletter%
\@ifclassloaded{book}
{%
<code block>
}
\makeatother%
\makeatletter%
\@ifclassloaded{article}
{%
<code block>
}
\makeatother%
我想在相同条件下处理report
或memoir
类与book
类,如下所示:
\makeatletter%
\@ifclassloaded{book}
\else \@ifclassloaded{report}
\else \@ifclassloaded{memoir}
{%
<code block>
}
\makeatother%
但不起作用。我该如何实现?
答案1
您可以使用etoolbox
及其\ifboolexpr
命令将多个形式的条件合并\<conditional [possibly with additional arguments]>{<true>}{<false>}
为一个。
注意test
每个条件前面的关键字和它们周围的括号。
\documentclass{article}
\usepackage{etoolbox}
\newcommand{\test}{} % just to make sure \test is undefined
\makeatletter
\ifboolexpr{ test {\@ifclassloaded{book}}
or test {\@ifclassloaded{report}}
or test {\@ifclassloaded{memoir}}}
{\def\test{lorem}}
{\def\test{ipsum}}
\makeatother
\begin{document}
\test
\end{document}
在此示例中,您还可以直接测试命令是否存在\chapter
。根据您要执行的操作,这实际上可能是更好的主意。
这里我使用了\ifundef
,etoolbox
这反转了第一个例子的逻辑。(还有\ifdef
,但它将按定义处理命令\relax
,这对于此应用程序来说没什么用。)
\documentclass{article}
\usepackage{etoolbox}
\newcommand{\test}{} % just to make sure \test is undefined
\ifundef\chapter
{\def\test{ipsum}}
{\def\test{lorem}}
\begin{document}
\test
\end{document}
答案2
语法\@ifclassloaded
是
\@ifclassloaded{class}{yes code}{no code}
所以你不需要\else
。两个分支都内置于语法中。
你有
\@ifclassloaded{book}
{%
<code block>
}
\makeatother%
所以您的“无代码”参数是,\makeatother
如果课程不是书,您只执行该参数。
无论如何你都不应该有\makeatletter
或者\makeatother
在包代码中所以你的片段应该看起来像
\RequirePackage{pgffor}
\@ifclassloaded{book}
{%
<code block>
}{%
else code
}
\@ifclassloaded{article}
{%
<code block>
}{%
else code
}
顺便说一句,按名称检查类并不真正推荐,因为有成千上万个类,如果有人通过复制book.cls
和更改一些内容来创建一个类,您的包将无法将其识别为类似书籍的类。通常最好测试特定功能(如\chapter
已定义),而不是检查类是否被调用book
。