Como posso usar \if \then \else com \@ifclassloaded{}

Como posso usar \if \then \else com \@ifclassloaded{}

Eu escrevi um pacote que usa o \@ifclassloaded{}comando para lidar com a classe do documento, como,

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

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

Quero tratar a classe reportor memoircom bookclasse na mesma condicional, assim:

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

mas não funciona. Como posso conseguir isso?

Responder1

Você pode usar etoolboxe seu \ifboolexprcomando para combinar várias condicionais do formulário \<conditional [possibly with additional arguments]>{<true>}{<false>}em uma.

Observe a testpalavra-chave na frente de cada condicional e as chaves ao redor delas.

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

Neste exemplo você também pode testar diretamente a existência do \chaptercomando. Dependendo do que você está tentando fazer, essa pode ser a melhor ideia.

Aqui usei \ifundeffrom etoolbox, isso inverte a lógica do primeiro exemplo. (Existe também \ifdef, mas trata comandos conforme \relaxdefinidos, o que não é muito útil para este aplicativo.)

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

Responder2

A sintaxe de \@ifclassloadedé

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

então você não precisa \else. Ambas as ramificações são incorporadas à sintaxe.

Você tem

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

então seu argumento "sem código" é \makeatotherpara que você só execute isso se a classe não for livro.

Você nunca deve ter \makeatletterou \makeatotherem um código de pacote, então seu fragmento deve se parecer com

\RequirePackage{pgffor}

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

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

Aliás, verificar a classe pelo nome não é realmente recomendado, existem milhares de classes e se alguém fizer uma copiando book.clse alterando algumas coisas, seu pacote não a reconhecerá como uma classe semelhante a um livro. Geralmente é melhor testar recursos específicos, como \chapterser definido, em vez de verificar se a classe é chamada book.

informação relacionada