
Escribí un paquete que usa el \@ifclassloaded{}
comando para manejar la clase de documento, como,
\RequirePackage{pgffor}
\makeatletter%
\@ifclassloaded{book}
{%
<code block>
}
\makeatother%
\makeatletter%
\@ifclassloaded{article}
{%
<code block>
}
\makeatother%
Quiero manejar la clase report
o memoir
con book
la clase en el mismo condicional, así:
\makeatletter%
\@ifclassloaded{book}
\else \@ifclassloaded{report}
\else \@ifclassloaded{memoir}
{%
<code block>
}
\makeatother%
pero no trabajo. ¿Cómo puedo conseguir esto?
Respuesta1
Puedes usar etoolbox
y su \ifboolexpr
comando para combinar varios condicionales del formulario \<conditional [possibly with additional arguments]>{<true>}{<false>}
en uno.
Tenga en cuenta la test
palabra clave delante de cada condicional y las llaves que las rodean.
\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}
En este ejemplo, también podrías probar directamente la existencia del \chapter
comando. Dependiendo de lo que estés intentando hacer, esa puede ser la mejor idea.
Aquí usé \ifundef
from etoolbox
, esto invierte la lógica del primer ejemplo. (También existe \ifdef
, pero trata los comandos que están \relax
definidos, lo cual no es tan útil para esta aplicación).
\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}
Respuesta2
La sintaxis de \@ifclassloaded
es
\@ifclassloaded{class}{yes code}{no code}
entonces no necesitas \else
. Ambas ramas están integradas en la sintaxis.
Tienes
\@ifclassloaded{book}
{%
<code block>
}
\makeatother%
entonces su argumento "sin código" es \makeatother
para que solo lo ejecute si la clase no es un libro.
De todos modos, nunca deberías tener \makeatletter
o \makeatother
en un código de paquete, por lo que tu fragmento debería verse así
\RequirePackage{pgffor}
\@ifclassloaded{book}
{%
<code block>
}{%
else code
}
\@ifclassloaded{article}
{%
<code block>
}{%
else code
}
Por cierto, no se recomienda verificar la clase por nombre, hay miles de clases y si alguien crea una copiando book.cls
y cambiando algunas cosas, su paquete no la reconocerá como una clase similar a un libro. Generalmente es mejor probar características específicas, como \chapter
estar definidas, en lugar de verificar que se llame a la clase book
.