¿Cómo puedo usar \if \then \else con \@ifclassloaded{}

¿Cómo puedo usar \if \then \else con \@ifclassloaded{}

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 reporto memoircon bookla 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 etoolboxy su \ifboolexprcomando para combinar varios condicionales del formulario \<conditional [possibly with additional arguments]>{<true>}{<false>}en uno.

Tenga en cuenta la testpalabra 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 \chaptercomando. Dependiendo de lo que estés intentando hacer, esa puede ser la mejor idea.

Aquí usé \ifundeffrom etoolbox, esto invierte la lógica del primer ejemplo. (También existe \ifdef, pero trata los comandos que están \relaxdefinidos, 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 \@ifclassloadedes

\@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 \makeatotherpara que solo lo ejecute si la clase no es un libro.

De todos modos, nunca deberías tener \makeatlettero \makeatotheren 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.clsy cambiando algunas cosas, su paquete no la reconocerá como una clase similar a un libro. Generalmente es mejor probar características específicas, como \chapterestar definidas, en lugar de verificar que se llame a la clase book.

información relacionada