如何将 \if \then \else 与 \@ifclassloaded{} 一起使用

如何将 \if \then \else 与 \@ifclassloaded{} 一起使用

我编写了一个使用命令\@ifclassloaded{}来处理文档类的包,例如,

\RequirePackage{pgffor}
\makeatletter%
\@ifclassloaded{book}
{%
<code block>
}
\makeatother%

\makeatletter%
\@ifclassloaded{article}
{%
<code block>
}
\makeatother%

我想在相同条件下处理reportmemoir类与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。根据您要执行的操作,这实际上可能是更好的主意。

这里我使用了\ifundefetoolbox这反转了第一个例子的逻辑。(还有\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

相关内容