- Questo topic ha 9 risposte, 3 partecipanti ed è stato aggiornato l'ultima volta 14 anni, 9 mesi fa da .
-
Topic
-
Sto scrivendo una classe che può caricare tre classi diverse a seconda delle opzioni passatele: due sono KOMA e una è memoir. Ad ognuna di esse devono essere passate delle opzioni predefinite, ma se l’utente ne specifica altre, queste devono avere la precedenza su quelle predefinite. Siccome elaborano le opzioni nell’ordine in cui vengono passate (non nell’ordine in cui sono dichiarate), devo passare le opzioni predefinite prima di quelle specificate dall’utente, quindi prima di \ProcessOptions. D’altro canto, per sapere a quale classe passarle, devo aver letto almeno alcune opzioni, cosa che avviene dopo \ProcessOptions.Per risolvere la faccenda ho pensato di usare la versione non asteriscata di \ProcessOptions, per controllare subito se sono state passate alla mia classe le opzioni che fanno da discriminante per stabilire la classe base.
Esistono comunque diversi modi di procedere, vorrei capire quale è il migliore.
Primo metodo.
`
\newif\if@primodiscriminante
\newif\if@secondodiscriminante\DeclareOption{primodiscriminante}{\@primodiscriminantetrue}
\DeclareOption{secondodiscriminante}{\@secondodiscriminantetrue}
\DeclareOption{altraopzionea}{…}
\DeclareOption{altraopzioneb}{…}
\DeclareOption*{
\if@primodiscriminante
\PassOptionsToClass{\CurrentOption}{classe1}
\else\if@secondodiscriminante
\PassOptionsToClass{\CurrentOption}{classe2}
\else
\PassOptionsToClass{\CurrentOption}{classe3}
\fi\fi}\PassOptionsToClass{…}{classe1}
\PassOptionsToClass{…}{classe2}
\PassOptionsToClass{…}{classe3}\ProcessOptions\relax
\if@primodiscriminante
\LoadClass{classe1}
\else\if@secondodiscriminante
\LoadClass{classe2}
\else
\LoadClass{classe3}
\fi\fi`
Lo svantaggio è che passo inutilmente delle opzioni a classi che non caricherò. Inoltre gli if/else vengono valutati un numero variabile di volte.Secondo metodo.
`
\newif\if@primodiscriminante
\newif\if@secondodiscriminante\def\@set@baseclass{
\if@primodiscriminante\else
\if@secondodiscriminante\else
\def\@baseclass{classe3}
\PassOptionsToClass{…}{classe3}
\fi
\fi
\let\@set@baseclass\relax}\DeclareOption{primodiscriminante}{
\@primodiscriminantetrue
\def\@baseclass{classe1}
\PassOptionsToClass{…}{classe1}
}
\DeclareOption{secondodiscriminante}{
\@secondodiscriminantetrue
\if@primodiscriminante\relax\else
\def\@baseclass{classe2}
\PassOptionsToClass{…}{classe2}
\fi
}
\DeclareOption{altraopzionea}{…}
\DeclareOption{altraopzioneb}{…}
\DeclareOption*{
\@set@baseclass
\PassOptionsToClass{\CurrentOption}{\@baseclass}}\ProcessOptions\relax
\@set@baseclass
\LoadClass{\@baseclass}`
È una soluzione ibrida: alcune cose le faccio subito, altre le differisco. Gli if/else vengono valutati più volte (ma il numero è fisso).Terzo metodo.
`
\newif\if@primodiscriminante
\newif\if@secondodiscriminante\def\@set@baseclass{
\if@primodiscriminante
\def\@baseclass{classe1}
\PassOptionsToClass{…}{classe1}
\else
\if@secondodiscriminante
\def\@baseclass{classe2}
\PassOptionsToClass{…}{classe2}
\else
\def\@baseclass{classe3}
\PassOptionsToClass{…}{classe3}
\fi
\fi
\let\@set@baseclass\relax}\DeclareOption{primodiscriminante}{\@primodiscriminantetrue}
\DeclareOption{secondodiscriminante}{\@secondodiscriminantetrue}
\DeclareOption{altraopzionea}{…}
\DeclareOption{altraopzioneb}{…}
\DeclareOption*{
\@set@baseclass
\PassOptionsToClass{\CurrentOption}{\@baseclass}}\ProcessOptions\relax
\@set@baseclass
\LoadClass{\@baseclass}`
Ritardo la scelta della classe base e il passaggio delle opzioni al momento in cui effettivamente servono e mi assicuro di farlo una e una volta solaIl terzo metodo è quello che preferisco. Può andar bene? Esistono tecniche migliori?
Grazie,
AntonioPS: curiosità: a che serve \relax dopo \ProcessOptions?
- Devi essere connesso per rispondere a questo topic.