Risposte nei forum create
-
AutoreRisposte
-
::
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.
::io sto usando \newdimen, ma solo perché scopiazzo alla grande dalle classi e pacchetti e perché l’ho letto nella guida per scrittori di classi e pacchetti, perché mi consigli il contrario?
Perché \newdimen è Plain TeX (ok, ok, stai già mischiando LaTeX con non-LaTeX, lo so, altrimenti al posto di \if & Co. avresti usato il pacchetto ifthen) e le variabili di tipo “lunghezza” create con \newdimen sono diverse da quelle create con \newlength (vedere la differenza tra lengths e glues sul TeXbook). Se però sei estremamente sicuro che non ti serve uno \skip allora procedi pure con \newdimen.
Ma sei sicuro che in clsguide.{dvi,ps,pdf} consiglino di usare \newdimen?
::`\if\paperheight == 297mm
istruzione
\fi`non succede niente, ne con \if ne con \ifx. il tutto deriva dalla mia ignoranza rispetto ai costrutti \if di TeX (bisogna davvero che mi metta a sfogliare il texbook)Devi usare \ifdim:`\ifdim\paperheight=297mm
% blah blah blah
\fi`Inoltre, anche se stai usando i costrutti condizionali del Plain TeX, ti consiglio di dichiarare le variabili contenenti dimensioni con \newlength
::per quanto riguarda a4paper non c’è problema perché non è di default su nessuna delle classi standard di LaTeX e quindi il pacchetto, a meno che non ci sia l’opzione esplicita, restituisce un errore.
Oppure, potresti controllare che \paperheight == 297mm e \paperwidth == 210mm, tanto per non porre limiti arbitrari.
per quanto riguarda la dimensione del font credo che di default tutte le classi standard usino 11pt
No, la dimensione standard e’ di 10pt. L’ultima cifra di 10, 11 e 12 e’ memorizzata in \@ptsize, quindi potresti controllare se si tratta di uno 0, di un 1 o di un 2.
l’unico vero problema si pone con twoside e oneside
Il kernel definisce \if@twoside per permettere controlli di questo tipo e le opzioni oneside e twoside alterano questo valore, quindi:`\if@twoside
% blah blah blah
\else
% blah blah blah
\fi`
::Secondo me c’hai piantato un erroretto:
Secondo me dipende dal tuo copia-incolla: bastava incollare il secondo pezzo al posto di opzione: #1\newline 🙂
Secondo la tua definizione \controllo come prima cosa guarda se il secondo argoemnto è nullo e in tal caso esce dal ciclo.
Correzione: \controllo appronta le cose per uscire dal ciclo al termine dell’iterazione corrente, non esce direttamente.
secondo me si può partire dall’assunto che la lista è non vuota (le classi hanno sempre almeno un opzione no?)
No.
piccolo dettaglio tecnico: c’è un modo di usare l’if ma con il falso? \ifx\temp@a\temp@b in C sarebbe equivalente a \if{a==b}, come si fa invece a fare \if{a!=b}?
Non si fa 🙂 ma puoi sempre usare il ramo else mettendo un \relax nel ramo then.
::`\def\controllo#1,#2\fine{%`allora: definisci un comando chiamato controllo che ha due argomenti, separati da una virgola. se non ho capito male l’idea hai una lista di elementi e con \controllo li guardi uno per uno, fino alla fine.
Esatto.
\fine cos’é?
Un token qualunque per segnalare a TeX che il secondo argomento di \controllo e’ tutto quello che si trova tra la prima virgola e questo token, quindi il “resto” della lista.
` \def\temp@a{#2}%`altro comando interno, che si becca il secondo argomento di controllo. mi par di capire che serve per vedere se ci sono aoncora elementi nella lista.
Esatto.
` \ifx\temp@a\@empty
\let\next\relax
`se la mia supposizione è esatta si controlla se non c’è l’n+1 elemento, in tal caso si smette di controllare.Esatto.
immahino \@emty voglia semplicmeente dire vuoto.
Esatto. E’ la “versione” interna di \empty, da utilizzarsi preferibilmente perche’ qualche pacchetto potrebbe combinarti lo scherzetto di ridefinire \empty come qualche cosa di non vuoto. Se proprio si vuol essere sicuri, basta crearsi qualche cosa di sicuramente vuoto con \def\sicuramentevuoto{}.
mi sfuggono i dettagli, la differenza fra \if e \ifx, cosa si fa con la seconda riga.
\if controlla l’uguaglianza dei character code dei due argomenti (i primi due token che incontra) mentre \ifx effettua un solo passo di espansione dei due token incriminati e controlla che la loro definizione sia esattamente uguale. In questo caso, si controlla che #2 sia completamente vuoto.
`
\else
\def\next{\controllo#2\fine}%
\fi
`
altrimenti si definisce \next come…
qui immagino che si salvi il valore trovato.Con quella ridefinizione di \next si “riimmette” nel flusso di input il comando \controllo passandogli come argomento la coda della lista del passo precedente.
Nel tuo caso, invece di scivere opzione XYZ potresti testare #1 (dopo averlo infilato in una macro di appoggio come \temp@b) con \ifx.
???????????
Intendevo qualche cosa del tipo:`\def\temp@b{#1}%
\def\temp@c{12pt}%
\ifx\temp@b\temp@c
% Abbiamo beccato l'opzione 12pt
\else
\def\temp@c[11pt}%
\ifx \temp@b\temp@c
% Abbiamo beccato l'opzione 11pt
\fi
\fi`già, forse era meglio studiare ancora un po’ che mettersi a smanettare sui pacchetti… lo faccio per imparare, perdonatemi…
E quale modo migliore di imparare se non mettere in pratica la teoria?
::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}`
::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:)
::per quanto riguarda \@classoptionslist è da ieri che ci provo ma non ci cavo un ragno dal buco. ho dato un occhiata in giro e al sorgente di latex ma non ci capisco un piffero e non ho idea di come fare a estrarre le opzioni.
Per estrarre la testa di una lista di oggetti separati da una virgola potresti “giocherellare” con \def e gli argomenti delimitati nel seguente modo:`\def\controllo#1,#2\fine{%
\def\temp@a{#2}%
\ifx\temp@a\@empty
\let\next\relax
\else
\def\next{\controllo#2\fine}%
\fi
opzione: #1\newline
\next}`
Per usarlo tieni a mente che ci devi aggiungere una virgola, altrimenti l’ultimo argomento non e’ delimitato correttamente:`\def\pippo{ciao,a,tutti}
\expandafter\controllo\pippo,\fine`Nel tuo caso, invece di scivere opzione XYZ potresti testare #1 (dopo averlo infilato in una macro di appoggio come \temp@b) con \ifx.secondo te mi sto imbarcando in qualcosa di incasinatissimo? dove potrei documentarmi?
Sul TeXbook, ovviamente 😉
::scusa se ti contraddico E, ma non mi tornano i conti.
Per forza non ti tornano i conti 😳 Nella fretta, quel giorno in cui ti risposi, rileggendo bk12.clo ho preso fischi per fiaschi (nel dettaglio, ho letto la larghezza del testo utilizzata quando LaTeX2e funziona in compatibility mode). LaTeX2e utilizza effettivamente 390 pt 😳
Per keyval apri un altro thread.
::è importante che l’altezza del testo sia un numero intero di righe o posso fregarmene e dare un valore esatto?
Risposta definitiva alla tua domanda non c’e’: se la pagina contiene solo testo e’ meglio che \textheight sia fissato ad un multiplo intero dell’altezza della riga, ma se ci sono figure od “inserzioni” matematiche casca il palco.
secondo voi è preferibile fare un pacchetto che richiama automaticamente geometry (molto più facile per me a scrivere) o uno indipendente che cambia automaticamente le dimensioni definite dalle classi standard?
Usa direttamente geometry: e’ un pacchetto presente praticamente in tutte le distribuzioni di LaTeX, quindi non vedo controindicazioni.
::in particolare vorrei poter scrivere un po’ di codice che “estragga” le opzioni passate alla classe standard di LaTeX.
Le opzioni con cui e’ richiamata la classe in uso si trovano in`\@classoptionslist`Si tratta della lista completa (utilizzabile solo nel preambolo) delle opzioni separate solo da una virgola; il parsing devi effettuarlo in separata sede da solo. L’alternativa, che ti semplificherebbe il parsing ma ti complicherebbe la vita in altro modo, e’ usare`\@ifclasswith{
}{ }{ }{ }`che pero’ come vedi necessita dell’indicazione esplicita della classe oltre che dell’opzione di cui testare la presenza. Per esempio, quanto segue controlla l’utilizzo di memoir con oneside, ma non funziona minimamente con book:`\@ifclasswith{memoir}{oneside}{\def\pippo{solo fronte}}{\def\pippo{fronte e retro}}`Una soluzione decisamente limitante.
::Ora, usando un metodo empirico inventato da Bringhurst e considerando che ad una dimensione media di 12 pt la stringa alfabetica “abc…xyz” in Computer Modern Roman ha una lunghezza di circa 150 pt abbiamo che la larghezza ottimale dell’area del testo varia tra i 26 pc ed i 30 pc.
dove si trova una spiegazione di tale metodo?
vorrei calcolare la larghezza ottimale per 10pt e 11pt.Nel manuale di memoir 🙂 (dai un’occhiata anche a memmanadd.pdf per alcune correzioni ed aggiunte che riguardano proprio quest’argomento).
Buon weekend a tutti 😉
::c’é un certo rigore nel modo in cui rispondete e ponete le domande, ed un certo intento “didattico”
Esatto 🙂 GuIT e’ nato per questo, per aiutare a diffondere la conoscenza e l’uso di LaTeX in Italia e cercare di insegnarlo piuttosto che limitarsi a risolvere i problemi e’, a nostro avviso, il modo migliore per cercare di portare a termine il nostro scopo primario.
Una curiosità: in che modo vengono decise le scritte “neofita”, “avanzato” e via dicendo che compaiono al di sotto del nome di chi risponde o di chi pone una domanda?
E’ un automatismo del software che gestisce il forum e si basa esclusivamente sul numero dei messaggi. Stiamo valutando una ridefinizione dei “livelli” per evitare che diano l’impressione di essere legati alla conoscenza di LaTeX (perche’ in effetti indicano solo il “grado” di frequentazione del forum).
Ve lo chiedo perché spesso sia quando guardo le risposte sia quando rispondo (…spesso siete velocissimi nel farlo prima di me, oltre che più autorevoli)
Ok, ci andremo un po’ piu’ lenti 😉
-
AutoreRisposte