Realizzazione classe con opzione «binaria»

  • Creatore
    Topic
  • #32762
    Up
    0
    Down
    ::


    Ciao a tutti,
    avrei due domande in merito alla gestione delle opzioni all’interno di un file di classe personalizzato.

    Sto scrivendo una classe che consente di realizzare la dispensa di una lezione. Siccome una generica lezione alla quale faccio riferimento è solitamente abbastanza breve, la mia classe si basa fortemente su article.cls, alla quale aggiunge alcune piccole modifiche.

    In realtà, vorrei che questa mia classe potesse servirmi anche per tenere traccia delle esercitazioni. Dal momento che un’esercitazione presenta la stessa struttura di una lezione di teoria (cambia solo il contenuto), la classe in questione può essere usata indifferentemente sia per una normale lezione, sia per un’esercitazione. L’unica differenza tra le due situazioni consiste nella ridefinizione di un comando interno, il cui valore viene modificato da «Lezione» a «Esercitazione».

    Per spiegarmi meglio, allego il codice dei file che sto correntemente usando. Per semplicità, ho rimosso un sacco di righe, in modo da riportarmi ad un esempio minimale.

    Il primo caso è quello che consente di scrivere una lezione; il file di classe:
    `\NeedsTeXFormat{LaTeX2e}[1995/12/01]

    \ProvidesClass{lezione}

    \DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}}

    \ProcessOptions\relax

    \LoadClass{article}

    \newcommand{\@tipologia}{Lezione} % <--- Viene definita la tipologia di dispensa corrente. \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 Tipologia: \@tipologia} % <--- Viene stampata la tipologia di dispensa corrente. \end{center}% \par \vskip 1.5em} \endinput` Una prova d'uso: `\documentclass{lezione} \author{Autore} \title{Titolo} \begin{document} \maketitle \end{document}` Nel caso della lezione, tutto fila liscio. Per quanto riguarda l'esercitazione, il file di prova dovrebbe essere scritto in questo modo: `\documentclass[esercitazione]{lezione} \author{Autore} \title{Titolo} \begin{document} \maketitle \end{document}` La modifica che vorrei introdurre nel file di classe comporta la definizione di un'opzione di nome «esercitazione», la gestione della quale dovrebbe realizzare una delle due situazioni elencate di seguito (non so quale sia la migliore): [ul][li] in seguito al comando `\newcommand{\@tipologia}{Lezione}` un'istruzione if valuta se l'opzione «esercitazione» è stata specificata nel file principale, e in caso affermativo effettua un \renewcommand su \@tipologia assegnandole invece il valore «Esercitazione»; [li] rimuovo dalla classe l'istruzione `\newcommand{\@tipologia}{Lezione}` ed inserisco un'istruzione if la quale valuta se l'opzione «esercitazione» è stata specificata nel file principale; in caso affermativo, essa realizza il comando `\newcommand{\@tipologia}{Esercitazione}` altrimenti `\newcommand{\@tipologia}{Lezione}`[/ul]Purtroppo, non so come realizzare questa situazione. So che di certo devo inserire un'istruzione del tipo `\DeclareOption{esercitazione}{...}` presumibilmente sotto `\DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}}` e credo che servirà anche un'istruzione del tipo «\newif». A questo punto, aspetto qualche dritta anziché scrivere a vuoto. La seconda domanda, più semplice della prima, è più che altro una curiosità relativa all'istruzione `\DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}}` La presenza di questa istuzione consente di scrivere nel file principale una cosa del tipo `\documentclass[11pt,a4paper,italian]{lezione}` assicurandosi che queste opzioni verranno passate ad article.cls. Tuttavia, nel mio caso, viene dichiarata anche l'opzione «esercitazione». A questo punto, mi chiedo se sia valida la sintassi seguente: `\documentclass[11pt,a4paper,italian,esercitazione]{lezione}` Mi chiedo infatti se questa dichiarazione non faccia confusione a LaTeX, inducendolo a passare ad article.cls anche l'opzione sconosciuta «esercitazione», la quale deve invece essere presa in carico dalla mia classe personalizzata. È lecita o no? Grazie e a presto.

Visualizzazione 5 filoni di risposte
  • Autore
    Risposte
    • #32763
      robitex
      Amministratore del forum
        Up
        0
        Down
        ::


        Discussione http://www.guit.sssup.it/phpBB2/viewtopic.php?t=5417 al quinto e sesto post.

        Si risolve facilemnte con un \newif

        Bye

      • #32764
        Up
        0
        Down
        ::

        Discussione http://www.guit.sssup.it/phpBB2/viewtopic.php?t=5417 al quinto e sesto post.

        Si risolve facilemnte con un \newif

        Molte grazie per la dritta. Alla luce del tuo consiglio, la mia classe assume quindi la seguente forma:
        `\NeedsTeXFormat{LaTeX2e}[1995/12/01]

        \ProvidesClass{lezione}

        \DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}}

        \newif\iflezione@esercitazione
        \DeclareOption{esercitazione}{\lezione@esercitazionetrue}

        \ProcessOptions\relax

        \LoadClass{article}

        \iflezione@esercitazione
        \newcommand{\@tipologia}{Esercitazione}
        \else
        \newcommand{\@tipologia}{Lezione}
        \fi

        \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 Tipologia: \@tipologia}%
        \end{center}%
        \par
        \vskip 1.5em}

        \endinput`
        L’unico dubbio che mi rimane è quello di avere inserito le istruzioni al posto giusto. Comunque, a meno che qualcuno non abbia commenti da fare, considero questa versione la definitiva.

        Per quanto riguarda la seconda domanda, mi rispondo da solo (adesso che la classe funziona): nonostante l’istruzione
        `\DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}}`
        sembra che non vi siano ambiguità: l’opzione «esercitazione» viene gestita dalla classe e tutto il resto da article.cls.

        Grazie e a presto!

      • #32765
        Up
        0
        Down
        ::

        Ciao a tutti,
        avrei due domande in merito alla gestione delle opzioni all’interno di un file di classe personalizzato.

        Sto scrivendo una classe che consente di realizzare la dispensa di una lezione. Siccome una generica lezione alla quale faccio riferimento è solitamente abbastanza breve, la mia classe si basa fortemente su article.cls, alla quale aggiunge alcune piccole modifiche.

        In realtà, vorrei che questa mia classe potesse servirmi anche per tenere traccia delle esercitazioni. Dal momento che un’esercitazione presenta la stessa struttura di una lezione di teoria (cambia solo il contenuto), la classe in questione può essere usata indifferentemente sia per una normale lezione, sia per un’esercitazione. L’unica differenza tra le due situazioni consiste nella ridefinizione di un comando interno, il cui valore viene modificato da «Lezione» a «Esercitazione».Il primo caso è quello che consente di scrivere una lezione; il file di classe:…

        Non occorre alcun \if:
        `\NeedsTeXFormat{LaTeX2e}[1995/12/01]
        \ProvidesClass{lezione}

        \newcommand{\@tipologia}{Lezione}

        \DeclareOption{esercitazione}{\renewcommand{\@tipologia}{Esercitazione}}
        \DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}}

        \ProcessOptions\relax

        \LoadClass{article}

        \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 Tipologia: \@tipologia} % <--- Viene stampata la tipologia di dispensa corrente. \end{center}% \par \vskip 1.5em} \endinput` Le tue ipotesi su \DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}} sono più o meno corrette: ogni opzione alla classe che non sia stata dichiarata esplicitamente con \DeclareOption viene passata alla classe article. Prima o dopo \DeclareOption* è irrilevante, ma tradizionalmente questa istruzione si mette per ultima.

        Il problema che poni su
        `\documentclass[11pt,a4paper,italian,esercitazione]{lezione}`
        non esiste: l’opzione esercitazione non viene passata a article, perché è stata dichiarata nella classe.

        Ciao
        Enrico

      • #32766
        Up
        0
        Down
        ::

        Non occorre alcun \if

        Molte grazie, ne prendo atto. Tengo comunque a mente anche la soluzione precedente, perché potrebbe sempre far comodo sapere gestire le condizioni.

        Le tue ipotesi […] sono più o meno corrette: ogni opzione alla classe che non sia stata dichiarata esplicitamente viene passata alla classe article. Prima o dopo \DeclareOption* è irrilevante, ma tradizionalmente questa istruzione si mette per ultima.

        Il problema che poni […] non esiste: l’opzione esercitazione non viene passata a article, perché è stata dichiarata nella classe.

        Molto bene. Terrò a mente anche questo.

        In realtà, questa discussione mi fa pensare anche ad un altro problema simile che mi aveva turbato qualche mese fa. Oggi però non ho più la forza di scrivere, se ce la faccio scrivo un messaggio domani…

        Grazie a tutti per la preziosa collaborazione e a presto!

      • #32767
        Up
        0
        Down
        ::

        Non occorre alcun \if

        Molte grazie, ne prendo atto. Tengo comunque a mente anche la soluzione precedente, perché potrebbe sempre far comodo sapere gestire le condizioni.

        La tecnica con \newif è utile in vari contesti, ma principalmente se la condizione deve essere verificata più volte. L’esempio tipico è l’opzione twoside: ci sono parecchi posti nella classe article dove occorre scegliere codice per il caso oneside o per il caso twoside. Perciò nella classe trovi
        `\newif\if@twoside
        \DeclareOption{oneside}{\@twosidefalse}
        \DeclareOption{twoside}{\@twosidetrue}

        \ExecuteOptions{…,oneside,…}
        \ProcessOptions\relax`
        (come al solito, non è proprio questo che si trova, indico solo l’essenziale). Prima di \ProcessOptions vengono passate le opzioni di default.

        Nel tuo caso non occorre definire l’opzione di default “lezione”, ma non è vietato:
        `\DeclareOption{lezione}{\def\@tipologia{Lezione}}
        \DeclareOption{esercitazione}{\def\@tipologia{Esercitazione}}

        \ExecuteOptions{lezione}
        \ProcessOptions\relax`
        avrebbe avuto lo stesso effetto (puoi usare \newcommand invece di \def se preferisci), ma sarebbe uno spreco.

        La strategia da adottare dipende da quello che fa l’opzione. La lettura di clsguide.pdf (LaTeX2e for class and package writers) è molto indicata.

        Ciao
        Enrico

      • #32768
        Up
        0
        Down
        ::


        Un’ultima precisazione: il tuo ultimo intervento cita l’istruzione
        `\ExecuteOptions{nomeopzione}`
        della quale non ho mai approfondito la funzione. Il suo significato sembrerebbe essere: «anche se l’utente non specifica l’opzione “nomeopzione” in modo esplicito, esegui comunque il codice contenuto nella sua definizione». In pratica, immagino sia il modo di dichiarare una generica opzione nei termini di un’opzione «di default».

        La strategia da adottare dipende da quello che fa l’opzione. La lettura di clsguide.pdf (LaTeX2e for class and package writers) è molto indicata.

        Ben venga anche questo consiglio. Aspetto la metà del mese per montare e testare la stampante laser a colori. Sono già presenti nella mia coda di stampa ideale il quinto numero di ArsTeXnica, non appena diviene pubblico, la guida ufficiale di Beamer e quella di PGF. Diciotto fogli in più non saranno un problema. Senza contare che a fine mese bisognerà anche scaricare le nuove release delle verie versioni e varianti di Ubuntu per il parco macchine, configurare TeXLive, ecc., ecc.

        Altro che «aprile dolce dormire»… 😉

    Visualizzazione 5 filoni di risposte
    • Devi essere connesso per rispondere a questo topic.

    Go to top