Wie kann ich \if \then \else mit \@ifclassloaded{} verwenden?

Wie kann ich \if \then \else mit \@ifclassloaded{} verwenden?

Ich habe ein Paket geschrieben, das den \@ifclassloaded{}Befehl verwendet, um die Dokumentklasse zu handhaben, wie,

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

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

reportIch möchte die Klasse „oder“ memoirmit bookder Klasse im gleichen Bedingungssatz behandeln , und zwar etwa so:

\makeatletter%
\@ifclassloaded{book}
\else  \@ifclassloaded{report}
\else  \@ifclassloaded{memoir} 
{%
<code block>
}
\makeatother%

aber es funktioniert nicht. Wie kann ich das erreichen?

Antwort1

Sie können etoolboxund dessen \ifboolexprBefehl verwenden, um mehrere Bedingungen des Formulars \<conditional [possibly with additional arguments]>{<true>}{<false>}zu einer einzigen zu kombinieren.

Beachten Sie das testSchlüsselwort vor jedem Bedingungssatz und die Klammern, die ihn umgeben.

\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}

In diesem Beispiel könnten Sie auch direkt auf die Existenz des \chapterBefehls testen. Je nachdem, was Sie versuchen, kann das tatsächlich die bessere Idee sein.

Hier habe ich \ifundeffrom verwendet etoolbox, dies kehrt die Logik aus dem ersten Beispiel um. (Es gibt auch \ifdef, aber das behandelt Befehle wie \relaxdefiniert, was für diese Anwendung nicht so nützlich ist.)

\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}

Antwort2

Die Syntax von \@ifclassloadedist

\@ifclassloaded{class}{yes code}{no code}

Sie brauchen also nicht \else. Beide Zweige sind in die Syntax integriert.

Du hast

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

Ihr „kein Code“-Argument ist also, \makeatotherdass Sie das nur ausführen, wenn die Klasse kein Buch ist.

Sie sollten in einem Paketcode ohnehin nie \makeatletteroder haben, daher sollte Ihr Fragment so aussehen\makeatother

\RequirePackage{pgffor}

\@ifclassloaded{book}
{%
<code block>
}{%
 else code
}

\@ifclassloaded{article}
{%
<code block>
}{%
    else code
}

Übrigens ist es nicht wirklich empfehlenswert, nach Klassennamen zu suchen. Es gibt Tausende von Klassen, und wenn jemand eine erstellt, indem er book.clsein paar Dinge kopiert und ändert, wird Ihr Paket sie nicht als buchähnliche Klasse erkennen. Normalerweise ist es besser, auf bestimmte Merkmale zu testen, wie z. B. \chapterdefiniert zu sein, als zu prüfen, ob die Klasse aufgerufen wird book.

verwandte Informationen