Ciao a tutti,
mi ricollego alla discussione Realizzazione classe con opzione «binaria» (http://www.guit.sssup.it/phpBB2/viewtopic.php?t=5877), richiamando una situazione alla quale avevo pensato qualche tempo fa.La situazione è simile a quella del topic sopracitato, nel senso che vi è sempre un comando interno tipico della classe il quale può assumere uno tra due possibili valori. In questo caso, però, la differenza consiste nel fatto che il valore assunto dal comando interno non viene specificato da un’opzione, ma da un secondo comando fornito dalla classe, il quale è messo a disposizione dell’utente.
Cerco di spiegarmi meglio con un esempio: si immagini di dover realizzare il frontespizio di una tesi (sì, lo so già che ci sono ottimi strumenti per farlo, sto solo facendo un esempio 😉 ); un problema può essere quello di dover stampare la stringa “Laureando” oppure “Laureanda” a seconda che l’autore del documento sia un uomo oppure una donna.
Non volendo introdurre opzioni specifiche per ottenere questo risultato, il modo più semplice (a mio avviso) per farlo è il seguente: ecco la classe
`\NeedsTeXFormat{LaTeX2e}[1995/12/01]\ProvidesClass{lezione}
\DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}}
\ProcessOptions\relax
\LoadClass{article}
\newcommand{\@qualificastudente}{} % <--- Può assumere i valori "Laureando" o "Laureanda" \newcommand{\@autore}{} % <--- Tiene traccia del nome dell'autore \newcommand{\laureando}[1]{% \renewcommand{\@qualificastudente}{Laureando}% \renewcommand{\@autore}{#1}% } \newcommand{\laureanda}[1]{% \renewcommand{\@qualificastudente}{Laureanda}% \renewcommand{\@autore}{#1}% } \renewcommand{\@maketitle}{% \newpage \null \vskip 2em% \begin{center}% \let \footnote \thanks {\LARGE \@title \par}% \vskip 1.5em% {\large \lineskip .5em% \begin{tabular}[t]{c}% \@author \end{tabular}\par}% \vskip 1em% {\large \@qualificastudente: \@autore} % <--- Vengono stampati la qualifica e il nome \end{center}% \par \vskip 1.5em} \endinput` ed ecco il file di prova `\documentclass{lezione} \author{Autore} \title{Titolo} \laureanda{Elisa} \begin{document} \maketitle \end{document}` Per funzionare, funziona (si può provare a sostituire \laureando a \laureanda nel file di prova). Le mie domande sono: [ul][li] È questo il modo giusto di procedere o ci sono degli errori? [li] In caso contrario, che cosa c'è che non va e/o si può fare di meglio?[/ul]Alla luce delle risposte che ho ricevuto nel precedente topic, l'unica cosa che mi viene in mente in questo momento è di sostituire `\newcommand{\@qualificastudente}{} \newcommand{\@autore}{}` con `\def\@qualificastudente{} \def\@autore{}` ma nulla di più. Aspetto quindi di sentire l'opinione di qualcun altro.
Mi pare che vada bene. La differenza fra \def e \newcommand in questo caso è solo che \newcommand controlla che il comando non sia definito, cosa che non è affatto probabile. Tuttavia è meglio usare nomi del tipo \rod@autore, con un prefisso che scegli arbitrariamente (dall’autore della classe o dal nome della classe stessa); in questo modo le probabilità che ci sia già un comando con quel nome sono quasi nulle.
Ciao
Enrico