Re: [.cls] Caricare diversa classe base a seconda delle opzioni

#67093
Up
0
Down
::


Prima di tutto, grazie!

OldClaudio” post=66073Confesso che non le ho provate, ma ho solo letto il codice; da questa lettura solo la terza versine mi pare che possa funziinare, nel senso che le altre due secondo la mia lettura non funzionano.

Mi spiego: finché dichiari una opzione con \DeclareOption il suo codice viene messo in una lista, ma non viene eseguito finché non viene eseguito il comando \ProcessOptions. Dunque nei primi due casi i vari \if che corrispondono ai discriminanti non sono impostati e di conseguenza le strutture condizionali funzionano solo con i valori di default di quelle variabili booleane, cioè false.

Ci sarebbe anche la possibilità di usare \ExecuteOption; questo crea una lista di opzioni da usare, con la clausola che se qualche opzione non è definita, viene silenziosamente ignorata.

Ci sarebbe anche da sfruttare il fatto che le opzioni non definite per una classe non producono errori, anche se funzionano daopzioni globali, ma viene solo emesso un messaggio “Option … not used”, che appare solo nel file .log.

Però secondo me la terza variante funziona benissimo;

Ho provato le varie soluzioni e a me paiono funzionare. Ho letto la clsguide e non vorrei aver preso un abbaglio, ma i condizionali vengono eseguiti indirettamente da \ProcessOptions (perché inseriti in qualche \DeclareOption) oppure direttamente dopo \ProcessOptions.

Comunque, se ti sembra che la terza vada bene, allora uso quella. 🙂

io ho incontrato delle difficoltà a passare opzioni a memoir dalla classe che la chiama, ma forse c’è ancora qualcosa che mi sfugge in tutto questo meccanismo.

L’ho concepito così: se non ci sono opzioni non previste (niente \DeclareOption*, con l’asterisco), allora viene espanso il \my@configbaseclass che segue \ProcessOptions, e che quindi usa i condizionali correttamente impostati. Se invece viene passata un’opzione con \DeclareOption*, allora sono state certamente già eseguite (se ci sono) le opzioni che fanno da discriminante, quindi chiamo \my@configbaseclass prima di passare le nuove opzioni alla classe base. In ogni caso, se non sbaglio qualcosa, \my@configbaseclass si annulla automaticamente dopo la prima chiamata.

Il vincolo è che devo passare alla classe base (qualunque essa sia) le relative opzioni predefinite prima che vengano passate altre opzioni con \DeclareOption* (con l’asterisco), in modo che queste ultime abbiano la precedenza.

Questo è l’esempio (quasi) reale:
`
\RequirePackage{filecontents}

\begin{filecontents}{classe.cls}
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{classe}[2011/12/01 v0.1 Classe di prova]

\newif\ifmy@memoir
\newif\ifmy@article
% altri newif

\def\print{\typeout{\CurrentOption}}

\def\my@configbaseclass{
\ifmy@memoir
\def\my@baseclass{memoir}
\ifmy@article
\PassOptionsToClass{10pt,a4paper,article}{memoir}
\else
\PassOptionsToClass{10pt,a4paper}{memoir}
\fi
\else
\ifmy@article
\def\my@baseclass{scrartcl}
\PassOptionsToClass{10pt,abstract=true}{scrartcl}
\else
\def\my@baseclass{scrbook}
\PassOptionsToClass{10pt}{scrbook}
\fi
\fi
\let\my@configbaseclass\relax}

\DeclareOption{memoir}{\print\my@memoirtrue}
\DeclareOption{article}{\print\my@articletrue}
% altre opzioni
\DeclareOption*{
\print
\my@configbaseclass
\PassOptionsToClass{\CurrentOption}{\my@baseclass}
}

\ProcessOptions\relax
\my@configbaseclass
\LoadClass{\my@baseclass}
\end{filecontents}

%\documentclass[b5paper,article,11pt,memoir,landscape]{classe}
\documentclass[b5paper,article,11pt,headinclude]{classe}

\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[italian]{babel}

\begin{document}
ciao!
\end{document}`
Viene passata correttamente sia l’opzione “landscape” a memoir che “headinclude” a scrbook.

Sperando che non ci siano altri bug… 🙂

Grazie di nuovo!

Go to top