
Я написал пакет, который использует \@ifclassloaded{}
команду для обработки класса документа, например,
\RequirePackage{pgffor}
\makeatletter%
\@ifclassloaded{book}
{%
<code block>
}
\makeatother%
\makeatletter%
\@ifclassloaded{article}
{%
<code block>
}
\makeatother%
Я хочу обработать класс report
or 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
from 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
.