- Questo topic ha 6 risposte, 2 partecipanti ed è stato aggiornato l'ultima volta 17 anni, 11 mesi fa da
francesco.biccari.
-
CreatoreTopic
-
7 Ottobre 2008 alle 23:56 #27431::
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?
Grazie e scusate l’ignoranza…
-
CreatoreTopic
-
AutoreRisposte
-
-
8 Ottobre 2008 alle 0:21 #27432::
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
-
8 Ottobre 2008 alle 13:29 #27433::
Innanzitutto grazie della risposta.Spesso, nonostante non sia un grande esperto, mi trovo ad aiutare i miei colleghi nell’uso di LaTeX. Molti passano le giornate a rifinire il layout…
Mi è così venuta l’idea di fare una classe, abbastanza chiusa, per le tesi di dottorato in Fisica della Sapienza, sulla falsariga di quelle già esistenti per altre università.
L’idea è stata accettata… ora però mi devo dar da fare!Vorrei limitarmi ad una classe, chiamata sapthesis e basata sulla book, che carichi i latin modern con la codifica T1, cambi il layout di pagina con fancyhdr, usi layaureo per allargare la colonna del testo e dia l’opzione per un margine di rilegatura ed infine che generi un frontespizio.
Le uniche opzioni possibili per la classe sarebbero a4paper(default), 11pt (default), 10pt, 12pt, draft, twoside (default), oneside, binding=…
Questo è quello che sto scrivendo…
`
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{sapthesis}[2009/01/01 Sapienza University of Rome Ph.D. thesis class]% dichiaro e processo le opzioni
\DeclareOption{a4paper}{\typeout{sapthesis option 'a4paper' used} \PassOptionsToClass{a4paper}{book}}
\DeclareOption{draft}{\typeout{sapthesis option 'draft' used} \PassOptionsToClass{draft}{book}}
\DeclareOption{oneside}{\typeout{sapthesis option 'oneside' used} \PassOptionsToClass{oneside}{book}}
\DeclareOption{twoside}{\typeout{sapthesis option 'twoside' used} \PassOptionsToClass{twoside}{book}}
\DeclareOption{10pt}{\typeout{sapthesis option '10pt' used} \PassOptionsToClass{10pt}{book}}
\DeclareOption{11pt}{\typeout{sapthesis option '11pt' used} \PassOptionsToClass{11pt}{book}}
\DeclareOption{12pt}{\typeout{sapthesis option '12pt' used} \PassOptionsToClass{12pt}{book}}
\DeclareOption*{\ClassError{sapthesis}{Unknow option}{The option '\CurrentOption' is unknown}}
\ExecuteOptions{a4paper,11pt,twoside}
\ProcessOptions\relax
\LoadClass{book}% carico i pacchetti
\RequirePackage[T1]{fontenc}
\RequirePackage{lmodern}
\RequirePackage{textcomp}% fanyhdr, frontespizio, ecc…
`Quello che vorrei aggiungere al precedente codice è richiamare layaureo passandogli il margine per la rilegatura dalle opzioni della classe, ad esempio:
`
\documentclass[draft, binding=1cm]{sapthesis}
`
-
8 Ottobre 2008 alle 15:44 #27434::
Innanzitutto grazie della risposta.
Spesso, nonostante non sia un grande esperto, mi trovo ad aiutare i miei colleghi nell’uso di LaTeX. Molti passano le giornate a rifinire il layout…
Mi è così venuta l’idea di fare una classe, abbastanza chiusa, per le tesi di dottorato in Fisica della Sapienza, sulla falsariga di quelle già esistenti per altre università.
L’idea è stata accettata… ora però mi devo dar da fare!Vorrei limitarmi ad una classe, chiamata sapthesis e basata sulla book, che carichi i latin modern con la codifica T1, cambi il layout di pagina con fancyhdr, usi layaureo per allargare la colonna del testo e dia l’opzione per un margine di rilegatura ed infine che generi un frontespizio.
Le uniche opzioni possibili per la classe sarebbero a4paper(default), 11pt (default), 10pt, 12pt, draft, twoside (default), oneside, binding=…
Questo è quello che sto scrivendo…
`
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{sapthesis}[2009/01/01 Sapienza University of Rome Ph.D. thesis class]% dichiaro e processo le opzioni
\DeclareOption{a4paper}{\typeout{sapthesis option 'a4paper' used} \PassOptionsToClass{a4paper}{book}}
\DeclareOption{draft}{\typeout{sapthesis option 'draft' used} \PassOptionsToClass{draft}{book}}
\DeclareOption{oneside}{\typeout{sapthesis option 'oneside' used} \PassOptionsToClass{oneside}{book}}
\DeclareOption{twoside}{\typeout{sapthesis option 'twoside' used} \PassOptionsToClass{twoside}{book}}
\DeclareOption{10pt}{\typeout{sapthesis option '10pt' used} \PassOptionsToClass{10pt}{book}}
\DeclareOption{11pt}{\typeout{sapthesis option '11pt' used} \PassOptionsToClass{11pt}{book}}
\DeclareOption{12pt}{\typeout{sapthesis option '12pt' used} \PassOptionsToClass{12pt}{book}}
\DeclareOption*{\ClassError{sapthesis}{Unknow option}{The option '\CurrentOption' is unknown}}
\ExecuteOptions{a4paper,11pt,twoside}
\ProcessOptions\relax
\LoadClass{book}% carico i pacchetti
\RequirePackage[T1]{fontenc}
\RequirePackage{lmodern}
\RequirePackage{textcomp}% fanyhdr, frontespizio, ecc…
`Quello che vorrei aggiungere al precedente codice è richiamare layaureo passandogli il margine per la rilegatura dalle opzioni della classe, ad esempio:
`
\documentclass[draft, binding=1cm]{sapthesis}
`Cambia \DeclareOption* con
`\DeclareOption*{\PassOptionsToPackage{layaureo}{\CurrentOption}}`
altrimenti è piuttosto complicato.Ciao
Enrico
-
8 Ottobre 2008 alle 23:25 #27435::
Grazie mille Enrico.Purtroppo ho ancora dei problemi.
Prendiamo questo codice:`
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{sapthesis}[2009/01/01 Sapienza University of Rome Ph.D. thesis class]\DeclareOption{draft}{\typeout{sapthesis option 'draft' used} \PassOptionsToClass{\CurrentOption}{book}}
\DeclareOption{10pt}{\typeout{sapthesis option '10pt' used} \PassOptionsToClass{10pt}{book}}
\DeclareOption{11pt}{\typeout{sapthesis option '11pt' used} \PassOptionsToClass{11pt}{book}}
\DeclareOption{12pt}{\typeout{sapthesis option '12pt' used} \PassOptionsToClass{12pt}{book}}
\DeclareOption*{\PassOptionsToPackage{layaureo}{\CurrentOption}}
\ExecuteOptions{11pt}
\ProcessOptions\relax
\LoadClass[a4paper]{book}\RequirePackage{layaureo}
`Quando richiamo la classe, le opzioni draft e 12pt funzionano, l’opzione 10pt viene ignorata (viene stampato il messaggio nel log ma viene comunque usato il corpo a 11pt).
Se aggiungo alle opzioni della classe binding=1cm, anche questa opzione, inizialmente sconosciuta e che dovrebbe essere passata a layaureo, in realtà viene ignorata.Posso aggirare il problema del 10pt, usando comandi come:
`
\newcommand{\@fontsize}{}
…
\DeclareOption{10pt}{\typeout{sapthesis option '10pt' used} \renewcommand{\@fontsize}{10pt}}
…
`Però mi piacerebbe capire se c’è qualcosa di sbagliato in quello che ho scritto o in generale come usare i comandi “standard”.
Ciao ciao
Fra
-
8 Ottobre 2008 alle 23:58 #27436::
Grazie mille Enrico.
Purtroppo ho ancora dei problemi.
Prendiamo questo codice:`
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{sapthesis}[2009/01/01 Sapienza University of Rome Ph.D. thesis class]\DeclareOption{draft}{\typeout{sapthesis option 'draft' used} \PassOptionsToClass{\CurrentOption}{book}}
\DeclareOption{10pt}{\typeout{sapthesis option '10pt' used} \PassOptionsToClass{10pt}{book}}
\DeclareOption{11pt}{\typeout{sapthesis option '11pt' used} \PassOptionsToClass{11pt}{book}}
\DeclareOption{12pt}{\typeout{sapthesis option '12pt' used} \PassOptionsToClass{12pt}{book}}
\DeclareOption*{\PassOptionsToPackage{layaureo}{\CurrentOption}}
\ExecuteOptions{11pt}
\ProcessOptions\relax
\LoadClass[a4paper]{book}\RequirePackage{layaureo}
`Quando richiamo la classe, le opzioni draft e 12pt funzionano, l’opzione 10pt viene ignorata (viene stampato il messaggio nel log ma viene comunque usato il corpo a 11pt).
Se aggiungo alle opzioni della classe binding=1cm, anche questa opzione, inizialmente sconosciuta e che dovrebbe essere passata a layaureo, in realtà viene ignorata.Posso aggirare il problema del 10pt, usando comandi come:
`
\newcommand{\@fontsize}{}
…
\DeclareOption{10pt}{\typeout{sapthesis option '10pt' used} \renewcommand{\@fontsize}{10pt}}
…
`Però mi piacerebbe capire se c’è qualcosa di sbagliato in quello che ho scritto o in generale come usare i comandi “standard”.
Il problema dell’opzione 10pt è molto sottile. La classe book esegue il comando
`\ExecuteOptions{letterpaper,10pt,twoside,onecolumn,final,openright}`
La tua esegue sempre le opzioni 11pt e a4paper, che passa a book.cls; se dai nel tuo documento l’opzione 10pt hai l’esecuzione delle opzioniletterpaper
10pt
twoside
onecolumn
final
openright
11pt
a4paper
10ptma l’ultima è già stata data e quindi non ha effetto. Occorre qualche trucco molto più complesso per avere come default 11pt e però poter scegliere anche il corpo 10. Provo a pensarci.
Sulle opzioni da passare a layaureo per ora passo.
Ciao
Enrico
-
9 Ottobre 2008 alle 10:54 #27437::
Grazie Enrico!!Per quanto riguarda il 10pt potrei usare l’escamotage del \newcommand detto sopra, ma in ogni caso per ora ho deciso di obbligare all’uso dell’ 11pt, in fondo se deve essere uno stile comune… sono sicuro che qualcuno avrebbe consegnato la tesi compilandola con il 10pt o 12pt…
Solo un appunto sulla spiegazione del 10pt.
Se non ho capito male, usando \LoadClass l’ordine delle opzioni è quindi:1. Opzioni di default della classe richiamata con \LoadClass
2. Opzioni richiamate con \ExecuteOptions
3. Opzioni del comando \LoadClass
4. Opzioni del comando \documentclassE se una opzione viene richiamata più di una volta, le volte successive vengono ignorate.
Credo però che le ultime due siano invertite. Infatti il seguente codice non produce un documento oneside nonostante tale opzione sia richiamata da \documentclass[oneside]{sapthesis}.
`
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{sapthesis}[2009/01/01 Sapienza University of Rome Ph.D. thesis class]% dichiaro e processo le opzioni
\DeclareOption{draft}{\PassOptionsToClass{draft}{book}}
\DeclareOption{oneside}{\PassOptionsToClass{oneside}{book}}
\DeclareOption{twoside}{}
\DeclareOption{10pt}{\ClassError{sapthesis}{Option '10pt' not valid.}{Option '10pt' not valid. '11pt' is the default and the only accepted font size.}}
\DeclareOption{11pt}{}
\DeclareOption{12pt}{\ClassError{sapthesis}{Option '12pt' not valid.}{Option '12pt' not valid. '11pt' is the default and the only accepted font size.}}
%\DeclareOption*{\PassOptionsToPackage{layaureo}{\CurrentOption}}
\ProcessOptions\relax
\LoadClass[a4paper,11pt,twoside]{book}
`Passando a layaureo, potrei anche rinunciare all’allargamento della colonna del testo e al rapporto aureo tra i margini, quello che invece ritengo necessario è avere un margine per la rilegatura regolabile.
Usando layaureo o altre classi, ho il problema di come passargli l’opzione.
Però potrei usare keyval per tutto e poi usare geometry…
Oppure potrei definire molte opzioni tipo 4mm, 5mm, 6mm, 7mm, 8mm, ecc… e passa la paura.
Speriamo che in LaTeX3 introducano una interfaccia completa per le opzioni!Ciao ciao.
Fra
-
-
AutoreRisposte
- Devi essere connesso per rispondere a questo topic.