Как использовать \if \then \else с \@ifclassloaded{}

Как использовать \if \then \else с \@ifclassloaded{}

Я написал пакет, который использует \@ifclassloaded{}команду для обработки класса документа, например,

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

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

Я хочу обработать класс reportor 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. В зависимости от того, что вы пытаетесь сделать, это может быть лучшей идеей.

Здесь я использовал \ifundeffrom 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.

Связанный контент