
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 report
or memoir
com book
classe 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 etoolbox
e seu \ifboolexpr
comando para combinar várias condicionais do formulário \<conditional [possibly with additional arguments]>{<true>}{<false>}
em uma.
Observe a test
palavra-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 \chapter
comando. Dependendo do que você está tentando fazer, essa pode ser a melhor ideia.
Aqui usei \ifundef
from etoolbox
, isso inverte a lógica do primeiro exemplo. (Existe também \ifdef
, mas trata comandos conforme \relax
definidos, 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" é \makeatother
para que você só execute isso se a classe não for livro.
Você nunca deve ter \makeatletter
ou \makeatother
em 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.cls
e alterando algumas coisas, seu pacote não a reconhecerá como uma classe semelhante a um livro. Geralmente é melhor testar recursos específicos, como \chapter
ser definido, em vez de verificar se a classe é chamada book
.