- Questo topic ha 6 risposte, 2 partecipanti ed è stato aggiornato l'ultima volta 22 anni, 10 mesi fa da
ev.
-
CreatoreTopic
-
10 Novembre 2003 alle 10:40 #1650::
ciao a tutti,
vorrei realizzare qualcosa come:
\usepackage[opzione=valore]{pacchetto}
so che è possibile perché l’ho visto realizzato, ma leggendo il codice del pacchetto mi perdo.ho provato a leggere la doc di keyval, ma non mi sembra troppo comprensibile (sono limitato, lo so…). sono riuscito a far assegnare a una lunghezza il paramentro che voglio, ma non riesco proprio a infilarlo in un opzione.
ciao
f
-
CreatoreTopic
-
AutoreRisposte
-
-
10 Novembre 2003 alle 11:01 #1651::
vorrei realizzare qualcosa come:
\usepackage[opzione=valore]{pacchetto}
so che è possibile perché l’ho visto realizzato, ma leggendo il codice del pacchetto mi perdo.La documentazione di keyval e’ “sintetica” 🙂
Prova con questo:`\newlength{\nuovadimensione}
\define@key{fbs}{opzione}[0pt]{\setlength{\nuovadimensione}{#1}}`Poi, quando e’ il momento di elaborare le opzioni, usando \setkeys devi specificare come primo parametro la “famiglia” fbs usata nel \define@key e come secondo parametro l’elenco di tutte le opzioni. Se opzione non era accompagnata da un valore esplicito e’ posta a 0pt, altrimenti al valore indicato dall’utente (sperando che sia una lunghezza :wink:)
-
10 Novembre 2003 alle 11:16 #1652::
`\newlength{\nuovadimensione}
\define@key{fbs}{opzione}[0pt]{\setlength{\nuovadimensione}{#1}}`fin qua c’ero faticosamente arrivato, creo una famiglia fbs che ha l’opzione “opzione” e che quando specificata mette la lunghezza opportuna a “nuovadimensione”.
poi ho fatto un mini comando del tipo
\comando{opzione=5pt}
e facendo
\the\nuovadimensione
trovo appunto 5pt.
quindi funziona.Poi, quando e’ il momento di elaborare le opzioni, usando \setkeys devi specificare come primo parametro la “famiglia” fbs usata nel \define@key e come secondo parametro l’elenco di tutte le opzioni. Se opzione non era accompagnata da un valore esplicito e’ posta a 0pt, altrimenti al valore indicato dall’utente (sperando che sia una lunghezza :wink:)
si però non posso infilarlo direttamente in \DeclareOption. il problema è proprio quello.
non so se mi sono spiegato male o se mi hai dato la risposta e non la capisco…
ciao
f
-
10 Novembre 2003 alle 11:36 #1653::
si però non posso infilarlo direttamente in \DeclareOption. il problema è proprio quello.
Ok, ok… ero partito dall’assunto che non riuscissi minimamente ad usare keyval, ma vedo che il “succo” l’hai capito da solo. Se vuoi gestire le opzioni del pacchetto con keyval allora non ti serve usare \DeclareOption: definisci ogni opzione con \define@key e poi, invece di \ProcessOptions iteri sul contentuo di \@classoptionslist sulla falsariga di geometry:`\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}}
\ProcessOptionsWithKV{fbs}`
-
10 Novembre 2003 alle 17:43 #1654::
O dato un’occhiata al tuo codice e a quello di geometry. per ora sono spossato e la cosa esula dalle mie possibilità. mi sono detto che allora posso cominciare a fare un piccolo comando che prenda l’opzione e la passi al pacchetto, piuttosto che:`
\documentclass[a4paper,12pt,oneside]{book}
\usepackage[rilegature=1cm]{layaureo}
`
fare semplicemnte
`
\documentclass[a4paper,12pt,oneside]{book}
\usepackage{layaureo}
\LayAureoConf{rilegatura=1cm}
`purtroppo non funziona, perché il mio pachetto setta la dimensione per la rilegatura e solo dopo assegna alla lunghezza in gioco il valore che le passo con il comando di configurazione…
oggi sono spossato, vedo se domani ci cavo qualcosa di buono.
ciao
fp.s. a parte un errorino marginale che spero presto di risolvere ho quasi finito la versione 0.1 del pacchetto.
grazie a tutti quanti mi hanno aiutato o consigliato
-
12 Novembre 2003 alle 9:09 #1655::
allora, vediamo se riesco a fare il giochino di indovinare il significato dei comandi…`\def\ProcessOptionsWithKV#1{%
\let\@tempa\@empty
`allora: si definisce un comando che elabora le opzioni con keyval e inizializiamo una \@tempa ponendolo vuoto (usando la definizione interna di \empty)
`
\@for\CurrentOption:=\@classoptionslist\do{%
`
Immagino che si fa un ciclo per ogni opzione corrente, sul contenuto di tutta la lista delle opzioni. in pratica quando metto le opzioni in \usepackage queste dovrebbero venir messe nella lista suddetta, che io avrei chiamato \@packageoptionslist per non fare cosino con le classi, ma insomma…`
\@ifundefined{KV@#1@\CurrentOption}%
`
qui tiro un po’ a indovinare:
usando la macro di keyval \define@key{family}{key}{code} questa definisce una macro \KV@family@key che quando viene usata in una lista keyval riceve i valori specificati come argomenti.
in questo caso si vuole controllare se altrove è stato definito \KV@family@key in maniera che family sia l’argomento specificato per \ProcessOptionsWithKV e key l’opzione corrente. se non esiste una dichiarazione del genere si passa avanti.
o mi sto inventando tutto?`
{}{\edef\@tempa{\@tempa,\CurrentOption,}}}%
`
qui mi perdo, se \@tempa è vuoto definiamo \@tempa come “,opzione corrente,”.
se al ciclo precedente eravamo passati dentro l’if allora lo definiamo come
“,opzione precendente,opzione corrente,” ??? se invece non siamo passati nell’if \@tempa contiene la definizione specificata sotto, che è la cosa che capisco meno…
in ogni caso si esce dal ciclo do.`
\edef\@tempa{%
\noexpand\setkeys{#1}{\@tempa\@ptionlist{\@currname.\@currext}}}%
\@tempa
`adesso si definisce \@tempa come:
\noexpand???
e si utilizza la macro \setkeys, dando appunto come primo argomento il nome della famiglia e come argomento \@tempa e \@optionlist (ho aggiunto una o di option, ho fatto male?) e poi mi perdo.
non capisco più cosa contiene \@tempa e cosa si fa con \@currname e \@curext. vado a cercare se trovo la definizione di tali comandi.`
\AtEndOfPackage{\let\@unprocessedoptions\relax}}
\ProcessOptionsWithKV{fbs}`posponendo il codice quando verrà utilizzato alla fine del pacchetto per un istante si ridefinisce al volo \@unprocessedoptions in modo che equivalga a \relax perché altrimenti latex darebbe un errore visto che non sono stati usati i comandi \DeclareOption e nonostante questo sono presenti delle opzioni.
infine si lancia il comando suddetto, che dovrebbe processare tutte le opzioni.incomincio a capirci qualcosa…
ciao
f
-
12 Novembre 2003 alle 10:01 #1656::
allora, vediamo se riesco a fare il giochino di indovinare il significato dei comandi…
Ok, ma niente premio

`
\@ifundefined{KV@#1@\CurrentOption}%
`
qui tiro un po’ a indovinare:Taglio un po’ per non annoiare gli altri utenti: hai sostanzialmente afferrato il significato di \@ifundefined e la modalità di “reperimento” delle macro che keyval associa ad ogni opzione.
`
{}{\edef\@tempa{\@tempa,\CurrentOption,}}}%
`
qui mi perdo, se \@tempa è vuoto definiamo \@tempa come “,opzione corrente,”.
se al ciclo precedente eravamo passati dentro l’if allora lo definiamo come
“,opzione precendente,opzione corrente,” ??? se invece non siamo passati nell’if \@tempa contiene la definizione specificata sotto, che è la cosa che capisco meno…No. Per ogni opzione valida per keyval si aggiunge quell’opzione alla lista che stiamo costruendo in \@tempa; per ogni opzione non valida, cioè quelle che danno luogo ad alcuna macro \KV@fam@key, non si esegue alcuna operazione (la coppia di parentesi graffe vuota) e si passa ad esaminare l’elemento seguente di \@classoptionslist.
`
\edef\@tempa{%
\noexpand\setkeys{#1}{\@tempa\@ptionlist{\@currname.\@currext}}}%
\@tempa
`
adesso si definisce \@tempa come:
\noexpand???
e si utilizza la macro \setkeys, dando appunto come primo argomento il nome della famiglia e come argomento \@tempa e \@optionlist (ho aggiunto una o di option, ho fatto male?) e poi mi perdo.Per \edef e \noexpand dai un’occhiata al TeXbook (il capitolo sulle macro, se non ricordo male). Dopo l’esecuzione di quell’\edef in \@tempa avrai:`\setkey{
}{ }`cioè quello che si voleva fin dall’inizio.
-
-
AutoreRisposte
- Devi essere connesso per rispondere a questo topic.