Re: Definizione pacchetto con opzioni (contrastanti)

#23689
Up
0
Down
::

Ciao a tutti,
qualche giorno fa ho deciso di scrivere un pacchettino per risolvere alcune mie esigenze.

Il pacchetto (di cui riporto solo il codice rilevante), tra le altre cose, «enfatizza» certi termini che hanno per me un significato particolare colorandoli di celeste. Chiaramente, questa caratteristica non è sfruttabile se, come faccio talvolta, ho bisogno di mettere il tutto su carta usando una stampante laser in bianco e nero.

Ho pensato quindi di definire un’opzione di nome «stampa»; l’idea di base è che il pacchetto si comporti così:

  • il pacchetto definisce un colore di nome «celeste» che rappresenta (idealmente) una tonalità di celeste;

  • se il pacchetto viene caricato senza opzioni, il comando «\termine{…}» che esso fornisce colora effettivamente il suo parametro di celeste;

  • se lo si carica specificando l’opzione «stampa», il colore «celeste» viene (ri)definito in termini di nero, e pertanto i termini assumeranno quest’ultimo colore.

Come gestire questa opzione? Riprendendo un discorsetto di qualche tempo fa (Occultare un comando con parametri, consultabile all’indirizzo http://guit.sssup.it/phpbb/viewtopic.php?p=7837#7837), ho dato un’occhiata (veloce) a clsguide.pdf e ho scritto i due file riportati di seguito.

«pacchetto.sty»:
`\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{pacchetto}[2008/04/18 Enfatizza i termini]

\RequirePackage{color}

\definecolor{celeste}{rgb}{0,.5,.99}

\DeclareOption{stampa}{\definecolor{celeste}{rgb}{0,0,0}}
\ProcessOptions\relax

\newcommand{\termine}{\textcolor{celeste}}

\endinput`
«prova.ltx»:
`\documentclass{article}

\usepackage[stampa]{pacchetto}

\begin{document}

Introduciamo un \termine{termine}\dots

\end{document}`
Il tutto sembra funzionare, ma ho due perplessità sulla correttezza del mio codice:

  1. se l’istruzione «\definecolor{celeste}{rgb}{0,.5,.99}» viene inserita dopo la dichiarazione dell’opzione, non ottengo l’effetto sperato (cioè i termini vengono comunque colorati di celeste, anche se il pacchetto viene caricato con l’opzione «stampa»);

  2. avrei voluto scrivere il codice in un altro modo (ammesso che sia possibile); ecco l’idea:

    `\NeedsTeXFormat{LaTeX2e}
    \ProvidesPackage{pacchetto}[2008/04/18 Enfatizza i termini]

    \RequirePackage{color}

    \definecolor{celeste}{rgb}{…} <--- definizione del nome del colore senza specificarne il valore \DeclareOption{stampa}{...} <--- dichiarazione dell'esistenza di \ProcessOptions\relax un'opzione senza specificarne il codice relativo if se si chiama l'opzione «stampa», alla variabile «celeste» viene assegnato il colore nero else alla variabile «celeste» viene assegnato il colore celeste fi \newcommand{\termine}{\textcolor{celeste}} \endinput`[/ol]È possibile fare quello che chiedo? E se sì, qual è la sintassi corretta?

  3. `\NeedsTeXFormat{LaTeX2e}
    \ProvidesPackage{pacchetto}[2008/04/18 Enfatizza i termini]

    \newif\if@terminecolor
    \DeclareOption{stampa}{\@terminecolorfalse}
    \DeclareOption{colored}{\@terminecolortrue}
    \ExecuteOptions{colored}
    \ProcessOptions\relax

    \if@terminecolor
    \RequirePackage{color}
    \definecolor{celeste}{rgb}{0,.5,.99}
    \newcommand\termine{\textcolor{celeste}}
    \else
    \newcommand\termine{\@iden}
    \fi
    \endinput`
    Il comando \@iden semplicemente toglie le graffe attorno al suo argomento.

    Ciao
    Enrico

    Go to top