- Questo topic ha 9 risposte, 3 partecipanti ed è stato aggiornato l'ultima volta 20 anni, 4 mesi fa da
rodimus.
-
CreatoreTopic
-
18 Aprile 2006 alle 11:05 #8770::
Salve a tutti,
come indicato nel titolo, vorrei capire come si può ridefinire un comando con parametri in modo che non faccia niente (comando nullo).La ragione per cui vorrei fare questa cosa è un po’ lunghetta da spiegare; non ne parlo per non distogliere l’attenzione dal problema principale, comunque, se necessario, posso discuterne più avanti.
Per ora è sufficiente sapere che sto cercando di realizzare un documento che dovrebbe essere stampato in due modalità diverse, che differiscono prevalentemente per la formattazione; dal momento che la maggior parte del contenuto non cambia, preferirei non scrivere due sorgenti diversi, ma scrivere un sorgente solo al quale potrei associare due file STY differenti scritti da me che contengono regole di formattazione differenti. A seconda della modalità di stampa che preferisco, potrei associare un file STY oppure l’altro al documento sorgente.
Il comando che vorrei ridefinire è \chapter, cioè vorrei che \chapter non facesse nulla.
In pratica, per chi si intende un po’ di HTML e CSS vorrei realizzare una sorta di “display: none” per il comando in questione.
Qualcuno potrebbe suggerire di commentare le occorrenze di \chapter nel sorgente, ma per un elevato numero di occorrenze questo non è pratico (anche perché se poi volessi scegliere l’altra modalità di stampa dovrei decommentarle tutte di nuovo); meglio cambiare una riga sola, dove carico un pacchetto oppure un altro.
Nel titolo ho scritto comando con parametri perché in presenza di un comando senza parametri saprei già come fare: immaginiamo che in LaTeX esista il comando \ciao, così definito:
`\newcommand{\ciao}{Ciao a tutti!}`
Poiché in TeX l’istruzione \relax rappresenta un’istruzione nulla, basterebbe ridefinire \ciao nel seguente modo:
`\renewcommand{\ciao}{\relax}`
e il problema sarebbe risolto. Purtroppo, \chapter ha un parametro obbligatorio, che è il titolo del capitolo. Questa soluzione non funziona, perché con questo codice:
`\renewcommand{\chapter}{\relax}`
il titolo del capitolo verrebbe comunque stampato. Come fare quindi per ovviare anche a questo problema?
Ringrazio anticipatamente chiunque potesse aiutarmi a raggiungere la soluzione di questo inghippo.
Ciao a tutti! (e Buona Pasqua, anche se in ritardo) 🙂
-
CreatoreTopic
-
AutoreRisposte
-
-
18 Aprile 2006 alle 14:43 #8771::
Il comando che vorrei ridefinire è \chapter, cioè vorrei che \chapter non facesse nulla.
Non sono riuscito ad immaginarmi un contesto nel quale potrebbe essere utile una cosa simile, ma sono notoriamente privo di fantasia, quindi mi limito a suggerirti una soluzione. Limitandoci alle classi standard, \chapter può comparire in tre modi diversi:
`\chapter{Titolo}
\chapter[Titolo breve]{Titolo lungo}
\chapter*{Titolo}`
Se non me ne ho dimenticato alcuno, il codice seguente “se li mangia”:
`\makeatletter
\def\chapter{\@ifstar\@gobble\@capitolo@farlocco}%
\newcommand*{\@capitolo@farlocco}[2][]{\relax}%
\makeatother`
-
18 Aprile 2006 alle 14:59 #8772::
Salve a tutti,
come indicato nel titolo, vorrei capire come si può ridefinire un comando con parametri in modo che non faccia niente (comando nullo).La ragione per cui vorrei fare questa cosa è un po’ lunghetta da spiegare; non ne parlo per non distogliere l’attenzione dal problema principale, comunque, se necessario, posso discuterne più avanti.
…
Il comando che vorrei ridefinire è \chapter, cioè vorrei che \chapter non facesse nulla.
…
Nel titolo ho scritto comando con parametri perché in presenza di un comando senza parametri saprei già come fare: immaginiamo che in LaTeX esista il comando \ciao, così definito:`\newcommand{\ciao}{Ciao a tutti!}`Poiché in TeX l’istruzione \relax rappresenta un’istruzione nulla, basterebbe ridefinire \ciao nel seguente modo:`\renewcommand{\ciao}{\relax}`e il problema sarebbe risolto. Purtroppo, \chapter ha un parametro obbligatorio, che è il titolo del capitolo. Questa soluzione non funziona, perché con questo codice: `\renewcommand{\chapter}{\relax}`il titolo del capitolo verrebbe comunque stampato. Come fare quindi per ovviare anche a questo problema?Il problema di \ciao si risolve meglio con `\renewcommand{\ciao}{}` che è molto più semplice; dare \relax non sempre è la soluzione corretta. Per \chapter la situazione è più complicata; ma se nel tuo documento \chapter compare sempre e solo con l’argomento obbligatorio, puoi scrivere`\renewcommand{\chapter}[1]{}` Se compare anche con l’argomento opzionale, puoi scrivere`\renewcommand{\chapter}[2][]{}`Se però usi qualche volta \chapter*, devi fare qualcosa di più complicato: `\makeatletter
\renewcommand{\@schapter}[1]{}
\renewcommand{\@chapter}[2][]{}
\makeatletter`(e nessuna delle ridefinizioni precedenti).Ah! Prima che tu lo domandi, non funziona allo stesso modo per \section.
Ciao
Enrico
-
18 Aprile 2006 alle 21:12 #8773::
Grazie ad entrambi per l’interessamento al mio problema 🙂Limitandoci alle classi standard, \chapter può comparire in tre modi diversi:
`\chapter{Titolo}
\chapter[Titolo breve]{Titolo lungo}
\chapter*{Titolo}`Non sono stato molto preciso in merito, è vero. È probabile che in generale nel mio documento possano comparire tutte e tre i modi che mi hai proposto.
Se però usi qualche volta \chapter*, devi fare qualcosa di più complicato:
`\makeatletter
\renewcommand{\@schapter}[1]{}
\renewcommand{\@chapter}[2][]{}
\makeatletter`
(e nessuna delle ridefinizioni precedenti)Ho provato a mettere in pratica quanto suggerito in un ambiente minimale (giustamente l’indice, non avendo voci da segnalare, non compare affatto):
`\documentclass{book}\makeatletter
\renewcommand{\@schapter}[1]{}
\renewcommand{\@chapter}[2][]{}
\makeatletter\begin{document}
\tableofcontents
\chapter[Titolo corto]{Titolo luuuuuuuungo}
Uno, uno, uno\dots
\chapter*{Titolo senza numero}
Due, due, due\dots
\end{document}`
Direi che il problema è risolto quasi del tutto; purtroppo ci sono ancora dei \clearpage (almeno credo che siano questi, dando una sbirciata in book.cls) di troppo. In pratica, per come la vedo io, vorrei ridefinire \chapter (in tutte e tre le forme) in modo tale che il file prodotto in output a partire dall’esempio che ho appena scritto fosse composto da una pagina sola, con i testi “Uno, uno, uno\dots” e “Due, due, due\dots” separati (come da una riga bianca (\par) ideale).Vorrei quindi che l’output fosse identico a quello del file seguente (lasciamo stare dove va a finire il numero di pagina, e anche se l’internlinea tra le due rige è un po’ più grande, va bene lo stesso):
`\documentclass{book}\begin{document}
Uno, uno, uno\dots
Due, due, due\dots
\end{document}`
Riusciamo a fare anche questo? 😉Ah! Prima che tu lo domandi, non funziona allo stesso modo per \section.
Quasi! 😉 Mi sono appena reso conto però che mi potrebbe servire “azzerare” anche \part (ooops…)
Prendendo esempio da quanto suggeritomi, ho provato a fare da solo (nel mio documento inserirei sia l’azzeramento di \chapter che quello di \part; nel codice seguente, però, mi occupo solo di \part per affrontare i due casi separatamente):
`\documentclass{book}\makeatletter
\renewcommand{\@spart}[1]{}
\renewcommand{\@part}[2][]{}
\makeatletter\begin{document}
\tableofcontents
\part[Titolo corto]{Titolo luuuuuuuungo}
Uno, uno, uno\dots
\part*{Titolo senza numero}
Due, due, due\dots
\end{document}`
Qui i problemi sono due:-
anche qui ci sono dei \clearpage di troppo (ma se si può risolvere nel caso di \chapter, nell’esempio sopra, mi sa che la soluzione per \part non sarà troppo differente…);
-
l’indice (o meglio, il titolo dell’indice) stavolta compare (anche se, giustamente, privo di voci). Se possibile, non lo vorrei neanche qui.
Questo è tutto! Grazie per la collaborazione e buona notte! 🙂
-
-
19 Aprile 2006 alle 6:34 #8774::
Direi che il problema è risolto quasi del tutto; purtroppo ci sono ancora dei \clearpage (almeno credo che siano questi, dando una sbirciata in book.cls) di troppo.
Ridefinisci \chapter come ti ho suggerito e ricompila.
Quasi! 😉 Mi sono appena reso conto però che mi potrebbe servire “azzerare” anche \part (ooops…)
Idem come sopra, ma te lo lascio come esercizio 😉 (sempre che non salti la mosca al naso anche a te al solo leggere la parola esercizio).
-
20 Aprile 2006 alle 10:08 #8775::
Ciao ev.Direi che il problema è risolto quasi del tutto; purtroppo ci sono ancora dei \clearpage (almeno credo che siano questi, dando una sbirciata in book.cls) di troppo.
Ridefinisci \chapter come ti ho suggerito e ricompila.
Ti chiedo scusa, non ho specificato che la presenza dei \clearpage di troppo si avverte nella soluzione proposta da egreg9, non nella tua. Il fatto è che la sua soluzione mi era parsa più semplice, comprensibile e ad alto livello e, per queste ragioni, alla fine avrei preferito usare una versione (leggermente modificata) della sua, senza nulla togliere alla tua, che risolve il mio problema alla perfezione.
Quindi, oltre alla prima distinzione che ho fatto (separare i problemi per \chapter e per \part), ne introduco qui un’altra: “soluzione egreg9” e “soluzione ev”. Per tutto questo mio messaggio mi concentrerò solo sulla “soluzione ev”, il cui corretto funzionamento si vede nel seguente esempio minimale:
`\documentclass{book}\makeatletter
\def\chapter{\@ifstar\@gobble\@capitolo@farlocco}%
\newcommand*{\@capitolo@farlocco}[2][]{\relax}%
\makeatother\begin{document}
\tableofcontents
\chapter[Titolo corto]{Titolo luuuuuuuungo}
Uno, uno, uno\dots
\chapter*{Titolo senza numero}
Due, due, due\dots
\end{document}`
Per dimostrare (solo a me stesso) di avere imparato qualcosa da tutti e due, modifico il tuo codice eliminando il \relax nella tua definizione
`\makeatletter
\def\chapter{\@ifstar\@gobble\@capitolo@farlocco}%
\newcommand*{\@capitolo@farlocco}[2][]{}%
\makeatother`
dal momento che mi viene detto che non sempre è corretto usarlo. Pare che non vi siano effetti collaterali.mi potrebbe servire “azzerare” anche \part
Idem come sopra, ma te lo lascio come esercizio
Volentieri. Tenendo presente che non so cosa facciano ne’ \@ifstar (anche se immagino che abbia a che fare con la variante non numerata di un qualsiasi comando) ne’ \@gobble, e che non capisco perché nel nuovo comando che definisci compaia il carattere chiocciola (ma su questo non occorre rispondermi perché aprirò di sicuro un post dedicato all’argomento in futuro), andando ad intuito scriverei:
`\makeatletter
\def\part{\@ifstar\@gobble\@parte@farlocca}%
\newcommand*{\@parte@farlocca}[2][]{}%
\makeatother`
Se però applico questo codice ad un esempio minimale
`\documentclass{book}\makeatletter
\def\part{\@ifstar\@gobble\@parte@farlocca}%
\newcommand*{\@parte@farlocca}[2][]{}%
\makeatother\begin{document}
\tableofcontents
\part[Parte corta]{Parte luuuuuuuunga}
Uno, uno, uno\dots
\part*{Parte senza numero}
Due, due, due\dots
\end{document}`
mi accorgo che purtroppo, come già notato con la soluzione egreg9, compare il titolo dell’indice, cosa che non vorrei. Per il resto, tutto a posto.sempre che non salti la mosca al naso anche a te al solo leggere la parola esercizio.
Al contrario, l’esercizio a me piace molto e ritengo che faccia bene, basta che si riesca ad arrivare a qualcosa di “costruttivo” 😉
Nel frattempo ho appena ordinato The LaTeX Companion, sperando che mi faccia luce in merito ai comandi misteriosi di cui sopra. Ora devo scappare, ma cercherò comunque più tardi in rete il loro significato.
P.S. se possibile, mi farebbe piacere cercare di sollevare da quei problemi anche la soluzione egreg9. Se invece (per chi ha un modello mentale perfetto di LaTeX) quella soluzione non era corretta o all’altezza (cosa di cui dubito, visto il personaggio 😉 come non detto.
P.P.S. ev scusami ancora se ti ho fatto sentire “in secondo piano”. Non era mia intenzione.
Ciao a tutti!
-
20 Aprile 2006 alle 12:06 #8776::
Ciao ev.
[quote]Direi che il problema è risolto quasi del tutto; purtroppo ci sono ancora dei \clearpage (almeno credo che siano questi, dando una sbirciata in book.cls) di troppo.
Ridefinisci \chapter come ti ho suggerito e ricompila.
Ti chiedo scusa, non ho specificato che la presenza dei \clearpage di troppo si avverte nella soluzione proposta da egreg9, non nella tua. Il fatto è che la sua soluzione mi era parsa più semplice, comprensibile e ad alto livello e, per queste ragioni, alla fine avrei preferito usare una versione (leggermente modificata) della sua, senza nulla togliere alla tua, che risolve il mio problema alla perfezione.
Quindi, oltre alla prima distinzione che ho fatto (separare i problemi per \chapter e per \part), ne introduco qui un’altra: “soluzione egreg9” e “soluzione ev”. Per tutto questo mio messaggio mi concentrerò solo sulla “soluzione ev”, il cui corretto funzionamento si vede nel seguente esempio minimale:
`\documentclass{book}\makeatletter
\def\chapter{\@ifstar\@gobble\@capitolo@farlocco}%
\newcommand*{\@capitolo@farlocco}[2][]{\relax}%
\makeatother\begin{document}
\tableofcontents
\chapter[Titolo corto]{Titolo luuuuuuuungo}
Uno, uno, uno\dots
\chapter*{Titolo senza numero}
Due, due, due\dots
\end{document}`
Per dimostrare (solo a me stesso) di avere imparato qualcosa da tutti e due, modifico il tuo codice eliminando il \relax nella tua definizione
`\makeatletter
\def\chapter{\@ifstar\@gobble\@capitolo@farlocco}%
\newcommand*{\@capitolo@farlocco}[2][]{}%
\makeatother`
dal momento che mi viene detto che non sempre è corretto usarlo. Pare che non vi siano effetti collaterali.mi potrebbe servire “azzerare” anche \part
Idem come sopra, ma te lo lascio come esercizio
Volentieri. Tenendo presente che non so cosa facciano ne’ \@ifstar (anche se immagino che abbia a che fare con la variante non numerata di un qualsiasi comando) ne’ \@gobble, e che non capisco perché nel nuovo comando che definisci compaia il carattere chiocciola (ma su questo non occorre rispondermi perché aprirò di sicuro un post dedicato all’argomento in futuro), andando ad intuito scriverei:
`\makeatletter
\def\part{\@ifstar\@gobble\@parte@farlocca}%
\newcommand*{\@parte@farlocca}[2][]{}%
\makeatother`
Se però applico questo codice ad un esempio minimale
`\documentclass{book}\makeatletter
\def\part{\@ifstar\@gobble\@parte@farlocca}%
\newcommand*{\@parte@farlocca}[2][]{}%
\makeatother\begin{document}
\tableofcontents
\part[Parte corta]{Parte luuuuuuuunga}
Uno, uno, uno\dots
\part*{Parte senza numero}
Due, due, due\dots
\end{document}`
mi accorgo che purtroppo, come già notato con la soluzione egreg9, compare il titolo dell’indice, cosa che non vorrei. Per il resto, tutto a posto.sempre che non salti la mosca al naso anche a te al solo leggere la parola esercizio.
Al contrario, l’esercizio a me piace molto e ritengo che faccia bene, basta che si riesca ad arrivare a qualcosa di “costruttivo” 😉
Nel frattempo ho appena ordinato The LaTeX Companion, sperando che mi faccia luce in merito ai comandi misteriosi di cui sopra. Ora devo scappare, ma cercherò comunque più tardi in rete il loro significato.
P.S. se possibile, mi farebbe piacere cercare di sollevare da quei problemi anche la soluzione egreg9. Se invece (per chi ha un modello mentale perfetto di LaTeX) quella soluzione non era corretta o all’altezza (cosa di cui dubito, visto il personaggio 😉 come non detto.
P.P.S. ev scusami ancora se ti ho fatto sentire “in secondo piano”. Non era mia intenzione.
Ciao a tutti![/quote]Basta guardare il codice di book.cls e modificarlo alla buona.
`\makeatletter
\def\not@a@section{\@ifstar\@gobble\@gobbleopt}
% \def\not@a@section{\secdef\@gobbleopt\@gobble} %alternativa
\let\part\not@a@section
\let\chapter\not@a@section
\let\section\not@a@section
\newcommand\@gobbleopt[2][]{}
\makeatother`\@ifstar controlla se il comando è seguito dall’asterisco; se lo è, esegue \@gobble, altrimenti \@gobbleopt. Il primo mangia il suo argomento; il secondo mangia l’argomento obbligatorio e anche quello opzionale. Ovviamente vorrai aggiungere a \not@a@section qualche comando di spaziatura.Non dovresti avere alcun problema di indice.
Ciao
Enrico
-
20 Aprile 2006 alle 22:18 #8777::
Ciao a tutti. In questo messaggio cerco di fare un riassunto di tutto il discorso, mettendo in evidenza solo i punti essenziali.Ormai siamo giunti alla fine, e, a parte un piccolo dubbio che mi è venuto in mente, il mio problema è risolto. Scrivo questo messaggio prevalentemente per ringraziare ev, che si chiedeva dove stava l’utilità nel problema che mi sono posto, facendo vedere a lui e a chiunque ne fosse interessato un esempio di applicazione reale dell’idea che mi era venuta.
Questo messaggio è lungo e articolato e serve da riassunto; chi non è interessato non occorre che perda tempo a leggerlo.
alla fine avrei preferito usare una versione (leggermente modificata) della sua [di egreg9], senza nulla togliere alla tua [di ev], che risolve il mio problema alla perfezione.
E invece, alla fine, pare che le cose vadano ancora meglio: le due soluzioni sembrano essersi “unificate” in una sola che prende il meglio di tutte e due. Fantastico! 🙂
In merito al significato dei comandi (almeno a me) misteriosi di cui dovevo cercare il significato:
non so cosa facciano ne’ \@ifstar
`\@ifstar\@gobble\@gobbleopt`
\@ifstar controlla se il comando è seguito dall’asterisco; se lo è, esegue \@gobble, altrimenti \@gobbleopt.Bene, grazie, direi che questo spiega la sintassi del comando \@ifstar: se il test che conduce (controllare se il comando è seguito dall’asterisco) risulta essere vero, viene eseguito, in generale il primo comando proposto, altrimenti il secondo.
ne’ \@gobble
Il primo [\@gobble] mangia il suo argomento [l’argomento del comando nel quale esso è chiamato]
Benissimo; come leggo anche su questo messaggio, \@gobble “cancella” il primo carattere che trova (che non sia uno spazio bianco) oppure la prima stringa che trova raggruppata tra parentesi (graffe, ovviamente). In pratica si tratta dell’istruzione di cancellazione che andavo cercando. Chiaramente, bisognava anche sapere dove metterla (oltre a sapere che esisteva)…
Per quanto riguarda i nuovi comandi, invece:
`\newcommand\@gobbleopt[2][]{}`
[\@gobbleopt] mangia l’argomento obbligatorio e anche quello opzionale.Ho idea che questo trucco mi sarà molto utile in futuro (e forse non solo a me…)
Ovviamente vorrai aggiungere a \not@a@section qualche comando di spaziatura.
Ma anche no, grazie, sono più che soddisfatto di com’è attualmente.
Non dovresti avere alcun problema di indice.
Confermo.
Ecco la storia integrale del perché ho voluto risolvere questo problema…
Tempo fa, per prepararmi ad un esame, mi sono messo a raccogliere dei testi degli esercizi di vecchi esami e a scriverli in una dispensa. Ho pensato di codificare il tutto nel seguente modo:
-
le consegne degli esercizi sono state scritte direttamente così come le ho trovate; il “titolo” dell’esercizio è stato codificato con una sezione (es. \section{Esercizio 4 del 12 aprile 1996});
-
quando degli esercizi simili facevano parte di un blocco logico comune, questo è stato codificato con un capitolo (es. \chapter{Esercizi sui B-tree});
-
se è stato possibile racchiudere blocchi comuni in ulteriori macroblocchi, questi ultimi sono stati codificati con delle parti (es. \part{Esercizi sugli alberi}).
A questo punto ho arricchito la dispensa con ulteriori caratteristiche messe a disposizione dal linguaggio (l’indice dei contenuti, le metainformazioni e i segnalibri di hyperref, le intestazioni di fancyhdr e così via) che potessero facilitare il reperimento delle informazioni. Anche per questo motivo, questa dispensa non l’ho mai stampata.
Io sono una persona a cui basta poco per distrarsi, e quindi, quando devo svolgere degli esercizi, desidero che il foglio sia il più “pulito” possibile. Ho pensato quindi che tutti gli strumenti messi a disposizione dal linguaggio che rendevano così facile la navigazione, nella carta stampata per me dovevano sparire.
Mi sono messo quindi a scrivere un secondo file (usando il copia e incolla quando potevo) in cui ho fatto sparire l’indice, le intestazioni, i numeri di pagina (perche’ gli esercizi non erano legati l’uno all’altro, e quindi potevano essere svolti indipendentemente), ho eliminato i comandi \part e \chapter, perché il raggruppamento non aveva più importanza, ho sostituito le occcorrenze di \section con \paragraph per diminuire la dimensione del testo della consegna (semanticamente scorretto, ma una volta stampato uno non vede il sorgente elettronico del documento), ho dato dei \newpage per lasciare lo spazio sufficiente per svolgere l’esercizio e così via. La dispensa, così riscritta, aveva quindi un senso ed una praticità, per me, e stavolta potevo stamparla davvero.
Questo è stato un lavorone; fatto una volta, rifarlo sarebbe stato solo una perdita di tempo. In questi giorni ho avuto proprio la necessità di rifarlo e ho preferito perdere un po’ più di tempo per semplificare il lavoro in modo da non doverlo rifare mai più, e grazie al GuIT il problema è risolto.
In breve, la soluzione è questa (l’esempio che propongo è reale; semplicemente, non ho scritto le consegne degli esercizi per non allungare troppo il post):
-
scrivere un solo sorgente, il file esempio.tex illustrato di seguito;
-
scrivere delle regole di formattazione varie per la produzione di una modalità “raccolta” della mia dispensa, quella pensata per essere “navigata”, non stampata, nel file raccolta.sty;
-
scrivere delle regole di formattazione varie per la produzione di una modalità per la stampa, in cui l’aspetto semantico e ipertestuale è ridotto al minimo, nel file stampa.sty.
Come già detto, questa idea l’ho presa in prestito dal mondo HTML + CSS; in questo ambito, infatti, non è raro che uno stesso documento venga formattato in modi differenti a seconda del mezzo con cui deve essere visualizzato.
Ecco il file esempio.tex con il contenuto; ho indentato un po’ male sperando di facilitare la leggibilità. Si noti che il file carica il pacchetto per la raccolta (raccolta.sty); i due pacchetti sono mutuamente esclusivi: o l’uno, o l’altro.
`\documentclass[a4paper,italian]{book}\usepackage{raccolta}
%\usepackage{stampa}\begin{document}
\frontmatter
\tableofcontents
\mainmatter
\pagestyle{fancy}
\part[Alberi]{Esercizi sugli alberi}
\chapter[BST]{Esercizi sui BST}
\section{Esercizio 1 del 7 dicembre 2004}
Bla, bla, bla\dots
\section{Esercizio 2 del 7 dicembre 2004}
Bla, bla, bla\dots
\chapter[RB-tree]{Esercizi sugli RB-tree}
\section{Esercizio 2 del 21 gennaio 1999}
Bla, bla, bla\dots
\section{Esercizio 1 del 10 dicembre 1994}
Bla, bla, bla\dots
\chapter[B-tree]{Esercizi sui B-tree}
\section{Esercizio 5 del 21 gennaio 2006}
Bla, bla, bla\dots
\section{Esercizio 7 del 19 dicembre 1991}
Bla, bla, bla\dots
\part[Grafi]{Esercizi sui grafi}
\chapter[Prim]{Esercizi sull'algoritmo di Prim}
\section{Esercizio 4 del 21 gennaio 1999}
Bla, bla, bla\dots
\chapter[Kruskal]{Esercizi sull'algoritmo di Kruskal}
\section{Esercizio 1 del 9 dicembre 1992}
Bla, bla, bla\dots
\end{document}`
Segue il file raccolta.sty, che permette di generare un documento per la navigazione; non lo commento perché non è rilevante ai fini del problema:
`\NeedsTeXFormat{LaTeX2e}\ProvidesPackage{raccolta}[2006/04/20]
\RequirePackage[italian]{babel}
\RequirePackage{fancyhdr}
\RequirePackage[bookmarksopen,plainpages=false]{hyperref}\hypersetup{%
pdfauthor={Pinco Pallino},%
pdftitle={Raccolta di esercizi di Algoritmi e Strutture Dati},%
pdfsubject={Esercizi per migliorare la pratica con gli algoritmi},%
}\pagestyle{fancy}
\renewcommand{\chaptermark}[1]{\markboth{#1}{}}
\renewcommand{\sectionmark}[1]{\markright{\thesection\ #1}}
\fancyhf{}
\fancyhead[LE,RO]{\thepage}
\fancyhead[RE]{\nouppercase{\leftmark}}
\fancyhead[LO]{\nouppercase{\rightmark}}
\renewcommand{\headrulewidth}{0pt}\fancypagestyle{plain}{
\fancyhf{}
\renewcommand{\headrulewidth}{0pt}
}\endinput`
Infine, il file stampa.sty, che contiene tutto il bel discorso che abbiamo fatto; i commenti salienti compaiono prima dei comandi:
`\NeedsTeXFormat{LaTeX2e}% Il presente pacchetto, pensato per una dispensa di esercizi da svolgere,
% formatta il sorgente in modo tale che ogni esercizio (se la consegna non e`
% troppo lunga) venga posto in una singola pagina, affinché la persona che deve
% svolgerlo (a mano), dopo avere stampato la dispensa, abbia spazio sufficiente
% per poterlo risolvere.\ProvidesPackage{stampa}[2006/04/20]
\RequirePackage[italian]{babel}
\RequirePackage{fancyhdr}% Poiche' qualcuno potrebbe voler svolgere gli esercizi nell'ordine che
% preferisce (o, comunque, alcuni esercizi potrebbe non volerli svolgere
% affatto), non ha senso tenere conto di una numerazione sequenziale delle
% pagine.\pagestyle{fancy}
\fancyhf{}
\renewcommand{\headrulewidth}{0pt}% Giusta o sbagliata che sia, l'istruzione seguente permette di aumentare di
% parecchio la giustezza del testo, e riduce i margini, in modo da fornire uno
% spazio maggiore per chi deve scrivere.\RequirePackage[top=2cm,left=2cm,right=2cm,bottom=2cm]{geometry}
% I comandi \part e \chapter vengono azzerati dal comando \not@a@section;
% per quanto riguarda \section, non si vuole che esso venga eliminato del
% tutto, ma solo che esso risulti scritto piu` in piccolo. Si vuole comunque
% che non compaia nell'indice…\setcounter{tocdepth}{0}
% … e inoltre, se il titolo di una sezione e` semplicemente il testo della
% consegna, a chi deve svolgere l'esercizio non dovrebbe interessare che
% l'esercizio in questione sia la sezione 4.3 di un possibile capitolo
% dedicato ai grafi.\setcounter{secnumdepth}{0}
% Il nuovo comando \not@a@section si prefigge lo scopo di “annullare” (rendere
% vuoti) i comandi di sezionamento; per fare cio` chiama \@gobble in presenza
% di un comando di sezionamento non numerato e \@gobbleopt in presenza di un
% sezionamento numerato, che potrebbe avere un titolo opzionale.\def\not@a@section{\@ifstar\@gobble\@gobbleopt}
% Il nuovo comando \@gobbleopt “annulla” sia l'argomento obbligatorio che
% quello opzionale del comando in cui viene chiamato.\newcommand\@gobbleopt[2][]{}
% I comandi \part e \chapter vengono “annullati”.
\let\part\not@a@section
\let\chapter\not@a@section% Il comando \section viene riformattato in modo da essere scritto molto piu`
% in piccolo, come \paragraph. In piu` viene chiamata l'istruzione \clearpage
% che fornisce a chi deve svolgere l'esercizio lo spazio bianco in cui poterlo
% risolvere (a mano, dopo averlo stampato) dal momento che inserisce il testo
% dell'esercizio [la \section] successivo[a] appena alla pagina seguente; in
% questo modo, per ogni facciata c'e` un solo esercizio (a meno di consegne
% troppo lunghe).\renewcommand{\section}{\@startsection
{section}% Il nome.
{1}% Il livello.
{\z@}% L'indentazione.
{3.25ex \@plus1ex \@minus.2ex}% Lo spazio prima.
{-1em}% Lo spazio dopo.
{\normalfont\normalsize\bfseries\clearpage}} % Lo stile.\endinput`
Chi è interessato può provare a compilare per vedere la differenza con i due pacchetti.
L’ultimo dubbio che mi è venuto: se sintatticamente è corretto chiamare \clearpage dentro a \section codì direttamente oppure se si può fare di meglio; comunque, questa sarebbe solo una chicca.Grazie a tutti per la bontà dei vostri suggerimenti e per la vostra pazienza! A presto! 🙂
-
-
21 Aprile 2006 alle 7:24 #8778::
Ciao a tutti. In questo messaggio cerco di fare un riassunto di tutto il discorso, mettendo in evidenza solo i punti essenziali.
…
`
% Il comando \section viene riformattato in modo da essere scritto molto piu`
% in piccolo, come \paragraph. In piu` viene chiamata l'istruzione \clearpage
% che fornisce a chi deve svolgere l'esercizio lo spazio bianco in cui poterlo
% risolvere (a mano, dopo averlo stampato) dal momento che inserisce il testo
% dell'esercizio [la \section] successivo[a] appena alla pagina seguente; in
% questo modo, per ogni facciata c'e` un solo esercizio (a meno di consegne
% troppo lunghe).\renewcommand{\section}{\@startsection
{section}% Il nome.
{1}% Il livello.
{\z@}% L'indentazione.
{3.25ex \@plus1ex \@minus.2ex}% Lo spazio prima.
{-1em}% Lo spazio dopo.
{\normalfont\normalsize\bfseries\clearpage}} % Lo stile.\endinput`
Chi è interessato può provare a compilare per vedere la differenza con i due pacchetti.
L’ultimo dubbio che mi è venuto: se sintatticamente è corretto chiamare \clearpage dentro a \section codì direttamente oppure se si può fare di meglio; comunque, questa sarebbe solo una chicca.Nessuna obiezione sostanziale eccetto che forse, invece di una sezione per esercizio, andrebbe meglio un ambiente, che potrebbe chiamare \clearpage alla fine (se si vuole lasciare spazio) oppure niente se si vogliono stampare tutti gli esercizi uno in fila all’altro.
Il prossimo passo è di fornire opzioni a stampa.sty in modo da scegliere tra le varie possibilità.
Ciao
Enrico
-
22 Aprile 2006 alle 10:26 #8779::
Il mio problema è stato risolto. Da qui in poi si tratta solo di chicche.Nessuna obiezione sostanziale eccetto che forse, invece di una sezione per esercizio, andrebbe meglio un ambiente, che potrebbe chiamare \clearpage alla fine (se si vuole lasciare spazio) oppure niente se si vogliono stampare tutti gli esercizi uno in fila all’altro.
Molto bene. E allora in stampa.sty elimino le righe
`\setcounter{tocdepth}{0}
\setcounter{secnumdepth}{0}`
che non servono più a nulla, ed elimino pure la ridefinizione di \section. Al suo posto introduco l’ambiente “esercizio”, che definisco nel seguente modo (perdonatemi la sintassi, mi sa che è il primo ambiente che scrivo da zero):
`\newenvironment{esercizio}[1]{% L'ambiente prende un parametro: il titolo
% dell'esercizio.
\noindent% L'ambiente non e` preceduto da alcuna
% indentazione.
\normalfont% I caratteri sono scritti normalmente, in
% romano.
\normalsize% I caratteri hanno un corpo normale.
{\bfseries#1}% *Solo* il primo argomento (il titolo) e` in
% grassetto.
\hspace{.575em}% Vi e` una distanza orizzontale che separa il
% titolo dal resto della consegna.
}
{%
\clearpage% Alla fine dell'esercizio vi e` un salto pagina.
}`
L’ambiente verrà poi utilizzato nel file LaTeX come illustrato di seguito:
`\begin{esercizio}{Esercizio 14 del 21 luglio 2000}
L'esercizio richiede di bla, bla, bla\dots
\end{esercizio}`
Cerco di spiegare alla buona cosa ho fatto: nella versione per la stampa, mi faceva piacere che l’ambiente per l’esercizio fosse uguale a \paragraph; guardo quindi la definizione di \paragraph in book.cls (modifico solo l’indentazione per leggibilità, ma il contenuto è inalterato):
`\newcommand\paragraph{\@startsection
{paragraph}% Il nome.
{4}% Il livello.
{\z@}% L'indentazione.
{3.25ex \@plus1ex \@minus.2ex}% Lo spazio prima.
{-1em}% Lo spazio dopo.
{\normalfont\normalsize\bfseries}}% Lo stile.`
nella definizione del mio ambiente ho cercato di essere il più fedele possibile a \paragraph, a parte qualcosina che non ho capito; apro un post a parte per discutere di ciò, in modo da non divagare troppo nei dettagli tecnici.Purtroppo questo ambiente, non tanto in modalità “stampa” quanto in modalità “raccolta”, deve fare tutto quello che faceva \section, e quindi la sua definizione in realtà sarebbe molto più complicata di quella che ho proposto io. In particolare, in raccolta.sty:
-
l’ambiente deve essere numerato, e la numerazione deve seguire il modello di \section, ovvero
. ; spulciando un po’ nel forum, forse questo lo so fare:
`% Viene introdotto un nuovo contatore, che fa dipendere la numerazione
% dell'ambiente da definirsi da quella del capitolo.\newcounter{esercizio}[chapter]
% La numerazione viene impostata nella forma
. . \renewcommand{\theesercizio}{\thechapter.\arabic{esercizio}}
`
ovviamente, anche l’ambiente deve essere aggiornato di conseguenza:
`\newenvironment{esercizio}[1]{% L'ambiente prende un parametro: il titolo
% dell'esercizio.
\refstepcounter{esercizio}% Il contatore viene aggiornato.
\noindent% L'ambiente non e` preceduto da alcuna
% indentazione.
\normalfont% I caratteri sono scritti normalmente, in
% romano.
\normalsize% I caratteri hanno un corpo normale.
{\bfseries\theesercizio\ #1}% *Solo* il primo argomento (il titolo) e` in
% grassetto.
\hspace{.575em}% Vi e` una distanza orizzontale che separa il
% titolo dal resto della consegna.
}
{%
\clearpage% Alla fine dell'esercizio vi e` un salto pagina.
}` -
i singoli esercizi devono essere aggiunti all’indice dei contenuti (come \section), quindi direi che nell’ambiente, per esempio dopo \refstepcounter{esercizio}, ci potrei mettere
`\addcontentsline{toc}{section}{\theesercizio\ #1}`
(pare che funzioni); -
i singoli esercizi dovranno essere scritti in delle marche che potranno essere usate da fancyhdr per gestire le intestazioni (per esempio, nelle pagine pari il capitolo e nelle dispari l’esercizio, e qui mi vengono già i brividi perché per me le marche sono arabo), come \section;
-
il corpo dovrà essere un po’ più in grande, quindi al posto di
`\normalfont\normalsize\bfseries`
ci andrà
`\normalfont\Large\bfseries`
e penso che basti; -
sarebbe da implementare anche la versione con asterisco e il fatto di permettere di mandare nell’indice dei contenuti un titolo (opzionale) più corto (non sono in grado di farlo).
Ho quindi paura che per via delle mie scarse conoscenze TeXniche, tutti questi propositi (bellissimi e interessanti, davvero) li si potrà mettere in atto solo col tempo. Ho idea che userò la tecnica divide et impera :-), eventualmente con nuovi topic, se necessario (uno sulle marche, di sicuro, noi due non andiamo molto d’accordo 😉
Il prossimo passo è di fornire opzioni a stampa.sty in modo da scegliere tra le varie possibilità.
Cosa vorresti dire? Che non dovrei usare due pacchetti (raccolta.sty e stampa.sty) ma uno solo (es. formattazione.sty) da chiamare così
`\usepackage[raccolta]{formattazione}`
oppure così?
`\usepackage[stampa]{formattazione}`
Sarebbe fantastico, ma ho idea che sia un po’ aldilà delle mie possibilità…
Nel frattempo, ringrazio tutti quanti per la pazienza e l’interesse (wow! Questo topic sta diventando tosto e stimolante (almeno per me… 😉
-
-
-
AutoreRisposte
- Devi essere connesso per rispondere a questo topic.