Re: keyval e \DeclareOption

#27432
Up
0
Down
::

Salve,

sto cercando di creare una classe molto semplice, basata sulla book, che ne modifichi
qualche aspetto tramite opportune opzioni.

Vorrei che coesistessero opzioni del tipo chiave=valore (usando keyval) e opzioni normali (vero/falso) (usando il comando \DeclareOption).

Il processamento delle opzioni di keyval l’ho copiato e incollato dal pacchetto layaureo.

`
\def\ProcessOptionsWithKV#1{%
\let\@tempa\@empty
\@for\CurrentOption:=\@classoptionslist\do{%
\@ifundefined{KV@#1@\CurrentOption}%
{}{\edef\@tempa{\@tempa,\CurrentOption,}}}%
\edef\@tempa{%
\noexpand\setkeys{#1}%
{\@tempa\@ptionlist{\@currname.\@currext}}}%
\@tempa
\AtEndOfPackage{\let\@unprocessedoptions\relax}}
`

Purtroppo appena richiamo la mia classe con una opzione dichiarata con \DeclareOption, keyval mi da errore perché non riconosce quella opzione. Viceversa quando uso una opzione del tipo chiave=valore, keyval la processa correttamente ma \ProcessOptions mi restituisce un warning sull’inesistenza di tale opzione.

Per quanto riguarda il warning non saprei proprio come eliminarlo, mentre per il processamento delle opzioni di keyval credo che il problema sia specificare a mano quale opzioni processare, senza usare il for (oppure semplicemente non dichiarare
le opzioni tramite \DeclareOption ma limitarmi a usare anche per le altre \define@key,
come in layaureo per l’opzione big)

La mia domanda: è possibile far coesistere keyval con \DeclareOption ? Se sì, come?

Credo che il modo migliore sia di usare xkeyval, che dovrebbe avere già la funzionalità che chiedi. Oppure di dichiarare le opzioni tramite \define@key.

Supponiamo che tu abbia un’opzione classica, “pippo”, che dichiareresti con
`\newif\ifpippo
\DeclareOption{pippo}{\pippotrue}

\ProcessOptions\relax`
Credo che il codice seguente abbia la stessa funzionalità con keyval:
`\newif\ifpippo
\define@key{mykeys}{pippo}[true]{\csname pippo#1\endcsname}

\ProcessOptionsWithKV{mykeys}`
Chiamando il pacchetto con \usepackage[pippo]{package} verrebbe eseguita l’opzione “pippo=true” che darà il risultato corretto, perché sarebbe eseguito il codice \csname pippotrue\endcsname che equivale a \pippotrue. Naturalmente non è necessario usare #1 nell’argomento di \define@key, puoi metterci qualsiasi codice.

Puoi fare un esempio di quello che desideri ottenere?

Ciao
Enrico

Go to top