
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%
report
Ich möchte die Klasse „oder“ memoir
mit book
der 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 etoolbox
und dessen \ifboolexpr
Befehl verwenden, um mehrere Bedingungen des Formulars \<conditional [possibly with additional arguments]>{<true>}{<false>}
zu einer einzigen zu kombinieren.
Beachten Sie das test
Schlü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 \chapter
Befehls testen. Je nachdem, was Sie versuchen, kann das tatsächlich die bessere Idee sein.
Hier habe ich \ifundef
from verwendet etoolbox
, dies kehrt die Logik aus dem ersten Beispiel um. (Es gibt auch \ifdef
, aber das behandelt Befehle wie \relax
definiert, 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 \@ifclassloaded
ist
\@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, \makeatother
dass Sie das nur ausführen, wenn die Klasse kein Buch ist.
Sie sollten in einem Paketcode ohnehin nie \makeatletter
oder 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.cls
ein 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. \chapter
definiert zu sein, als zu prüfen, ob die Klasse aufgerufen wird book
.