- Questo topic ha 9 risposte, 3 partecipanti ed è stato aggiornato l'ultima volta 16 anni fa da
Stemby.
-
CreatoreTopic
-
9 Agosto 2010 alle 9:55 #48330::
Da un po’ di settimane sto cercando di apprendere qualche rudimento di programmazione in LaTeX.Una cosa che mi ha fatto venire dei gran mal di testa senza riuscire ad ottenere niente di concreto è la gestione delle opzioni di pacchetto di tipo chiave-valore, tramite xkeyval.
Qualcuno sarebbe così gentile da fornirmi un esempio, in modo che impari una volta per tutte?
Per essere più concreti, vorrei come prima cosa prevedere in questo pacchetto un’opzione staffsize=XX (con XX un numero) che semplicemente produca questo comando (in aggiunta agli altri analoghi):
`
\immediate\write\conffile{staffsize: XX}
`Come fare?
Grazie!
-
CreatoreTopic
-
AutoreRisposte
-
-
9 Agosto 2010 alle 10:21 #48331::
Non sono un grande esperto ma la sintassi base dovrebbe essere:`\RequirePackage{xkeyval}
\newlength{\lunghezza}
\define@key[nome]{}{pippo}[valore di default]{\setlength{\lunghezza}{#1}}
\ProcessOptionsX[nome]<>`Da usarsi:
`\documentclass[pippo=3cm]{…}`Per il resto non so aiutarti. Mi dispiace.
Ciao ciao.
Fra
-
9 Agosto 2010 alle 18:17 #48332::
Grazie per la risposta 🙂Fino a lì più o meno c’ero. Andando un po’ per tentativi e un po’ per intuito, sono riuscito a farcela.
Mi piacerebbe raccogliere un po’ di casi d’uso da qualche parte, in modo da renderli disponibili ai futuri programmatori: per la rete ci sono decine di rischieste in tal senso, e praticamente nessuna risposta (almeno in italiano, inglese e francese).
Dove posso inserirli?
Ciao!
Carlo
-
9 Agosto 2010 alle 19:01 #48333::
Potresti realizzare una piccola guida su come si imposta una
classe e un pacchetto per LaTeX. Se è ben fatta e utile gli amministratori
potrebbero decidere di pubblicarla sul sito del GuIT.Quello che so l’ho imparato dagli appunti di Enrico,
dalla guida clsguide e dallo studio di altre
classi e pacchetti (oltre, ovviamente, da Google e dalla documentazione di pacchetti
come xkeyval, ecc. . .)Ciao ciao.
Fra
-
10 Agosto 2010 alle 9:24 #48334::
Potresti realizzare una piccola guida su come si imposta una
classe e un pacchetto per LaTeX. Se è ben fatta e utile gli amministratori
potrebbero decidere di pubblicarla sul sito del GuIT.Ok, mi ci butto. Appena c’è qualcosa vi passo il link.
Quello che so l’ho imparato dagli appunti di Enrico,
dalla guida clsguide e dallo studio di altre
classi e pacchetti (oltre, ovviamente, da Google e dalla documentazione di pacchetti
come xkeyval, ecc. . .)Le guide che mi hai indicato le ho stampate e rilegate appena ho iniziato a studiare programmazione in LaTeX, più i manuali di numerosi pacchetti. In realtà non ho ancora letto proprio tutto tutto, perché alcune cose sono abbastanza ostiche e da prendere a piccole dosi (la guida di Enrico, in particolare).
La mia guida vorrebbe colmare una lacuna che ho riscontrato nella documentazione esistente nelle lingue che conosco: un semplice e pratico tutorial che tratti unicamente le opzioni di pacchetto e di classe con xkeyval, scritto con un linguaggio comprensibile anche ad un debuttante (come me). In pratica, se riuscirò a capire ciò che scriverò, sarò già soddisfatto :D.
-
12 Agosto 2010 alle 15:11 #48335::
Potresti realizzare una piccola guida su come si imposta una
classe e un pacchetto per LaTeX. Se è ben fatta e utile gli amministratori
potrebbero decidere di pubblicarla sul sito del GuIT.Ok, mi ci butto. Appena c’è qualcosa vi passo il link.
Quello che so l’ho imparato dagli appunti di Enrico,
dalla guida clsguide e dallo studio di altre
classi e pacchetti (oltre, ovviamente, da Google e dalla documentazione di pacchetti
come xkeyval, ecc. . .)Le guide che mi hai indicato le ho stampate e rilegate appena ho iniziato a studiare programmazione in LaTeX, più i manuali di numerosi pacchetti. In realtà non ho ancora letto proprio tutto tutto, perché alcune cose sono abbastanza ostiche e da prendere a piccole dosi (la guida di Enrico, in particolare).
La mia guida vorrebbe colmare una lacuna che ho riscontrato nella documentazione esistente nelle lingue che conosco: un semplice e pratico tutorial che tratti unicamente le opzioni di pacchetto e di classe con xkeyval, scritto con un linguaggio comprensibile anche ad un debuttante (come me). In pratica, se riuscirò a capire ciò che scriverò, sarò già soddisfatto :D.
Ciao,
mi interessa risolvere un problema di “peso” di un opzione con xkeyval, che potrebbe interessarti.
Pensiamo di voler generare un oggetto tramite un comando “\build” che accetta parametri chiave valore.Vorrei ottenere questo comportamento:
dando l’opzione “localmente” al comando il parametro agisce solo per questa volta (il parametro tornerà a quello di default al termine dell’esecuzione del comando).
dando invece l’opzione “globalmente” con un comando apposito tipo \setup, ottengo che tutti i successivi oggetti saranno costruiti con il nuovo valore.
`
\buid{my data} % il parametro assume il valore di default
\build[param=value]{my data} % il nuovo valore agisce localmente
\build{my data} % ottengo quindi lo stesso oggetto di partenza
\setup{param=value}
\build{my data} % ora il valore di default è quello nuovo
`So che si tratta di un arzigogolo, ma sapendo che TeX dispone dei gruppi, la soluzione sarebbe un’ottima cosa per il codice a cui sto lavorando.
Grazie per la pazienza.
-
13 Agosto 2010 alle 10:42 #48336::
Ecco un altro tema: creazione on the fly di chiavi xkeyval.
Ammettiamo di voler gestire dimensioni attraverso la sintassi chiave valore. Vorremmo un comando per esempio \dim il cui argomento è appunto un assegnazione di una misura ad un registro (con sitassi TeX) \dimen.
esempio:
`\dim{a=100pt}
\dim{b=1mm}
`
La sostanza di tutto questo è: prima di poter assegnare un valore ad una variabile occorre creare la chiave tramite gli opportuni comandi del pacchetto xkeyval.Allora basta che la prima e solo la prima volta che avviene una definizione venga creata l’oppurtuna chiave, per esempio con il codice:
`\documentclass{report}
\usepackage{xkeyval}\makeatletter
\def\dim#1{%
\setkeys*{dimfam}{#1}
\ifx\XKV@rm\empty
\setrmkeys{dimfam}—esisting key—%
\else
\expandafter\make@newkey\XKV@rm\@nil
\setrmkeys{dimfam}—new key—%
\fi
}
%
\def\make@newkey#1=#2\@nil{%
% creo la nuova dimensione
\expandafter\newdimen\csname #1\endcsname
%
% creo la chiave ad essa associata
\define@key{dimfam}{#1}{%
\csname #1\endcsname=##1
}
}
\makeatother\begin{document}
\dim{xMain=1mm}Dimensione xMain=\the\xMain.\dim{xMain=100mm}Dimensione xMain=\the\xMain.
\end{document}`Si può fare anche qualcosa di più interessante: definire variabili in funzione di altre. Basta caricare il pacchetto etex che rende disponibili le estensioni di etex appunto, e far lavorare il comando \dimexpr. Bellissimo direte voi (se non lo state dicendo ditelo immediatamente perché potrete scrivere \dim{a=10mm+4pt}\dim{b=\a/2}). Ecco il codice modificato:
`\documentclass{report}
\usepackage{etex}
\usepackage{xkeyval}\makeatletter
\def\dim#1{%
\setkeys*{dimfam}{#1}
\ifx\XKV@rm\empty
\setrmkeys{dimfam}%
\else
\expandafter\make@newkey\XKV@rm\@nil
\setrmkeys{dimfam}%
\fi
}
%
\def\make@newkey#1=#2\@nil{%
% creo la nuova dimensione
\expandafter\newdimen\csname #1\endcsname
%
% creo la chiave ad essa associata
\define@key{dimfam}{#1}{%
\csname #1\endcsname=\dimexpr##1\relax
}
}
\makeatother\begin{document}
\dim{xMain=1mm}Dimensione xMain=\the\xMain.
\dim{xMain=100mm}Dimensione xMain=\the\xMain.
\dim{xMain=\xMain/2}Dimensione xMain=\the\xMain.
\dim{xMain=45pt+45pt}Dimensione xMain=\the\xMain.
\dim{xMain=5pt+5pt}Dimensione xMain=\the\xMain.
\dim{yMain=30pt}Dimensione yMain=\the\yMain.
\dim{yMain=\xMain*2}Dimensione yMain=\the\yMain.
\end{document}`
Il tallone di Achille del comando \dim è che se si inseriscono alla prima chiamata, spazi prima e/o dopo il nome della chiave sono guai, mentre quello della sintassi è che la chiave è un nome standard (tipo a o b come abbiamo visto), mentre se vogliamo usarne il valore (a secondo membro) occorre che premettere il backslash per crearne la control sequence.
Altra cosetta è che occorre tener presente la sintassi prevista per il comando \dimexpr (se interessati leggere anche questo post http://www.guit.sssup.it/phpBB2/viewtopic.php?t=7576 ), e che il tutto si basa sul fatto che la lista delle chiavi sconosciute è vuota (cosa che può nono essere se in altri unti del codice abbiamo usato la versione asteriscata di \setkeys).Bye
-
13 Agosto 2010 alle 11:05 #48337::
Secondo voi, si potrebbero definire più variabili nello stesso comando \dim, magari in termini di variabili solo precedentemente definiti?
Ebbene si!!! basta elaborare la lista \XKV@rm (con l’ausilio del pacchetto etextools):
`\documentclass{report}
\usepackage{etextools}\usepackage{xkeyval}
\makeatletter
\DeclareCmdListParser{\parser@csv}{,}
\def\dim#1{%
\setkeys*{dimfam}{#1}
\ifx\XKV@rm\empty
\setrmkeys{dimfam}%
\else
\parser@csv[\definesingle@key]{\XKV@rm}
\setrmkeys{dimfam}%
\fi
}
%
\def\definesingle@key#1{\make@newkey#1\@nil}
\def\make@newkey#1=#2\@nil{%
% creo la nuova dimensione
\expandafter\newdimen\csname #1\endcsname
%
% creo la chiave ad essa associata
\define@key{dimfam}{#1}{%
\csname #1\endcsname=\dimexpr##1\relax
}
}
\makeatother\begin{document}
\dim{a=10mm,b=30mm}a=\the\a;b=\the\b.\dim{a=10mm,b=\a/2,c=\b/2}a=\the\a;b=\the\b;c=\the\c.
\end{document}`
Alla prossima!
-
15 Agosto 2010 alle 7:18 #48338::
Ciao robitex,Vorrei ottenere questo comportamento:
dando l’opzione “localmente” al comando il parametro agisce solo per questa volta (il parametro tornerà a quello di default al termine dell’esecuzione del comando).
dando invece l’opzione “globalmente” con un comando apposito tipo \setup, ottengo che tutti i successivi oggetti saranno costruiti con il nuovo valore.
`
\buid{my data} % il parametro assume il valore di default
\build[param=value]{my data} % il nuovo valore agisce localmente
\build{my data} % ottengo quindi lo stesso oggetto di partenza
\setup{param=value}
\build{my data} % ora il valore di default è quello nuovo
`Così al volo non ti so dare la soluzione, ma dovrebbe essere semplicissimo: ti consiglio di dare un’occhiata alla documentazione del pacchetto, che tutto sommato è ben fatta, anche se non semplice da leggere per un debuttante; da quanto hai scritto più in basso vedo che comunque tu te la cavi già piuttosto bene. A naso direi che basta un \newcommand{\build} e poi mettere come comando di xkeyval un \renewcommand quando la coppia chiave-valore dà vero.
In ogni caso tutto ciò è OT: al momento mi interessa definire tutte le problematiche e proporre delle soluzioni per ciò che concerne unicamente le opzioni di classe e di pacchetto.
Ciao!
-
26 Agosto 2010 alle 18:05 #48339::
Potresti realizzare una piccola guida su come si imposta una
classe e un pacchetto per LaTeX. Se è ben fatta e utile gli amministratori
potrebbero decidere di pubblicarla sul sito del GuIT.Ok, mi ci butto. Appena c’è qualcosa vi passo il link.
Eccomi 🙂
Primo commit, è solo l’inizio; suggerimenti, critiche ed insulti sono come sempre benvenuti.
http://github.com/Stemby/xkeyval-tutorial/blob/master/xkeyval-tutorial.tex
È un repo Git, quindi man mano la guida evolverà, ma il link resterà sempre quello.
Ciao!
-
-
AutoreRisposte
- Devi essere connesso per rispondere a questo topic.