...

Introduzione alla creazione di file di classe

by user

on
Category: Documents
31

views

Report

Comments

Transcript

Introduzione alla creazione di file di classe
Claudio Beccari
po
U ti l i z
z
ato
bb
t
bbI
guIt
ri
Gru
p
Introduzione alla creazione
di file di classe
a li
X
ani di TE
IntroCreaClassi.tex v.1.9 del 2015/02/301
Fai click per associarti
Associati anche tu al guIt
L’associazione per la diffusione di TEX in Italia riconosciuta ufficialmente
in ambito internazionale, si sostiene unicamente con le quote sociali.
Se anche tu trovi che questa guida tematica gratuita ti sia stata utile,
il mezzo principale per ringraziare gli autori è diventare socio.
Divenendo soci si ricevono gratuitamente:
• l’abbonamento alla rivista ArsTEXnica;
• il DVD TEX Collection;
• l’esclusivo tipometro realizzato da Massimo Caschili.
L’adesione al guIt prevede un quota associativa compresa tra 12,00 e e
70,00 e a seconda della tipologia di adesione prescelta ed ha validità per
l’anno solare in corso.
1
1
Introduzione
La creazione di nuove classi è un problema che si presenta più spesso di
quanto non si creda, ma che allo stesso tempo scoraggia la maggior parte
degli utenti di LATEX 2ε i quali, se hanno mai aperto un file di classe, vi
hanno trovato dei codici misteriosi, indecifrabili, scoraggianti. . . e si sono
scoraggiati.
In effetti, alcune classi contengono codici scritti in linguaggi misteriosi
e non sempre se ne riesce a capire il significato; ora, poi, che sta entrando
nell’uso anche il riferimento ai nuovi potentissimi comandi predisposti per
il prossimo venturo LATEX3, ma forniti senza o con poca documentazione,
anche i vecchi guru del mestiere cominciano ad avere dei problemi.
Io scrivo classi da almeno venti anni e mi muovo con una certa agilità
in questo campo, ma con i nuovi comandi di LATEX3 mi sento veramente
impacciato, per non dire completamente incapace. Tuttavia, se non altro
per retrocompatibilità, i vecchi comandi sono sempre lì disponibili e a quelli
mi riferirò in questa introduzione.
Quale formazione pregressa bisogna avere acquisito per scrivere un
file di classe? Poca o molta, a seconda di quale classe si voglia creare.
Per “poca” intendo una sufficiente conoscenza del linguaggio di mark-up
di LATEX 2ε , non proprio a livello base, ma niente di più di quanto, per
esempio, non sia scritto nella guida introduttiva di Lorenzo Pantieri e
Tommaso Gordini, L’arte di scrivere con LATEX, (Pantieri e Gordini,
2012). Per “molta” intendo una ottima conoscenza del linguaggio TEX
primitivo e dei comandi interni di servizio del nucleo di LATEX.
È chiaro che con una formazione media si può arrivare a scrivere file di
classe semplici; con poca formazione si possono scrivere file di classe quasi
banali, ma pur sempre utili; con molta formazione si possono scrivere file
di classe partendo da zero, senza appoggiarsi a niente già scritto da altri.
Ma in tutti e tre i casi bisogna sapersi documentare. Ci sono tre modi per
Introduzione
documentarsi e nel seguito mi riferirò esplicitamente alla documentazione
già presente nel proprio calcolatore se si dispone di una versione aggiornata
della distribuzione TEX Live completa, disponibile per tutti e tre i sistemi
operativi maggiori, Windows (da XP in poi), Mac OS X, Linux (per il
quale però potrebbero esserci dei problemi di aggiornamento se si tratta
di una versione Linux sottoposta alle condizioni del Consorzio Debian1 ).
Probabilmente la documentazione distribuita con MiKTEX è altrettanto
aggiornata e altrettanto completa, ma generalmente si trova in alberi di
cartelle sul disco fisso che hanno nomi diversi da quelli di TEX Live. Nel
seguito, con TEXMF indico la radice della distribuzione; in un Mac sta per
/usr/local/texlive/hannoi/, dove hannoi indica l’anno in cui la versione
specifica di TEX Live è stata resa disponibile; sulle altre macchine il percorso
è simile, ma specifico di ognuna.
Documentazione di TEX Live L’albero dove cercare la documentazione
è TEXMF/texmf-dist/doc/latex/. Ogni pacchetto è elencato nella
vastissima lista di cartelle; quasi sempre la documentazione è in formato PDF ed è piuttosto curata; per pacchetti che si riferiscono a
lingue particolari il file di documentazione potrebbe essere scritto
nella lingua a cui si riferisce il pacchetto, ma normalmente la documentazione è in inglese. Un inglese sempre abbastanza facile per cui
è comprensibile anche per coloro che hanno una conoscenza molto
basilare di questa lingua; al più potrebbero essere di difficile comprensione, all’inizio, le parole tecniche relative all’arte della tipografia, ma
dopo poco che si prende l’abitudine di leggere questa documentazione
le si impara a conoscere senza problemi.
Il lato ancora migliore di questa enorme quantità di documentazione
è che, senza andare a cercare nell’albero di cartelle indicato sopra,
ogni file di documentazione è leggibile in un modo semplicissimo: si
apre il terminale o prompt dei comandi e si dà il comando texdoc
seguito da uno spazio e dal nome del pacchetto; al premere del tasto
di “invio”, si apre il visualizzatore dei file PDF e il documento si
legge subito sullo schermo; volendo lo si può anche stampare.
Non è vietato andare a cercare in rete, naturalmente, ma spesso
1
In questo caso suggerisco di riferirsi al breve testo texlive-ubuntu.pdf (Gregorio,
2010b), che insegna come far convivere su una macchina Linux/Debian sia la versione
TEX Live/Debian, sia una versione aggiornatissima, non Debian, di TEX Live.
iv
i forum che sono liberamente accessibili danno risposte a quesiti
specifici; non sempre è facile trovare risposte valide e aggiornate. Il
forum del guIt è una eccezione a questa regola: dalla pagina http:
//www.guitex.org/home/ ci si può rivolgere alla varie targhette, in
particolare a “Documentazione”.
Fra la documentazione presente nella distribuzione TEX Live c’è in
particolare il documento clsguide.pdf (LATEX 3 Project Team,
2006), da leggere con il solito comando texdoc clsguide, intitolato
LATEX 2ε for class and package writers, che dovrebbe essere studiato
molto a fondo: non dico “imparato a memoria”, ma quasi.
Documentazione cartacea La documentazione cartacea abbonda nei
negozi (anche quelli di e-commerce), per cui consultarla è particolarmente facile; alcuni libri sono disponibili gratuitamente anche in rete,
ma spesso si tratta di libri il cui copyright è scaduto, quindi sono
vecchiotti.
Sul sito guIt basta cliccare la targhetta “Documentazione” per accedere a una pagina da cui scaricare vari testi: il primo da studiare
è L’arte di scrivere con LATEX (Pantieri e Gordini, 2012), già
citato, e che dovrebbe essere conosciuto in ogni suo dettaglio. Si può
scaricare l’Introduzione all’arte della composizione tipografica con
LATEX (soprannominato Guida guIt (Beccari, 2011a)), per lettori
con maggiore esperienza. Ci sono varie monografie di Enrico Gregorio
che vale la pena studiare attentamente; in particolare, c’è un link
alla pagina Web di Enrico Gregorio dalla quale si può scaricare la
1
seconda edizione del suo Appunti
di programmazione in LATEX e TEX
(Gregorio, 2009) che ritengo indispensabile per chi si accinge a
scrivere file di classe anche solo mediamente complessi. Ci sono tutti
gli articoli di ArsTEXnica, ma quelli più recenti di un anno sono a
disposizione solo dei membri regolari del guIt; tuttavia ci sono molti
articoli didattici che vale la pena leggere. Tutti questi testi si possono
scaricare gratuitamente dalla rete; alcuni possono venire acquistati già stampati e brossurati. Visto l’uso che se ne dovrebbe fare
le versioni stampate potrebbero essere più maneggevoli, anche per
poterle annotare adeguatamente secondo i propri gusti e le proprie
necessità. Anche scaricando i file dalla rete e poi stampandoli non è
che si risparmi granché, anzi forse si spende di più. Però alcuni dei
testi suddetti sono dotati, nella loro forma elettronica, di adeguati
1
v
1
Introduzione
collegamenti ipertestuali, grazie ai quali non è difficile consultare quei
documenti “navigandovi” con grande agilità.
In libreria ci sono testi prevalentemente in inglese; in italiano esiste
forse ancora la mia vecchia Guida LATEX. Guida a un sistema di
tipografia elettronica, ma non lo consiglio perché è abbondantemente
obsoleto; c’è anche il testo TEX per l’impaziente (Abrahams et al.,
1991), traduzione in italiano del corrispondente originale in inglese;
sempre in italiano c’è il testo Il TEX (Gilardi, 1993); ma tutti questi
sono libri “vecchi”. È pur vero che quelli che riguardano il linguaggio
TEX non si possono considerare veramente vecchi, perché quel linguaggio e il relativo interprete sono stati congelati agli inizi degli anni ’90
da Donald Knuth in persona, che si limita a correggere i rarissimi
errori che gli vengono segnalati in cambio di un assegno da un dollaro
firmato di suo pugno. Tra le guide a LATEX io ho trovato sempre
molto utile quella di Helmut Kopka e Patrick Daly, Guide to
LATEX 2ε (Kopka e Daly, 2004); la quarta edizione è del 2004 e
quindi è piuttosto recente.
Ma i libri più autorevoli fanno parte di una collana pubblicata dalla
Addison Wesley, coordinata da Frank Mittelbach, che è anche
il “caposquadra” del LATEX3 Project Team, al lavoro per produrre
l’attesa versione 3 di LATEX. Questa collana, fra gli altri, contiene i
testi The LATEX Companion (Mittelbach et al., 2004), The LATEX
Graphics Companion (Goossens, 1997), The LATEX Web Companion
(Goossens, 1999), elencati in ordine decrescente di importanza
per chi vuole prepararsi a scrivere file di classe complessi. Merita
segnalare che la Addison Wesley ha sempre sostenuto il sistema TEX
e fin dall’inizio ha pubblicato le successive edizioni del TEXbook e il
manuale di LATEX ufficiale LATEX: A Document Preparation System
(Lamport, 1994).
Certo, se uno si compra dalla Addison Wesley tutti questi testi spende
una bella cifra; il lettore interessato sappia che come membro regolare
del guIt può avere, con un piccolo sovrapprezzo sulla quota associativa,
anche la “membership” al TEX Users Group (TUG) internazionale,
grazie al quale può ottenere sconti significativi sui libri di queste
collane.
Va da sé che molti dei documenti elencati contengono molte indicazioni
ed esempi, per cui l’aiuto fornito da quei testi è piuttosto valido.
vi
Documentazione su file altrui È molto importante imparare a leggere
i file di classe scritti da altri; magari anche il file TEXMF/tex/latex/
base/latex.ltx che contiene il nucleo di LATEX; nella stessa cartella
ci sono i file .cls, quelli che definiscono le classi; ci sono i file .clo,
quelli che definiscono le varie opzioni, specialmente le dimensioni del
corpo dei caratteri e quelle per la posizione delle equazioni o dei loro
numeri a destra o a sinistra.
Lo ammetto: all’inizio la lettura è tutt’altro che facile, ma è l’unico
modo con cui potevo documentarmi quando circa 30 anni fa ho
cominciato ad usare LATEX. Ho conservato quest’abitudine, per cui
trovo spesso più utile e diretto andare a cercare nei file di stile o di
classe che non consultare le guide. Non seguite il mio esempio di
preferire i file altrui alle guide; consultate prima le guide.
Quando apro la documentazione di un pacchetto che non conosco
(e sono centinaia), spesso vado a leggere i corrispondenti file .sty e
magari mi prendo appunti: è molto utile. Programmare in linguaggio
TEX o LATEX non è come programmare con un linguaggio “macina
numeri”; il risultato che si vuole ottenere spesso è difficile da definire
perché ha delle valenze estetiche. Questo significa che non esiste un
solo modo per raggiungere risultati accettabili; esistono forse solo
modi più o meno efficienti. Talvolta bisogna avere l’intuizione buona
e magari salta fuori una macro che non risolve un solo problema, ma
è sufficientemente versatile per risolverne diversi.
Dunque in questo campo è difficile dare consigli; si può certo dire “io
farei così”, ma senza pretendere che si debba fare così. Poi, con analisi
critiche e proposte costruttive due persone di parere opposto possono
anche discutere e convenire che si potrebbe fare in un terzo modo
ritenuto da entrambi i contendenti migliore del proprio. Non capita
spesso; ma il mondo della programmazione TEX/LATEX è abbastanza
“fuzzy” (nel senso matematico dei fuzzy sets) per far prevalere il buon
senso, invece della teoria.
Porto un esempio: nessuno potrebbe considerare che spaziare due
entità vuoi in modo testuale, vuoi in modo matematico usando una
serie di spazi interparola:
parola␣precedente␣\␣\␣\␣\␣parola␣seguente
sia più efficiente che scrivere qualcosa come:
vii
Introduzione
parola precedente\hspace{2.5em}parola seguente
eppure ci sono moltissime persone felici di fare come nel primo modo
e non soffrono di sensi di colpa per un procedimento così naïf.
Ecco, scrivendo macro per costruire un nuova classe, bisogna stare
attenti a evitare cose di questo genere, ma sono convinto che metà
delle cose che si scrivono, qualcun altro le avrebbe realizzate meglio.
Cerchiamo quindi di fare del nostro meglio e non sentiamoci in colpa
se qualcun altro ci facesse osservare che sarebbe stato meglio fare in
un altro modo. Dice un vecchio proverbio “cambian col tempo i saggi
lor consiglio”; se il modo suggerito con spirito costruttivo ci convince,
perché non adottarlo?
viii
Ringraziamenti
Qui intendo ringraziare Tommaso Gordini; da letterato qual egli è, ha
ripulito il mio povero italiano; inoltre, con l’esperienza che si è fatto
cooperando nella scrittura del testo Pantieri e Gordini (2012), mi ha
dato preziosi consigli nella presentazione del materiale contenuto in questa
guida tematica.
Ringrazio anche Orlando Iovino che si è prodigato con estrema attenzione a segnalarmi refusi ed errori, alcuni dei quali veramente subdoli.
Ringrazio infine Ivan Valbusa che ha passato al setaccio questo testo
ed ha segnalato ancora un buon numero di refusi; questi apparentemente
sono dotati di vita propria e generazione spontanea, visto che compaiono
o ricompaiono anche dopo che il testo è stato rivisto da diverse persone e
ogni volta è stato debitamente corretto.
Indice
Introduzione
iii
Ringraziamenti
ix
Indice
x
1 Documentare classi e pacchetti
1
2 Creare classi o pacchetti di estensione
2.1
Creare classi semplici . . . . . . . . . . . . . . . . . . . .
2.1.1 Una classe semplicissima . . . . . . . . . . . . . .
2.1.2 Un’altra classe semplicissima . . . . . . . . . . .
2.2 Creazione di una classe mediante personalizzazioni . . .
2.2.1 Una classe per libri con lo stile di Bringhurst . .
2.2.2 Una classe per tesi con stile americano . . . . . .
2.2.3 Nuova classe usando pacchetti di configurazione .
3 Produrre una classe partendo da zero
3.1 La via breve . . . . . . . . . . . . . . . . . . . . . . . .
3.2 La struttura della classe book . . . . . . . . . . . . . .
3.2.1 Identificazione e opzioni . . . . . . . . . . . . .
3.2.2 Spazi tecnici e parametri per gli oggetti mobili
3.2.3 Lo stile delle pagine . . . . . . . . . . . . . . .
3.2.4 I titoli e la pagina del titolo . . . . . . . . . . .
3.2.5 Gestione dei comandi di sezionamento . . . . .
3.2.6 Le liste . . . . . . . . . . . . . . . . . . . . . .
3.2.7 Tabelle e matrici, figure e tavole . . . . . . . .
3.2.8 I vecchi comandi per i font . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
4
4
4
11
13
13
14
15
.
.
.
.
.
.
.
.
.
.
19
19
23
38
39
39
40
40
42
44
44
Indice
3.2.9 Indici ed elenchi di oggetti mobili . . . .
3.2.10 La bibliografia e l’indice analitico . . . .
3.2.11 Definizioni finali e di default . . . . . .
3.3 Verifica del funzionamento di una nuova classe
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
45
46
47
48
4 Classe per comporre lettere personalizzate
49
4.1 Commento alla classe . . . . . . . . . . . . . . . . . . . . . . 51
4.2 Il file lettera.dtx . . . . . . . . . . . . . . . . . . . . . . . 58
5 La classe per comporre questa guida tematica
5.1
5.2
5.3
5.4
Il file documentato . . . . . . . . . . . . . . . .
Il file di classe estratto dal file documentato . .
Il file di documentazione debitamente composto
Conclusione . . . . . . . . . . . . . . . . . . . .
Bibliografia
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
72
. 73
. 97
. 108
. 108
118
xi
Documentare classi e pacchetti
1
Per prima cosa bisognerebbe abituarsi ad usare il pacchetto docstrip e
la classe standard ltxdoc; esiste poi un tutorial (Pakin, 2004) che spiega
come confezionare in un solo file sia il codice della classe o del pacchetto
sia i suoi commenti esplicativi; la documentazione si legge con il solito
programma: texdoc dtxtut.
Ecco, questo è il punto e sembra strano che io voglia parlarne prima
ancora di aver cominciato a descrivere come si crea la più semplice delle
classi. Il punto è che ogni codice di programmazione va adeguatamente
commentato, perché bastano pochi giorni e non si capisce più che cosa si è
fatto; si perde moltissimo tempo a decifrare quello che noi stessi abbiamo
scritto.
Quindi è meglio cominciare con il piede giusto. Per far questo bisogna
comporre un file con estensione .dtx, acronimo di “documented TEX”. Questo file deve avere una struttura particolare i cui dettagli sono spiegati nel
tutorial indicato sopra. Il concetto generale è che brani di testo esplicativo
e brani di codice sono interlacciati in modo da ottenere la documentazione
compilando il file con pdfLaTeX. Il tutorial spiega anche come creare un
secondo file con estensione .ins per estrarre dal file .dtx il file di classe o il
file del pacchetto “pulito”, cioè senza commenti. In certe situazioni questo
modo di procedere non produce risultati negativi, anzi, tiene ben separate
le due funzioni del file commentato; ma c’è un problema; il file .ins, anche
se racchiuso in un archivio compresso, non può venire trasmesso per posta
elettronica ad altri, perché ci sono alcuni provider di posta elettronica che
vietano il transito di qualunque file con l’estensione .ins. Il problema si
risolve inserendo il contenuto del file .ins dentro allo stesso file .dtx, marcato in modo opportuno, in modo che una sola esecuzione del programma
pdfLaTeX produca sia il codice pulito sia il file di documentazione.
Capitolo 1.
Documentare classi e pacchetti
Più avanti si mostrerà un esempio; per ora ci si accontenti di quanto
segue per sapere come strutturare il file .dtx.
1. Il file comincia con il codice che permette di estrarre il codice ripulito
dai commenti; questa prima parte va racchiusa fra due delimitatori
scritti in righe a sé stanti: %<*system> subito prima del codice e
%</system> subito dopo la fine del codice.
2. Segue poi una sezione delimitata da due delimitatori dello stesso tipo
%<*driver> e %</driver> contenente un breve brano di codice con la
sintassi del linguaggio LATEX, che invoca la classe ltxdoc, contiene un
preambolo, e poi fra \begin{document} e \end{document} esegue
un comando che rilegge lo stesso file .dtx (il file .dtx legge sé stesso).
3. Segue una terza parte che contiene una descrizione della classe o
del pacchetto, lo scopo, le specifiche, le funzionalità e le parti che
necessitano di descrizioni particolari. Questa parte non contiene
codice vero e proprio, e tutte le sue righe cominciano con il carattere
di commento %.
4. La quarta parte, infine, è delimitata dai marcatori %<*class> oppure %<*package> o contenenti nomi più specifici, ed è terminata
dai marcatori di chiusura %</class> oppure %</package> o quelli
corrispondenti ai nomi usati per i marcatori di apertura. Questa
parte contiene intercalati blocchi di righe con il testo commentato
e blocchi di codice racchiusi fra altri marcatori dalla sintassi un po’
particolare:
%␣␣␣␣\begin{macrocode}
...
%␣␣␣␣\end{macrocode}
in cui i quattro spazi evidenziati sono necessari. Tra questi due
delimitatori le righe di codice non vanno commentate. I blocchi di
codice possono venire spezzati in blocchi più piccoli, specialmente
per le macro più lunghe, in modo da poter intercalare i commenti più
appropriati per descrivere il codice adeguatamente.
Naturalmente, come il tutorial descrive bene, esistono molti altri comandi che permettono di fare altre cose, compresa quella di poter descrivere
in un solo file .dtx diverse classi, diversi file di estensione, diversi file di
opzioni, diversi file di definizioni, eccetera. Il grande file .dtx contiene
2
Capitolo 1.
Documentare classi e pacchetti
quindi la documentazione e il codice di una collezione coordinata di file,
quelli che formano un pacchetto propriamente detto.
L’abilità di maneggiare i file .dtx cresce con l’uso e la pratica, ovviamente, ma fin dal primo momento, senza strafare con cose complicatissime,
si possono ottenere file documentati di ottima qualità.
Pertanto io consiglierei di iniziare sempre con lo scrivere il file .dtx,
dettagliandone bene la terza parte, dove bisogna essere molto chiari, specialmente con sé stessi, nel descrivere le specifiche di quello che si vuol fare,
come lo si fa, quali funzionalità si possono ottenere, eccetera. Il resto viene
dopo; prima bisogna avere chiaro quello che si vuol fare.
3
Creare classi o pacchetti
di estensione
2.1
2.1.1
2
Creare classi semplici
Una classe semplicissima
Supponiamo di voler creare una semplice classe per comporre libri in
italiano, usando sempre la codifica di entrata utf8, usando sempre i font
Latin Modern con codifica T1 insieme alle estensioni fornite dal pacchetto
textcomp. Possiamo sempre copiare di volta in volta il preambolo di un
altro documento simile, ma siamo sicuri di essere molto più tranquilli se
usiamo una classe ad hoc.
Allora predisporremo un file .dtx con il contenuto seguente:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
% \iffalse
% !TEX encoding = UTF-8 Unicode
% !TEX TS-program = pdflatex
%<*system>
\begingroup
\input docstrip.tex
\keepsilent
\preamble
________________________________________
The libro class for typesetting books in Italian
Copyright (C) 2011 Mario Rossi
All rights reserved
License information appended
\endpreamble
\postamble
Copyright 2011 Mario Rossi
§ 2.1
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
Creare classi semplici
Distributable under the LaTeX Project Public License,
version 1.3c or higher (your choice). The latest version of
this license is at: http://www.latex-project.org/lppl.txt
This work is "author-maintained"
This work consists of this file libro.dtx,
and the derived files libro.cls and libro.pdf.
\endpostamble
\askforoverwritefalse
%
\generate{\file{libro.cls}{\from{libro.dtx}{class}}}
%
\def\tmpa{plain}
\ifx\tmpa\fmtname\endgroup\expandafter\bye\fi
\endgroup
%</system>
% \fi
%
% \iffalse
%<*driver>
\ProvidesFile{libro.dtx}
%</driver>
%<class>\NeedsTeXFormat{LaTeX2e}[2009/01/01]
%<class>\ProvidesClass{libro}%
%<*class>
[2011/11/25 v.0.4 Classe per comporre libri in italiano]
%</class>
%<*driver>
\documentclass[a4paper]{ltxdoc}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern,textcomp}
\usepackage[italian]{babel}
\hfuzz 10pt
%
\begin{document}\errorcontextlines=9
\GetFileInfo{libro.dtx}
\title{La classe \texttt{libro}\thanks{Version number \fileversion;
5
Capitolo 2.
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
Creare classi o pacchetti di estensione
ultima revisione \filedate.}}
\author{Mario Rossi\thanks{e-mail: \texttt{mario dot rossi
at mymail dot net}}}
\maketitle
\DocInput{libro.dtx}
\end{document}
%</driver>
% \fi
%
%
% \CheckSum{10}
% \begin{abstract}
% Questa classe serve per comporre libri in italiano
% appoggiandosi alla classe \texttt{book} ma includendo
% i pacchetti necessari.
% \end{abstract}
%
% \section{Generalità}
%
La classe \texttt{libro.cls} serve per comporre libri in italiano
%
con le seguenti specifiche:
%
\begin{itemize}
%
\item La classe di supporto è la classe standard del
%
system \TeX\ \texttt{book.cls}.
%
\item Tutte le opzioni inserite nell’istruzione
%
|\documentclass| vengono trasferite integralmente
%
alla classe \texttt{book}.
%
\item La codifica di entrata è fissata con la specifica
%
\texttt{utf8} e non è possibile con questa classe specificare
%
una codifica differente.
%
\item La codifica dei font di uscita è \texttt{T1} e non è
%
possibile specificare una codifica differente, cosa che
%
sarebbe quanto mai sgradevole per comporre in italiano dove
%
sono presenti molte lettere accentate.
%
\item Il pacchetto \texttt{babel} viene caricato con la sola
%
opzione
%
\texttt{italian}; nei rari casi in cui sia necessario usare
%
anche altre lingue, esse vanno specificate come opzione alla
%
classe, perché non si può chiamare \texttt{babel} due volte
%
con opzioni diverse. Le opzioni della classe sono globali
%
e vengono passate automaticamente a tutti i pacchetti che
%
sanno che cosa farne.
6
§ 2.1
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
Creare classi semplici
%
\end{itemize}
% \StopEventually{}
%
% \section{Codice commentato}
% Le due righe contenti il formato e l’identificazione della classe
% sono già state inserite prima; ora possiamo passare alla gestione
% delle opzioni che vengono tutte passate alla classe \texttt{book}
% \iffalse
%<*class>
% \fi
%
\begin{macrocode}
\DeclareOption*{\PassOptionToClass{\CurrentOption}{book}}
\ProcessOptions*\relax
\LoadClass{book}
%
\end{macrocode}
% Poi carichiamo i pacchetti relativi alle codifiche di ingresso
% e di uscita:
%
\begin{macrocode}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
%
\end{macrocode}
% Scegliamo per l’uscita un font eccellente come Latin Modern, ma
% lo accompagniamo con il pacchetto texttt{textcomp} così da
% completarlo con molti altri segni alfabetici e analfabetici.
%
\begin{macrocode}
\usepackage{lmodern,textcomp}
%
\end{macrocode}
% Infine chiamiamo \texttt{babel} per scegliere la lingua del
% documento.
%
\begin{macrocode}
\usepackage[italian]{babel}
%
\end{macrocode}
% \iffalse
%</class>
% \fi
% Questo è tutto.
% \Finale
%
% \endinput
Nel codice appena mostrato si riconosce che la prima parte del file
documentato va dalla riga 1 alla riga 38; la seconda parte dalla riga 40 alla
7
Capitolo 2.
Creare classi o pacchetti di estensione
riga 67, la terza parte, puramente descrittiva, dalla riga 70 alla riga 107
e, infine, la quarta parte va dalla riga 108 alla riga 139. I vari comandi
\iffalse e \fi delimitano dei brani di codice commentato che pdfLaTeX
deve saltare durante la sua seconda lettura. Servono anche per non far
scrivere nella documentazione le parti che i vari marcatori indicano come
parti da estrarre. Per esempio:
% \iffalse
%<*class>
% \fi
serve per evitare che il marcatore <*class> venga stampato nella documentazione, anche se continua ad essere efficace per dire alla parte di
programma per l’estrazione che le righe della classe cominciano da quel
marcatore.
Salvando questo file con codifica utf8 come specificato nell’istruzione
della codifica di entrata della seconda parte, e compilandolo con pdfLaTeX
si ottengono contemporaneamente i file libro.cls e libro.pdf; il primo
file appare così:
%%
%% This is file ‘libro.cls’,
%% generated with the docstrip utility.
%%
%% The original source files were:
%%
%% libro.dtx (with options: ‘class’)
%% ________________________________________
%%
The libro class for typesetting books in Italian
%%
Copyright (C) 2011 Mario Rossi
%%
All rights reserved
%%
%%
License information appended
%%
\NeedsTeXFormat{LaTeX2e}[2009/01/01]
\ProvidesClass{libro}%
[2011/11/25 v.0.4 Classe per comporre libri in italiano]
\DeclareOption*{\PassOptionToClass{\CurrentOption}{book}}
\ProcessOptions*\relax
\LoadClass{book}
8
§ 2.1
Creare classi semplici
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern,textcomp}
\usepackage[italian]{babel}
%% Copyright 2011 Mario Rossi
%%
%% Distributable under the LaTeX Project Public License,
%% version 1.3c or higher (your choice). The latest version of
%% this license is at: http://www.latex-project.org/lppl.txt
%%
%% This work is "author-maintained"
%%
%% This work consists of this file libro.dtx,
%% and the derived files libro.cls and libro.pdf.
%%
%%
%% End of file ‘libro.cls’.
Il secondo file è mostrato nella pagina 10.
I comandi \StopEventually e \Finale nella quarta parte racchiudono
il codice commentato. Il comando \Finale controlla anche la “check sum”,
che deve risultare uguale a quella specificata nel comando \CheckSum; essa
rappresenta il conteggio di tutti i segni \ incontrati nel codice; non è un
conteggio infallibile, ma è una buona assicurazione che se il file contiene il
numero giusto di backslash è quasi certamente integro attraverso i passaggi
per la posta elettronica, gli algoritmi di compressione e di decompressione,
ed altri accidenti a cui sono sottoposti i file.
I due file suddetti vanno spostati in due cartelle diverse nel proprio
albero personale; dove sia radicato questo albero dipende dal sistema
operativo usato, ma leggendo la documentazione di TEX Live (Berry,
2011) (texdoc texlive) c’è un paragrafo apposta che spiega le differenze
nei vari sistemi operativi.
Comunque nel proprio albero personale (che va creato se non lo si è
mai fatto prima) bisogna creare la cartella .../doc/latex/libro/1 e lì
spostare il file libro.pdf; poi bisogna creare la cartella .../tex/latex/
libro/ e lì bisogna spostare il file libro.cls; se si vuole conservare il file
1
I tre puntini indicano la radice dell’albero personale; i separatori delle cartelle sono
indicati con lo slash; nei sistemi Windows bisogna usare il backslash.
9
Generalità
10
Codice commentato
5
4
† e-mail:
∗ Version
1
number v.0.4; ultima revisione 2011/11/25.
mario dot rossi at mymail dot net
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
Poi carichiamo i pacchetti relativi alle codifiche di ingresso e di uscita:
2
1
\DeclareOption*{\PassOptionToClass{\CurrentOption}{book}}
\ProcessOptions*\relax
3 \LoadClass{book}
Le due righe contenti il formato e l’identificazione della classe sono già state inserite
prima; ora possiamo passare alla gestione delle opzioni che vengono tutte passate
alla classe book
2
• Il pacchetto babel viene caricato con la sola opzione italian; nei rari casi in
cui sia necessario usare anche altre lingue, esse vanno specificate come opzione alla classe, perché non si può chiamare babel due volte con opzioni diverse. Le opzioni della classe sono globali e vengono passate automaticamente
a tutti i pacchetti che sanno che cosa farne.
• La codifica dei font di uscita è T1 e non è possibile specificare una codifica
differente, cosa che sarebbe quanto mai sgradevole per comporre in italiano
dove sono presenti molte lettere accentate.
• La codifica di entrata è fissata con la specifica utf8 e non è possibile con
questa classe specificare una codifica differente.
• Tutte le opzioni inserite nell’istruzione \documentclass vengono trasferite
integralmente alla classe book.
• La classe di supporto è la classe standard del system TEX book.cls.
La classe libro.cls serve per comporre libri in italiano con le seguenti specifiche:
1
Questa classe serve per comporre libri in italiano appoggiandosi alla
classe book ma includendo i pacchetti necessari.
Sommario
30 ottobre 2012
Mario Rossi†
La classe libro∗
\usepackage{lmodern,textcomp}
\usepackage[italian]{babel}
Questo è tutto.
7
2
Infine chiamiamo babel per scegliere la lingua del documento.
6
Scegliamo per l’uscita un font eccellente come Latin Modern, ma lo accompagniamo con il pacchetto texttttextcomp così da completarlo con molti altri segni
alfabetici e analfabetici.
Capitolo 2.
Creare classi o pacchetti di estensione
§ 2.1
Creare classi semplici
libro.dtx, come è opportuno fare, lo si mette nella cartella .../source/
latex/libro/. Con queste operazioni la documentazione è accessibile; il
file documentato è accessibile per possibili modifiche, e il file di classe è
immediatamente usabile2 .
2.1.2
Un’altra classe semplicissima
Questa classe non è così semplice come la precedente, e non scriverò il file
.dtx per contenere entro limiti ragionevoli questa guida tematica. Si è
certamente notato quante pagine sono risultate necessarie per descrivere
una classe che in fondo ha solo sette righe di codice. Il tutto sembra quasi
sprecato (e in certo senso lo è, per una classe così semplice) ma avendo a
che fare con classi più complesse è l’unico modo per mantenere ordinato
e comprensibile il lavoro nel tempo. Quindi, anche se nel seguito non
mostrerò altri file .dtx, ci si ricordi sempre di impostare il lavoro attraverso
questo file documentato.
Ecco l’esempio. Il prof. Tizio sta scrivendo un trattato di tricotetratomia
(taglio del capello in quattro ma, se si tratta di un trattato, l’Accademia usa
solo termini di origine greca, altrimenti tutti potrebbero capire di che cosa
si parla). Egli comincia a impostare il trattato con la classe book, ma via
via che procede nella redazione di questo fondamentale documento, deve
definire comandi e ambienti nuovi rispetto a quelli predefiniti in quella classe;
si accorge che deve anche cambiare i margini e la gabbia di composizione del
testo. Così facendo, il preambolo del documento diventa molto lungo e non
riesce più a gestire comodamente i file sorgente. Decide allora di raccogliere
i suoi comandi e ambienti nuovi in un file di estensione .sty; attraverso
un file .dtx provvede a documentarli per bene; sta attento affinché il file
documentato inserisca in testa al file di estensione tttextension.sty le
specificazioni:
\NeedsTeXFormat{LaTeX2e}[2009/01/01]
\ProvidesPackage{tttextension}%
[2011/11/25 v.1.0 Estensione per la classe tttclass]
Per la classe tttclass.cls si assicurerà che il file documentato inserisca
in testa al file .cls le righe:
2
TEX Live non richiede operazioni speciali; altre distribuzioni potrebbero richiedere
l’aggiornamento del database dei nomi dei file prima di poterli usare.
11
Capitolo 2.
Creare classi o pacchetti di estensione
\NeedsTeXFormat{LaTeX2e}[2009/01/01]
\ProvidesClass{tttclass}%
[2011/11/25 v.1.0 Classe per il trattato di TricoTetraTomia]
nel quale dichiarerà che tutte le opzioni sono da trasferire alla classe book e
caricherà la classe book. Nello stesso tempo decide di caricare il pacchetto
geometry per ridefinire la gabbia di composizione del testo e poi caricherà
il suo pacchetto di estensione:
\DeclareOption*{\PassOptionsToClass{\CurrentOption}{book}}
\ProcessOptions*\relax
\LoadClass{book}
\RequirePackage[total={140mm,250mm},top=30mm,%
left=20mm]{geometry}
\RequirePackage{tttextension}
In questo modo avrà un testo in cui la gabbia di composizione è di 140 mm
per 250 mm, il margine superiore di 30 mm e il margine interno di 20 mm;
le testatine e il piedini non fanno parte della gabbia di composizione e le
distanze di questi elementi dalla gabbia restano quelle definite nella classe
book.
Ovviamente queste osservazioni andranno nel file, chiamato per esempio
ttt.dtx, il quale può contenere sia il codice per la classe, sia quello per il
pacchetto di estensione, con marcatori diversi; il codice per l’estrazione dei
rispettivi file (la prima parte del file .dtx) conterrà quindi due righe del
tipo:
\generate{\file{tttclass.cls}{\from{ttt.dtx}{class}}}
\generate{\file{tttextension.sty}{\from{ttt.dtx}{package}}}
cosicché lanciando pdfLaTeX sul file ttt.dtx si produrranno un unico file
di documentazione e due file, tttclass.cls e tttextension.sty, avendo
specificato rispettivamente i nomi dei due marcatori class e package ai
comandi \generate.
L’idea di tenere le macro personali in un file di estensione separato è
utile perché, indipendentemente da quella in lavorazione, lo si può caricare
anche quando si usano altre classi.
12
§ 2.2
2.2
Creazione di una classe mediante personalizzazioni
Creazione di una classe mediante personalizzazioni
Una classe può essere creata anche a partire da altre classi; una molto
versatile e fortemente personalizzabile in ogni suo dettaglio è la classe
memoir (Wilson e Madsen, 2011); merita leggere i capitoli 20 e 21 della
sua documentazione (leggibile come al solito con texdoc memoir).
2.2.1
Una classe per libri con lo stile di Bringhurst
Nel capitolo 20 di quella documentazione si descrive come realizzare una
personalizzazione in modo da comporre un libro con lo stile del testo di
Robert Bringhurst The Elements of typographic style (Bringhurst,
2004), mentre nel capitolo 21 si descrive come predisporre una classe per
comporre una tesi.
Nel primo caso si potrebbe costruire un classe Bringhurstbook.cls
cominciando con le solite poche righe:
\NeedsTeXFormat{LaTeX2e}[2009/01/01]
\ProvidesClass{Bringhurstbook}%
[2011/11/25 v.1.0 Classe per libri alla Bringhurst]
\DeclareOption*{\PassOptionsToClass{\CurrentOption}{memoir}}
\ProcessOptions*\relax
\LoadClass{memoir}
per poi aggiungerci tutte le personalizzazioni copiandole dal capitolo 20
della documentazione di memoir. Quel capitolo spiega anche le motivazioni,
le specifiche, il modo di ottenerle e anche il codice usato: tutte cose da
aggiungere al file documentato Bringhurstbook.dtx. Ma il bello è che i
comandi copiati dal capitolo 20 possono servire da modello per apportare
ulteriori modifiche: basta infatti modificare ulteriormente gli argomenti dei
comandi di personalizzazione.
Si noti che la classe memoir emula già da sola una moltitudine di
pacchetti e altri ne carica apposta quindi, una volta fatta la personalizzazione suddetta, di solito non è necessario aggiungere alcunché. È bene
lasciare la scelta delle codifiche, delle lingue e dei font nel preambolo del
documento che si comporrà con questa classe; in questo modo si è liberi
di specificare queste cose nei modi propri dei programmi di composizione
pdfLaTeX oppure XeLaTeX che richiedono forme particolari diverse.
13
Capitolo 2.
2.2.2
Creare classi o pacchetti di estensione
Una classe per tesi con stile americano
Nel manuale di memoir al capitolo 21 si parla di configurare la classe per
comporre una tesi secondo le specifiche di una ipotetica università ASU,
Archibald Smythe University, le cui specifiche sono molto severe, come
succede spesso negli Stati Uniti; in Europa le specifiche sono spesso più
elastiche per cui in Europa, secondo Wilson, si possono ottenere disegni
editoriali migliori; ecco quindi che servirsi della classe memoir con le
sue infinite possibilità di personalizzazione diventa un’ottima strada per
costruire una classe a sé stante.
Ci vorranno sempre le righe iniziali nel file di classe ASUthesis.cls:
\NeedsTeXFormat{LaTeX2e}[2009/01/01]
\ProvidesClass{ASUthesis}%
[2011/11/25 v.1.0 Classe per tesi presso
la Archibald Smythe University]
\DeclareOption*{\PassOptionsToClass{\CurrentOption}{memoir}}
\ProcessOptions*\relax
\LoadClass{memoir}
Poi bisogna copiare dal manuale di memoir sia le spiegazioni, sia i vari blocchi di codice per inserire il tutto dentro il file documentato ASUthesis.dtx;
infine bisogna modificare gli argomenti dei comandi di configurazione per
adattarli al formato di tesi che si desidera; bisognerà anche, per una tesi in
italiano, sostituire parole come “Supervisor” con “Relatore”; sarà anche il
caso di cambiare il nome ASUthesis in qualcosa di più consono alla classe
così ottenuta.
Ci si ricordi che la spaziatura doppia per le bozze, se usata, va eliminata
quando si compone la bella copia, quindi quando si esegue la composizione
definitiva.
Tuttavia il grosso è fatto; l’impalcatura c’è ed è possibile modificarla
fino a quando il risultato è esteticamente soddisfacente, ma tenendo in
mente che l’eleganza del disegno grafico non deve distrarre il lettore né,
al contrario, metterlo a disagio con linee troppo lunghe in relazione al
corpo o con cambi di font troppo numerosi; sarà un filino eccessivo, ma
è meglio ricordare che secondo Robert Bringhurst non si dovrebbero
mai usare font della serie nera, e fra le forme usabili ci sarebbero solo il
tondo, il corsivo e il maiuscoletto; ogni altra forma sarebbe sconsigliata.
14
§ 2.2
Creazione di una classe mediante personalizzazioni
Ovviamente è esagerato: come si potrebbe scrivere in questo modo una
tesi di informatica senza distinguere con un font decisamente contrastante
(come il typewriter type) le parole che appartengono ad un linguaggio di
programmazione da quelle che appartengono alla lingua corrente?
2.2.3
Nuova classe usando pacchetti di configurazione
Un altro metodo, invece di usare una classe altamente configurabile come
memoir, è quello di usare una classe standard e modificare le impostazioni
grafiche mediante pacchetti di configurazione.
In questo modo, dopo le prime cinque righe per identificare la classe,
per specificare il nome del file di formato che contiene le definizioni del
nucleo del linguaggio di mark-up, per dichiarare che tutte le opzioni devono
venire passate integralmente alla classe standard prescelta, bisogna caricare
tutti i pacchetti che servono per la configurazione e usare i loro comandi
per configurare il disegno e i font della nuova classe che si vuole definire. I
pacchetti più importanti (riportati anche nella bibliografia) sono:
geometry per selezionare le dimensioni della gabbia di composizione, i
margini, la larghezza o l’altezza di diversi elementi, come le note
marginali, le testatine, i piedini, i rientri dei capoversi, gli spazi prima
e dopo gli elementi in display, mobili o fissi che siano, eccetera.
tocloft per configurare il modo di comporre l’indice generale e gli elenchi
di figure e tabelle, oltre che degli altri elementi flottanti creati con il
pacchetto float (Lingnau, 2001); si possono configurare anche gli
indici analitici e i glossari, almeno per quel che riguarda il lato LATEX,
non certo quello che riguarda i file di stile che deve usare makeindex
per alfabetizzare e strutturare questi indici.
titlesec per configurare ogni genere di titolo, da quello principale del
documento ai titoli dei capitoli, dei paragrafi, e di ogni altra sezione
di rango inferiore, scegliendo famiglie, corpi, serie e forme dei font da
usare e il modo di comporre di quei titoli o titolini.
caption per configurare il modo di comporre le didascalie sia sotto l’aspetto dei font usati sia per il tipo di composizione; in particolare il
pacchetto riesce a configurare le didascalie da mettere sopra le tabelle
diversamente dalle didascalie da mettere sotto le figure: in buona
15
Capitolo 2.
Creare classi o pacchetti di estensione
sostanza lo spazio che separa la didascalia dall’oggetto che essa deve
identificare.
subcaption oppure subfig per poter avere più figure o tabelle dentro lo
stesso ambiente mobile, che quindi potrà avere una didascalia generale,
ma ogni figurina o tabellina può avere la sua piccola didascalia
identificativa alla quale ci si può riferire con i soliti comandi \label
e \ref.
fancyhdr sia per configurare nuove testatine e piedini, sia per riconfigurare quelli della classe principale: in sostanza, per configurare o
riconfigurare gli stili delle pagine. La cosa notevole di questo pacchetto è che riesce a configurare con pochi semplici comandi le testatine
e i piedini delle pagine sia destre sia sinistre, curando che in ogni
testatina o piedino si possano mettere fino a tre informazioni distinte;
ogni pagina quindi può contenere sei informazioni distinte e due pagine affacciate fino a dodici informazioni distinte e diverse da quelle
della pagina a fronte. Permette anche di configurare questi elementi
con testatine e piedini che sporgono nel margine esterno essendo più
larghi della giustezza della gabbia di composizione, un po’ come nel
manuale di LATEX predisposto da Leslie Lamport. Comodo e facile
da usare.
enumitem serve per configurare tutti gli aspetti di composizione delle liste
create con gli ambienti enumerate, itemize, description; definisce anche
nuovi ambienti compatti senza spazi per separare le varie voci.
varioref serve per accontentare tutti coloro che vogliono usare espressioni come “la figura 3.3 nella pagina seguente”; bisogna invocare questo
pacchetto con l’opzione specifica della lingua principale, altrimenti
la parte testuale dell’indicazione risulta in un’altra lingua, e perciò
“stonata”.
hyperref se si vuole che la classe abbia i riferimenti ipertestuali da un
punto all’altro del documento, tipicamente per comporre documenti
da leggere a video; siccome hyperref deve essere l’ultimo pacchetto
caricato è meglio configurarne le prestazioni nel preambolo del documento piuttosto che dentro la classe, a meno che non si desideri
bloccare apposta la configurazione ipertestuale della classe.
Ognuno di questi pacchetti è ben documentato e la documentazione in
inglese si può facilmente leggere con il solito comando texdoc hnome del
16
§ 2.2
Creazione di una classe mediante personalizzazioni
pacchettoi come indicato nella bibliografia. Esiste una documentazione
più concisa in italiano nel documento di Enrico Gregorio LaTeX, breve
guida ai pacchetti di uso più comune (Gregorio, 2010a) scaricabile dal
sito http://www.guitex.org/home/ selezionando la targhetta “Documentazione” e poi nel menù “Guide per iniziare” selezionando le “Guide di
Enrico Gregorio”.
È assolutamente evidente che qui un esempio sarebbe un’inutile ripetizione degli esempi che si trovano nell’ultimo riferimento; la gestione delle
configurazioni non è difficile, basta leggere la documentazione, ma è lunga
per la quantità di informazioni che bisogna specificare.
Tuttavia conviene preparare un primo abbozzo di classe senza caricare
nessun pacchetto configurabile. Contemporaneamente si prepara un documento TestClasse.tex che usi quella bozza di classe e che contenga ogni
genere di strutture: pagina del titolo, parti, capitoli, paragrafi, sottoparagrafi, eccetera, figure e tabelle con le loro didascalie, teoremi, definizioni e
simili enunciati, figure e tabelle semplici o formate da diversi elementi, stili
di pagina diversi, liste di ogni tipo, collegamenti ipertestuali. Ovviamente
il testo sarà composto dentro una gabbia le cui dimensioni possono venire
collaudate via via.
Il file TestClasse.tex deve compilarsi senza nessun problema con la
classe di base. Poi si inserisce il primo pacchetto di configurazione, se
ne impostano i parametri e si compila TestClasse.tex; successivamente
si riconfigura e si controlla, finché le impostazioni non sono soddisfacenti. Poi si aggiunge un altro pacchetto e con questo si eseguono le nuove
configurazioni che esso gestisce, ripetendo finché basta; si continua così
fin quando la nuova classe non è più una bozza ma è diventata la classe
definitiva. Descritto come sopra, sembra un lavoro terribile; in realtà, a
seconda dell’abilità di chi scrive la classe e della quantità di configurazioni
da eseguire, richiede da una a tre ore, spese soprattuto a leggere la documentazione dei vari pacchetti. Il tempo relativamente lungo per costruire
una classe abbastanza complessa come descritto qui è ricompensato dal
risultato generalmente molto buono, per non dire eccellente. L’eccellenza, in realtà, si raggiunge quando si capisce che i font scelti, la gabbia
di composizione, la distribuzione dei vari elementi sulla pagina, eccetera,
danno un senso di agio al solo guardare il libro aperto. Anzi, si cerchi di
stampare un paio di pagine affacciate in formato vero in modo da poter
valutare l’agio della lettura; in alternativa, si imposti il visualizzatore PDF
17
Capitolo 2.
Creare classi o pacchetti di estensione
in modo che mostri due pagine affacciate e se ne configuri l’ingrandimento,
schermo permettendo, che mostri le pagine in scala 1 : 1. Solo guardando
due pagine affacciate si può valutare l’effetto del disegno grafico unito alla
particolare scelta dei font. Quando si raggiunge il meglio l’autore se ne
accorge subito, sempre che abbia ben chiaro in mente quello che riguarda le
basi dell’arte tipografica e non scambi per agio di lettura l’apprezzamento
delle forme e dei colori.
18
Produrre una classe partendo da
zero
3
Non è impossibile produrre una classe partendo da zero, ma oggigiorno è un
po’ masochistico. Con il vecchio LATEX 209 ne ho dovute preparare molte
perché allora non si disponeva di pacchetti di configurazione. In pratica si
prendeva una classe standard, le si cambiava nome e vi si introducevano
tutte le modifiche e le aggiunte che si volevano. Sembra facile, ma non è vero;
ogni modifica implica la scrittura o la modifica di brani di programmazione
scritti da altri, poco o nulla documentati, e generalmente scritti in linguaggio
TEX primitivo, o con comandi di Plain TEX, o con comandi del nucleo di
LATEX.
3.1
La via breve
Oggi farlo è certamente più facile, se non altro perché si possono usare i
pacchetti di personalizzazione, con i quali si fa la maggior parte del lavoro.
Poi bisogna aggiungere un certo numero di nuovi ambienti o comandi un
po’ particolari che non si possono direttamente scrivere con i comandi di
definizione (\newcommand) o di dichiarazione (\Declare...) ad alto livello
forniti dal nucleo di LATEX.
A questo punto sarebbe meglio avere una certa dimestichezza con i
comandi del nucleo di LATEX (non tutti, certo, ma una buona dimestichezza,
sì, ci vuole), bisogna saper distinguere le definizioni e i comandi con
argomenti delimitati da quelli con argomenti non delimitati. Bisogna sapere
destreggiarsi con i comandi \@ifundefined e \@ifdefinable e le loro
sottili differenze. Meglio ancora sarebbe studiarsi a fondo la documentazione
del pacchetto etoolbox (Lehman, 2011b), la scatola degli attrezzi di pdfTeX
esteso, sapendo che le potenzialità dell’attuale pdfTeX e di XeTeX sono
Capitolo 3.
Produrre una classe partendo da zero
molto maggiori della versione knuthiana di TeX. Caricando nella futura
classe il pacchetto etoolbox si possono sfruttare tutti i suoi potentissimi
strumenti per maneggiare e modificare correttamente macro preesistenti; per
eseguire test inimmaginabili con i comandi primitivi di TEX; per dilazionare
l’esecuzione di comandi anche di definizione o di dichiarazione all’inizio
dell’esecuzione dell’istruzione \begin{document}, a metà o alla fine (i
risultati possono essere assai diversi); e tante altre cose, compresa la
possibilità di eseguire calcoli direttamente in memoria, eliminando i difetti
dei comandi primitivi, e senza bisogno di ricorrere al pacchetto calc.
Ci si ricordi che i registri di ogni genere non sono più limitati a 256
come nella versione knuthiana, ma possono essere un numero sterminato,
difficilissimo da raggiungere; per venire allocati correttamente per nome è
necessaria la presenza del pacchetto etex, che è già caricato da etoolbox.
Un’altra cosa a cui bisogna stare attenti è che il carattere @ dentro
i file di classe e dentro i file di estensione può avere lo status di lettera;
quando viene eseguito il comando \begin{document} il suo status viene
ripristinato a quello di un carattere analfabetico; dentro i file di classe i
nomi dei comandi, che devono essere formati solo da lettere maiuscole e
minuscole, possono contenere anche la ‘lettera’ @. Non c’è quindi bisogno di
usare comandi come \makeatletter per cambiare status a quel carattere,
né di usare \makeatother dopo il brano di codice che lo usa nei nomi dei
comandi.
In questa pagina ho messo come sfondo del testo il disegno in rosso
dello schema grafico della gabbia di composizione. Nel preambolo del file
sorgente di questo file ho inserito le definizioni seguenti:
% Layout disegnato e definizione di uno stile di pagina
\newcommand*\cblayoutdestro{%
\dimen256=
\dimexpr\headheight+\topmargin+1in-\paperheight\relax
\dimen258=\dimexpr\oddsidemargin+1in\relax
\dimen260=\dimexpr \paperheight-\topmargin\headheight-1in-\headsep-\textheight\relax
\begin{picture}(0,0)(\strip@pt\dimen258,-\strip@pt\dimen256)
\put(0,0){\unitlength=\p@
\color{red}%
\put(\strip@pt\dimen258,\strip@pt\dimen260)%
20
§ 3.1
La via breve
{\makebox(0,0)[bl]{%
\framebox(\strip@pt\textwidth,\strip@pt\textheight){}
}}
\Line(0,\strip@pt\paperheight)(\strip@pt\paperwidth,0)
\put(\strip@pt\dimexpr\paperwidth/2\relax,%
\strip@pt\dimexpr\dimen260+\textheight/2\relax)%
{\circle{\strip@pt\paperwidth}}
}
\end{picture}}
%
\newcommand*\ps@headingslayout{\ps@headings
\toks@=\expandafter{\@oddhead}%
\edef\@oddhead{\noexpand\cblayoutdestro\the\toks@}%
}
Indipendentemente dall’uso specifico che se ne fa, questo è il genere di
comandi che si possono o può essere necessario inserire in un file di classe.
Si nota la presenza del carattere @ nei nomi dei comandi; si nota l’asterisco
dopo il comando \newcommand, che classifica la macro così definita come una
macro non avente la caratteristica di “long”, quindi, se dovesse accettare
in ingresso degli argomenti, questi non potrebbero contenere un qualsiasi
comando che rappresenti un fine capoverso, che sia una riga vuota o il
comando \par o qualunque cosa equivalente a queste.
Nella macro \cblayoutdestro si comincia col caricare dei registri
“lunghezza” numerati esplicitamente con numeri superiori a 255, grazie
alla versione estesa dei programmi di composizione pdfLaTeX e XeLaTeX;
questi programmi sono estesi fin dal 2005, quindi qualunque distribuzione
recente del sistema TEX li usa di default. Si usano i numeri pari, perché
si conviene di usare questa parità per i registri “scratch”, destinati a
conservare informazioni che interessano solo localmente e che non interessa
se vengono poi alterate da altre macro.
Le espressioni che vengono determinate con \dimexpr e terminate con
\relax sono assolutamente esplicite e non richiedono spiegazioni. Servono
per calcolare lo spostamento che la figura di dimensioni nulle definita poco
dopo, e che verrà posta all’inizio della testatina di destra (l’unica usata
in questo documento composto solo in bianca – solo fronte) ha rispetto al
vertice in alto a sinistra del foglio di carta.
21
Capitolo 3.
Produrre una classe partendo da zero
Subito dopo si definisce un disegno di dimensioni nulle; l’unità di misura
non è rilevante, che siano punti, centimetri o pollici, il valore zero è sempre
lo stesso. Ma dentro la figura si definisce come unità di misura il punto
tipografico. Prima si definisce che si vuole colorare il disegno in rosso poi
nell’origine di questo disegno vene collocato il disegno vero e proprio e
per prima cosa si usa un comando \put per metterlo al suo posto con le
coordinate determinate sopra per lo spostamento, in modo che il disegno
della gabbia di composizione sia esattamente al suo posto.
Poi si disegna la diagonale del foglio con uno dei comandi aggiunti dal
pacchetto di estensione pict2e, che estende le funzionalità dell’ambiente
picture del nucleo di LATEX. Infine si mette in posizione il cerchio di diametro
pari alla base del foglio di carta. Sulla base di questo disegno, il pacchetto
canoniclayout (Beccari, 2011b), caricato nella classe di questo stesso
documento, ha creato il layout della pagina.
La successiva definizione permette di dichiarare un layout della pagina
uguale al layout headings, ma alla testatina dispari è stato aggiunto il
precedente comando \cblayoutdestro, che non occupa spazio (disegno di
dimensioni nulle) ma che viene inserito per primo dalla routine di output
di LATEX per cui il testo della pagina vi si sovrappone.
Si noti come si è fatto per aggiungere il comando alla precedente
definizione di \@oddhead: si è prima caricata la sua espansione nel registro
‘token’ numero zero, rappresentato dal comando \toks@, poi si è ridefinito
lo stesso comando espanso mediante il comando \edef (non disponibile in
LATEX, ma compreso nel linguaggio primitivo TEX) stando attenti a non
espandere \cblayoutdestro, la cui espansione sarebbe del tutto inutile,
mentre l’espansione di \toks@ rimette nello stesso ordine dentro la macro
le parti che conteneva anche in precedenza e che erano state conservate nel
registro ‘token’. Al posto di questo apparente giro “di conigli e cappelli
a cilindro”, si sarebbe potuto usare il comando definito da etoolbox
\cspreto in questo modo:
\cspreto{@oddhead}{\cblayoutdestro}
e questo esempio mostra al di là di ogni dubbio quanto possano essere utili
le macro definite nel pacchetto etoolbox.
22
§ 3.2
3.2
La struttura della classe book
La struttura della classe book
Per meglio comprendere di che cosa le classi standard (che si possono usare
come modelli per costruire classi partendo da zero) sono tenute ad occuparsi,
ora esaminiamo per sezioni la struttura della classe book, senza scendere
nei dettagli riga per riga; con questa descrizione, la lettura del codice vero e
proprio nel file TEXMF/texmf-dist/tex/latex/base/book.cls dovrebbe
risultare agevolata; il file con le righe numerate viene riportato qui di seguito
ma si suggerisce di aprire il file suddetto e di tenerne aperta la finestra
accanto a quella dove si sta leggendo questa documentazione; in questo
modo è più facile seguire la descrizione e leggere il codice. Possibilmente si
imposti il programma per visualizzare il file book.cls in modo che mostri a
sinistra di ogni riga il suo numero progressivo; in questo modo le indicazioni
del tipo “la seconda sezione si svolge dalla riga. . . alla riga. . . ” diventa
comprensibile e permette di localizzare meglio nel file sorgente il blocco
che viene descritto.
Si noti che la classe book è concepita anche per funzionare con documenti precedenti al 1994, anno di nascita di LATEX 2ε , e quindi contiene
moltissime istanze del test \if@compatibility; nel leggere il file si possono
saltare sistematicamente i blocchi di codice corrispondenti all’esito “true”
del test e leggere solo quello che appare dopo il comando \else fino alla
fine segnata dal comando \fi. Se si usa questa classe come modello per
creare una nuova classe, dopo averlo copiato in un altro file con nome
diverso, la prima modifica da fare è quella di eliminare tutti questi test
e il ramo relativo alla compatibilità col passato; si elimina circa la metà
dell’intero file.
Nel nuovo file si cambi nella riga 2 il nome del file, si cancelli tutto
quanto dalla riga 3 alla riga 53, si modifichi di nuovo il nome del file (senza
estensione) nella riga 55, e si cambi data, versione e descrizione nelle righe
56 e 57. Non si dimentichino mai queste operazioni ogni qual volta si crei
un nuovo file partendo da un file preesistente.
1
2
3
4
5
6
7
8
%%
%%
%%
%%
%%
%%
%%
%%
This is file ‘book.cls’,
generated with the docstrip utility.
The original source files were:
classes.dtx
(with options: ‘book’)
23
Capitolo 3.
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
Produrre una classe partendo da zero
%% This is a generated file.
%%
%% Copyright 1993-2014
%% The LaTeX3 Project and any individual authors listed elsewhere
%% in this file.
%%
%% This file was generated from file(s) of the LaTeX base system.
%% -------------------------------------------------------------%%
%% It may be distributed and/or modified under the
%% conditions of the LaTeX Project Public License, either version 1.3c
%% of this license or (at your option) any later version.
%% The latest version of this license is in
%%
http://www.latex-project.org/lppl.txt
%% and version 1.3c or later is part of all distributions of LaTeX
%% version 2005/12/01 or later.
%%
%% This file has the LPPL maintenance status "maintained".
%%
%% This file may only be distributed together with a copy of the LaTeX
%% base system. You may however distribute the LaTeX base system without
%% such generated files.
%%
%% The list of all files belonging to the LaTeX base distribution is
%% given in the file ‘manifest.txt’. See also ‘legal.txt’ for additional
%% information.
%%
%% The list of derived (unpacked) files belonging to the distribution
%% and covered by LPPL is defined by the unpacking scripts (with
%% extension .ins) which are part of the distribution.
%% \CharacterTable
%% {Upper-case
\A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
%%
Lower-case
\a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
%%
Digits
\0\1\2\3\4\5\6\7\8\9
%%
Exclamation
\!
Double quote \"
Hash (number) \#
%%
Dollar
\$
Percent
\%
Ampersand
\&
%%
Acute accent \’
Left paren
\(
Right paren
\)
%%
Asterisk
\*
Plus
\+
Comma
\,
%%
Minus
\Point
\.
Solidus
\/
%%
Colon
\:
Semicolon
\;
Less than
\<
%%
Equals
\=
Greater than \>
Question mark \?
%%
Commercial at \@
Left bracket \[
Backslash
\\
%%
Right bracket \]
Circumflex
\^
Underscore
\_
%%
Grave accent \‘
Left brace
\{
Vertical bar \|
%%
Right brace
\}
Tilde
\~}
\NeedsTeXFormat{LaTeX2e}[1995/12/01]
\ProvidesClass{book}
[2014/09/29 v1.4h
Standard LaTeX document class]
\newcommand\@ptsize{}
\newif\if@restonecol
\newif\if@titlepage
24
§ 3.2
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
La struttura della classe book
\@titlepagetrue
\newif\if@openright
\newif\if@mainmatter \@mainmattertrue
\if@compatibility\else
\DeclareOption{a4paper}
{\setlength\paperheight {297mm}%
\setlength\paperwidth {210mm}}
\DeclareOption{a5paper}
{\setlength\paperheight {210mm}%
\setlength\paperwidth {148mm}}
\DeclareOption{b5paper}
{\setlength\paperheight {250mm}%
\setlength\paperwidth {176mm}}
\DeclareOption{letterpaper}
{\setlength\paperheight {11in}%
\setlength\paperwidth {8.5in}}
\DeclareOption{legalpaper}
{\setlength\paperheight {14in}%
\setlength\paperwidth {8.5in}}
\DeclareOption{executivepaper}
{\setlength\paperheight {10.5in}%
\setlength\paperwidth {7.25in}}
\DeclareOption{landscape}
{\setlength\@tempdima
{\paperheight}%
\setlength\paperheight {\paperwidth}%
\setlength\paperwidth {\@tempdima}}
\fi
\if@compatibility
\renewcommand\@ptsize{0}
\else
\DeclareOption{10pt}{\renewcommand\@ptsize{0}}
\fi
\DeclareOption{11pt}{\renewcommand\@ptsize{1}}
\DeclareOption{12pt}{\renewcommand\@ptsize{2}}
\if@compatibility\else
\DeclareOption{oneside}{\@twosidefalse \@mparswitchfalse}
\fi
\DeclareOption{twoside}{\@twosidetrue \@mparswitchtrue}
\DeclareOption{draft}{\setlength\overfullrule{5pt}}
\if@compatibility\else
\DeclareOption{final}{\setlength\overfullrule{0pt}}
\fi
\DeclareOption{titlepage}{\@titlepagetrue}
\if@compatibility\else
\DeclareOption{notitlepage}{\@titlepagefalse}
\fi
\if@compatibility
\@openrighttrue
\else
\DeclareOption{openright}{\@openrighttrue}
\DeclareOption{openany}{\@openrightfalse}
\fi
25
Capitolo 3.
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
Produrre una classe partendo da zero
\if@compatibility\else
\DeclareOption{onecolumn}{\@twocolumnfalse}
\fi
\DeclareOption{twocolumn}{\@twocolumntrue}
\DeclareOption{leqno}{\input{leqno.clo}}
\DeclareOption{fleqn}{\input{fleqn.clo}}
\DeclareOption{openbib}{%
\AtEndOfPackage{%
\renewcommand\@openbib@code{%
\advance\leftmargin\bibindent
\itemindent -\bibindent
\listparindent \itemindent
\parsep \z@
}%
\renewcommand\newblock{\par}}%
}
\ExecuteOptions{letterpaper,10pt,twoside,onecolumn,final,openright}
\ProcessOptions
\input{bk1\@ptsize.clo}
\setlength\lineskip{1\p@}
\setlength\normallineskip{1\p@}
\renewcommand\baselinestretch{}
\setlength\parskip{0\p@ \@plus \p@}
\@lowpenalty
51
\@medpenalty 151
\@highpenalty 301
\setcounter{topnumber}{2}
\renewcommand\topfraction{.7}
\setcounter{bottomnumber}{1}
\renewcommand\bottomfraction{.3}
\setcounter{totalnumber}{3}
\renewcommand\textfraction{.2}
\renewcommand\floatpagefraction{.5}
\setcounter{dbltopnumber}{2}
\renewcommand\dbltopfraction{.7}
\renewcommand\dblfloatpagefraction{.5}
\if@twoside
\def\ps@headings{%
\let\@oddfoot\@empty\let\@evenfoot\@empty
\def\@evenhead{\thepage\hfil\slshape\leftmark}%
\def\@oddhead{{\slshape\rightmark}\hfil\thepage}%
\let\@mkboth\markboth
\def\chaptermark##1{%
\markboth {\MakeUppercase{%
\ifnum \c@secnumdepth >\m@ne
\if@mainmatter
\@chapapp\ \thechapter. \ %
\fi
\fi
##1}}{}}%
\def\sectionmark##1{%
\markright {\MakeUppercase{%
26
§ 3.2
La struttura della classe book
165
\ifnum \c@secnumdepth >\z@
166
\thesection. \ %
167
\fi
168
##1}}}}
169 \else
170
\def\ps@headings{%
171
\let\@oddfoot\@empty
172
\def\@oddhead{{\slshape\rightmark}\hfil\thepage}%
173
\let\@mkboth\markboth
174
\def\chaptermark##1{%
175
\markright {\MakeUppercase{%
176
\ifnum \c@secnumdepth >\m@ne
177
\if@mainmatter
178
\@chapapp\ \thechapter. \ %
179
\fi
180
\fi
181
##1}}}}
182 \fi
183 \def\ps@myheadings{%
184
\let\@oddfoot\@empty\let\@evenfoot\@empty
185
\def\@evenhead{\thepage\hfil\slshape\leftmark}%
186
\def\@oddhead{{\slshape\rightmark}\hfil\thepage}%
187
\let\@mkboth\@gobbletwo
188
\let\chaptermark\@gobble
189
\let\sectionmark\@gobble
190
}
191
\if@titlepage
192
\newcommand\maketitle{\begin{titlepage}%
193
\let\footnotesize\small
194
\let\footnoterule\relax
195
\let \footnote \thanks
196
\null\vfil
197
\vskip 60\p@
198
\begin{center}%
199
{\LARGE \@title \par}%
200
\vskip 3em%
201
{\large
202
\lineskip .75em%
203
\begin{tabular}[t]{c}%
204
\@author
205
\end{tabular}\par}%
206
\vskip 1.5em%
207
{\large \@date \par}%
% Set date in \large size.
208
\end{center}\par
209
\@thanks
210
\vfil\null
211
\end{titlepage}%
212
\setcounter{footnote}{0}%
213
\global\let\thanks\relax
214
\global\let\maketitle\relax
215
\global\let\@thanks\@empty
216
\global\let\@author\@empty
27
Capitolo 3.
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
Produrre una classe partendo da zero
\global\let\@date\@empty
\global\let\@title\@empty
\global\let\title\relax
\global\let\author\relax
\global\let\date\relax
\global\let\and\relax
}
\else
\newcommand\maketitle{\par
\begingroup
\renewcommand\thefootnote{\@fnsymbol\c@footnote}%
\def\@makefnmark{\rlap{\@textsuperscript{\normalfont\@thefnmark}}}%
\long\def\@makefntext##1{\parindent 1em\noindent
\hb@[email protected]{%
\hss\@textsuperscript{\normalfont\@thefnmark}}##1}%
\if@twocolumn
\ifnum \col@number=\@ne
\@maketitle
\else
\twocolumn[\@maketitle]%
\fi
\else
\newpage
\global\@topnum\z@
% Prevents figures from going at top of page.
\@maketitle
\fi
\thispagestyle{plain}\@thanks
\endgroup
\setcounter{footnote}{0}%
\global\let\thanks\relax
\global\let\maketitle\relax
\global\let\@maketitle\relax
\global\let\@thanks\@empty
\global\let\@author\@empty
\global\let\@date\@empty
\global\let\@title\@empty
\global\let\title\relax
\global\let\author\relax
\global\let\date\relax
\global\let\and\relax
}
\def\@maketitle{%
\newpage
\null
\vskip 2em%
\begin{center}%
\let \footnote \thanks
{\LARGE \@title \par}%
\vskip 1.5em%
{\large
\lineskip .5em%
\begin{tabular}[t]{c}%
28
§ 3.2
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
La struttura della classe book
\@author
\end{tabular}\par}%
\vskip 1em%
{\large \@date}%
\end{center}%
\par
\vskip 1.5em}
\fi
\newcommand*\chaptermark[1]{}
\setcounter{secnumdepth}{2}
\newcounter {part}
\newcounter {chapter}
\newcounter {section}[chapter]
\newcounter {subsection}[section]
\newcounter {subsubsection}[subsection]
\newcounter {paragraph}[subsubsection]
\newcounter {subparagraph}[paragraph]
\renewcommand \thepart {\@Roman\c@part}
\renewcommand \thechapter {\@arabic\c@chapter}
\renewcommand \thesection {\thechapter.\@arabic\c@section}
\renewcommand\thesubsection
{\thesection.\@arabic\c@subsection}
\renewcommand\thesubsubsection{\thesubsection.\@arabic\c@subsubsection}
\renewcommand\theparagraph
{\thesubsubsection.\@arabic\c@paragraph}
\renewcommand\thesubparagraph {\theparagraph.\@arabic\c@subparagraph}
\newcommand\@chapapp{\chaptername}
\newcommand\frontmatter{%
\cleardoublepage
\@mainmatterfalse
\pagenumbering{roman}}
\newcommand\mainmatter{%
\cleardoublepage
\@mainmattertrue
\pagenumbering{arabic}}
\newcommand\backmatter{%
\if@openright
\cleardoublepage
\else
\clearpage
\fi
\@mainmatterfalse}
\newcommand\part{%
\if@openright
\cleardoublepage
\else
\clearpage
\fi
\thispagestyle{plain}%
\if@twocolumn
\onecolumn
\@tempswatrue
\else
\@tempswafalse
29
Capitolo 3.
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
Produrre una classe partendo da zero
\fi
\null\vfil
\secdef\@part\@spart}
\def\@part[#1]#2{%
\ifnum \c@secnumdepth >-2\relax
\refstepcounter{part}%
\addcontentsline{toc}{part}{\thepart\hspace{1em}#1}%
\else
\addcontentsline{toc}{part}{#1}%
\fi
\markboth{}{}%
{\centering
\interlinepenalty \@M
\normalfont
\ifnum \c@secnumdepth >-2\relax
\huge\bfseries \partname\nobreakspace\thepart
\par
\vskip 20\p@
\fi
\Huge \bfseries #2\par}%
\@endpart}
\def\@spart#1{%
{\centering
\interlinepenalty \@M
\normalfont
\Huge \bfseries #1\par}%
\@endpart}
\def\@endpart{\vfil\newpage
\if@twoside
\if@openright
\null
\thispagestyle{empty}%
\newpage
\fi
\fi
\if@tempswa
\twocolumn
\fi}
\newcommand\chapter{\if@openright\cleardoublepage\else\clearpage\fi
\thispagestyle{plain}%
\global\@topnum\z@
\@afterindentfalse
\secdef\@chapter\@schapter}
\def\@chapter[#1]#2{\ifnum \c@secnumdepth >\m@ne
\if@mainmatter
\refstepcounter{chapter}%
\typeout{\@chapapp\space\thechapter.}%
\addcontentsline{toc}{chapter}%
{\protect\numberline{\thechapter}#1}%
\else
\addcontentsline{toc}{chapter}{#1}%
30
§ 3.2
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
La struttura della classe book
\fi
\else
\addcontentsline{toc}{chapter}{#1}%
\fi
\chaptermark{#1}%
\addtocontents{lof}{\protect\addvspace{10\p@}}%
\addtocontents{lot}{\protect\addvspace{10\p@}}%
\if@twocolumn
\@topnewpage[\@makechapterhead{#2}]%
\else
\@makechapterhead{#2}%
\@afterheading
\fi}
\def\@makechapterhead#1{%
\vspace*{50\p@}%
{\parindent \z@ \raggedright \normalfont
\ifnum \c@secnumdepth >\m@ne
\if@mainmatter
\huge\bfseries \@chapapp\space \thechapter
\par\nobreak
\vskip 20\p@
\fi
\fi
\interlinepenalty\@M
\Huge \bfseries #1\par\nobreak
\vskip 40\p@
}}
\def\@schapter#1{\if@twocolumn
\@topnewpage[\@makeschapterhead{#1}]%
\else
\@makeschapterhead{#1}%
\@afterheading
\fi}
\def\@makeschapterhead#1{%
\vspace*{50\p@}%
{\parindent \z@ \raggedright
\normalfont
\interlinepenalty\@M
\Huge \bfseries #1\par\nobreak
\vskip 40\p@
}}
\newcommand\section{\@startsection {section}{1}{\z@}%
{-3.5ex \@plus -1ex \@minus -.2ex}%
{2.3ex \@plus.2ex}%
{\normalfont\Large\bfseries}}
\newcommand\subsection{\@startsection{subsection}{2}{\z@}%
{-3.25ex\@plus -1ex \@minus -.2ex}%
{1.5ex \@plus .2ex}%
{\normalfont\large\bfseries}}
\newcommand\subsubsection{\@startsection{subsubsection}{3}{\z@}%
{-3.25ex\@plus -1ex \@minus -.2ex}%
{1.5ex \@plus .2ex}%
31
Capitolo 3.
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
Produrre una classe partendo da zero
{\normalfont\normalsize\bfseries}}
\newcommand\paragraph{\@startsection{paragraph}{4}{\z@}%
{3.25ex \@plus1ex \@minus.2ex}%
{-1em}%
{\normalfont\normalsize\bfseries}}
\newcommand\subparagraph{\@startsection{subparagraph}{5}{\parindent}%
{3.25ex \@plus1ex \@minus .2ex}%
{-1em}%
{\normalfont\normalsize\bfseries}}
\if@twocolumn
\setlength\leftmargini {2em}
\else
\setlength\leftmargini {2.5em}
\fi
\leftmargin \leftmargini
\setlength\leftmarginii {2.2em}
\setlength\leftmarginiii {1.87em}
\setlength\leftmarginiv {1.7em}
\if@twocolumn
\setlength\leftmarginv {.5em}
\setlength\leftmarginvi {.5em}
\else
\setlength\leftmarginv {1em}
\setlength\leftmarginvi {1em}
\fi
\setlength \labelsep {.5em}
\setlength \labelwidth{\leftmargini}
\addtolength\labelwidth{-\labelsep}
\@beginparpenalty -\@lowpenalty
\@endparpenalty
-\@lowpenalty
\@itempenalty
-\@lowpenalty
\renewcommand\theenumi{\@arabic\c@enumi}
\renewcommand\theenumii{\@alph\c@enumii}
\renewcommand\theenumiii{\@roman\c@enumiii}
\renewcommand\theenumiv{\@Alph\c@enumiv}
\newcommand\labelenumi{\theenumi.}
\newcommand\labelenumii{(\theenumii)}
\newcommand\labelenumiii{\theenumiii.}
\newcommand\labelenumiv{\theenumiv.}
\renewcommand\p@enumii{\theenumi}
\renewcommand\p@enumiii{\theenumi(\theenumii)}
\renewcommand\p@enumiv{\p@enumiii\theenumiii}
\newcommand\labelitemi{\textbullet}
\newcommand\labelitemii{\normalfont\bfseries \textendash}
\newcommand\labelitemiii{\textasteriskcentered}
\newcommand\labelitemiv{\textperiodcentered}
\newenvironment{description}
{\list{}{\labelwidth\z@ \itemindent-\leftmargin
\let\makelabel\descriptionlabel}}
{\endlist}
\newcommand*\descriptionlabel[1]{\hspace\labelsep
\normalfont\bfseries #1}
32
§ 3.2
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
La struttura della classe book
\newenvironment{verse}
{\let\\\@centercr
\list{}{\itemsep
\z@
\itemindent
-1.5em%
\listparindent\itemindent
\rightmargin \leftmargin
\advance\leftmargin 1.5em}%
\item\relax}
{\endlist}
\newenvironment{quotation}
{\list{}{\listparindent 1.5em%
\itemindent
\listparindent
\rightmargin
\leftmargin
\parsep
\z@ \@plus\p@}%
\item\relax}
{\endlist}
\newenvironment{quote}
{\list{}{\rightmargin\leftmargin}%
\item\relax}
{\endlist}
\if@compatibility
\newenvironment{titlepage}
{%
\cleardoublepage
\if@twocolumn
\@restonecoltrue\onecolumn
\else
\@restonecolfalse\newpage
\fi
\thispagestyle{empty}%
\setcounter{page}\z@
}%
{\if@restonecol\twocolumn \else \newpage \fi
}
\else
\newenvironment{titlepage}
{%
\cleardoublepage
\if@twocolumn
\@restonecoltrue\onecolumn
\else
\@restonecolfalse\newpage
\fi
\thispagestyle{empty}%
\setcounter{page}\@ne
}%
{\if@restonecol\twocolumn \else \newpage \fi
\if@twoside\else
\setcounter{page}\@ne
\fi
}
\fi
33
Capitolo 3.
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
Produrre una classe partendo da zero
\newcommand\appendix{\par
\setcounter{chapter}{0}%
\setcounter{section}{0}%
\gdef\@chapapp{\appendixname}%
\gdef\thechapter{\@Alph\c@chapter}}
\setlength\arraycolsep{5\p@}
\setlength\tabcolsep{6\p@}
\setlength\arrayrulewidth{.4\p@}
\setlength\doublerulesep{2\p@}
\setlength\tabbingsep{\labelsep}
\skip\@mpfootins = \skip\footins
\setlength\fboxsep{3\p@}
\setlength\fboxrule{.4\p@}
\@addtoreset {equation}{chapter}
\renewcommand\theequation
{\ifnum \c@chapter>\z@ \thechapter.\fi \@arabic\c@equation}
\newcounter{figure}[chapter]
\renewcommand \thefigure
{\ifnum \c@chapter>\z@ \thechapter.\fi \@arabic\c@figure}
\def\fps@figure{tbp}
\def\ftype@figure{1}
\def\ext@figure{lof}
\def\fnum@figure{\figurename\nobreakspace\thefigure}
\newenvironment{figure}
{\@float{figure}}
{\end@float}
\newenvironment{figure*}
{\@dblfloat{figure}}
{\end@dblfloat}
\newcounter{table}[chapter]
\renewcommand \thetable
{\ifnum \c@chapter>\z@ \thechapter.\fi \@arabic\c@table}
\def\fps@table{tbp}
\def\ftype@table{2}
\def\ext@table{lot}
\def\fnum@table{\tablename\nobreakspace\thetable}
\newenvironment{table}
{\@float{table}}
{\end@float}
\newenvironment{table*}
{\@dblfloat{table}}
{\end@dblfloat}
\newlength\abovecaptionskip
\newlength\belowcaptionskip
\setlength\abovecaptionskip{10\p@}
\setlength\belowcaptionskip{0\p@}
\long\def\@makecaption#1#2{%
\vskip\abovecaptionskip
\sbox\@tempboxa{#1: #2}%
\ifdim \wd\@tempboxa >\hsize
#1: #2\par
\else
34
§ 3.2
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
La struttura della classe book
\global \@minipagefalse
\hb@xt@\hsize{\hfil\box\@tempboxa\hfil}%
\fi
\vskip\belowcaptionskip}
\DeclareOldFontCommand{\rm}{\normalfont\rmfamily}{\mathrm}
\DeclareOldFontCommand{\sf}{\normalfont\sffamily}{\mathsf}
\DeclareOldFontCommand{\tt}{\normalfont\ttfamily}{\mathtt}
\DeclareOldFontCommand{\bf}{\normalfont\bfseries}{\mathbf}
\DeclareOldFontCommand{\it}{\normalfont\itshape}{\mathit}
\DeclareOldFontCommand{\sl}{\normalfont\slshape}{\@nomath\sl}
\DeclareOldFontCommand{\sc}{\normalfont\scshape}{\@nomath\sc}
\DeclareRobustCommand*\cal{\@fontswitch\relax\mathcal}
\DeclareRobustCommand*\mit{\@fontswitch\relax\mathnormal}
\newcommand\@pnumwidth{1.55em}
\newcommand\@tocrmarg{2.55em}
\newcommand\@dotsep{4.5}
\setcounter{tocdepth}{2}
\newcommand\tableofcontents{%
\if@twocolumn
\@restonecoltrue\onecolumn
\else
\@restonecolfalse
\fi
\chapter*{\contentsname
\@mkboth{%
\MakeUppercase\contentsname}{\MakeUppercase\contentsname}}%
\@starttoc{toc}%
\if@restonecol\twocolumn\fi
}
\newcommand*\l@part[2]{%
\ifnum \c@tocdepth >-2\relax
\addpenalty{-\@highpenalty}%
\addvspace{2.25em \@plus\p@}%
\setlength\@tempdima{3em}%
\begingroup
\parindent \z@ \rightskip \@pnumwidth
\parfillskip -\@pnumwidth
{\leavevmode
\large \bfseries #1\hfil \hb@xt@\@pnumwidth{\hss #2}}\par
\nobreak
\global\@nobreaktrue
\everypar{\global\@nobreakfalse\everypar{}}%
\endgroup
\fi}
\newcommand*\l@chapter[2]{%
\ifnum \c@tocdepth >\m@ne
\addpenalty{-\@highpenalty}%
\vskip 1.0em \@plus\p@
\setlength\@tempdima{1.5em}%
\begingroup
\parindent \z@ \rightskip \@pnumwidth
\parfillskip -\@pnumwidth
35
Capitolo 3.
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
Produrre una classe partendo da zero
\leavevmode \bfseries
\advance\leftskip\@tempdima
\hskip -\leftskip
#1\nobreak\hfil \nobreak\hb@xt@\@pnumwidth{\hss #2}\par
\penalty\@highpenalty
\endgroup
\fi}
\newcommand*\l@section{\@dottedtocline{1}{1.5em}{2.3em}}
\newcommand*\l@subsection{\@dottedtocline{2}{3.8em}{3.2em}}
\newcommand*\l@subsubsection{\@dottedtocline{3}{7.0em}{4.1em}}
\newcommand*\l@paragraph{\@dottedtocline{4}{10em}{5em}}
\newcommand*\l@subparagraph{\@dottedtocline{5}{12em}{6em}}
\newcommand\listoffigures{%
\if@twocolumn
\@restonecoltrue\onecolumn
\else
\@restonecolfalse
\fi
\chapter*{\listfigurename}%
\@mkboth{\MakeUppercase\listfigurename}%
{\MakeUppercase\listfigurename}%
\@starttoc{lof}%
\if@restonecol\twocolumn\fi
}
\newcommand*\l@figure{\@dottedtocline{1}{1.5em}{2.3em}}
\newcommand\listoftables{%
\if@twocolumn
\@restonecoltrue\onecolumn
\else
\@restonecolfalse
\fi
\chapter*{\listtablename}%
\@mkboth{%
\MakeUppercase\listtablename}%
{\MakeUppercase\listtablename}%
\@starttoc{lot}%
\if@restonecol\twocolumn\fi
}
\let\l@table\l@figure
\newdimen\bibindent
\setlength\bibindent{1.5em}
\newenvironment{thebibliography}[1]
{\chapter*{\bibname}%
\@mkboth{\MakeUppercase\bibname}{\MakeUppercase\bibname}%
\list{\@biblabel{\@arabic\c@enumiv}}%
{\settowidth\labelwidth{\@biblabel{#1}}%
\leftmargin\labelwidth
\advance\leftmargin\labelsep
\@openbib@code
\usecounter{enumiv}%
\let\p@enumiv\@empty
\renewcommand\theenumiv{\@arabic\c@enumiv}}%
36
§ 3.2
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
La struttura della classe book
\sloppy
\clubpenalty4000
\@clubpenalty \clubpenalty
\widowpenalty4000%
\sfcode‘\.\@m}
{\def\@noitemerr
{\@latex@warning{Empty ‘thebibliography’ environment}}%
\endlist}
\newcommand\newblock{\hskip .11em\@plus.33em\@minus.07em}
\let\@openbib@code\@empty
\newenvironment{theindex}
{\if@twocolumn
\@restonecolfalse
\else
\@restonecoltrue
\fi
\twocolumn[\@makeschapterhead{\indexname}]%
\@mkboth{\MakeUppercase\indexname}%
{\MakeUppercase\indexname}%
\thispagestyle{plain}\parindent\z@
\parskip\z@ \@plus .3\p@\relax
\columnseprule \z@
\columnsep 35\p@
\let\item\@idxitem}
{\if@restonecol\onecolumn\else\clearpage\fi}
\newcommand\@idxitem{\par\hangindent 40\p@}
\newcommand\subitem{\@idxitem \hspace*{20\p@}}
\newcommand\subsubitem{\@idxitem \hspace*{30\p@}}
\newcommand\indexspace{\par \vskip 10\p@ \@plus5\p@ \@minus3\p@\relax}
\renewcommand\footnoterule{%
\kern-3\p@
\hrule\@width.4\columnwidth
\kern2.6\p@}
\@addtoreset{footnote}{chapter}
\newcommand\@makefntext[1]{%
\parindent 1em%
\noindent
\hb@[email protected]{\hss\@makefnmark}#1}
\newcommand\contentsname{Contents}
\newcommand\listfigurename{List of Figures}
\newcommand\listtablename{List of Tables}
\newcommand\bibname{Bibliography}
\newcommand\indexname{Index}
\newcommand\figurename{Figure}
\newcommand\tablename{Table}
\newcommand\partname{Part}
\newcommand\chaptername{Chapter}
\newcommand\appendixname{Appendix}
\def\today{\ifcase\month\or
January\or February\or March\or April\or May\or June\or
July\or August\or September\or October\or November\or December\fi
\space\number\day, \number\year}
37
Capitolo 3.
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
Produrre una classe partendo da zero
\setlength\columnsep{10\p@}
\setlength\columnseprule{0\p@}
\pagestyle{headings}
\pagenumbering{arabic}
\if@twoside
\else
\raggedbottom
\fi
\if@twocolumn
\twocolumn
\sloppy
\flushbottom
\else
\onecolumn
\fi
\endinput
%%
%% End of file ‘book.cls’.
3.2.1
Identificazione e opzioni
Questa sezione si riferisce alle righe da 54 a 131.
Le righe relative al file di formato e al tipo e nome di file sono le solite; se
si vuole creare una nuova classe, bisogna sempre cambiare la frase Standard
LaTeX document class in qualcosa di attinente alla nuova classe e non
usare mai quella frase per file che non siano prodotti dal LATEX3 Project
Team.
I comandi \DeclareOption sono abbastanza numerosi e corrispondono
alle varie opzioni che si possono specificare per la classe book; si noterà
che per le opzioni 10pt, 11pt e 12pt si richiede di caricare rispettivamente
i file bk10.clo, bk11.clo e bk12.clo; queste operazioni di caricamento
vengono dilazionate a dopo l’esecuzione di \ProcessOptions. Invece per
le opzioni leqno e fleqn (numeri delle equazioni a sinistra e equazioni
allineate a sinistra) viene ordinata la lettura di due altri file, rispettivamente
leqno.clo e fleqn.clo.
Prima di \ProcessOptions c’è il comando \ExecuteOptions per specificare la lista di opzioni di default, nel caso che non ne fosse stata specificata
nessuna nell’argomento facoltativo. Visto che per il formato della carta
viene predefinito il formato letterpaper, nella nuova classe si inserirà di
default a4paper, se non altro perché qui in Europa è difficile trovare carta
di formato quadrotto1 .
1
Il formato letter è di 8,5 pollici di base (215,9 mm) per 11 pollici di altezza (279,4 mm).
38
§ 3.2
La struttura della classe book
I file bk1*.clo definiscono le varie misure della gabbia di composizione
e degli spazi verticali da inserire per gli oggetti in display, e gli spazi verticali
e orizzontali da usarsi nelle liste a diversi livelli di annidamento; definiscono
inoltre qualunque lunghezza che in qualche misura debba essere collegata
al corpo normale del font in uso; in realtà tutti questi calcoli sono eseguiti
assumendo l’uso dei font della famiglia Computer Modern, e prima che
l’utente abbia caricato o specificato l’uso di altri font; si potrebbe fare di
meglio mediante il comando \AtBeginDocument, che consente di ritardare
al principio dell’esecuzione dell’istruzione \begin{document} questi calcoli
dipendenti dal font in uso.
3.2.2
Spazi tecnici e parametri per gli oggetti mobili
Questa sezione si riferisce alle righe da 132 a 148.
Seguono poi le definizioni degli spazi tecnici come, per esempio, l’interlineatura aggiuntiva, da inserire se due righe consecutive rischiano di
interferire tra loro.
I parametri per la gestione delle code degli oggetti mobili riguardano
i loro numeri massimi per le posizioni in testa e in calce alla pagina, le
frazioni di pagina massime per l’uso degli oggetti mobili in testa o in calce,
o la frazione minima della pagina da lasciare per il testo.
È molto importante sapere gestire questi parametri; nella guida (Beccari, 2011a) in un’appendice c’è una spiegazione dettagliata dell’uso di
questi parametri; specificarli in modo corretto permette di gestire bene le
code degli oggetti mobili.
3.2.3
Lo stile delle pagine
Questa sezione si riferisce alle righe da 149 a 190.
Vengono poi definiti gli stili di pagina headings e myheadings; gli stili
empty e plain sono definiti nel nucleo di LATEX.
Si nota che vengono definiti stili diversi a seconda che si componga
solo fronte oppure fronte-retro. Magari nella nuova classe da definire si
potrebbe evitare di produrre le definizioni per i due casi, se si vuole che la
nuova classe venga composta in un solo modo; se fosse così, converrebbe
Quando in Italia esisteva il formato quadrotto, esso corrispondeva a 220 mm di base per
280 mm di altezza, quasi uguale al formato letter.
39
Capitolo 3.
Produrre una classe partendo da zero
allora ridefinire le opzioni di ingresso oneside e twoside in modo che non
eseguano nessuna differente impostazione ma emettano solo un messaggio
di avviso che, comunque sia, il testo verrà composto solo in un modo.
Si nota ancora che le macro \chaptermark e \sectionmark contengono entrambi il comando \MakeUppercase; questa impostazione è uno
dei motivi per i quali esistono tanti pacchetti o classi configurabili per
riconfigurare lo stile delle pagine in modo che questa trasformazione dei
contenuti delle testatine in sole lettere maiuscole sia evitata. Piuttosto, è
meglio metterci un comando di interfaccia che vale \relax di default, ma
può venire ridefinito dall’utente della classe con un comando apposito della
classe. Questo in sostanza è quello che fanno le classi configurabili come,
per esempio, memoir o scrbook.
3.2.4
I titoli e la pagina del titolo
Questa sezione si riferisce alle righe da 191 a 276.
Per la classe book il titolo del documento viene composto in una
pagina a sé stante all’interno dell’ambiente titlepage attivato direttamente
dal comando \maketitle; se però si sceglie l’opzione notitlepage allora
\maketitle riceve una diversa definizione.
Per una nuova classe varrebbe forse la pena di far sì che il comando
\maketitle eseguisse una composizione di pagine un poco più elegante di
quella definita di default; perciò questa è una parte della classe che lascia
ampio margine di configurazione o di modifica o di riscrittura ex novo.
Si noti ancora che è quanto mai opportuno, se si vuole comporre una
pagina di titolo a sé stante, essere sicuri che sia specificata l’opzione titlepage
di default o espressamente, perché se è invece in vigore l’opzione notitlepage
la pagina composta, oltre al titolo, conterrebbe anche l’inizio del testo e
quindi dovrebbe essere numerata: infatti, le impostazioni predefinite della
classe richiedono che per la pagina che contiene il titolo non isolato venga
composta con lo stile plain, quindi con il numero di pagina centrato nel
piè di pagina.
3.2.5
Gestione dei comandi di sezionamento
Questa sezione si riferisce alle righe da 277 a 433.
40
§ 3.2
La struttura della classe book
Vengono poi impostati il contatore secnumdepth per regolare fino a
che livello vengono numerati in automatico i titoli e titolini dei comandi
di sezionamento; vengono definiti i loro contatori e il modo di scriverne il
contenuto.
Vengono definiti i tre principali comandi di sezionamento della classe
book che non scrivono niente ma in effetti suddividono il documento nelle
sue tre parti principali: le pagine iniziali, il corpo del testo e le pagine finali;
si tratta dei comandi \frontmatter, \mainmatter e \backmatter. Le
impostazioni predefinite fanno riferimento al modo di scrivere i numeri di
pagina (numeri romani nelle pagine iniziali, cifre arabe nelle pagine del corpo
del testo e in quelle finali), alla stato della variabile booleana @mainmatter
che è vera solo nel corpo del testo e falsa nelle due parti estreme; questa
variabile booleana controlla anche se i comandi di sezionamento delle parti
estreme vengono numerati e messi nell’indice. Per essere più chiari: se si
usano i comandi di sezionamento asteriscati, i relativi titoli non vengono
numerati e non vengono messi nell’indice indipendentemente dal fatto che
@mainmatter sia vera o falsa; se però @mainmatter è falsa, i comandi non
asteriscati, che normalmente producono sezioni numerate, non le numerano,
ma il loro titolo va ugualmente a finire nell’indice.
Cominciando da \part e scendendo via via fino a \subparagraph
vengono poi definiti i modi di scrivere titoli e titolini, in pagine a sé stanti
per le parti, in testa alla pagina per i capitoli, nel corpo del testo ma in
evidenza con adeguate spaziature prima e dopo da \section a \paragraph,
fino a \subparagraph il cui titolo è in linea con il testo a cui si riferisce.
Si noti che le spaziature prima e dopo i titoli, i corpi dei font da usare,
nonché i loro stili sono specificati all’interno dei vari comandi; questo implica
l’uso di pacchetti di configurazione per modificare il comportamento dei
comandi di sezionamento. Quando si produce una nuova classe questo è un
terreno fertile per introdurre comandi di interfaccia, predefiniti magari con
gli stessi valori che essi avrebbero nella classe book, ma modificabili con
comandi accessibili all’utente.
Si prenda in considerazione un’altra possibilità; come è noto, i comandi
di sezionamento possono avere un argomento facoltativo e un argomento
obbligatorio, per esempio:
\section[hTitolo brevei]{hTitolo lungoi}
41
Capitolo 3.
Produrre una classe partendo da zero
Se l’argomento facoltativo non viene specificato, esso viene reso uguale
all’argomento obbligatorio; poi questo argomento facoltativo viene scritto
nel file .toc per la costruzione dell’indice generale, e l’argomento obbligatorio viene usato per comporre per davvero il titolo nel documento e
possibilmente anche nella testatina. Quindi il comando facoltativo è un
argomento mobile, ed eventuali macro che vi fossero incluse andrebbero
protette (ma questo lo deve fare l’utente quando usa questi comandi). Non
è detto che lo stesso testo vada bene sia per l’indice sia per la testatina;
per ovviare con la classe book standard bisogna agire così:
\section[hTitolo brevei]{hTitolo lungoi}
\markright{hTitolo per la testatinai}
Allora tra le modifiche della nuova classe si potrebbe definire un comando
\section che accetta due argomenti facoltativi:
\section[hTitolo brevei][hTitolo per la testatinai]{hTitolo lungoi}
dove il secondo argomento facoltativo può venire usato solo se si è usato
anche il primo. Per fare ciò non basta ricorrere ai pacchetti di personalizzazione, ma bisogna scrivere direttamente comandi di definizione ricorrendo a
comandi di basso livello, e curando di definire comunque comandi robusti;
in questo aiuta molto il pacchetto etoolbox che dispone di due comandi
\robustify e \protecting per rendere robusti comandi che potrebbero
essere fragili; quel pacchetto permette anche di definire direttamente comandi protetti, cioè robusti, e di verificare se determinati comandi lo siano.
Si può anche sbirciare nel codice della classe memoir dove i comandi di
sezionamento con due argomenti facoltativi sono già definiti.
3.2.6
Le liste
Questa sezione si riferisce alle righe da 434 a 533.
Proseguendo l’analisi della classe book si arriva alle impostazioni per le
liste e i loro contatori; si definiscono i vari rientri dipendenti dal livello di
annidamento di una lista dentro un’altra; per i contatori si definiscono i modi
di stampare il loro valore, sia in generale, sia nella lista, sia nei richiami di
42
§ 3.2
La struttura della classe book
elementi di una lista. Per esempio, il contatore LATEX enumii2 viene scritto
con il comando \theenumii, ma nella lista viene scritto come definito dal
comando \labelenumii, mentre in un riferimento incrociato viene scritto
premettendogli un prefisso definito con \p@enumii; quindi, proseguendo
l’esempio, se il contatore enumi contiene il valore 3 e il contatore enumii
contiene il valore 2, allora \theenumii produce b; nella lista compare
l’etichetta prodotta da \labelenumii (b); in una citazione del secondo
elemento della lista annidata nel terzo elemento della prima lista compare
3(b). Come si vede il meccanismo è piuttosto complesso, ma è funzionale.
Queste definizioni riguardano solo l’ambiente enumerate definito nel
nucleo di LATEX, come anche l’ambiente itemize; le altre liste description,
verse, quotation e quote3 sono definite subito dopo. Si noti che la lista
description consente di definire facilmente un diverso modo di scrivere
l’etichetta mediante \descriptionlabel; non ci si stupisca troppo per la
presenza iniziale di uno spostamento orizzontale pari a \labelsep; questo
fatto apparentemente incomprensibile dipende dal modo particolare con
cui l’ambiente list compone l’etichetta. Come è tradizione in questo genere
di comandi LATEX, le caratteristiche stilistiche di scrittura dell’etichetta
(font, serie, forma, corpo) sono definite nei comandi stessi, ma sarebbe
più interessante se ci fosse un comando di interfaccia e un comando per
l’utente per modificare il modo di scrivere l’etichetta. Tuttavia in questo
caso ridefinire l’intero comando \descriptionlabel non è così complicato,
ma la soluzione precedente sarebbe decisamente preferibile; quella soluzione,
in effetti, è quella praticata dal pacchetto enumitem, dalla classe memoir
e dalle classi della collezione Koma-Script.
2
Il comando LATEX \newcounter definisce un nome di contatore, ma l’algoritmo di
allocazione attribuisce quel nome ad una control sequence ottenuta premettendo al nome
la stringa c@: il nome del contatore enumii viene usato per identificare il contatore
\c@enumii. LATEX fornisce i meccanismi per agire sui contatori attraverso il loro nomi,
ma per usare i contatori LATEX bisogna sempre agire attraverso comandi che usano il nome
per accedere al contatore; tipico è il comando \value con il quale si accede al contenuto
del contatore; con il linguaggio primitivo di TEX queste cose sono molto più semplici. Ci
si ricordi anche che le assegnazioni ai contatori LATEX sono sempre assegnazioni globali,
che prescindono dai limiti dei gruppi.
3
Questi ultimi ambienti non sono delle vere liste, ma sono definiti in termini del
comando/ambiente \list che è utilissimo per gestire ogni minimo dettaglio compositivo
delle liste, anche “finte”, ma che gli utenti non usano quasi mai; la documentazione
dell’ambiente list riportata in (Beccari, 2011a) descrive ogni parametro di configurazione
di list.
43
Capitolo 3.
Produrre una classe partendo da zero
In questa sezione si ridefinisce anche l’ambiente titlepage che logicamente
sarebbe stato più agevole da trattare se fosse stato adiacente alla definizione
di \maketitle.
Anche il comando \appendix è definito qui. Sarebbe stato più facile
da gestire se fosse stato collocato più vicino alla definizione di \chapter.
3.2.7
Tabelle e matrici, figure e tavole
Questa sezione si riferisce alle righe da 534 a 584.
La classe prosegue definendo i parametri stilistici per la composizione
di tabulazioni, tabelle e matrici, i cui ambienti sono definiti nel nucleo di
LATEX.
Un po’ disordinatamente qui vengono impostati i parametri stilistici per
le scatole riquadrate \fbox e \framebox; viene definito il contatore delle
equazioni, che viene azzerato ad ogni nuovo capitolo; necessariamente viene
quindi ridefinito anche il modo di scrivere questo contatore. Lo stesso viene
fatto per i contatori figure e table dei rispettivi ambienti, che vengono
definiti subito dopo.
Logicamente viene qui definito il comando \caption e il modo di
comporlo; è il posto giusto, ma manca una definizione di \caption* per
una didascalia non numerata. E manca la possibilità di gestire la posizione
della didascalia, sopra o sotto la figura o tabella. Anche questo è un terreno
fertile per modifiche e aggiunte.
3.2.8
I vecchi comandi per i font
Questa sezione si riferisce alle righe da 585 a 593.
Le nove definizioni dei comandi del vecchio LATEX 209 potrebbero venire
completamente cancellate da una nuova classe che non avrebbe problemi di
compatibilità con i vecchi file scritti prima del 1994. Ci sono alcuni utenti
che desiderano ancora usare questi comandi, ma non è opportuno usarli;
sia nel testo sia in matematica si comportano diversamente da come lo
fanno i corrispondenti comandi LATEX 2ε .
Si potrebbero lasciare modificandoli in modo che diventino sostanzialmente equivalenti alle corrispondenti dichiarazioni togliendo il comando
\normalfont che compare nelle definizioni. Ci sono ragioni a favore e contro una simile modifica, quindi sta al creatore della nuova classe decidere
44
§ 3.2
La struttura della classe book
come fare. Io preferirei eliminare quelle definizioni lasciando che durante la
compilazione sia LATEX stesso a dire con un messaggio di errore che quei
comandi non sono definiti.
3.2.9
Indici ed elenchi di oggetti mobili
Questa sezione si riferisce alle righe da 594 a 671.
Vengono poi definiti i parametri dimensionali e stilistici dell’indice generale e degli elenchi delle figure e delle tabelle. In questa parte viene anche
impostato il contatore tocdepth che regola quali comandi di sezionamento
compaiono nell’indice.
Qui viene definito il comando \tableofcontents, ma vengono definiti
anche i comandi \l@part, \l@chapter, eccetera, fino a \l@subparagraph,
per descrivere il modo di comporre ogni voce dell’indice, differenziata nello
stile a seconda del comando di sezionamento che l’ha prodotta. Corrispondentemente, vengono definiti i comandi \listoffigures e \listoftables
e il modo di comporre le rispettive voci con i comandi \l@figure e
\l@table. Attenzione: \l@table viene reso equivalente mediante \let al
comando \l@figure; per cui, se quest’ultimo venisse ridefinito in seguito,
il primo manterrebbe la definizione precedente a meno che non si stabilisca
una nuova equivalenza.
Bisogna ancora fare attenzione che i comandi per gli elenchi delle figure
e delle tabelle fanno uso del comando \chapter*, quindi i loro titoli non
sono numerati ma non vanno nemmeno a finire nell’indice. Non solo, ma
viene usato di nuovo il comando \MakeUppercase per le testatine. Visto
che questi elenchi insieme all’indice generale devono essere composti solo
nella parte iniziale o solo nella parte finale del documento, sarebbe molto
desiderabile che si usasse il comando \chapter ma inserendo questi comandi nella front matter oppure nella back matter, cosicché non verrebbero
numerati ma andrebbero direttamente nell’indice generale. Piuttosto si
definiscono dei nuovi comandi del tipo \listoffigures* in cui viene eliminata la possibilità di numerare e di inserire la voce nell’indice. Sono
cose da pensare per la nuova classe e sarebbe utile se si mantenesse una
certa omogeneità con altre classi, come memoir, dove i comandi asteriscati
esistono già.
45
Capitolo 3.
3.2.10
Produrre una classe partendo da zero
La bibliografia e l’indice analitico
Questa sezione si riferisce alle righe da 672 a 713.
Vengono definiti gli ambienti thebibliography e theindex; anche qui, come
nell’indice generale viene usato il comando \chapter* e per le testatine
viene di nuovo usato il comando \MakeUppercase; sono gli stessi problemi
che si hanno con gli elenchi delle tabelle e delle figure e vanno affrontati e
risolti nello stesso modo.
Si badi bene a non confondere lo stile di composizione della bibliografia
e dell’indice analitico con lo stile della bibliografia e dell’indice analitico;
lo stile di composizione dipende dalla classe e stabilisce la giustezza delle
righe, i font, gli spazi, eccetera; la classe gestisce l’aspetto tipografico. Lo
stile della bibliografia dipende da quali informazioni vi vengono inserite,
se le voci sono numerate o etichettate in qualche modo o sono prive di
etichetta, eccetera. Gli ambienti thebibliography e theindex sono riempiti
con le informazioni che ci mettono dentro i programmi esterni BibTeX
e makeindex e queste informazioni dipendono rispettivamente dai file di
stile .bst o .ist; se si usa il pacchetto biblatex e magari il motore
di elaborazione della bibliografia biber, il modo di procedere è diverso e
si affida ad un interfaccia a parole chiave, ma il concetto sottostante è
sostanzialmente lo stesso: lo stile di composizione dipende da che cosa il
programma di elaborazione della bibliografia ha scritto dentro l’ambiente
thebibliography. Per la bibliografia è l’utente stesso che, con il comando
\bibliographystyle o con le opzioni per biblatex, sceglie quale stile
bibliografico usare, mentre con makeindex questo stile può venire scelto solo
dando a mano nel terminale o prompt dei comandi il comando letterale con
tutte le opzioni necessarie, compreso il nome del file .ist, a meno che. . .
A meno che nella nuova classe non si richieda di default l’uso del pacchetto imakeidx (Beccari e Gregorio, 2010) che, con classi basate
sul modello di book, consente all’utente di specificare il titolo dell’indice analitico, il file di stile con cui comporlo, il motore di elaborazione
per ordinare l’indice analitico alfabeticamente e strutturalmente; infine
imakeidx consente di comporre uno o più indici analitici in modo sincrono
con l’esecuzione di pdfLaTeX o di XeLaTeX. Anche per un solo indice del
tutto ordinario, con il titolo di default e lo stile .ist di default, questo
pacchetto è comodissimo perché consente di avere sempre l’indice analitico
coerente con il documento nel quale compare.
46
§ 3.2
3.2.11
La struttura della classe book
Definizioni finali e di default
Questa sezione si riferisce alle righe da 714 a 752.
La classe book termina con alcune impostazioni stilistiche per le note,
per assoggettare il contatore delle note a quello dei capitoli, cosicché le
note al piede ricominciano da 1 ad ogni nuovo capitolo.
Vengono eseguite le definizioni di default in inglese (la lingua di default
se non si carica babel o polyglossia); tutti questi “nomi” vengono automaticamente cambiati ogni volta che si cambia lingua ricorrendo ai comandi
definiti da babel e polyglossia; ma questi, come i font del documento, è
bene che siano scelti dall’utente nel suo preambolo.
La classe finisce senza impostare la dichiarazione \frontmatter. Forse
è giusto che sia così, ma ritengo che la cosa sia da specificare bene nella documentazione. Io preferirei impostare \frontmatter di default, obbligando
quindi l’utente ad accorgersi che è obbligato a usare anche \mainmatter
e \backmatter, mentre se deve essere lui a pensare di cominciare con
\frontmatter non prenderà mai l’abitudine e non comporrà mai in modo
corretto; poi se vuole può anche ridefinirsi il comando \frontmatter come
preferisce; per esempio, ci sono utenti che desiderano avere una numerazione in cifre arabe delle pagine senza differenze fra pagine iniziali, centrali
o finali e senza ricominciare da 1 alla parte centrale. Per essere sicuri
che le impostazioni siano eseguite all’inizio del documento, e non siano
prese in considerazione le impostazioni che via via l’utente ha definito
nel preambolo, si può usare il comando \AtBeginDocument, il cui argomento (costruito cumulativamente ad ogni impiego di questo comando)
contenga cose che vengono eseguite solo durante l’esecuzione dell’istruzione
\begin{document}.
A questo proposito, i comandi \AtBeginDocument e \AtEndDocument
sono definiti nel nucleo di LATEX; il pacchetto etoolbox ne aggiunge diversi
altri che permettono di aggiungere l’esecuzione di comandi all’inizio, a
metà o alla fine di \begin{document} e all’inizio, a metà o alla fine di
\end{document}. Anzi, la lettura di Lehman (2011b) permette di capire
meglio le operazioni delegate all’apertura e alla chiusura di quell’ambiente
particolare che si chiama document.
47
Capitolo 3.
3.3
Produrre una classe partendo da zero
Verifica del funzionamento di una nuova classe
Questa parte, in un certo senso, è più difficile che non scrivere una nuova
classe a partire da un modello.
Bisogna cioè costruire un file di prova .tex che faccia uso della classe da
verificare e che usi ogni comando, ogni impostazione, ogni ambiente, ogni
lista, ogni oggetto flottante vecchio e nuovo, tutti i comandi di sezionamento
che la classe contenga.
Risulta più facile se questo file viene costruito via via che si crea la classe
in modo da inserire subito quei blocchi del file sorgente che permettano
di eseguire la verifica di quel che è già stato implementato. Durante le
verifiche non ci si dimentichi di leggere con attenzione il file .log; spesso
vi si nascondono insidie che non appaiono dal risultato della composizione
del file di prova.
Per non dover scervellarsi a trovare testi fasulli per riempire di testo
diverse pagine del file di prova, esiste anche il pacchetto lipsum per generare
del testo in latinorum; un testo che non significa niente composto da
parole messe insieme con pezzi di parole latine. Se un testo così assurdo
desse fastidio, si può usare il pacchetto kantlipsum, il cui scopo è lo
stesso di lipsum, ma il cui contenuto contiene dei brani in linguaggio
pseudo-kantiano e in inglese.
48
Classe per comporre lettere
personalizzate
4
Nel forum guIt compaiono spesso domande relative alla personalizzazione
di classi per comporre lettere. Spesso la personalizzazione implica un lavoro
delicato perché una lettera è comunque un oggetto molto personale, sia per
le parte grafica dell’intestazione sia per lo stile della prosa usata.
In questo capitolo si mostra come costruire una classe per scrivere lettere;
una classe minimale, ma pur sempre capace di essere molto configurabile
ed estensibile; ed è quindi adatta a molti usi; tuttavia il suo uso principale
è proprio quello di mostrare come fare.
Attenzione; il codice non è banale; i pacchetti usati sono pochi, ma
secondo chi scrive, sono molto utili propio per aiutare a creare un file di
classe. Si notino i pacchetti usati: etoolbox, sempre consigliabile per
scrivere codice; graphicx, usato non solo per servirsi del suo comando
\includegraphics, ma anche di altri comandi meno noti; picture, che
estende le funzionalità dell’ambiente nativo di LATEX, picture, per fare
semplici disegni, ma qui usato per collocare oggetti in posizioni le cui
coordinate sono parametrizzate alle dimensioni della carta e della gabbia
di stampa; geometry, per definire la geometria delle pagine della lettera.
In ogni caso spesso verrà usato linguaggio nativo di TEX; non necessariamente perché migliore o più efficiente di quello di LATEX, ma perché
certe funzionalità non sono direttamente disponibili in LATEX.
Il risultato si può vedere1 nella pagina 50.
È importante sottolineare l’importanza di leggere il file .dtx riportato
a partire dalla pagina 58; qui ci si limita a commentare alcune piccole cose
che sembrano un po’ meno comuni.
U ti l i z
z
ri
ato
Gru
p
guIt
po
t
bbI
a li
X
ani di TE
Rivoli, 18 marzo 2015
Mario Rossi
Via Giacomo Matteotti, 40
10098 RIVOLI (TO)
Telefono: (+39) 011 9520000
E-mail: [email protected]
Web: www.guitex.org
Cara prof. Bianchi,
le scrivo per chiederle la cortesia di inviarmi per posta elettronica il programma
della sua nuova guida sugli allineamenti verticali, indicando nel contempo una
previsione sui tempi di realizzazione.
Le ricordo che salvo rarissime eccezioni, tutte le guide tematiche non superano
le 100 pagine.
I frequentatori del Forum del guIt sono ansiosi di vedere al luce della nuova
guida che compre un’area raramente trattata nelle guide generaliste, ma che riveste
una notevole importanza tipografica.
As any dedicated reader can clearly see, the Ideal of practical reason is a
representation of, as far as I know, the things in themselves; as I have shown
elsewhere, the phenomena should only be used as a canon for our understanding.
The paralogisms of practical reason are what first give rise to the architectonic of
practical reason. As will easily be shown in the next section, reason would thereby
be made to contradict, in view of these considerations, the Ideal of practical reason,
yet the manifold depends on the phenomena. Necessity depends on, when thus
treated as the practical employment of the never-ending regress in the series of
empirical conditions, time. Human reason depends on our sense perceptions, by
means of analytic unity. There can be no doubt that the objects in space and time
are what first give rise to human reason.
Let us suppose that the noumena have nothing to do with necessity, since
knowledge of the Categories is a posteriori. Hume tells us that the transcendental
Oggetto: La guida tematica sugli allineamenti verticali
E p. c. Vincenzo Verdi
Via Gradenigo, 215
11100 GENOVA
po
U ti l i z
z
guIt
Gru
p
Gruppo utenti Italiani di TEX e LATEX
Allegati: Guida 2015-15.pdf
2
Mario Rossi
Curatore delle Guide Tematiche
del guIt
unity of apperception can not take account of the discipline of natural reason, by
means of analytic unity. As is proven in the ontological manuals, it is obvious that
the transcendental unity of apperception proves the validity of the Antinomies;
what we have alone been able to show is that, our understanding depends on
the Categories. It remains a mystery why the Ideal stands in need of reason. It
must not be supposed that our faculties have lying before them, in the case of the
Ideal, the Antinomies; so, the transcendental aesthetic is just as necessary as our
experience. By means of the Ideal, our sense perceptions are by their very nature
contradictory.
Con i miei saluti più cordiali
a li
X
ani di TE
t
bbI
Giovanna Bianchi
Via Garibaldi, 35
61029 URBINO (PU)
Gruppo utenti Italiani di TEX e LATEX
bb
ri
bb
ato
§ 4.1
4.1
Commento alla classe
Commento alla classe
Come al solito le righe dalla 1 alla 41 sono dedicate all’estrazione automatica
del codice dal file .dtx.
Le righe dalla 43 alla 111 contengono la parte che serve per stampare
la documentazione; questa parte è insolitamente lunga, perché ci sono le
definizioni di molti comandi utili per scrivere codice documentato; sono
comandi che l’autore usa solitamente per scrivere codice all’interno del testo
descrittivo; l’autore trova molto comodi questi comandi, ma naturalmente
si tratta di gusti personali. Non tutte quelle macro vengono usate nella
parte descrittiva, ma l’insieme di quei comandi viene tramandato tale e
quale da un documento all’altro; non si è ritenuto opportuno di farne
un pacchetto personale, perché questo non sarebbe disponibile quando si
inviano i file .dtx all’archivio ctan.
Dalla riga 116 fino alla riga 350 c’è la parte relativa allo scopo e
all’uso della classe, con la descrizione dei comandi disponibili per inserire le
informazioni necessarie alla composizione della lettera e per personalizzare
alcune stringhe. Vi sono esplicitati alcuni consigli; nonostante l’estrema
importanza di questa parte per l’utente finale, questa parte non contiene
informazioni particolari.
Dalla riga 354 alla fine del file c’è la descrizione del codice e del perché
certi comandi sono stati fatti proprio in quel modo. Se l’utente vuole
modificare qualche parte, copia il codice sorgente della parte da modificare,
lo inserisce in un file con estensione .sty o con estensione .tex e poi lo
può modificare come desidera, sempre che sappia come farlo e che sappia
quello che sta facendo; con queste parole non si mettono in dubbio le
competenze di chi vuole apportare delle modifiche, ma si sottolinea il fatto
che le modifiche non consistono nel semplice uso di comandi già predisposti.
Poi l’utente immetterà questi file personali mediante il file di configurazione, nell’ipotesi che la maggior parte di tali modifiche servano solo per
modificare lettere specifiche. Una piccola attenzione: se questi file vengono
letti mediante il file di configurazione, allora quelli con estensione .sty
vanno letti ricorrendo a \RequirePackage; invece quelli con estensione
.tex vanno letti mediante \input. Se le modifiche alla classe dovessero
essere permanenti, sarebbe meglio che l’utente copiasse l’intera classe, e la
salvasse con un nome diverso, dopo di che può apportare tutte le modifiche
che vuole a questa sua versione con il nome cambiato.
51
Capitolo 4.
Classe per comporre lettere personalizzate
Qui non verrano commentate tutte le righe del codice. Il file lettera.cls,
in totale, tolti i commenti iniziali e quelli finali, ammonta a solo 140 righe.
Si noterà per altro che viene usata la classe article come classe di base,
su cui costruire la classe lettera. Con il pacchetto geometry si stabiliscono i
margini parametrizzati alla dimensioni della carta, non mediante misure assolute. In questo modo la lettera può essere composta su carta di qualunque
formato fra quelli accettabili dalla classe article. La classe è stata collaudata con le opzioni a4paper, b5paper, a5paper, letterpaper, legalpaer, e
executivepaper constatando che l’aspetto della lettera ovviamente cambia,
ma la composizione avviene in modo armonico con tutti e sei i formati.
Con lo specifico testo della lettera mostrata nella pagina 50, si nota che
con legalpaper la firma cade da sola nella seconda pagina; questo non è un
caso insolito: lo si cura semplicemente cambiando il testo, oppure inserendo
un comando \newpage prima dei saluti, o con qualche altro espediente;
certo mettere la firma da sola nell’ultima pagina è poco elegante e non è
accettabile e va evitata nel modo più assoluto, ma non lo si può ottenere in
modo automatico. Ecco un altro motivo per il quale una classe per scrivere
lettere deve sempre venire usata con cautela e con molta attenzione.
Il pacchetto babel è caricato solo se si usa come programma di composizione pdflatex; se si usasse per esempio xelatex non sarebbe preimpostato
nulla in merito alle lingue e l’utente dovrebbe provvedere autonomamente
a caricare polyglossia e a specificare la lingua da usare. Invece, con
pdflatex, avendo precaricato babel con l’opzione italian, questo pacchetto
non può più essere caricato nuovamente dall’utente, ma se vuole usare una
lingua diversa dall’italiano, dovrebbe inserirne l’opzione corrispondente fra
le opzioni della classe lettera.
Dalla riga 437 alla riga 477 sono definiti i comandi per impostare le
stringhe con i nomi, gli indirizzi e ogni altra informazione che possa servire
per comporre una lettera; vengono anche definiti i comandi per ridefinire
le parole fisse.
Subito dopo, se esiste, viene letto il file di configurazione in modo che
tutti questi comandi possono venire ridefiniti mediante quanto contenuto
nel file di configurazione.
Successivamente, dalla riga 499, alla riga 546 vengono definiti i due
stili di pagina, quello per la prima o unica pagina della lettera e quello
per le pagine successive. Si noti l’uso del comando \smash: serve per
“schiacciare” le scatole che contengono i vari oggetti in modo che le loro
52
§ 4.1
Commento alla classe
altezze e profondità appaiano nulle; lo stesso si ottiene con i due parametri
facoltativi del comando \raisebox; entrambi sono comandi LATEX che però
vengono usati raramente dall’utente comune.
Per lo stile della prima pagina si noti come è stato creato il “piedino”
con le informazioni riguardanti il mittente. si tratta di tue tabelle, di una
sola colonna ciascuna, contenute dentro scatole di dimensioni apparenti
nulle, al fine di non doversi impegnare con la ripartizione dello spazio fra
la tabella di sinistra e quella di destra; infatti, mettendo le tabelle dentro
scatole di larghezza nulla, la loro larghezza effettiva viene nascosta; è chiaro
che così facendo se le scatole sono troppo larghe, si possono sovrapporre in
parte. Non sarebbe una cosa tanto strana; anche con il pacchetto fancyhdr
sia le testatine sia i piedini sono divisi in tre parti, ciascuna contenuta
in scatole di larghezza nulla; se i loro contenuti sono troppo larghi, si
sovrappongono.
Nella testatina della prima pagina compare il comando \foldingmarks;
serve per comporre i segni di piegatura in tre; questo comando agisce solo se
la variabile booleana Aquattro è vera, perciò i segni di piegatura vengono
inseriti solo se si compone su carta ISO A4. Il comando in sé viene definito
dal codice compreso fra le righe 557 e 563.
Come si vede esso è un codice di pochissime righe, dove compaiono
un po’ di “sporchi trucchi”, i famosi “dirty tricks” già usati anche da
Knuth. Vi compare un ambiente picture (nativo di LATEX) di dimensioni
nulle, ma con l’origine spostata in una posizione la cui ordinata è espressa
mediante le dimensioni effettive del margine superiore e dell’altezza della
testatina; quindi l’origine viene spostata in alto fino al bordo della carta,
sulla verticale della gabbia di stampa. I successivi comandi \put pongono
il loro contenuto in posizioni relative all’origine della figura, spostate in
basso rispettivamente di in terzo e di due terzi dell’altezza della pagina,
ma spostati indietro al bordo sinistro del foglio. Ecco quindi che le due
lineette di piegatura vengono poste sul bordo sinistro dividendolo in tre
parti uguali.
Si finisce poi con l’ambiente lettera, definito con il codice riportato
dalla riga 577 fino alla 597. Non c’è niente di particolare che non sia
già descritto nel codice di spiegazione. Si sottolinea il fatto che, sempre
grazie al pacchetto picture caricato dalla classe, le varie dimensioni per
collocare la finestra dell’indirizzo sono in parte assolute in parte relative
alla dimensione della pagina e della gabbia di stampa. Questo dipende dal
53
Capitolo 4.
Classe per comporre lettere personalizzate
99 mm
110 mm
39 mm
16 mm
229 mm
16 mm
Figura 4.1
Le dimensioni di una busta commerciale
fatto che l’indirizzo del destinatario richiede uno spazio assoluto, visto che
è scritto con i font di default e non si può modificare il corpo di questi font
in proporzione alle dimensioni della carta. Nello stesso tempo la posizione
delle finestra dovrebbe essere in corrispondenza della finestra della busta, la
quale ha dimensioni adatte ma non proporzionali alle dimensioni della carta
che deve essere introdotta nella busta; in Italia le buste con finestra sono
disponibili solo per la carta ISO A4; una busta con finestra regolarmente
in commercio ha le dimensioni della finestra di 99 mm per 39 mm, e i suoi
bordi sono a 16 mm sia dal bordo inferiore sia dal bordo destro; si veda la
figura 4.1.
La posizione della finestra dell’indirizzo sulla prima pagina della lettera
è collocata con una certa tolleranza rispetto alla finestra della busta, perché
la busta, per ovvi motivi, è più grande del foglio ISO A4 piegato in tre,
che sarebbe di 210 mm per 99 mm. In commercio esistono anche buste
per fogli ISO A4 leggermente più grandi di quelle indicate nella figura 4.1;
a maggior ragione una certa tolleranza è d’obbligo. Questa tolleranza si
realizza essenzialmente con delle dimensioni minori sulla prima pagina della
lettera, rispetto alla finestra sulla busta.
La classe termina con le due righe 599 e 600, dove per la stile delle
pagine si specifica come predefinito quello per le pagine successive alla
prima: per la prima viene specificato il suo stile come valido per una sola
54
§ 4.1
Commento alla classe
pagina, ma se ne ritarda la specificazione alla fine del preambolo, cioè
alla fine dell’insieme di comandi eseguiti dall’istruzione \begin{document}.
Si noti che LATEX, da solo, provvede solo il comando \AtBeginDocument,
mentre il pacchetto etoolbox fornisce fornisce altri comandi che ritardano
l’esecuzione dei comandi contenuti nel loro argomento in punti diversi lungo
la serie di istruzioni che vengono eseguite da \begin{document}
Finalmente il codice per generare un modello di file di configurazione
è riportato nelle righe 669-677. Questo file di configurazione è particolarmente semplice, ma con le istruzioni indicate sia un questo testo sia
nella documentazione della classe non dovrebbe essere difficile costruire file di configurazione più complessi, che contengano anche comandi
\RequirePackage e/o \input per immettere ridefinizioni di alcune parti
di codice; si raccomanda di ritardare queste ridefinizioni alla specificazione
di inizio del documento, mediante il comando \AtBeginDocument.
Va da sé che il codice, qui presentato sotto forma di file .dtx riprodotto
nelle pagine di questa guide, può essere selezionato e copiato pagina dopo pagina dal file PDF, e incollato in un file da salvare con il nome lettera.dtx;
lo si può elaborare con pdflatex e si ottengono contemporaneamente la
documentazione ben composta e i file lettera.cls e lettera.cfg. Se si
pensa di volerli usare per scrivere le proprie lettere, è opportuno spostare il file PDF ottenuto nella cartella $Home/texmf/doc/latex/lettera/
e gli altri due nella cartella $HOME/texmf/tex/latex/lettera/; $HOME
rappresenta la radice del proprio albero personale per il sistema TEX; in
Windows, potrebbe essere qualcosa come C:\Users\hnome utentei\. in
Linux potrebbe essere semplicemente ~/; in Mac OS X potrebbe essere
~/Library/. Inoltre se l’albero non esiste o se le cartelle indicate non
esistono bisogna crearle con gli strumenti propri di ogni sistema operativo;
con MiKTeX è necessario anche creare o aggiornare il database dei nomi
dei file relativo all’albero personale; con TeX Live non è necessario.
Un esempio d’uso della classe è riportato nella pagina 50 composto con
il codice seguente.
1
2
% !TEX TS-program = pdflatex
% !TEX encoding = UTF-8 Unicode
3
4
5
6
\documentclass[12pt,a4paper]{lettera}
\usepackage[T1]{fontenc}
55
Capitolo 4.
7
8
9
10
11
Classe per comporre lettere personalizzate
\usepackage{lmodern}
\usepackage[utf8]{inputenc}
\usepackage{guit}
\usepackage{kantlipsum}% Per generare testo di riempimento.
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
\mittente{Mario Rossi}
\indirizzomittente{Via Giacomo Matteotti, 40\\
10098 RIVOLI (TO)}
\telefono{(+39) 011 9520000}
\email{[email protected]}
\web{www.guitex.org}
\destinatario{Giovanna Bianchi}
\indirizzodestinatario{Via Garibaldi, 35\newline
61029 URBINO (PU)}
\logo{../LogoGuITtondo}
\ragionesociale{\textsf{Gruppo utenti Italiani di \TeX\ e \LaTeX}}
\allegati{Guida 2015-15.pdf}
\Noggetto{\textbf{Oggetto}:}
\Nallegati{\textbf{Allegati}:}
\oggetto{La guida tematica sugli allineamenti verticali}
\data{\mbox{}\hfill Rivoli, 18 marzo 2015}
\perconoscenza{Vincenzo Verdi\\ Via Gradenigo, 215\\
11100 GENOVA}
32
33
34
35
\begin{document}
\begin{lettera}
36
37
38
39
40
41
42
43
44
45
46
47
\noindent Cara prof.~Bianchi,\\
le scrivo per chiederle la cortesia di inviarmi per posta elettronica
il programma della sua nuova guida sugli allineamenti verticali,
indicando nel contempo una previsione sui tempi di realizzazione.
Le ricordo che salvo rarissime eccezioni, tutte le guide tematiche
non superano le 100 pagine.
I frequentatori del Forum del \GuIT\ sono ansiosi di vedere al luce
della nuova guida che compre un’area raramente trattata nelle guide
56
§ 4.2
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
generaliste, ma che riveste una notevole importanza tipografica.
\kant[1-2]% due capoversi di riempimento
Con i miei saluti più cordiali
\begin{flushright}
\begin{minipage}{0.5\textwidth}
\vspace*{2\baselineskip}
\centering
Mario Rossi\\
Curatore delle Guide Tematiche\\
del \GuIT
\end{minipage}
\end{flushright}
\end{lettera}
\end{document}
4.2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Il file lettera.dtx
Il file lettera.dtx
%\iffalse
% !TEX encoding = UTF-8 Unicode
% !TEX TS-program = pdflatex
%<*system>
\begingroup
\input docstrip.tex
\keepsilent
\preamble
________________________________________
The lettera class for typesetting a letter
Copyright (C) 2015 A. Utore
All rights reserved
License information appended
\endpreamble
\postamble
Copyright 2015 A. Utore
Distributable under the LaTeX Project Public License,
version 1.3c or higher (your choice). The latest version of
this license is at: http://www.latex-project.org/lppl.txt
This Work has the status of ‘maintained’
The Current Maintainer is A. Utore
57
Capitolo 4.
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
Classe per comporre lettere personalizzate
This work consists of this file lettera.dtx, and the derived
files lettera.cls, lettera.cfg, and lettera.pdf.
\endpostamble
\askforoverwritefalse
%
\generate{\file{lettera.cls}{\from{lettera.dtx}{class}}}
\generate{\file{lettera.cfg}{\from{lettera.dtx}{cconf}}}
%
\def\tmpa{plain}
\ifx\tmpa\fmtname\endgroup\expandafter\bye\fi
\endgroup
%</system>
% \fi
%
% \iffalse
%<*driver>
\ProvidesFile{lettera.dtx}
%</driver>
%<class>\NeedsTeXFormat{LaTeX2e}[2009/01/01]
%<class>\ProvidesClass{lettera}%
%<*class>
[2015/03/18 v.1.0 Classe per la composizione di lettere di diverse pagine]
%</class>
%<*driver>
\documentclass[a4paper]{ltxdoc}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage[italian]{babel}
\usepackage{multicol,pict2e}
\usepackage{guit}% carica anche xcolor
\hfuzz 10pt
%
\makeatletter
\newbox\mysintassi
\newenvironment{sintassi}{\begin{flushleft}\fboxsep=6pt
\begin{lrbox}{\mysintassi}%
\begin{minipage}{\dimexpr\linewidth-2\fboxsep-2\fboxrule}\obeylines
}{%
\end{minipage}\end{lrbox}%
\fbox{\box\mysintassi}\end{flushleft}%
}
\providecommand*\meta[1]{$\langle${\normalfont\textit{#1}}$\rangle$}
\providecommand*\marg[1]{\texttt{\char123}\meta{#1}\texttt{\char125}}
\providecommand*\oarg[1]{\texttt{[}\meta{#1}\texttt{]}}
\def\GT@splitargs#1,#2!{\def\@tempA{#1}\def\@tempB{#2}}
\newcommand\garg[1]{\GT@splitargs#1!%
\texttt{(}\meta{\@tempA}\texttt{,}\meta{\@tempB}\texttt{)}}
\newcommand*\comando[1]{\texttt{\string#1}}
\renewcommand*{\cs}[1]{%
58
§ 4.2
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
Il file lettera.dtx
\texttt{\char92#1}\index{#1@\texttt{\char92#1}}}
\let\csindex\cs
\newcommand*\Sambiente[2]{%
\cs{begin}\marg{#1}\oarg{#2} \dots\ \cs{end}\marg{#1}}
\newcommand*\Dambiente[3]{%
\cs{begin}\marg{#1}\oarg{#2}\oarg{#3} \dots\ \cs{end}\marg{#1}}
\newcommand*\Bambiente[1]{\cs{begin}\texttt{\char123#1\char125}}
\newcommand*\Eambiente[1]{\cs{end}\texttt{\char123#1\char125}}
\newcommand*\Arg[1]{\texttt{\char123\relax#1\char125}}
\newcommand*\prog[1]{\textsf{#1}}
\newcommand*\pack[1]{\textsf{\slshape#1}}
\newcommand*\amb[1]{\textit{#1}}
\newcommand*\class[1]{{\fontshape{ui}\selectfont#1}}
\newcommand*\file[1]{\texttt{#1}}
\newcommand*\opz[1]{\textsl{#1}}
\makeatother
%
\setactivedoublequote
%
\begin{document}\errorcontextlines=9
\GetFileInfo{lettera.dtx}
\date{Versione numero: \fileversion; ultima revisione: \filedate}
\title{La classe \texttt{\filename}}
\author{%
A. Utore\thanks{e-mail \texttt{augusto dot utore at server dot domain}}}
\maketitle
\columnseprule0.5pt
\begin{multicols}{2}
\tableofcontents
\end{multicols}
\DocInput{lettera.dtx}
\end{document}
%</driver>
% \fi
%
% \CheckSum{384}
%
% \begin{abstract}
% Questa classe mostra come creare una classe per scrivere lettere nelle
% quali la prima pagina sia dotata di una vistosa testata (accademica,
% aziendale, professionale, o altro) e contenga le coordinate del mittente
% in calce. Nelle pagina successive la testata sarà molto più sobria,
% mancheranno le coordinate del mittente, ma il piedino conterrà centrato il
% numero progressivo di pagina. Le altre informazioni come l’indirizzo del
% destinatario, l’oggetto, le formule di apertura e di chiusura compaiono
% normalmente. La lettera viene scritta in italiano; nulla vieta di
% scrivere il corpo della lettera in un’altra lingua, ma la specificazione
% della lingua va fatta mediante le opzioni della classe.
% \end{abstract}
%
%\section{Il formato della lettera}
59
Capitolo 4.
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
Classe per comporre lettere personalizzate
% La lettera verrà stampata su un foglio di carta di formato qualsiasi, vale
% a dire uno di quelli accettabili dalla classe |article|, cioè
% |a4paper|, |a5paper|, |b5paper|, |letterpaper|, |legalpaper| e
% |executivepaper|; se non si specifica nessuna opzione per il formato
% della carta, sarà usato il formato preimpostato (durante l’installazione
% del sistema \TeX) probabilmente il formato ISO A4, ma senza specificare
% l’opzione del formato della carta in certi casi potrebbero manifestarsi
% degli errori di composizione.
%
% La prima e spesso unica pagina della lettera conterrà una testata molto
% visibile, con il logo e la denominazione sociale dell’ente a cui appartiene
% il mittente, sia esso un ente accademico, scientifico, professionale, aziendale
% o altro. Nel piedino di questa prima pagina apparirà il nome e gli altri
% dati del mittente, quali l’indirizzo, il telefono, il fax, l’indirizzo di
% posta elettronica, il sito web. Ognuno di questi dati può mancare (tranne
% il nome del mittente) e, nel caso, non viene stampato nulla al suo posto.
%
% La prima pagina conterrà anche i segni di piegatura in tre al fine di poter
% inserire la lettera piegata dentro alla corrispondente busta rettangolare;
% la cosa ha senso solo per il formato A4, almeno in Italia, probabilmente
% anche con il formato ‘‘letter’’ per gli USA; tuttavia con questa classe
% i segni di piegatura sono visibili solo quando si usa la carta~A4.
%
% I margini laterali e verticali sono abbastanza grandi per non far sembrare
% la lettera un dépliant pubblicitario denso di informazioni; essi sono
% personalizzabili usando le apposite istruzioni per il pacchetto
% |geometry| inserite nel file di configurazione specifico della particolare
% lettera. Questo file, infatti, ha il nome |\jobname.cfg| ed è presumibile
% che ogni lettera abbia un main file con un nome sufficientemente mnemonico
% da essere differente da qualunque altra lettera, almeno di quelle che
% risiedono nella stessa cartella. Le pagine successive alla prima contengono
% nella testatina solo il logo e il nome% dell’ente in corpo normale e nel
% piedino solo il numero della pagina.
%
%\section{Uso della classe}
% La classe si carica nel solito modo:
%\begin{sintassi}
%\cs{documentclass}\oarg{opzioni}\Arg{lettera}
%\end{sintassi}
% Bisogna poi specificare le codifiche di ingresso e dei font, nonché i font
% da usare, le informazioni relative al destinatario e ogni altra informazione
% relativa alla lettera, prima di comporre la lettera vera e propria.
%\begin{sintassi}
%\cs{usepackage}\oarg{codifica dei font}\Arg{fontenc}
%\cs{usepackage}\oarg{opzioni dei font}\Arg{font}
%\cs{usepackage}\oarg{codifica}\Arg{inputenc}
%\meta{informazioni relative al destinatario, all’oggetto,
% agli allegati, ai destinatari per conoscenza, eccetera.}
%\Bambiente{document}
%\end{sintassi}
%
60
§ 4.2
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
Il file lettera.dtx
% Si noti quanto segue.
%\begin{enumerate}
% \item
% Nel preambolo non è indicato l’uso del pacchetto |babel|; esso infatti
% è già caricato dalla classe con l’opzione \meta{italian}; non può quindi
% essere caricato nuovamente nel preambolo con opzioni diverse, nel caso che
% si voglia comporre la lettera in un’altra lingua. Quest’altra lingua, però
% può essere indicata fra le \meta{opzioni} della classe.
% \item
% La \meta{codifica} di ingresso deve essere specificata, ma si consiglia
% vivamente di usare la codifica |utf8| che non pone nessun problema con
% i caratteri accentati e con moltissimi caratteri analfabetici che potrebbero
% venire usati nel testo della lettera.
% \item
% Per l’italiano e per moltissime lingue europee l’uso degli accenti e di altri
% segni diacritici è essenziale; solo per l’inglese non sarebbe necessario
% disporre di font con i caratteri pre"accentati; tuttavia anche scrivendo in
% inglese può essere necessario scrivere nomi stranieri che fanno uso di segni
% diacritici, per cui la \meta{codifica dei font} |T1| è sempre consigliabile.
% Se non si specificano le \meta{opzioni dei font} nel caricare un pacchetto
% per l’uso di font non preimpostati, con lo stesso comando si possono caricare
% diversi pacchetti relativi ai \meta{font}, in particolare potrebbe essere
% conveniente, e quasi sempre lo è, specificare anche il pacchetto
% \pack{textcomp} per disporre di un altro centinaio di caratteri testuali
% analfabetici.
% \item
% I dati relativi al mittente è opportuno che siano contenuti nel file di
% configurazione |\jobname.cfg| insieme alle altre informazioni che lo
% riguardano e ad altre eventuali impostazioni per usare lingue diverse
% dall’italiano.
% Questo stesso file \file{.dtx} genera un file \file{lettera.cfg} che si può
% usare come modello per creare il proprio file di configurazione.
% Invece nel preambolo si devono mettere tutte le informazioni relative
% al destinatario e tutte le ulteriori informazioni necessarie per la
% completezza delle lettera.
%\end{enumerate}
%
% Per questo motivo la maggior parte della classe è dedicata alla definizione
% dei comandi per inserire le informazioni necessarie fisse e variabili della
% lettera che si vuole comporre.
%
% \section{Le informazioni per l’intestazione}
% I comandi per fornire tutti i dati alla classe per disporre di tutte
% le informazioni necessarie sono i seguenti.
% \begin{description}\let\originalitem\item
% \def\item[#1]{\originalitem[\normalfont\cs{#1}]}
%\item[mittente] accetta in argomento col nominativo del mittente.
%\item[indirizzomittente] accetta un argomento con l’indirizzo del mittente;
% se si svolge su più righe, bisogna inserire necessariamente i comandi
% \cs{\char92} alla fine di ogni riga.
%\item[telefono] accetta come argomento il numero di telefono del mittente
61
Capitolo 4.
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
Classe per comporre lettere personalizzate
% completo del prefisso internazionale, per esempio \texttt{(+39) 011 987 65 43},
% la separazione die gruppi di cifre è utile ma non necessaria.
%\item[Ntelefono] accetta come argomento una parola diversa da ‘‘Telefono:’’ da
% premettere al numero di telefono; contiene anche la punteggiatura necessaria;
% è utile specialmente per cambiare font o per scrivere la parola in una lingua
% diversa dall’italiano; valgono le stesse considerazioni per i prossimi comandi
% che cominciano con una ‘N’ maiuscola.
%\item[fax] accetta come argomento il numero del fax del mittente.
%\item[Nfax] serve per definire un nome diverso da ‘‘Fax:’’ da premettere al
% numero del fax.
%\item[email] accetta come argomento l’indirizzo e-mail del mittente.
%\item[Nemail] serve per definire un nome diverso da ‘‘E-mail:’’ da premettere
% all’indirizzo e-mail.
%\item[web] accetta come argomento l’url del mittente o dell’ente cui il
% mittente appartiene.
% \item[Nweb] serve per definire un nome diverso da ‘‘Web:’’ da premettere
% all’url del mittente.
% \item[destinatario] accetta come argomento il nominativo del destinatario.
%\item[indirizzodestinatario] accetta come argomento l’indirizzo completo
% del destinatario con le varie righe già divise con il comando \cs{\char92}.
%\item[allegati] accetta come argomento la lista degli allegati in una forma
% qualsiasi; un solo allegato, una lista con i nomi separati da virgole
% seguite da uno spazio; con una costruzione completa come un intero ambiente
% tabular con i nomi messi uno per riga, eccetera.
%\item[Nallegati] serve per definire un nome diverso da ‘‘Allegati:’’ da
% premettere alla lista degli allegati.
%\item[oggetto] accetta come argomento la frase che descrive l’oggetto
% della lettera.
%\item[Noggetto] definisce una parola diversa da ‘‘Oggetto:’’ da premettere
% alla frase che descrive l’oggetto.
%\item[perconoscenza] accetta come argomento la lista completa dei nominativi
% e degli indirizzi, separati convenientemente con i comandi \cs{\char92}
% dei destinatari a cui la lettera viene inviata per conoscenza.
%\item[Nperconoscenza] definisce una stringa diversa da ‘‘E p.c.’’ da
% premettere alla lista dei destinatari per conoscenza.
%\item[logo] accetta come argomento il nome del file che contiene il logo
% del mittente, sia esso una sua sigla o il logo dell’ente a cui
% il mittente appartiene.
%\item[ragionesociale] accetta come argomento il ‘‘nome’’ dell’ente a cui
% appartiene il mittente o una stringa a scelta del mittente.
%\item[data] pre"impostata alla data del giorno in cui si compone la lettera,
% serve per definire una data fissa, possibilmente preceduta dal luogo dove
% si trova il mittente al momento di scrivere la lettera; potrebbe quindi
% essere meglio usare questo comando, per esempio, con un argomento così
% fatto:\\[1.5ex]
%\cs{data}\Arg{Roma, 1 aprile 2015}
% \end{description}
% Ognuno di questi nomi o di queste liste può essere omesso; tutti gli
% argomenti che non rappresentino semplicemente delle parole fisse, hanno
% un valore predefinito ‘‘vuoto’’ e, se appunto il loro valore è vuoto,
% non viene scritto da nessuna parte, senza nemmeno la parola fissa che
62
§ 4.2
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
Il file lettera.dtx
% lo dovrebbe precedere. Solo la data è pre"impostata con la data fornita
% dal comando \cs{today} di \LaTeX.
%
% Ognuno di questi argomenti e di queste parole fisse può essere completata
% con comandi di formattazione; per esempio se si volesse ridefinire la
% stringa che precede l’oggetto, la si potrebbe ridefinire tranquillamente
% così:
%\begin{verbatim}
%\Noggetto{\textbf{Oggetto} --}
%\end{verbatim}
%
% \section{Lo stile delle pagine}
% Come già detto, l’intestazione della prima pagina della lettera richiede
% uno stile di pagina particolare che metta il logo e la ragione sociale
% dell’ente dello scrivente come intestazione della prima pagina.
% Le pagine successive conterranno solamente il logo con la ragione sociale
% scritti con un font normale. La classe deve quindi provvedere a due stili
% di pagina.
%
% Ma sorge spontanea una domanda: va bene per le lettere commerciali o ufficiali,
% me se uno desidera confezionarsi una carta intestata personale? La risposta
% è semplice, nel senso che il logo non è obbligatorio e la ragione sociale non
% è obbligatoria. Tuttavia la carta intestata personale potrebbe contenere un
% monogramma dello scrivente; oppure potrebbe contenere solo il nome e il
% cognome scritto con un font adeguato. Siccome tutto è configurabile, almeno
% entro certi limiti, si può fare quello che si vuole.
%
% L’utente di questa classe non deve preoccuparsi di come funzionino questi due
% stili di pagina a meno che non voglia personalizzare l’aspetto di queste pagine.
%
% Merita allora ricordare che le pagine oltre la prima sono sostanzialmente
% una modesta variante dello stile standard |myheadings|, consistente,
% sostanzialmente nello spostamento del numero di pagina al centro del
% piedino; per impostazione predefinita, il logo (o le cifre dello scrivente)
% viene esposto in formato ridotto nella testatina insieme, se c’è, alla
% ragione sociale o al nome del mittente.
%
% Invece lo stile della prima pagina è molto più complesso; l’intestazione
% contiene il logo (o le cifre dello scrivente) sporgente nel margine sinistro.
% La testatina vera e proprio può avere un nome di ragione sociale scritto con
% carattere piuttosto grandi; il tutto però viene fatto apparire al programma
% di composizione come se avesse altezza e profondità nulle.
%
% Il piedino può essere composto di molte righe e sporge nel margine inferiore
% quanto basta, ma non è garantito che il tutto si mantenga dentro lo spazio
% fisico della carta.
%
% Una particolarità è che alcune parti del disegno della pagina sono assolute;
% per esempio i segni per le piegature in tre sono riferiti alle dimensioni
% fisiche della carta, non alla larghezza dei margini comunque definiti, o
% dalla classe o dalle impostazioni dell’utente. Questi segni di piegatura
63
Capitolo 4.
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
Classe per comporre lettere personalizzate
% potrebbero essere inseriti per qualunque formato di carta specificato alla
% classe, ma si ritiene che per una classe da usare essenzialmente in Italia,
% sia ragionevole usarli solo per carta in formato ISO A4; non avrebbe senso
% piegare in tre fogli decisamente più piccoli; avrebbe senso con i formati
% USA, ma poi in Italia non si trovano buste di formati adatti.
%
% \section{Considerazioni finali}
%
% Va notato che fra le classi standard esiste la classe \class{letter} che
% ha le sue funzionalità e uno stile molto angloamericano. La classe
% \class{letteracpd} è italiana ed è molto configurabile; la documentazione
% si trova nel file \file{cpdbundle.pdf}. La classe \class{scrlettr2} è
% tedesca e fa parte del gruppo di classi KOMA Script; anche questa classe
% è configurabile e la sua documentazione si trova assieme a quella delle
% altre classi della stessa collezione in \file{scrguide.pdf} in tedesco e
% \file{scrguien.pdf} in inglese. Probabilmente esistono altre classi meno note
% e di uso più ristretto.
%
% \StopEventually{}
%
% \section{Descrizione del codice}
% \subsection{Preliminari}
% L’intestazione della classe è già stata fatta. Ora si tratta di procedere
% alla chiamata di \class{article}. Non ci sono opzioni specifiche per questa
% classe; tutte quelle che le vengono specificate vengono trasferite
% integralmente alla classe \class{article}. Tuttavia merita ricordare che,
% anche se il formato di carta ISO A4 è il formato predefinito per
% l’installazione del sistema \TeX, l’opzione \opz{a4paper} va specificata
% lo stesso, perché imposta la variabile booleana che permette di inserire
% i segni di piegatura in tre.
%
%\iffalse
%<*class>
%\fi
% Definiamo uno switch per verificare se si sta componendo su carta UNI A4:
%
\begin{macrocode}
\newif\ifAquattro \Aquattrofalse
\DeclareOption{a4paper}{\Aquattrotrue\paperwidth=210mm\paperheight=297mm}
%
\end{macrocode}
%
\begin{macrocode}
%\DeclareOption{*}{\PassOptionToClass{\CurrentOption}{article}}
\ProcessOptions*\relax
\LoadClassWithOptions{article}
%
\end{macrocode}
%
%\subsection{Test e impostazioni}
% Prima di leggere i dati e il file di configurazione è bene configurare bene
% la geometria della pagina e gli stili di pagina. Ci vuole la garanzia che
% lavorando con \prog{pdflatex} vengano trasmessi correttamente i dati al
% file PDF.
%
\begin{macrocode}
64
§ 4.2
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
Il file lettera.dtx
\RequirePackage{iftex}
\ifPDFTeX
\expandafter\@firstoftwo\else
\expandafter\@secondoftwo\fi
{%
\pdfpagewidth=\paperwidth
\pdfpageheight=\paperheight
\RequirePackage[italian]{babel}
}{%
\relax
}
%
\end{macrocode}
%
% Impostiamo i margini:
%
\begin{macrocode}
\RequirePackage{geometry}
\geometry{%
top=0.1\paperheight,
bottom=0.15\paperheight,
left=0.2\paperwidth,
right=0.1\paperwidth,
heightrounded
}
%
\end{macrocode}
%
%\subsection{Comandi per i dati}
% Si possono definire le varie stringhe e i vari comandi per acquisire i dati
% del mittente, del destinatario e le altre informazioni, impostando tutti
% i valori di default con il valore ‘‘vuoto’’. Gli indirizzi devono essere
% specificati per disteso inserendo i comandi |\\| alla fine di ogni riga.
%
% Per i destinatari a cui inviare la lettera per conoscenza bisogna specificare
% la lista completa, compreso il loro nome, non solo l’indirizzo, nell’argomento
% di un unico comando, inserendo tutti i comandi |\\| necessari, non solo alla
% fine di ogni riga come per il mittente e il destinatario principale; inoltre,
% se si vuole si più inserire a mano uno spazio verticale aggiuntivo fra il
% blocco di righe di ciascun destinatario per conoscenza; non sono accettabili
% righe vuote nell’argomento del comando |\perconoscenza|.
%
% Il comando |\logo| serve per acquisire il nome del file che contiene il
% disegno del logo; non occorre specificarne l’estensione se non ne esistono
% due versioni con lo stesso nome ma con estensione diversa. Si ricorda
% inoltre che le versioni moderne di \prog{pdflatex} accettano il
% file"-immagine nei formati PDF, PNG, JPG, MPS, EPS; altri formati devono
% essere trasformati preventivamente in uno di questi e si consiglia di
% preferire i formati genuinamente vettoriali PDF, MPS, EPS; se non se ne
% dispone, non si commetta ‘‘l’errore’’ di incorporare un file bitmapped
% in un file con uno dei tre formati suddetti, perché il file ottenuto non
% sarebbe \emph{genuinamente} vettoriale, ma solo \emph{apparentemente}
% vettoriale. Piuttosto, se si dispone solo di un file bitmapped in un
% formato non consentito, lo si converta nel formato PNF.
65
Capitolo 4.
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
Classe per comporre lettere personalizzate
%
\begin{macrocode}
\let\@mittente\empty
\newcommand*\mittente[1]{\gdef\@mittente{#1}}
\let\@indirizzomittente\empty
\newcommand*\indirizzomittente[1]{\gdef\@indirizzomittente{#1}}
\let\@telefono\empty
\newcommand*\telefono[1]{\gdef\@telefono{#1}}
\gdef\N@telefono{Telefono: }
\newcommand*\Ntelefono[1]{\gdef\N@telefono{#1\space}}
\let\@fax\empty
\newcommand*\fax[1]{\def\@fax{#1}}
\gdef\N@fax{Fax: }\newcommand*\Nfax[1]{\gdef\N@fax{#1\space}}
\let\@email\empty
\newcommand*\email[1]{\def\@email{#1}}
\gdef\N@email{E-mail: }\newcommand*\Nemail[1]{\gdef\N@email{#1\space}}
\let\@web\empty
\newcommand*\web[1]{\def\@web{#1}}
\gdef\N@web{Web: }\newcommand*\Nweb[1]{\gdef\N@web{#1\space}}
%
\let\@destinatario\empty
\newcommand*\destinatario[1]{\gdef\@destinatario{#1}}
\let\@indirizzodestinatario\empty
\newcommand*\indirizzodestinatario[1]{\gdef\@indirizzodestinatario{#1}}
\let\@allegati\empty
\newcommand*\allegati[1]{\gdef\@allegati{#1}}
\gdef\N@allegati{Allegati: }
\newcommand*\Nallegati[1]{\gdef\N@allegati{#1\space}}
\let\@oggetto\empty
\newcommand*\oggetto[1]{\gdef\@oggetto{#1}}
\gdef\N@oggetto{Oggetto: }
\newcommand*\Noggetto[1]{\gdef\N@oggetto{#1\space}}
\let\@perconoscenza\empty
\newcommand*\perconoscenza[1]{\gdef\@perconoscenza{#1}}
\gdef\N@perconoscenza{E p.~c. }
\newcommand*\Nperconoscenza[1]{\gdef\N@perconoscenza{#1\space}}
\gdef\@data{\today}
\newcommand*\data[1]{\gdef\@data{#1}}
%
\let\@logopic\empty
\newcommand*\logo[1]{\gdef\@logopic{#1}}
\let\@ente\empty
\newcommand*\ragionesociale[1]{\gdef\@ente{#1}}
%
\end{macrocode}
%
%\subsection{File di configurazione}
% Ora si può caricare il file |\jobname.cfg| con il quale l’utente può
% specificare sia le dimensioni della carta tramite le opzioni al comando
% |\geometry| sia le dimensioni dei margini (naturalmente deve sapere quello
% che sta facendo; si ricorda che sarebbe quanto mai opportuno che i dati del
% mittente vengano introdotti mediante il file di configurazione. Tutte le
% specifiche devono essere indicate mediante i comandi sopra definiti.
66
§ 4.2
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
Il file lettera.dtx
%
\begin{macrocode}
\IfFileExists{\jobname.cfg}%
{\input{\jobname.cfg}}%
{\ClassWarning{lettera}{Il file \jobname.cfg non e’ presente nella
cartella del file principale}}
%
\end{macrocode}
%
%\subsection{stili delle pagine}
% Si può ora procedere alla definizione degli stili di pagina. Nelle pagine
% successive alla prima si può fare riferimento a anche ai mark ordinariamente
% caricati com |\markboth|, mark che però sono inizialmente impostati vuoti.
%
\begin{macrocode}
\markboth{}{}
\RequirePackage{etoolbox,graphicx}
%
\def\ps@altrepagine{%
\def\@oddhead{\makebox[\textwidth][l]{%
\ifcsvoid{@logopic}{\ifcsvoid{@ente}{\rightmark}{\@ente}}{%
\raisebox{-0.3\height}[\z@][\z@]{%
\includegraphics[height=2\headheight]{\@logopic}}\qquad \@ente}}}
\let\@evehead\@oddhead
\def\@oddfoot{\makebox[\textwidth]{\thepage}}
\let\@evenfoot\@oddfoot
}
%
\end{macrocode}
%
% Per la prima pagina le cose sono più elaborate.
%
\begin{macrocode}
\newbox\intestazione
\def\ps@primapagina{%
\def\@oddhead{%
\llap{\ifcsvoid{@logopic}{}{%
\raisebox{-0.45\height}[\z@][\z@]{%
\includegraphics[width=\dimexpr(\oddsidemargin+1in)/2]{\@logopic}}%
\quad\ifAquattro\foldingmarks\fi}}%
\setbox\intestazione\hbox{\ifcsvoid{@ente}{}{\smash{\Huge\@ente}}}
\ifdim\wd\intestazione>\textwidth
\setbox\intestazione
\hbox{\resizebox{\textwidth}{!}{\box\intestazione}}%
\fi
\makebox[\textwidth][l]{\box\intestazione}%
}
\def\@evehead{}
\def\@oddfoot{\smash{\makebox[\textwidth]{\sffamily\footnotesize
\makebox[\z@][l]{\let\\ = \cr
\tabular[t]{@{}l@{}}
\@mittente\\
\@indirizzomittente
\endtabular
}\hfill
\makebox[\z@][r]{\tabular[t]{@{}r@{}}
67
Capitolo 4.
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
Classe per comporre lettere personalizzate
\ifcsvoid{@telefono}{}{\N@telefono\@telefono\cr }
\ifcsvoid{@fax}{}{\N@fax\@fax\cr }
\ifcsvoid{@email}{}{\N@email\@email\cr }
\ifcsvoid{@web}{}{\N@web\@web\cr }
\endtabular
}}
}}
\def\@evenfoot{}
}
%
\end{macrocode}
% Il comando |\foldingmarks| va definito per mettere i segni per la piegatura;
% si usa l’ambiente \amb{picture} esteso con il pacchetto \pack{picture} di Heiko
% Oberdiek, che consente di usare direttamente le dimensioni effettive e non
% solamente il moltiplicatore di |\unitlength|, come fanno tutti i comandi
% dell’ambiente nativo di \LaTeX. Probabilmente non abbiamo bisogno di usare
% \pack{pict2e}, ma lo carichiamo lo stesso perché deve essere caricato prima
% di \pack{picture}; se l’utente lo ricarica si spera che lo faccia senza
% opzioni, ma ci pensa |\usepackage| a non ricaricare un pacchetto già caricato.
%
\begin{macrocode}
\RequirePackage{pict2e,picture}
\newcommand*\foldingmarks{%
\begin{picture}(0,0)(0,-\topmargin-1in-\headheight)
\put(-\oddsidemargin-1in,-\paperheight/3){\line(1,0){10mm}}
\put(-\oddsidemargin-1in,-\paperheight*2/3){\line(1,0){10mm}}
\end{picture}%
}
%
\end{macrocode}
%
%\subsection{Ambiente \amb{lettera}}
% Ora bisogna definire l’ambiente che contiene il corpo della lettera; solo
% la posizione dell’indirizzo del destinatario deve essere posto in una
% posizione assoluta. Ecco perché dopo l’intestazione bisogna mettere la
% scatola con l’indirizzo del destinatario. Alcune dimensioni per mettere la
% scatola che contiene l’indirizzo del destinatario sono espresse in millimetri,
% invece che parametrizzate alle dimensioni della carta; la scatola dovrebbe
% essere collocata in posizioni parametrizzate, ma l’indirizzo del destinatario
% richiede comunque uno spazio indipendente dal formato della carta. bisogna
% quindi fare un misto, ma la cosa non dovrebbe essere particolarmente grave.
%
\begin{macrocode}
\newenvironment{lettera}{% Apertura
\noindent
\begin{picture}(0,0)(0,-\topmargin-1in-\headheight-\headsep-\topskip)
\put(\textwidth-80mm,-65mm){\makebox(99mm,0)[cc]{%
\parbox[b]{80mm}{\@destinatario\newline
\@indirizzodestinatario}}}
\end{picture}\par\vspace{65mm}
%
\ifcsvoid{@perconoscenza}{}{%
\ifcsvoid{N@perconoscenza}{}{\noindent\N@perconoscenza}
\parbox[t]{0.67\textwidth}{\@perconoscenza}\par\vspace*{\baselineskip}}
%
68
§ 4.2
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
Il file lettera.dtx
\noindent\@data\par
%
\ifcsvoid{@oggetto}{}{%
\ifcsvoid{N@oggetto}{}{\vspace*{\baselineskip}%
\noindent\N@oggetto\@oggetto\par\vspace*{\baselineskip}}}%
}{% Chiusura
\ifcsvoid{@allegati}{}{\ifcsvoid{N@allegati}{}{%
\vspace*{\baselineskip}\noindent\N@allegati\@allegati}\par}
}
\pagestyle{altrepagine}
\AtBeginDocument{\thispagestyle{primapagina}}
%
\end{macrocode}
% Il comando |\allegati| può anche essere usato dentro l’ambiente \amb{lettera};
% serve solo per impostare la lista degli allegati, poi ci pensa la classe
% a stampare la lista al posto giusto come ultima cosa della lettera.
%
% \subsection{Altri comandi}
% Perché questa classe non contiene altri comandi come |\signature|,
% |\opening|, |\closing|? Perché questi testi devono essere scritti di
% volta in volta in modo possibilmente meno burocratico di come si fa
% di solito e come viene fatto nelle classi menzionate nella sezione
% ‘‘Considerazioni finali’’.
%
% Sta quindi all’utente di gestire l’aspetto tipografico e il contenuto;
% per esempio non ci vorrebbe nulla per definire un comando |\signature|
% per comporre la firma con gli attributi del firmatario, cioè il mittente,
% in modo corretto.
%\begin{verbatim}
%\begin{flushright}
% \begin{minipage}{0.5\textwidth}\centering
% \vspace*{2\baselineskip}% spazio per la firma
%
Ambrogio Utore\\
%
Direttore Generale
% \end{minipage}
%\end{flushright}
%\end{verbatim}
% Questo intero blocco di codice può costituire l’argomento di un altro
% comando da sistemare nel file di configurazione, chiamato per esempio
% \cs{firmaqualificata}, che può essere usato dall’utente per sistemare
% la firma con la qualifica del firmatario dove vuole lui.
% Anzi, se dispone di una firma scandita, resa parzialmente trasparente
% (con il solo sfondo trasparente), ne può mettere il relativo comando
% \cs{includegraphics} completo della larghezza adatta al tipo di firma,
% al posto della spaziatura di |2\basleineskip|, cosicché quando mette la
% \cs{firmaqualificata} vi appare anche la firma grafica.
%
% Cose analoghe valgono per altre informazioni come per esempio il fatto
% che la lettera sia una raccomandata; talvolta questevengono scritte, ma
% chi le scrive prima dell’‘‘Oggetto’’, chi dopo; chi allineate a sinistra
% chi a destra. Meglio fare tutto a mano piuttosto che definire comandi
69
Capitolo 4.
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
Classe per comporre lettere personalizzate
% troppo complessi e fragili.
%\iffalse
%</class>
%\fi
% \section{Il file di configurazione}
% Il file di configurazione serve per diversi scopi, il primo dei quali
% consiste nel alleviare il possessore della classe per scrivere le sue
% stesse lettere ripetendo ogni vola le stesse informazioni che lo riguardano.
% Siccome bisogna predisporre un diverso file di configurazione per ogni
% lettera che si scrive, è possibile inserire nel file di configurazione
% ogni informazione che potrebbe essere collocata anche nel preambolo, come
% per esempio i dati del destinatario , gli allegati, l’oggetto della missiva,
% l’elenco dei destinatari per conoscenza.
%
% È possibile importare file nel file di configurazione, per cui certe
% informazioni come quelle dello scrivente possono risiedere in un file
% immesso con |\input| nel file di configurazione.
%
% Volendo, l’utente può anche modificare la configurazione e lo stile delle
% pagine; naturalmente chi fa queste cose sa come fare e sa dove mettere
% le mani; non è una operazione banale. Anche queste modifiche o diversi
% set di modifiche possono essere salvati in file distinti immessi nel file
% di configurazione mediante comandi |\input|.
%
% Qui si mostra un file di configurazione di base.
%\iffalse
%<*cfg>
%\fi
%
\begin{macrocode}
\mittente{Augusto Utore}
\indirizzomittente{Via Principale, 123\\
99099 TeXOPOLI, Italia}
\telefono{(+39)123\,9876543}
\fax{(+39)123\,9876542}
\email{[email protected]}
\web{}% conferma che non c’e’ sito web personale
\Noggetto{Oggetto:\space}
\endinput
%
\end{macrocode}
% Con un file di configurazione così essenziale è evidente che tutte le altre
% informazioni necessarie vanno inserite nel preambolo della lettera.
%\iffalse
%</cfg>
%\fi
% Questo è tutto.
%
% \Finale
% \endinput
70
La classe per comporre questa guida
tematica
5
Per fare un esempio più esteso riporto qui il file .dtx completo per la
descrizione della classe con cui ho composto questo testo1 ; seguono poi la
classe stessa e il file di documentazione debitamente composto.
Grazie a questa classe, questo stesso documento comincia semplicemente
con un (quasi) preambolo vuoto, così:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
\documentclass[11pt,b5paper,twoside,openany,ipertesto]{guidatematica}
\ProvidesFile{IntroCreaClassi.tex}[2013/01/30 v.1.8
Introduzione alla creazione di file di classe]
\DeclareRobustCommand*{\Ars}{% Definizione tratta da guit.sty
\textsf{\lower -.48ex\hbox{\rotatebox{-20}{A}}\kern -.3em{rs}}%
\kern -.05em\TeX\kern -.17em\lower -.357ex\hbox{nica}}
\usepackage{pdfpages}
\begin{document}
\frontmatter
\GetFileInfo{IntroCreaClassi.tex}
\author{Claudio Beccari}
\title{Introduzione alla creazione\\ di file di classe}
\date{\filename\ \fileversion\ del \filedate}
\maketitle
19
1
Quanto si riporta qui è solo esemplificativo; il file guidatematica.dtx e i suoi
derivati possono corrispondere ad una versione precedente a quella effettivamente usata
per comporre questo testo. Per quel che riguarda la versione eventualmente aggiornata
si esamini il kit distribuito ai potenziali autori di guide tematiche guidatematica.zip.
Capitolo 5.
20
21
22
23
24
25
26
27
28
La classe per comporre questa guida tematica
\contribguit
\chapter{Introduzione}
...
\chapter{Ringraziamenti}
...
\newpage
\tableofcontents
...
e nella riga 14 si vede già usato uno dei nuovi comandi definiti nella classe
guidatematica. Lo scarno preambolo contiene il comando \ProvidesFile
con i suoi argomenti; la definizione del logo di ArsTEXnica; questo sarebbe contenuto nel pacchetto guit, ma come viene spiegato nel file
guidatamatica.pdf, per motivi di compatibilità con XELATEX si è evitato di usare direttamente quel pacchetto. Infine vengono caricati il pacchetto pdfpages che è funzionale per questa specifica guida: il pacchetto
hyperref, grazie all’opzione iperteso, va sempre caricato per ultimo e vi
provvede la classe stessa rinviando la sua invocazione all’esecuzione del
comando \begin{document}.
5.1
Il file documentato
Il file guidatematica.dtx ora, a differenza degli esempi precedenti, è
piuttosto lungo, ma ho voluto mostrare il codice completo proprio per
renderlo istruttivo anche per i lettori di questa guida. Esso è documentato,
quindi non dovrebbero essere necessarie spiegazioni particolari che non
siano già scritte nel file stesso.
1
2
3
4
5
6
7
8
9
10
11
12
% \iffalse
% !TEX encoding = UTF-8 Unicode
% !TEX TS-program = pdflatex
%<*system>
\begingroup
\input docstrip.tex
\keepsilent
\preamble
________________________________________
The guidatematica class for typesetting books in the GuIT series
"Guide Tematiche"
Copyright (C) 2012, 2014 GuIT, Gruppo utilizzatori Italiani di TeX e LaTeX
72
§ 5.1
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
Il file documentato
All rights reserved
http://www.guitex.org
License information appended
\endpreamble
\postamble
Copyright 2012, 2013 GuIT, Gruppo utilizzatori Italiani di TeX e LaTeX
Distributable under the LaTeX Project Public License,
version 1.3c or higher (your choice). The latest version of
this license is at: http://www.latex-project.org/lppl.txt
This Work has the status of ‘maintained’
The Current Maintainer is the GuIT staff
This work consists of this file guidatematica.dtx,
and the derived files guidatematica.cls and guidatematica.pdf
plus the associated documentation guidatematica-doc.tex
and guidatematica-doc.pdf.
\endpostamble
\askforoverwritefalse
%
\generate{\file{guidatematica.cls}{\from{guidatematica.dtx}{class}}}
%
\def\tmpa{plain}
\ifx\tmpa\fmtname\endgroup\expandafter\bye\fi
\endgroup
%</system>
% \fi
%
% \iffalse
%<*driver>
\ProvidesFile{guidatematica.dtx}
%</driver>
%<class>\NeedsTeXFormat{LaTeX2e}[2009/01/01]
%<class>\ProvidesClass{guidatematica}%
%<*class>
[2014/09/03 v.1.5 Classe simmetrica per comporre testi della collana
Guide Tematiche del GuIT]
%</class>
%<*driver>
73
Capitolo 5.
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
La classe per comporre questa guida tematica
\documentclass[a4paper]{ltxdoc}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern,textcomp}
\usepackage[italian]{babel}
\hfuzz 10pt
%
\makeatletter
\providecommand*\meta[1]{$\langle$\textit{#1}$\rangle$}
\providecommand*\marg[1]{\texttt{\char123}\meta{#1}\texttt{\char125}}
\providecommand*\oarg[1]{\texttt{[}\meta{#1}\texttt{]}}
\def\GT@splitargs#1,#2!{\def\@tempA{#1}\def\@tempB{#2}}
\newcommand\garg[1]{\GT@splitargs#1!%
\texttt{(}\meta{\@tempA}\texttt{,}\meta{\@tempB}\texttt{)}}
\newcommand*\comando[1]{\texttt{\string#1}}
\renewcommand*{\cs}[1]{%
\texttt{\char92#1}\index{#1@\texttt{\char92#1}}}
\let\csindex\cs
\newcommand*\Sambiente[2]{%
\cs{begin}\marg{#1}\oarg{#2} \dots\ \cs{end}\marg{#1}}
\newcommand*\Dambiente[3]{%
\cs{begin}\marg{#1}\oarg{#2}\oarg{#3} \dots\ \cs{end}\marg{#1}}
\newcommand*\Bambiente[1]{\cs{begin}\texttt{\char123#1\char125}}
\newcommand*\Eambiente[1]{\cs{end}\texttt{\char123#1\char125}}
\newcommand*\Arg[1]{\texttt{\char123\relax#1\char125}}
%
\begin{document}\errorcontextlines=9
\GetFileInfo{guidatematica.dtx}
\title{La classe \texttt{\filename}\thanks{Version number \fileversion;
ultima revisione \filedate.}}
\author{GuIT\thanks{Web: \texttt{www.guitex.org}}}
\maketitle
\DocInput{guidatematica.dtx}
\end{document}
%</driver>
% \fi
%
%
% \CheckSum{1073}
% \begin{abstract}
% Questa classe \texttt{guidatematica} serve per comporre
% testi da pubblicare nella collana “Guide Tematiche” del GuIT.
% Si appoggia alla classe \texttt{memoir} ma include
% molte personalizzazioni e i pacchetti necessari.
% Differisce dalla classe \texttt{guidatematica} delle
74
§ 5.1
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
Il file documentato
versioni precedenti per il fatto
che il disegno della pagina è simmetrico e quindi si
presta ugualmente bene per comporre (e stampare) oneside
o twoside. Solo le note marginali eventualmente presenti
mostrano la differente impostazione. Inoltre è costruita
in modo da poter lavorare indifferentemente con pdf\LaTeX,
Xe\LaTeX\ e Lua\LaTeX,
\end{abstract}
\section{Caratteristiche della classe}
La classe \texttt{guidatematica.cls} serve per comporre
libri in italiano con le seguenti specifiche:
\begin{itemize}
\item La classe di supporto è la classe
\texttt{memoir.cls} facente parte del sistema TeX
in qualsiasi distribuzione completa.
\item Tutte le opzioni inserite nell’istruzione
|\documentclass| vengono trasferite integralmente
alla classe \texttt{memoir}; alcune opzioni per il
formato della ‘‘carta’’, sono state ridefinite, ma
l’utente non dovrebbe osservare nessuna variazione
rispetto all’impostazione che si avrebbe senza queste
ridefinizioni. Solo l’opzione |ipertesto| è
specifica della classe; serve all’utente per caricare il
pacchetto |hyperref| con alcune personalizzazioni,
ritardandone il caricamento al momento di eseguire il
comando |\begin{document}|; questo dipende dal fatto che
il pacchetto |hyperref| deve sempre venire caricato per
ultimo. Non è attivata di default, perché non tutte le
guide, benché previste per essere lette prevalentemente
sullo schermo del proprio PC, hanno bisogno di collegamenti
ipertestuali interni ed esterni. Quindi caricare questo
pacchetto è una scelta esclusiva dell’autore della guida.
\item La classe funziona sia con pdfLaTeX sia con XeLaTeX;
le impostazioni sono prefissate e i margini per ulteriori
personalizzazioni sono ridotti al minimo; lo scopo della
classe è quello di dare una veste comune alle guide
tematiche della collana, facendo sì che siano riconoscibili
a prima vista grazie al loro stile uniforme di composizione.
\item La classe riconosce da sola il motore di composizione
e imposta direttamente quanto occorre nella forma richiesta
dal programma di composizione.
\item La codifica di entrata deve essere \texttt{utf8}; per
XeLaTeX essa è implicita; con pdfLaTeX essa viene
preimpostata e non è possibile con questa classe specificare
75
Capitolo 5.
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
La classe per comporre questa guida tematica
una codifica differente.
\item La codifica dei font di uscita con pdfLaTeX è
\texttt{T1} e non è possibile specificare una codifica
differente, cosa che sarebbe quanto mai sgradevole per
comporre in italiano dove sono presenti molte lettere
accentate. Per altro se fosse necessario comporre qualcosa
in una lingua che usa un alfabeto diverso, basta caricare
i suoi pacchetti specifici; per scrivere una parola o due
basta caricare l’encoding dei font specifici in modo diretto:
per esempio: se si deve scrivere una parola in russo,
basta caricare esplicitamente il file del suo encoding con
|\input{t2enc.def}| e poi specificare la codifica |T2| con
|\fontencoding{T2}| seguito, se occorre, dai comandi per scegliere
famiglia, serie, forma e corpo del font cirillico che
si vuole usare.
\item Con pdfLaTeX il pacchetto \texttt{babel} viene caricato
con la sola opzione \texttt{italian}; nei rari casi in cui
fosse necessario usare anche altre lingue, esse vanno
specificate come opzione alla classe, perché non si può
chiamare \texttt{babel} due volte con opzioni diverse.
Le opzioni della classe sono globali e vengono passate
automaticamente a tutti i pacchetti che sanno che cosa farne.
\item Con XeLaTeX viene caricato il pacchetto |polyglossia|
e l’italiano viene impostato come la lingua principale;
altre lingue possono venire specificate mediante il comando
|\setotherlanguages| o, con lingue particolari, con
|\setotherlanguage| con le opzioni specifiche per la lingua.
Se questa richiede un alfabeto particolare bisogna ricordassi
di specificare una famiglia di font che contenga l’alfabeto
desiderato.
\item Sono stati introdotti molti nuovi comandi e sono stati
definiti molti nuovi ambienti. Per maggiori informazioni si
rimanda al documento \emph{guidatematica-doc.pdf} distribuito
con il ‘‘kit’’ |guidatematica.zip|.
\end{itemize}
\StopEventually{}
\section{Codice commentato}
Le due righe contenti il formato e l’identificazione della classe
sono già state inserite prima; ora possiamo passare alla gestione
delle opzioni che vengono quasi tutte passate alla classe \texttt{memoir}.
Viene definita l’opzione |ipertesto| per caricare il pacchetto |hypertext|
che non non viene caricato di default, perché va caricato per ultimo
solo se viene specificata l’opzione suddetta.
76
§ 5.1
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
Il file documentato
% L’autore potrebbe avere bisogno di caricare ulteriori pacchetti nel
% preambolo, quindi è meglio che |hyperref| venga caricato dopo questi
% ulteriori pacchetti. Per fare ciò basta che l’autore specifichi
% l’opzione |ipertesto| alla classe che provvede a caricare il pacchetto
% |hyperref| come ultima cosa al momento di iniziare la composizione
% della guida tematica.
%
% Vengono reimpostate le opzioni |a4paper|, |a5paper| e |\b5paper|
% e vengono definite le opzioni |tablet| e |pad|, per poter in tutti questi casi
% creare il layout della pagina in modo simile e non personalizzabile.
% Per tutte questo opzioni bisogna ricorrere ad opportuni comandi
% condizionali, per poter ritardare la loro esecuzione ad un momento
% successivo al caricamento della classe |memoir|.
% \iffalse
%<*class>
% \fi
%
\begin{macrocode}
\DeclareOption{ipertesto}{%
\AtBeginDocument{\RequirePackage[colorlinks,linkcolor={blue},
citecolor={blue!80!black},urlcolor={blue}]{hyperref}}
}
\newif\ifPAD\PADfalse
\DeclareOption{pad}{\PADtrue\tabletfalse\Aivfalse\Bvfalse\Avfalse}
\newif\iftablet\tabletfalse
\DeclareOption{tablet}{\tablettrue\Aivfalse\Bvfalse\Avfalse\PADfalse}
\newif\ifAiv \Aivfalse
\DeclareOption{a4paper}{\Aivtrue\tabletfalse\Bvfalse\Avfalse\PADfalse}
\newif\ifBv \Bvtrue
\DeclareOption{b5paper}{\Aivfalse\Bvtrue\tabletfalse\Avfalse\PADfalse}
\newif\ifAv \Avfalse
\DeclareOption{a5paper}{\Avtrue\Aivfalse\Bvfalse\tabletfalse\PADfalse}
\DeclareOption*{\PassOptionsToClass{\CurrentOption}{memoir}}
\ProcessOptions*\relax
\LoadClassWithOptions{memoir}
%
\end{macrocode}
%
% Si carica subito il pacchetto |iftex| che permette di distinguere
% quale motore di composizione si sta usando fra |pdftex|, |xetex|, oppure |luatex|.
%
\begin{macrocode}
\RequirePackage{iftex}
%
\end{macrocode}
% Con |xetex| si carica il pacchetto |fontspec| e si impostano le varie forme
77
Capitolo 5.
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
La classe per comporre questa guida tematica
% dei font Latin Modern OpenType, generando anche i comandi necessari per la
% compatibilità con i comandi da usare con |pdftex| quando si invoca
% il pacchetto |cfr-lm| per la gestione estesa dei font Latin Modern Type~1.
% Si provvede nei due casi di caricare i pacchetti necessari per la gestione
% della lingua italiana.
%
\begin{macrocode}
\ifPDFTeX
\RequirePackage[utf8]{inputenc}
\RequirePackage[T1]{fontenc}
\RequirePackage[italian]{babel}
\RequirePackage[tt={oldstyle=false,tabular,monowidth}]{cfr-lm}
\else
\RequirePackage{fontspec}
\defaultfontfeatures[\rmfamily,\sffamily]{Ligatures=TeX,Numbers=OldStyle}
\defaultfontfeatures[\ttfamily,\tvfamily]{Numbers=Lining}
\setmainfont{Latin Modern Roman}[SmallCapsFont={* Caps}]
\setsansfont{Latin Modern Sans}
\setmonofont{Latin Modern Mono}
\newfontfamily{\tvfamily}{Latin Modern Mono Prop}
\DeclareTextFontCommand{\texttm}{\ttfamily}
\DeclareTextFontCommand{\texttv}{\tvfamily}
\def\textl#1{{\addfontfeature{Numbers=Lining}#1}}
\RequirePackage{unicode-math}
\setmathfont{Latin Modern Math}
\RequirePackage{polyglossia}
\setmainlanguage{italian}
\ifx\tmspace\@undefined
\newlength{\tmspace}\tmspace=\z@
\fi
\fi
%
\end{macrocode}
%
%
% Si caricano poi i pacchetti ritenuti necessari; in questa versione
% della classe non viene caricato il pacchetto |guit.sty| perché
% è incompatibile con |XeLaTeX|; certo lo si sarebbe potuto caricare
% nel ramo |true| del test |\ifPDFTeX| e la definizione del logo del
% gruppo in forma grafica (immagine pdf) la si sarebbe potuta limitare
% all’uso con |XeLaTeX| o di |Lua\LaTeX|; siccome alla data attuale il pacchetto
% |guit.sty| è sottoposto a revisione per l’uso con i font OpenType, è molto
% meglio usare temporaneamente l’immagine in ogni caso e modificare
% questa classe solo con l’aggiunta di un nuovo pacchetto quando
% |guit.sty| sarà diventato compatibile con tuttii i programmi di
% composizione. Il logo tondo, il ‘‘timbro’’, del GuIT viene invece
% allegato come immagine, visto che si tratta di una variante
78
§ 5.1
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
Il file documentato
% nella quale le lettere della scritta attorno al bordo non appaiono
% mai capovolte.
%
\begin{macrocode}
\RequirePackage{graphicx}
\RequirePackage{metalogo}
\RequirePackage{pict2e}[2009/06/01]
\RequirePackage{microtype}
\RequirePackage{etoolbox}
\RequirePackage{xcolor}
\RequirePackage{natbib}
\RequirePackage{multicol}
\RequirePackage{imakeidx}
\RequirePackage{fancyvrb}
\RequirePackage{afterpage}
\RequirePackage{enumitem}
\RequirePackage[right]{eurosym}
\RequirePackage{listings}
\lstloadlanguages{[LaTeX]TeX}
%
\end{macrocode}
%
% Il disegno della gabbia del testo è ispirato al pacchetto |canoniclayout|.
% Però è stato osservato che se si compone in modo |oneside| la lettura
% a schermo è agevole, ma la stampa della guida risulta mal composta
% in fronte retro. Se invece si compone in modo |twoside| da una pagina
% all’altra il testo si sposterebbe alternativamente a destra e a
% sinistra a seconda della parità del numero di pagina, visto che il
% disegno della pagina prodotto da |canoniclayout| è asimmetrico.
%
% Per ovviare a questi inconvenient contemporaneamente necessita centrare
% orizzontalmente la gabbia e definire successivamente le testatine e i
% piedini in forma simmetrica così da rendere il layout delle pagine pari
% identiche a quelle dispari; la lettura a schermo e la stampa risultano
% pertanto identiche. Per testatine e piedini si veda più avanti. Per
% simmetria la gabbia viene centrata anche verticalmente.
%
% Prima però bisogna definire il formato della carta a seconda del formato
% specificato con l’apposita opzione. Poi, visto che la classe |memoir|
% è già stata caricata, si possono usare i suoi comandi specifici per
% definire gabbia, margini e le altre dimensioni. Si sfruttano registri
% già definiti da |memoir| e si usano alcuni comandi specifici della classe.
%
%
\begin{macrocode}
\normalfont
\ifPAD\setstocksize{160mm}{120mm}\fi
\iftablet\setstocksize{120mm}{90mm}\fi
79
Capitolo 5.
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
La classe per comporre questa guida tematica
\ifBv\setstocksize{250mm}{176mm}\fi
\ifAiv\setstocksize{293mm}{210mm}\fi
\ifAv\setstocksize{210mm}{146mm}\fi
\settrims{0pt}{0pt}
\settypeblocksize{\paperwidth}{\dimexpr\paperwidth*\paperwidth/\paperheight}{*}
\setlrmargins{*}{*}{*}
\setulmargins{*}{*}{*}
\setheadfoot{\baselineskip}{2\onelineskip}
\setheaderspaces{*}{\onelineskip}{*}
\setmarginnotes{7pt}{\dimexpr\foremargin-3em}{5pt}
\checkandfixthelayout[nearest]
%
\end{macrocode}
%
% Viene ora recuperato il comando |\GetFileInfo| dal pacchetto |doc.sty|
% in modo da sfruttare la possibilità di recuperare il dati di un file
% che contenga in testa uno dei comandi |\ProvidesClass| oppure
% |\ProvidesPackage| oppure |\ProvidesFile|, completo di argomento
% obbligatorio e facoltativo nel formato previsto da questi comandi.
% L’argomento di |\GetFileInfo| è il nome del file di cui si vogliono
% estrarre le informazioni, specificato completo di estensione.
% Il file deve essere già stato caricato prima di usare questo comando;
% usandolo si recuperano nelle macro |\filename|, |\filedate| e
% |\fileversion| le informazioni specifiche, che poi possono venire
% usate come meglio si crede.
%
\begin{macrocode}
\def\GetFileInfo#1{%
\def\filename{#1}%
\def\@tempb##1 ##2 ##3\relax##4\relax{%
\def\filedate{##1}%
\def\fileversion{##2}%
\def\fileinfo{##3}}%
\edef\@tempa{\csname ver@#1\endcsname}%
\expandafter\@tempb\@tempa\relax? ? \relax\relax}
%
\end{macrocode}
%
% Segue ora il comando |\setcopymark| che può venire usato in diversi
% modi; lo si può usare per inserire il marchio di copyright e il nome
% del detentore del suo diritto. Ma lo si può usare anche per marcare
% lo stato di avanzamento di bozze successive. Il suo output viene
% scritto nel margine esterno della pagina. Per altri usi di
% dichiarazioni di diritti si ritiene che sia meglio usare l’Introduzione
% invece del retrofrontespizio, visto che queste guide vengono per
% lo più composte solo fronte (almeno così si suggerisce) per una lettura
% confortevole a monitor.
80
§ 5.1
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
Il file documentato
%
\begin{macrocode}
\let\@copymark\@empty % Di default è vuoto
\newcommand*\setcopymark[1]{\gdef\@copymark{#1}}
\newcommand*\@insertcopymark{%
\begin{picture}(0,0)\unitlength=1mm\relax
\if@twoside
\ifodd\value{page}
\put(\strip@pt\dimexpr\foremargin/2\relax,\strip@pt\footskip)%
{\rotatebox{90}{\makebox(0,0)[l]{\@copymark}}}
\else
\put(-\strip@pt\dimexpr\foremargin/2\relax,\strip@pt\footskip)%
{\rotatebox{90}{\makebox(0,0)[l]{\@copymark}}}
\fi
\else
\put(\strip@pt\dimexpr\foremargin/2\relax,\strip@pt\footskip)%
{\rotatebox{90}{\makebox(0,0)[l]{\@copymark}}}
\fi
\end{picture}%
}
%
\end{macrocode}
%
% Si definisce il comando per inserire il layout della pagina sotto
% il testo di una pagina specifica. Vengono specificati i comandi
% sia per la pagina destra sia per quella sinistra, anche se si
% suppone che la maggior parte delle guide tematiche sia composta
% con l’opzione |oneside|. Questi comandi sono completamente
% parametrizzati alle dimensioni del foglio rifilato e valgono per
% qualunque formato.
%
\begin{macrocode}
\def\cblayoutsinistro{%
\dimen256=\dimexpr\headheight+\topmargin+1in-4pt-\paperheight\relax
\dimen258=\dimexpr\evensidemargin+1in\relax
\dimen262=1mm\relax
\dimen260=\dimexpr \paperwidth*\p@/\dimen262\relax
\dimen264=\dimexpr \paperheight-\topmargin-\headheight-1in
-\headsep-\textheight\relax
\begin{picture}(0,0)(\strip@pt\dimen258,-\strip@pt\dimen256)%
\put(0,0){\unitlength=\p@
\put(0,0){\framebox(\strip@pt\paperwidth,\strip@pt\paperheight){}}%
\color{red}%
\put(\strip@pt\dimen258,\strip@pt\dimen264){%
\framebox(\strip@pt\textwidth,\strip@pt\textheight){}}%
\Line(0,0)(\strip@pt\paperwidth,\strip@pt\paperheight)%
\put(\strip@pt\dimexpr\paperwidth/2\relax,%
\strip@pt\dimexpr\dimen264+\textheight/2\relax)%
81
Capitolo 5.
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
La classe per comporre questa guida tematica
{\circle{\strip@pt\paperwidth}}%
}
\end{picture}}
\def\cblayoutdestro{%
\dimen256=\dimexpr\headheight+\topmargin+1in-4pt-\paperheight\relax
\dimen258=\dimexpr\oddsidemargin+1in\relax
\dimen262=1mm\relax
\dimen260=\dimexpr \paperwidth*\p@/\dimen262\relax
\dimen264=\dimexpr \paperheight-\topmargin-\headheight-1in
-\headsep-\textheight\relax
\begin{picture}(0,0)(\strip@pt\dimen258,-\strip@pt\dimen256)%
\put(0,0){\unitlength=\p@
\put(0,0){\framebox(\strip@pt\paperwidth,\strip@pt\paperheight){}}%
\color{red}%
\put(\strip@pt\dimen258,\strip@pt\dimen264){%
\framebox(\strip@pt\textwidth,\strip@pt\textheight){}}%
\Line(0,\strip@pt\paperheight)(\strip@pt\paperwidth,0)%
\put(\strip@pt\dimexpr\paperwidth/2\relax,%
\strip@pt\dimexpr\dimen264+\textheight/2\relax)%
{\circle{\strip@pt\paperwidth}}%
}
\end{picture}}
%
\end{macrocode}
% Si noti che non sempre il rettangolo che rappresenta la gabbia
% è rasente agli ascendenti della prima riga della pagina e alla
% linea di base dell’ultima linea; questo dipende dal fatto che
% il layout della pagina creato da |memoir| prevede un piccolo
% aggiustamento dell’altezza della gabbia affinché contenga un
% numero intero di righe; si aggiunga che il programma di
% composizione talvolta inserisce un salto di pagina quando il
% ‘‘goal’’ di altezza della gabbia non è ancora raggiunto; questa
% cosa generalmente dipende dal contenuto della pagina stessa che
% potrebbe contenere oggetti il cui ingombro sulla pagina non
% corrisponde ad un numero intero di righe in corpo normale. Se
% l’aggiustamento è irrisorio, la diagonale della gabbia del testo
% coincide con la diagonale della pagina.
%
% Si specifica ora il comando |\contribguit| che realizza una pagina
% con le informazioni relative all’iscrizione nel gruppo. Il comando
% può essere utilizzato a inizio o fine documento. Tuttavia,
% per garantire maggiore visibilità, si consiglia di inserire
% |\contribguit| dopo |\frontmatter| e prima del capitolo di
% introduzione o eventuali pagine con informazioni sulle licenze d’uso.
%
\begin{macrocode}
82
§ 5.1
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
Il file documentato
\providecommand*\Ars{%
\textsf{\lower -.48ex\hbox{\rotatebox{-20}{A}}\kern -.3em{rs}}\hskip0pt%
\kern -.05em\TeX\hskip0pt\kern -.17em\lower -.357ex\hbox{nica}}
\newcommand{\contribguit}{\newpage
\thispagestyle{empty}
\noindent{\Large
Associati anche tu al \GuIT
\hfill
\setlength{\unitlength}{1mm}
\begin{picture}(50,2)
\setlength{\fboxsep}{0pt}
\put(1,-3){\colorbox{gray}{\framebox(50,6.5){}}}
\put(0,-2){\colorbox{white}{\framebox(50,6.5){%
\href{http://www.guitex.org/home/it/diventa-socio/associarsi-a-guit}{%
Fai click per associarti}}}}
\end{picture}%
}
\bigskip
L’associazione per la diffusione di \TeX{} in Italia riconosciuta
ufficialmente in ambito internazionale, si sostiene \emph{unicamente}
con le quote sociali.
Se anche tu trovi che questa guida tematica gratuita ti sia stata utile,
il mezzo principale per ringraziare gli autori è diventare socio.
\medskip
Divenendo soci si ricevono gratuitamente:
\begin{itemize}
\item
l’abbonamento alla rivista \Ars;
\item
il DVD \TeX\ Collection;
\item
l’esclusivo tipometro realizzato da Massimo Caschili.
\end{itemize}
L’adesione al \GuIT{} prevede un quota associativa compresa tra \EUR{12,00}
e \EUR{70,00} a seconda della tipologia di adesione prescelta ed ha
validità per l’anno solare in corso.
\newpage
}
%
\end{macrocode}
%
% Si specificano ora i comandi di configurazione per la classe |memoir|.
83
Capitolo 5.
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
La classe per comporre questa guida tematica
% Non si vuole il maiuscolo nelle testatine, perché verrà usato il
% maiuscoletto; non si vogliono filetti per separare la testatina e il
% piedino dal testo. Si vuole però che il |\@copymark| sia sempre presente
% nel piedino: vuol dire che se questa macro è vuota non viene stampato
% niente.
%
% Nei piedini il numero di pagina viene composto in maiuscoletto:
% la cosa non è importantissima, ma all’occorrenza i numeri di pagina
% romani minuscoli vengono composti col minuscolo del maiuscoletto e non
% hanno quell’aspetto orribile dei numeri romani composti in tondo
% minuscolo.
%
%
\begin{macrocode}
\nouppercaseheads
%\renewcommand{\footruleheight}{\normalrulethickness}
\renewcommand{\footruleskip}{0pt}
\makeheadrule{headings}{\textwidth}{0pt}
\makeheadrule{myheadings}{\textwidth}{0pt}
\makeevenfoot{plain}{\@insertcopymark}{\textsc{\thepage}}{}
\makeoddfoot{plain}{}{\textsc{\thepage}}{\@insertcopymark}
\makeevenfoot{headings}{\@insertcopymark}{\textsc{\thepage}}{}
\makeoddfoot{headings}{}{\textsc{\thepage}}{\@insertcopymark}
\makeevenfoot{myheadings}{\@insertcopymark}{\textsc{\thepage}}{}
\makeoddfoot{myheadings}{}{\textsc{\thepage}}{\@insertcopymark}
%
\end{macrocode}
% I mark delle pagine destre e sinistre sono composti centrati
% sia nelle pagine destre sia in quelle sinistre.
%
\begin{macrocode}
\makeevenhead{headings}{}{\textsc{\small\leftmark}}{}
\makeoddhead{headings}{}{\textsc{\small\rightmark}}{}
\makeevenhead{myheadings}{}{\textsc{\small\leftmark}}{}
\makeoddhead{myheadings}{}{\textsc{\small\rightmark}}{}
%
\end{macrocode}
% Vengono definiti i comandi per ‘‘decorare’’ le intestazioni delle testatine.
%
\begin{macrocode}
\makepsmarks{headings}{%
\createmark{chapter}{both}{shownumber}{\@chapapp\space}{.\qquad}
\createmark{section}{right}{shownumber}{$\mathsection$\,}{\qquad}
\renewcommand*\indexmark{\markboth{\indexname}{\indexname}}}
%
\end{macrocode}
% Vengono definiti gli stili di pagina modificati con il layout disegnato
% sotto. Non sono da usare sistematicamente, ma probabilmente come
% argomenti di |\thispagestyle|.
%
\begin{macrocode}
\makepagestyle{headingslayout}
84
§ 5.1
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
Il file documentato
\makeevenhead{headingslayout}{\cblayoutsinistro}{\textsc{\small\leftmark}}{}
\makeevenfoot{headingslayout}{\@insertcopymark}{\textsc{\thepage}}{}
\makeoddhead{headingslayout}{\cblayoutdestro}{\textsc{\small\rightmark}}{}
\makeoddfoot{headingslayout}{}{\textsc{\thepage}}{\@insertcopymark}
%
\end{macrocode}
%
% Viene definito lo stile per comporre la pagina iniziale dei capitoli;
% si compone il titolo del capitolo in maiuscoletto e il numero del capitolo
% molto grande fuori nel margine esterno. Si imposta questo stile al
% momento dell’inizio del documento per contrastare eventuali ulteriori
% modifiche inserite nel preambolo.
%
\begin{macrocode}
\makechapterstyle{guidatematica}{%
\renewcommand*{\chapnumfont}{%
\fontshape{it}\fontsize{40}{40}\selectfont}
\renewcommand*{\printchaptername}{}
\renewcommand*{\chapternamenum}{}
\renewcommand*{\chaptitlefont}{%
\fontsize{18}{16}\scshape}% sterlineato
\renewcommand{\printchapternum}{%
\noindent\rlap{\makebox[\textwidth][r]{\rlap{\makebox[\foremargin][l]{%
\chapnumfont \thechapter}}}}\printchaptertitle}
\renewcommand*{\afterchapternum}{}
}
\AtBeginDocument{\chapterstyle{guidatematica}}
%
\end{macrocode}
%
% Vengono ora fissati alcuni parametri stilistici per le pagine che
% iniziano una ‘‘parte’’, anche se si ritiene che le guide tematiche
% debbano essere sufficientemente succinte da non richiedere di
% essere divise in parti.
%
\begin{macrocode}
\renewcommand*\partnamefont{\normalfont\large\scshape}
\renewcommand*\partnumfont{\normalfont\large\scshape}
\renewcommand*\parttitlefont{\normalfont\huge\scshape}
%
\end{macrocode}
%
% Ora le spaziature prima, dopo, a destra e a sinistra dei titoli dei comandi
% di sezionamento minori. Inoltre si definiscono gli stili dei titolini e
% altre informazioni stilistiche per le parti e i capitoli.
%
\begin{macrocode}
\setbeforesecskip{-3.5ex plus-1ex minus-0.2ex}
\setbeforesubsecskip{-3ex plus-1ex minus-0.2ex}
\setbeforesubsubsecskip{-2.5ex plus-1ex minus-0.2ex}
\setbeforeparaskip{1\onelineskip plus1ex minus0.2ex}
85
Capitolo 5.
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
La classe per comporre questa guida tematica
\setbeforesubparaskip{1\onelineskip plus1ex minus0.2ex}
\setaftersecskip{1.5ex plus0.2ex}
\setaftersubsecskip{1.5ex plus0.2ex}
\setaftersubsubsecskip{1.5ex plus0.2ex}
\setafterparaskip{-1em}
\setaftersubparaskip{-1em}
\setsubparaindent{\parindent}
\setsecheadstyle{\large\scshape\raggedright}
\setsubsecheadstyle{\large\scshape\raggedright}
\setsubsubsecheadstyle{\large\scshape\raggedright}
\setparaheadstyle{\small\scshape}
\setsubparaheadstyle{\small\scshape}
\aliaspagestyle{part}{empty}
\aliaspagestyle{chapter}{empty}
\copypagestyle{titlepage}{headings}
\renewcommand\cftpartpagefont{\scshape}
\renewcommand\cftpartfont{\large\scshape}
\renewcommand\cftchapterfont{\large\scshape}
\renewcommand\cftchapterpagefont{\scshape}
\renewcommand*{\cftchapterfillnum}[1]{%
{\cftchapterleader}\nobreak
\cftchapterformatpnum{#1}%
\cftchapterafterpnum\par\nobreak}
\setlength{\cftbeforechapterskip}{1.0em \@plus 2\p@}
%
\end{macrocode}
%
% Grazie alle funzionalità di |memoir| si ridefiniscono anche
% le modalità di comporre le didascalie.
%
\begin{macrocode}
\captiondelim{\quad}
\captionnamefont{\small\scshape}
\captiontitlefont{\small}
\captionstyle[\centering]{}
\hangcaption
\captionwidth{\dimexpr\textwidth-2\parindent\relax}\changecaptionwidth
%
\end{macrocode}
%
% Qui ora grazie al pacchetto |enumitem| si definiscono, o
% ridefiniscono, comunque si personalizzano i vari ambienti
% che formano liste di tipo diverso.
% Intanto in tutte le liste descrittive l’etichetta viene sempre
% composta in maiuscoletto; se si vuole cambiare font o stile
% basta usare gli appositi comandi nella forma \meta{chiave}
86
§ 5.1
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
Il file documentato
% = \meta{valore} forniti dal pacchetto |enumitem|. Solo per
% il nuovo ambiente descrittivo |plaindescription| la didascalia
% di default è composta in |\normalfont|.
% L’ambiente |blockdescription| viene definito senza le etichette
% sporgenti e senza rientranza del margine sinistro.
% I nuovi ambienti |compactenumerate|, |compactitemize| e
% |compactdescription| sono definiti in modo da annullare tutti
% gli spazi verticali interni e in modo da ridurre gli spazi
% prima e dopo la lista.
%
\begin{macrocode}
\renewcommand\descriptionlabel[1]{\hspace\labelsep\normalfont\scshape #1}
\renewcommand\blockdescriptionlabel[1]{\normalfont\scshape #1}
\providecommand\plaindescriptionlabel[1]{\hspace\labelsep\normalfont #1}
\renewlist{blockdescription}{description}{1}
\setlist[blockdescription]{before={\let\makelabel\blockdescriptionlabel},
leftmargin=\z@,labelsep*=0.5em,labelindent=\z@,labelwidth=\z@}
\newlist{plaindescription}{description}{1}
\setlist[plaindescription]{before={\let\makelabel\plaindescriptionlabel}}
\newlist{compactenumerate}{enumerate}{1}
\setlist[compactenumerate,1]{label=\arabic*.,
noitemsep, partopsep=\z@, topsep=.25\onelineskip}
\newlist{compactitemize}{itemize}{4}
\setlist[compactitemize]{label=•,
noitemsep,partopsep=\z@,topsep=.25\onelineskip}
\newlist{compactdescription}{description}{1}
\setlist[compactdescription]{%
style=sameline,noitemsep,partopsep=\z@,topsep=.25\onelineskip}
%
\end{macrocode}
%
% Vengono poi impostati e differiti all’inizio del documento
% i contatori che regolano la profondità di numerazione delle
% sezioni e della loro inclusione nell’indice generale.
%
\begin{macrocode}
\AtBeginDocument{\setsecnumdepth{subsection}
\settocdepth{subsection}\maxsecnumdepth{subsection}
\maxtocdepth{subsection}}
%
\end{macrocode}
%
% Viene ora definita la virgola intelligente; si veda una
% descrizione più dettagliata della sua utilità in matematica
87
Capitolo 5.
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
%
%
%
%
%
%
%
%
La classe per comporre questa guida tematica
per esempio della documentazioone di questa classe
|gidatematica-doc.pdf|. Qui si commenta solo il codice.
La prima parte del codice serve per rendere attiva la virgola
solo in modo matematico e solo quando la lingua principale
\emph{non} è l’inglese. Si fornisce anche un comando
|\m@thcomma| come cuore della definizione della virgola attiva.
\begin{macrocode}
\DeclareMathSymbol{\virgola}{\mathpunct}{letters}{"3B}
\DeclareMathSymbol{\virgoladecimale}{\mathord}{letters}{"3B}
\unless\ifPDFTeX
\AtBeginDocument{\ifcsstring{xpg@main@language}{english}{\relax}{%
\mathcode‘\,=\string"8000}}
\else
\AtBeginDocument{\ifcsstring{languagename}{english}{\relax}{%
\mathcode‘\,=\string"8000}}
\fi
{\catcode ‘,=\active \gdef,{\futurelet\let@token\m@thcomma}}%
%
\end{macrocode}
% Poi, ritardando l’esecuzione alla fine del preambolo, si definisce
% |\m@thcomma| in modo che svolga il suo compito: |\let@token|
% contiene il token che segue |\m@thcomma| nel file sorgente;
% precisamente il token che segue la virgola nel file sorgente.
% Perciò esso può essere uno spazio, un carattere implicito,
% un carattere esplicito, una macro, un qualunque token di
% categoria diversa da 11 e da 12. Il comando |\m@thcomma|
% assorbe anche il primo token che la segue, purché non sia
% uno spazio, eventualmente già memorizzato in |\let@token|.
% Lo scopo della virgola intelligente è quello di sapere se il
% carattere che viene immediatamente dopo sia una cifra, che
% è di categoria 12, come l’asterisco. Quindi per prima cosa
% si controlla se |\let@token| ha categoria 12. Se non lo è
% allora non si tratta sicuramente di una cifra e la virgola
% intelligente inserisce la virgola interpuntiva.
% Ma se lo è potrebbe essere un carattere esplicito analfabetico
% oppure un carattere implicito di categoria 12. In questo caso
% non lo si può usare per verificare se il carattere implicito
% sia una cifra; ma in matematica nessuno si sognerebbe mai di
% indicare con un carattere implicito una qualunque delle
% 10 cifre decimali; dunque se si tratta di un carattere implicito
% esso rappresenta qualche carattere diverso da una cifra
% e ci vuole la virgola interpuntiva. Solo che per sapere se
% si tratta di un carattere implicito bisogna verificare se esso
% ha la forma di una sequenza di controllo. Per fare questo
% bisogna prendere la stringa che costituisce l’argomento di
88
§ 5.1
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
Il file documentato
% |\m@thcomma|, togliergli il primo carattere (eventualmente
% un backslash) e vedere se quel che resta costituisce il nome
% di una sequenza di controllo a cui è stato assegnato un
% significato; dunque se il token fosse per esempio
% \fbox{\cs{infty}} la stringa sarebbe formata dai caratteri
% |\|, |i|, |n|, |f|, |t|, e |y|, togliendo il primo dei quali
% resta la ‘‘parola’’ |infty|; il test |\ifcsname infty\endcsname|
% restituisce il valore ‘‘vero’’ se |\infty| ha un significato;
% nel nostro caso quindi si tratterebbe di un carattere
% implicito e ci vuole la virgola interpuntiva. Se invece il
% primo argomento della macro |\m@thcomma| fosse un carattere
% esplicito di categoria 12 (non potrebbe essere altro a questo
% punto dei test), questa operazione di togliere il primo
% carattere, lascerebbe una stringa vuota cosicché il test
% |\ifcsname\endcsname| darebbe luogo ad un valore ‘‘falso’’,
% quindi abbiamo la certezza che si tratti di un carattere
% esplicito di categoria 12; bisogna ora testare se si tratta
% di una cifra. I due test |\ifnum‘#1<‘0| e |\ifnum‘#1>‘9|
% controllano se il carattere in questione è esterno o interno
% all’intervallo ASCII delle cifre; se esso è esterno ci
% vuole la virgola interpuntiva, altrimenti la virgola decimale.
%
% Non tanto semplice ma efficace sia con pdfLaTeX sia con XeLaTeX.
%
\begin{macrocode}
\AtEndPreamble{%
\gdef\m@thcomma#1{%
\unless\ifcat\noexpand\let@token*%
\virgola
\else
\expandafter\expandafter\expandafter
\ifcsname\expandafter\@gobble\string#1\endcsname
\virgola
\else
\ifnum‘#1<‘0\relax
\virgola
\else
\ifnum‘#1>‘9\relax
\virgola
\else
\virgoladecimale
\fi
\fi
\fi
\fi#1}%
}
89
Capitolo 5.
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
La classe per comporre questa guida tematica
%
\end{macrocode}
%
% Si ridefiniscono l’ambiente |thebibliography| e |theindex|
% per poterne inserire il titolo nell’indice e per poter
% avere il ‘‘target’’ nel punto giusto quando si clicca su
% un link ipertestuale che porti all’inizio di queste
% ‘‘sezioni’’. Per giunta queste parti dovrebbero cadere
% nella back matter, quindi non verrebbero nemmeno numerati.
%
% Per la bibliografia si sfruttano i comandi interni di |memoir|
% per ottenere quello che si desidera e nello stesso tempo
% per consentire di mettere un prologo prima dell’elenco
% bibliografico. La documentazione di |memoir| dice che bisogna
% ridefinire il comando interno |\bibsection|.
%
\begin{macrocode}
\renewcommand{\bibsection}{\chapter{\bibname}\prebibhook}
%
\end{macrocode}
%
% Per l’indice o gli indici analitici non dovrebbero esserci
% problemi, nel senso che il pacchetto |imakeidx| ridefinisce
% a sua volta quelli analitici per poterli gestire a modo suo.
% Probabilmente è del tutto inutile la ridefinizione fatta
% in questa classe, ma non dà nessun fastidio, quindi la
% si lascia lo stesso.
%
\begin{macrocode}
\let\imki@idxprologue\empty
\def\imki@columns{2}
\renewenvironment{theindex}
{%
\clearforchapter
\csname phantomsection\endcsname
\chapter{\indexname}%
\indexmark%
\parindent\z@
\parskip\z@ \@plus .3\p@\relax
\let\item\@idxitem
\begin{multicols}{\imki@columns}[\imki@idxprologue]
\raggedright
}
{%
\end{multicols}\gdef\imki@idxprologue{}\clearpage
}
%
\end{macrocode}
%
% All’inizio del documento si inserisce l’indicazione
90
§ 5.1
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
Il file documentato
% per lo stile bibliografico. Avendo caricato il pacchetto
% |natbib| e lo stile bibliografico |guidatematica.bst|
% le citazioni e l’elenco dei riferimenti bibliografici
% vengono eseguiti con lo stile ‘‘autore-anno’’. |natbib|
% da parte sua mette a disposizione tanti comandi della
% famiglia |\cite|, che si possono usare più di una mezza
% dozzina di tali comandi per avere lo stile predefinito,
% fra parentesi, solo l’autore, solo l’anno, eccetera.
%
\begin{macrocode}
\AtBeginDocument{\bibliographystyle{guidatematica}%
%
\end{macrocode}
%
% Come configurazione generale con |XeLaTeX| si impone
% lo stile senza il rientro del primo capoverso di un
% capitolo o di ogni sezione. Con |pdfLaTeX| non è
% necessario, perché questa funzionalità è predefinita.
% Tuttavia ogni autore di guide tematiche è padronissimo
% di impostarsi il pacchetto |indentfirst| se vuole
% rientrare tutti i capoversi, anche quelli che seguono
% ogni comando di sezionamento.
%
\begin{macrocode}
\unless\ifPDFTeX
\ifcsstring{xpg@main@language}{italian}%
{\csgappto{init@extras@italian}{\nofrench@indent}}{}%
\fi}
%
\end{macrocode}
%
% L’ambiente per la pagina del titolo, |titlepage| non
% è definita con la classe |memoir|; qui la si definisce
% apposta e funzionalmente per questa classe, non è un
% comando da usare da parte dell’utente; egli deve
% invece limitarsi a dare i comandi |author|, un solo
% autore, o una lista di autori separati da virgole o
% altri spaziatori; |\title| con il titolo della guida;
% |\subtitle| per un eventuale sottotitolo; |\date| con
% le informazioni che ritiene più opportune.
%
\begin{macrocode}
\newenvironment{titlepage}{\clearpage
\pagestyle{titlepage}
\makeoddhead{titlepage}{}{\smash{\Large\scshape\@author}}{}
\makeoddfoot{titlepage}{}{\smash{\large\scshape\@date}}{}
}{\clearpage}
\providecommand\subtitle[1]{\gdef\@subtitle{#1}}
\let\@subtitle\empty
91
Capitolo 5.
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
La classe per comporre questa guida tematica
\renewcommand\maketitle{
\begin{titlepage}
\vspace*{\stretch{.7}}
{\centering\LARGE\scshape\@title\par}
\ifdefvoid{\@subtitle}{}{\vspace{2\onelineskip}
{\centering\scshape\Large\@subtitle\par}}
\vspace{\stretch{.7}}
{\centering\includegraphics[width=0.23\paperwidth]{logoguittondo}\par}
\vspace*{\stretch{.7}}
\end{titlepage}
}
%
\end{macrocode}
%
% Invece sono importanti questi due ambienti: |medaglione|
% e |sintassi|. Il primo serve per incorniciare un testo;
% per la larghezza l’ambiente medaglione accetta un argomento
% facoltativo, predefinito alla giustezza corrente (quindi
% una giustezza che cambia all’interno delle liste);
% determina la giustezza di composizione all’interno del
% medaglione tenendo conto dello spessore del filetto della
% cornice e dello spazio di separazione fra la cornice e
% il testo in essa contenuto.
%
% I secondo ambiente, |sintassi| è un medaglione adatto
% per incorniciare i comandi e quindi per descrivere la
% loro sintassi. Spesso l’ambiente sintassi contiene
% la descrizione della sintassi di un solo comando;
% dovendo indicare la sintassi di molti comandi è opportuno
% sfruttare la composizione sbandierata con l’allineamento
% a sinistra (predefinito) ma con un ‘‘a capo’’ automatico
% ogni volta che nel sorgente si incontra un ‘‘a capo’’ nel
% testo sorgente; in questi casi sta all’utente di specificare
% il comando |\obeylines| all’inizio dell’ambiente cosicché
% non dovrà più ricordarsi di mettere esplicitamente un
% comando |\\| alla fine di ogni riga.
%
\begin{macrocode}
\newenvironment{medaglione}[1][\linewidth]{%
\begin{lrbox}{0}%
\begin{minipage}{\dimexpr#1-2\fboxsep-2\fboxrule}
}{%
\end{minipage}\end{lrbox}\fbox{\usebox{0}}\relax
}
\newenvironment{sintassi}{\flushleft\medaglione}%
92
§ 5.1
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
Il file documentato
{\endmedaglione\endflushleft}
%
\end{macrocode}
%
% Per descrivere la sintassi sono utili i comandi seguenti
% al fine di semplificare la scrittura delle parti di testo
% corrente e differenziare gli argomenti generici; quelli
% obbligatori e quelli facoltativi; dovendo descrivere
% delle cose riguardanti il disegno programmato, le
% coordinate spesso vengono distinte con due valori,
% separati da una virgola e racchiusi fra parentesi tonde;
% anche in questo caso siamo di fronte alla descrizione di
% una sintassi e si dispone di un apposito comando per
% descrivere le coordinate geometriche.
%
% {\tolerance=9999\relax
% I comandi sono |\meta| per un \meta{argomento generico};
% |\marg| per un \marg{argomento obbligatorio}; |\oarg| per un
% \oarg{argomento facoltativo}; |\garg| per le
% \garg{coordinate,geometriche}; |\comando| per un
% \comando{\comando} completo del suo backslash; |\cs| per il
% nome (senza backslash) di un \cs{comando} al quale viene
% anteposto il suo necessario backslash quando esso viene
% composto; |\Sambiente| per descrivere la sintassi di uno
% specifico ambiente che accetta un argomento come in
% \Sambiente{ambiente}{argomento}; |\Dambiente|
% per descrivere la sintassi di un ambiente che accetta
% un argomento facoltativo per il quale bisogna indicare
% il valore predefinito, come in
% \Dambiente{ambiente}{argomento}{default}; |Bambiente|
% per indicare l’apertura di un ambiente specifico;
% |\Eambiente| per indicare la chiusura di un ambiente
% specifico; |\Arg| per indicare fra graffe un argomento
% specifico \Arg{123}.\par}
%
\begin{macrocode}
\newcommand*\hz{\nobreak\hskip\z@}
\renewcommand*\meta[1]{$\langle$\textit{\hz#1}$\rangle$}
\renewcommand*\marg[1]{\texttt{\char123}\meta{#1}\texttt{\char125}}
\renewcommand*\oarg[1]{\texttt{[}\meta{#1}\texttt{]}}
\newcommand*\Arg[1]{\texttt{\char123\relax#1\char125}}
\def\GT@splitargs#1,#2!{\def\@tempA{#1}\def\@tempB{#2}}
\newcommand\garg[1]{\GT@splitargs#1!\texttt{(}\meta{\@tempA}%
\texttt{,}\meta{\@tempB}\texttt{)}}
\newcommand*\comando[1]{\texttt{\string#1}}
\renewcommand*{\cs}[1]{\texttt{\char92#1}\index{#1@\texttt{\char92#1}}}
\let\csindex\cs
93
Capitolo 5.
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
La classe per comporre questa guida tematica
\newcommand*\Sambiente[2]{\cs{begin}\marg{#1}\oarg{#2}\,\dots
\cs{end}\marg{#1}}
\newcommand*\Dambiente[3]{\cs{begin}\marg{#1}\oarg{#2}\oarg{#3}\,\dots
\cs{end}\marg{#1}}
\newcommand*\Bambiente[1]{\cs{begin}\texttt{\char123#1\char125}}
\newcommand*\Eambiente[1]{\cs{end}\texttt{\char123#1\char125}}
%
\end{macrocode}
%
% Invece i comandi che seguono servono per comporre
% con un certo stile grafico certi elementi del
% linguaggio dagli ambienti alle classi fino ai
% codici di allineamento di certi oggetti con gli
% oggetti circostanti; ci si può riferire alla
% documentazione d’uso della classe
% \emph{guidatematica-doc.pdf} distribuita con il
% kit di composizione delle guide tematiche.
%
% Si noti che molti di questi oggetti possono venire
% inseriti in uno o più indici analitici; sta al
% compositore stabilire se la Guida tematica abbia
% necessità di uno o più indici analitici; la
% documentazione \emph{guidatematica-doc.pdf} contiene
% maggiori dettagli. Qui vale la pena di sottolineare
% che i comandi il cui nome termina con |style| servono
% solo per gestire lo stile di composizione; quelli
% invece che cominciano con la stessa ‘‘parola’’ ma
% non terminano con |style| compongono nel testo la
% locuzione specifica con lo stile che le si addice
% ma, se è stato specificato il comando |\makeindex|,
% eventualmente con le sue opzioni, inviano anche le
% apposite informazioni al file di servizio
% |\jobname.idx| per essere poi elaborati con il
% programma |makeidx| per avere le varie voci in ordine
% alfabetico gerarchico, al fine di poter comporre
% l’indice analitico come prescritto. I comandi che
% seguono permettono di inserire le voci in un unico
% indice analitico; se ne occorre più di uno essi
% possono o debbono venire ridefiniti in modo da inviare
% la voce all’indice desiderato.
%
\begin{macrocode}
%
\DeclareRobustCommand*\ambstyle[1]{\textsf{\slshape#1}}
\DeclareRobustCommand*\classstyle[1]{\texttv{\itshape#1}}
\DeclareRobustCommand*\filestyle[1]{\texttm{\textl{#1}}}
\unless\ifPDFTeX
94
§ 5.1
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
Il file documentato
\DeclareRobustCommand*\packstyle[1]{\texttm{\itshape{#1}}}
\else
\DeclareRobustCommand*\packstyle[1]{\texttm{\itshape\textl{#1}}}
\fi
\DeclareRobustCommand*\progstyle[1]{\textsf{#1}}
\DeclareRobustCommand*\prog[1]{\progstyle{#1}%
\index{programma!#1@\progstyle{#1}}}
\DeclareRobustCommand*\pack[1]{\packstyle{#1}%
\index{pacchetto!#1@\packstyle{#1}}}
\DeclareRobustCommand*\class[1]{\classstyle{#1}%
\index{classe!#1@\classstyle{#1}}}
\DeclareRobustCommand*\file[1]{\filestyle{#1}%
\index{file!#1@\filestyle{#1}}}
\DeclareRobustCommand*\amb[1]{\ambstyle{#1}%
\index{ambiente!#1@\ambstyle{#1}}}
%
\DeclareRobustCommand*\opzstyle[1]{\textsl{\textl{#1}}}
\DeclareRobustCommand*\contastyle[1]{\texttm{#1}}
\DeclareRobustCommand*\stilestyle[1]{\texttm{#1}}
\DeclareRobustCommand*\numeristyle[1]{\texttm{#1}}
\DeclareRobustCommand*\umisurastyle[1]{\texttm{#1}}
\DeclareRobustCommand*\chiavestyle[1]{\texttm{#1}}
\DeclareRobustCommand*\descrittorestyle[1]{\texttm{#1}}
\DeclareRobustCommand*\posizionestyle[1]{\texttm{#1}}
\DeclareRobustCommand*\allineamentostyle[1]{\texttm{#1}}
%
\DeclareRobustCommand*\opz[1]{\opzstyle{#1}%
\index{opzione!#1@\opzstyle{#1}}}
\DeclareRobustCommand*\conta[1]{\contastyle{#1}%
\index{contatore!#1@\contastyle{#1}}}
\DeclareRobustCommand*\stile[1]{\stilestyle{#1}%
\index{stile della pagina!#1@\stilestyle{#1}}}
\DeclareRobustCommand*\numeri[1]{\numeristyle{#1}%
\index{numerazione!#1@\numeristyle{#1}}}
\DeclareRobustCommand*\umisura[1]{\umisurastyle{#1}%
\index{unit\‘a di misura!#1@\umisurastyle{#1}}}
\DeclareRobustCommand*\chiave[1]{\chiavestyle{#1}%
\index{chiave!#1@\chiavestyle{#1}}}
\DeclareRobustCommand*\descrittore[1]{\descrittorestyle{#1}%
\index{descrittore di colonna!#1@\descrittorestyle{#1}}}
\DeclareRobustCommand*\posizione[1]{\posizionestyle{#1}%
\index{posizione degli oggetti flottanti!#1@\posizionestyle{#1}}}
\DeclareRobustCommand*\allineamento[1]{\allineamentostyle{#1}%
\index{codice di allineamento!#1@\allineamentostyle{#1}}}
%
\end{macrocode}
95
Capitolo 5.
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
La classe per comporre questa guida tematica
%
% Finalmente la macro |\GuIT| per gestire l’immagine del logo del GuIT.
%
\begin{macrocode}
%
\DeclareRobustCommand*\GuIT{{\dimen@=\f@size\p@\dimen2=20.88\p@
\edef\guitscale{\strip@pt\dimexpr\dimen@*\p@/\dimen2\relax}%
\raisebox{-0.93ex}[\z@][\z@]{%
\includegraphics[scale=\guitscale]{logoguitlineare}}}}
\let\guit\GuIT
%
\end{macrocode}
% \iffalse
%</class>
% \fi
% Questo è tutto.
% \Finale
%
% \endinput
5.2
Il file di classe estratto dal file documentato
Il file è autoestraente; l’esecuzione di pdfLaTeX sul file .dtx produce
quindi il file di classe guidatematica.cls e il file di documentazione
guidatematica.pdf; il primo appare così:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
%%
%% This is file ‘guidatematica.cls’,
%% generated with the docstrip utility.
%%
%% The original source files were:
%%
%% guidatematica.dtx (with options: ‘class’)
%%
________________________________________
%%
The guidatematica class for typesetting books in the GuIT series
%%
"Guide Tematiche"
%%
Copyright (C) 2012, 2014 GuIT, Gruppo utilizzatori Italiani di TeX e LaTeX
%%
All rights reserved
%%
%%
http://www.guitex.org
%%
%%
License information appended
%%
\NeedsTeXFormat{LaTeX2e}[2009/01/01]
\ProvidesClass{guidatematica}%
[2014/09/03 v.1.5 Classe simmetrica per comporre testi della collana
96
§ 5.2
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
Il file di classe estratto dal file documentato
Guide Tematiche del GuIT]
\DeclareOption{ipertesto}{%
\AtBeginDocument{\RequirePackage[colorlinks,linkcolor={blue},
citecolor={blue!80!black},urlcolor={blue}]{hyperref}}
}
\newif\ifPAD\PADfalse
\DeclareOption{pad}{\PADtrue\tabletfalse\Aivfalse\Bvfalse\Avfalse}
\newif\iftablet\tabletfalse
\DeclareOption{tablet}{\tablettrue\Aivfalse\Bvfalse\Avfalse\PADfalse}
\newif\ifAiv \Aivfalse
\DeclareOption{a4paper}{\Aivtrue\tabletfalse\Bvfalse\Avfalse\PADfalse}
\newif\ifBv \Bvtrue
\DeclareOption{b5paper}{\Aivfalse\Bvtrue\tabletfalse\Avfalse\PADfalse}
\newif\ifAv \Avfalse
\DeclareOption{a5paper}{\Avtrue\Aivfalse\Bvfalse\tabletfalse\PADfalse}
\DeclareOption*{\PassOptionsToClass{\CurrentOption}{memoir}}
\ProcessOptions*\relax
\LoadClassWithOptions{memoir}
\RequirePackage{iftex}
\ifPDFTeX
\RequirePackage[utf8]{inputenc}
\RequirePackage[T1]{fontenc}
\RequirePackage[italian]{babel}
\RequirePackage[tt={oldstyle=false,tabular,monowidth}]{cfr-lm}
\else
\RequirePackage{fontspec}
\defaultfontfeatures[\rmfamily,\sffamily]{Ligatures=TeX,Numbers=OldStyle}
\defaultfontfeatures[\ttfamily,\tvfamily]{Numbers=Lining}
\setmainfont{Latin Modern Roman}[SmallCapsFont={* Caps}]
\setsansfont{Latin Modern Sans}
\setmonofont{Latin Modern Mono}
\newfontfamily{\tvfamily}{Latin Modern Mono Prop}
\DeclareTextFontCommand{\texttm}{\ttfamily}
\DeclareTextFontCommand{\texttv}{\tvfamily}
\def\textl#1{{\addfontfeature{Numbers=Lining}#1}}
\RequirePackage{unicode-math}
\setmathfont{Latin Modern Math}
\RequirePackage{polyglossia}
\setmainlanguage{italian}
\ifx\tmspace\@undefined
\newlength{\tmspace}\tmspace=\z@
\fi
97
Capitolo 5.
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
La classe per comporre questa guida tematica
\fi
\RequirePackage{graphicx}
\RequirePackage{metalogo}
\RequirePackage{pict2e}[2009/06/01]
\RequirePackage{microtype}
\RequirePackage{etoolbox}
\RequirePackage{xcolor}
\RequirePackage{natbib}
\RequirePackage{multicol}
\RequirePackage{imakeidx}
\RequirePackage{fancyvrb}
\RequirePackage{afterpage}
\RequirePackage{enumitem}
\RequirePackage[right]{eurosym}
\RequirePackage{listings}
\lstloadlanguages{[LaTeX]TeX}
\normalfont
\ifPAD\setstocksize{160mm}{120mm}\fi
\iftablet\setstocksize{120mm}{90mm}\fi
\ifBv\setstocksize{250mm}{176mm}\fi
\ifAiv\setstocksize{293mm}{210mm}\fi
\ifAv\setstocksize{210mm}{146mm}\fi
\settrims{0pt}{0pt}
\settypeblocksize{\paperwidth}{\dimexpr\paperwidth*\paperwidth/\paperheight}{*}
\setlrmargins{*}{*}{*}
\setulmargins{*}{*}{*}
\setheadfoot{\baselineskip}{2\onelineskip}
\setheaderspaces{*}{\onelineskip}{*}
\setmarginnotes{7pt}{\dimexpr\foremargin-3em}{5pt}
\checkandfixthelayout[nearest]
\def\GetFileInfo#1{%
\def\filename{#1}%
\def\@tempb##1 ##2 ##3\relax##4\relax{%
\def\filedate{##1}%
\def\fileversion{##2}%
\def\fileinfo{##3}}%
\edef\@tempa{\csname ver@#1\endcsname}%
\expandafter\@tempb\@tempa\relax? ? \relax\relax}
\let\@copymark\@empty % Di default è vuoto
\newcommand*\setcopymark[1]{\gdef\@copymark{#1}}
\newcommand*\@insertcopymark{%
\begin{picture}(0,0)\unitlength=1mm\relax
\if@twoside
\ifodd\value{page}
98
§ 5.2
111
112
113
\else
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
\fi
\else
Il file di classe estratto dal file documentato
\put(\strip@pt\dimexpr\foremargin/2\relax,\strip@pt\footskip)%
{\rotatebox{90}{\makebox(0,0)[l]{\@copymark}}}
\put(-\strip@pt\dimexpr\foremargin/2\relax,\strip@pt\footskip)%
{\rotatebox{90}{\makebox(0,0)[l]{\@copymark}}}
\put(\strip@pt\dimexpr\foremargin/2\relax,\strip@pt\footskip)%
{\rotatebox{90}{\makebox(0,0)[l]{\@copymark}}}
\fi
\end{picture}%
}
\def\cblayoutsinistro{%
\dimen256=\dimexpr\headheight+\topmargin+1in-4pt-\paperheight\relax
\dimen258=\dimexpr\evensidemargin+1in\relax
\dimen262=1mm\relax
\dimen260=\dimexpr \paperwidth*\p@/\dimen262\relax
\dimen264=\dimexpr \paperheight-\topmargin-\headheight-1in
-\headsep-\textheight\relax
\begin{picture}(0,0)(\strip@pt\dimen258,-\strip@pt\dimen256)%
\put(0,0){\unitlength=\p@
\put(0,0){\framebox(\strip@pt\paperwidth,\strip@pt\paperheight){}}%
\color{red}%
\put(\strip@pt\dimen258,\strip@pt\dimen264){%
\framebox(\strip@pt\textwidth,\strip@pt\textheight){}}%
\Line(0,0)(\strip@pt\paperwidth,\strip@pt\paperheight)%
\put(\strip@pt\dimexpr\paperwidth/2\relax,%
\strip@pt\dimexpr\dimen264+\textheight/2\relax)%
{\circle{\strip@pt\paperwidth}}%
}
\end{picture}}
\def\cblayoutdestro{%
\dimen256=\dimexpr\headheight+\topmargin+1in-4pt-\paperheight\relax
\dimen258=\dimexpr\oddsidemargin+1in\relax
\dimen262=1mm\relax
\dimen260=\dimexpr \paperwidth*\p@/\dimen262\relax
\dimen264=\dimexpr \paperheight-\topmargin-\headheight-1in
-\headsep-\textheight\relax
\begin{picture}(0,0)(\strip@pt\dimen258,-\strip@pt\dimen256)%
\put(0,0){\unitlength=\p@
\put(0,0){\framebox(\strip@pt\paperwidth,\strip@pt\paperheight){}}%
\color{red}%
\put(\strip@pt\dimen258,\strip@pt\dimen264){%
\framebox(\strip@pt\textwidth,\strip@pt\textheight){}}%
99
Capitolo 5.
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
La classe per comporre questa guida tematica
\Line(0,\strip@pt\paperheight)(\strip@pt\paperwidth,0)%
\put(\strip@pt\dimexpr\paperwidth/2\relax,%
\strip@pt\dimexpr\dimen264+\textheight/2\relax)%
{\circle{\strip@pt\paperwidth}}%
}
\end{picture}}
\providecommand*\Ars{%
\textsf{\lower -.48ex\hbox{\rotatebox{-20}{A}}\kern -.3em{rs}}\hskip0pt%
\kern -.05em\TeX\hskip0pt\kern -.17em\lower -.357ex\hbox{nica}}
\newcommand{\contribguit}{\newpage
\thispagestyle{empty}
\noindent{\Large
Associati anche tu al \GuIT
\hfill
\setlength{\unitlength}{1mm}
\begin{picture}(50,2)
\setlength{\fboxsep}{0pt}
\put(1,-3){\colorbox{gray}{\framebox(50,6.5){}}}
\put(0,-2){\colorbox{white}{\framebox(50,6.5){%
\href{http://www.guitex.org/home/it/diventa-socio/associarsi-a-guit}{%
Fai click per associarti}}}}
\end{picture}%
}
\bigskip
L’associazione per la diffusione di \TeX{} in Italia riconosciuta
ufficialmente in ambito internazionale, si sostiene \emph{unicamente}
con le quote sociali.
Se anche tu trovi che questa guida tematica gratuita ti sia stata utile,
il mezzo principale per ringraziare gli autori è diventare socio.
\medskip
Divenendo soci si ricevono gratuitamente:
\begin{itemize}
\item
l’abbonamento alla rivista \Ars;
\item
il DVD \TeX\ Collection;
\item
l’esclusivo tipometro realizzato da Massimo Caschili.
\end{itemize}
L’adesione al \GuIT{} prevede un quota associativa compresa tra \EUR{12,00}
e \EUR{70,00} a seconda della tipologia di adesione prescelta ed ha
100
§ 5.2
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
Il file di classe estratto dal file documentato
validità per l’anno solare in corso.
\newpage
}
\nouppercaseheads
\renewcommand{\footruleskip}{0pt}
\makeheadrule{headings}{\textwidth}{0pt}
\makeheadrule{myheadings}{\textwidth}{0pt}
\makeevenfoot{plain}{\@insertcopymark}{\textsc{\thepage}}{}
\makeoddfoot{plain}{}{\textsc{\thepage}}{\@insertcopymark}
\makeevenfoot{headings}{\@insertcopymark}{\textsc{\thepage}}{}
\makeoddfoot{headings}{}{\textsc{\thepage}}{\@insertcopymark}
\makeevenfoot{myheadings}{\@insertcopymark}{\textsc{\thepage}}{}
\makeoddfoot{myheadings}{}{\textsc{\thepage}}{\@insertcopymark}
\makeevenhead{headings}{}{\textsc{\small\leftmark}}{}
\makeoddhead{headings}{}{\textsc{\small\rightmark}}{}
\makeevenhead{myheadings}{}{\textsc{\small\leftmark}}{}
\makeoddhead{myheadings}{}{\textsc{\small\rightmark}}{}
\makepsmarks{headings}{%
\createmark{chapter}{both}{shownumber}{\@chapapp\space}{.\qquad}
\createmark{section}{right}{shownumber}{$\mathsection$\,}{\qquad}
\renewcommand*\indexmark{\markboth{\indexname}{\indexname}}}
\makepagestyle{headingslayout}
\makeevenhead{headingslayout}{\cblayoutsinistro}{\textsc{\small\leftmark}}{}
\makeevenfoot{headingslayout}{\@insertcopymark}{\textsc{\thepage}}{}
\makeoddhead{headingslayout}{\cblayoutdestro}{\textsc{\small\rightmark}}{}
\makeoddfoot{headingslayout}{}{\textsc{\thepage}}{\@insertcopymark}
\makechapterstyle{guidatematica}{%
\renewcommand*{\chapnumfont}{%
\fontshape{it}\fontsize{40}{40}\selectfont}
\renewcommand*{\printchaptername}{}
\renewcommand*{\chapternamenum}{}
\renewcommand*{\chaptitlefont}{%
\fontsize{18}{16}\scshape}% sterlineato
\renewcommand{\printchapternum}{%
\noindent\rlap{\makebox[\textwidth][r]{\rlap{\makebox[\foremargin][l]{%
\chapnumfont \thechapter}}}}\printchaptertitle}
\renewcommand*{\afterchapternum}{}
}
\AtBeginDocument{\chapterstyle{guidatematica}}
\renewcommand*\partnamefont{\normalfont\large\scshape}
\renewcommand*\partnumfont{\normalfont\large\scshape}
\renewcommand*\parttitlefont{\normalfont\huge\scshape}
\setbeforesecskip{-3.5ex plus-1ex minus-0.2ex}
\setbeforesubsecskip{-3ex plus-1ex minus-0.2ex}
\setbeforesubsubsecskip{-2.5ex plus-1ex minus-0.2ex}
101
Capitolo 5.
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
La classe per comporre questa guida tematica
\setbeforeparaskip{1\onelineskip plus1ex minus0.2ex}
\setbeforesubparaskip{1\onelineskip plus1ex minus0.2ex}
\setaftersecskip{1.5ex plus0.2ex}
\setaftersubsecskip{1.5ex plus0.2ex}
\setaftersubsubsecskip{1.5ex plus0.2ex}
\setafterparaskip{-1em}
\setaftersubparaskip{-1em}
\setsubparaindent{\parindent}
\setsecheadstyle{\large\scshape\raggedright}
\setsubsecheadstyle{\large\scshape\raggedright}
\setsubsubsecheadstyle{\large\scshape\raggedright}
\setparaheadstyle{\small\scshape}
\setsubparaheadstyle{\small\scshape}
\aliaspagestyle{part}{empty}
\aliaspagestyle{chapter}{empty}
\copypagestyle{titlepage}{headings}
\renewcommand\cftpartpagefont{\scshape}
\renewcommand\cftpartfont{\large\scshape}
\renewcommand\cftchapterfont{\large\scshape}
\renewcommand\cftchapterpagefont{\scshape}
\renewcommand*{\cftchapterfillnum}[1]{%
{\cftchapterleader}\nobreak
\cftchapterformatpnum{#1}%
\cftchapterafterpnum\par\nobreak}
\setlength{\cftbeforechapterskip}{1.0em \@plus 2\p@}
\captiondelim{\quad}
\captionnamefont{\small\scshape}
\captiontitlefont{\small}
\captionstyle[\centering]{}
\hangcaption
\captionwidth{\dimexpr\textwidth-2\parindent\relax}\changecaptionwidth
\renewcommand\descriptionlabel[1]{\hspace\labelsep\normalfont\scshape #1}
\renewcommand\blockdescriptionlabel[1]{\normalfont\scshape #1}
\providecommand\plaindescriptionlabel[1]{\hspace\labelsep\normalfont #1}
\renewlist{blockdescription}{description}{1}
\setlist[blockdescription]{before={\let\makelabel\blockdescriptionlabel},
leftmargin=\z@,labelsep*=0.5em,labelindent=\z@,labelwidth=\z@}
\newlist{plaindescription}{description}{1}
\setlist[plaindescription]{before={\let\makelabel\plaindescriptionlabel}}
\newlist{compactenumerate}{enumerate}{1}
102
§ 5.2
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
Il file di classe estratto dal file documentato
\setlist[compactenumerate,1]{label=\arabic*.,
noitemsep, partopsep=\z@, topsep=.25\onelineskip}
\newlist{compactitemize}{itemize}{4}
\setlist[compactitemize]{label=•,
noitemsep,partopsep=\z@,topsep=.25\onelineskip}
\newlist{compactdescription}{description}{1}
\setlist[compactdescription]{%
style=sameline,noitemsep,partopsep=\z@,topsep=.25\onelineskip}
\AtBeginDocument{\setsecnumdepth{subsection}
\settocdepth{subsection}\maxsecnumdepth{subsection}
\maxtocdepth{subsection}}
\DeclareMathSymbol{\virgola}{\mathpunct}{letters}{"3B}
\DeclareMathSymbol{\virgoladecimale}{\mathord}{letters}{"3B}
\unless\ifPDFTeX
\AtBeginDocument{\ifcsstring{xpg@main@language}{english}{\relax}{%
\mathcode‘\,=\string"8000}}
\else
\AtBeginDocument{\ifcsstring{languagename}{english}{\relax}{%
\mathcode‘\,=\string"8000}}
\fi
{\catcode ‘,=\active \gdef,{\futurelet\let@token\m@thcomma}}%
\AtEndPreamble{%
\gdef\m@thcomma#1{%
\unless\ifcat\noexpand\let@token*%
\virgola
\else
\expandafter\expandafter\expandafter
\ifcsname\expandafter\@gobble\string#1\endcsname
\virgola
\else
\ifnum‘#1<‘0\relax
\virgola
\else
\ifnum‘#1>‘9\relax
\virgola
\else
\virgoladecimale
\fi
\fi
\fi
\fi#1}%
}
\renewcommand{\bibsection}{\chapter{\bibname}\prebibhook}
103
Capitolo 5.
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
La classe per comporre questa guida tematica
\let\imki@idxprologue\empty
\def\imki@columns{2}
\renewenvironment{theindex}
{%
\clearforchapter
\csname phantomsection\endcsname
\chapter{\indexname}%
\indexmark%
\parindent\z@
\parskip\z@ \@plus .3\p@\relax
\let\item\@idxitem
\begin{multicols}{\imki@columns}[\imki@idxprologue]
\raggedright
}
{%
\end{multicols}\gdef\imki@idxprologue{}\clearpage
}
\AtBeginDocument{\bibliographystyle{guidatematica}%
\unless\ifPDFTeX
\ifcsstring{xpg@main@language}{italian}%
{\csgappto{init@extras@italian}{\nofrench@indent}}{}%
\fi}
\newenvironment{titlepage}{\clearpage
\pagestyle{titlepage}
\makeoddhead{titlepage}{}{\smash{\Large\scshape\@author}}{}
\makeoddfoot{titlepage}{}{\smash{\large\scshape\@date}}{}
}{\clearpage}
\providecommand\subtitle[1]{\gdef\@subtitle{#1}}
\let\@subtitle\empty
\renewcommand\maketitle{
\begin{titlepage}
\vspace*{\stretch{.7}}
{\centering\LARGE\scshape\@title\par}
\ifdefvoid{\@subtitle}{}{\vspace{2\onelineskip}
{\centering\scshape\Large\@subtitle\par}}
\vspace{\stretch{.7}}
{\centering\includegraphics[width=0.23\paperwidth]{logoguittondo}\par}
\vspace*{\stretch{.7}}
\end{titlepage}
}
\newenvironment{medaglione}[1][\linewidth]{%
\begin{lrbox}{0}%
\begin{minipage}{\dimexpr#1-2\fboxsep-2\fboxrule}
104
§ 5.2
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
}{%
}
Il file di classe estratto dal file documentato
\end{minipage}\end{lrbox}\fbox{\usebox{0}}\relax
\newenvironment{sintassi}{\flushleft\medaglione}%
{\endmedaglione\endflushleft}
\newcommand*\hz{\nobreak\hskip\z@}
\renewcommand*\meta[1]{$\langle$\textit{\hz#1}$\rangle$}
\renewcommand*\marg[1]{\texttt{\char123}\meta{#1}\texttt{\char125}}
\renewcommand*\oarg[1]{\texttt{[}\meta{#1}\texttt{]}}
\newcommand*\Arg[1]{\texttt{\char123\relax#1\char125}}
\def\GT@splitargs#1,#2!{\def\@tempA{#1}\def\@tempB{#2}}
\newcommand\garg[1]{\GT@splitargs#1!\texttt{(}\meta{\@tempA}%
\texttt{,}\meta{\@tempB}\texttt{)}}
\newcommand*\comando[1]{\texttt{\string#1}}
\renewcommand*{\cs}[1]{\texttt{\char92#1}\index{#1@\texttt{\char92#1}}}
\let\csindex\cs
\newcommand*\Sambiente[2]{\cs{begin}\marg{#1}\oarg{#2}\,\dots
\cs{end}\marg{#1}}
\newcommand*\Dambiente[3]{\cs{begin}\marg{#1}\oarg{#2}\oarg{#3}\,\dots
\cs{end}\marg{#1}}
\newcommand*\Bambiente[1]{\cs{begin}\texttt{\char123#1\char125}}
\newcommand*\Eambiente[1]{\cs{end}\texttt{\char123#1\char125}}
\DeclareRobustCommand*\ambstyle[1]{\textsf{\slshape#1}}
\DeclareRobustCommand*\classstyle[1]{\texttv{\itshape#1}}
\DeclareRobustCommand*\filestyle[1]{\texttm{\textl{#1}}}
\unless\ifPDFTeX
\DeclareRobustCommand*\packstyle[1]{\texttm{\itshape{#1}}}
\else
\DeclareRobustCommand*\packstyle[1]{\texttm{\itshape\textl{#1}}}
\fi
\DeclareRobustCommand*\progstyle[1]{\textsf{#1}}
\DeclareRobustCommand*\prog[1]{\progstyle{#1}%
\index{programma!#1@\progstyle{#1}}}
\DeclareRobustCommand*\pack[1]{\packstyle{#1}%
\index{pacchetto!#1@\packstyle{#1}}}
\DeclareRobustCommand*\class[1]{\classstyle{#1}%
\index{classe!#1@\classstyle{#1}}}
\DeclareRobustCommand*\file[1]{\filestyle{#1}%
\index{file!#1@\filestyle{#1}}}
\DeclareRobustCommand*\amb[1]{\ambstyle{#1}%
\index{ambiente!#1@\ambstyle{#1}}}
\DeclareRobustCommand*\opzstyle[1]{\textsl{\textl{#1}}}
\DeclareRobustCommand*\contastyle[1]{\texttm{#1}}
\DeclareRobustCommand*\stilestyle[1]{\texttm{#1}}
105
Capitolo 5.
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
La classe per comporre questa guida tematica
\DeclareRobustCommand*\numeristyle[1]{\texttm{#1}}
\DeclareRobustCommand*\umisurastyle[1]{\texttm{#1}}
\DeclareRobustCommand*\chiavestyle[1]{\texttm{#1}}
\DeclareRobustCommand*\descrittorestyle[1]{\texttm{#1}}
\DeclareRobustCommand*\posizionestyle[1]{\texttm{#1}}
\DeclareRobustCommand*\allineamentostyle[1]{\texttm{#1}}
\DeclareRobustCommand*\opz[1]{\opzstyle{#1}%
\index{opzione!#1@\opzstyle{#1}}}
\DeclareRobustCommand*\conta[1]{\contastyle{#1}%
\index{contatore!#1@\contastyle{#1}}}
\DeclareRobustCommand*\stile[1]{\stilestyle{#1}%
\index{stile della pagina!#1@\stilestyle{#1}}}
\DeclareRobustCommand*\numeri[1]{\numeristyle{#1}%
\index{numerazione!#1@\numeristyle{#1}}}
\DeclareRobustCommand*\umisura[1]{\umisurastyle{#1}%
\index{unit\‘a di misura!#1@\umisurastyle{#1}}}
\DeclareRobustCommand*\chiave[1]{\chiavestyle{#1}%
\index{chiave!#1@\chiavestyle{#1}}}
\DeclareRobustCommand*\descrittore[1]{\descrittorestyle{#1}%
\index{descrittore di colonna!#1@\descrittorestyle{#1}}}
\DeclareRobustCommand*\posizione[1]{\posizionestyle{#1}%
\index{posizione degli oggetti flottanti!#1@\posizionestyle{#1}}}
\DeclareRobustCommand*\allineamento[1]{\allineamentostyle{#1}%
\index{codice di allineamento!#1@\allineamentostyle{#1}}}
\DeclareRobustCommand*\GuIT{{\dimen@=\f@size\p@\dimen2=20.88\p@
\edef\guitscale{\strip@pt\dimexpr\dimen@*\p@/\dimen2\relax}%
\raisebox{-0.93ex}[\z@][\z@]{%
\includegraphics[scale=\guitscale]{logoguitlineare}}}}
\let\guit\GuIT
%% Copyright 2012, 2013 GuIT, Gruppo utilizzatori Italiani di TeX e LaTeX
%%
%% Distributable under the LaTeX Project Public License,
%% version 1.3c or higher (your choice). The latest version of
%% this license is at: http://www.latex-project.org/lppl.txt
%%
%% This Work has the status of ‘maintained’
%%
%% The Current Maintainer is the GuIT staff
%%
%% This work consists of this file guidatematica.dtx,
%% and the derived files guidatematica.cls and guidatematica.pdf
%% plus the associated documentation guidatematica-doc.tex
%% and guidatematica-doc.pdf.
%%
%%
106
§ 5.3
471
Il file di documentazione debitamente composto
%% End of file ‘guidatematica.cls’.
5.3
Il file di documentazione debitamente composto
Infine il file di documentazione è riportato nelle pagine 110 e seguenti.
5.4
Conclusione
È chiaro che con il metodo esposto nel capitolo 3 si possono creare classi o
pacchetti di qualsiasi complessità; si consiglia invece di cominciare con i
primi metodi esposti e si raccomanda di usare sempre il file documentato
.dtx, perché solo con il codice ben documentato è possibile riprendere in
mano le definizioni usate, magari per usare le vecchie classi per costruirne di
altre, o semplicemente per migliorare le prestazioni delle macro già inserite.
Ovviamente le correzioni sono anche facilitate; il bello del software
libero, come le classi e i pacchetti del sistema TEX, è che beneficiano del
feedback degli utenti che segnalano volentieri agli autori del pacchetto le
loro osservazioni e i bug trovati. E gli autori sono ben lieti che vengano
loro segnalati gli errori.
Per concludere, vorrei segnalare ancora come fare per caricare eventualmente le proprie classi o pacchetti (di interesse internazionale) nella
Rete degli Archivi Completi di TEX (ctan, Comprehensive TEX Archive
Network); si vada per esempio nel sito http://www.tex.ac.uk/upload/
che contiene una pagina interattiva per caricare i pacchetti; conviene leggere
tutta la pagina e le istruzioni lì contenute.
In buona sostanza, ogni contributo deve essere compresso in formato
.zip; questo file deve contenere il file .dtx e .pdf e ogni altro file di
ulteriore documentazione che non derivi dalla elaborazione del file .dtx;
esso deve contenere un ulteriore file manifest.txt di puro testo2 che dice
espressamente chi è l’autore o il manutentore e quale sia la licenza per l’uso
del pacchetto; infine esso deve contenere un file README di puro testo, ma
senza estensione, che elenchi il file principali e quelli derivati, come fare
2
I fine-riga devono essere omogenei: o solo quelli di Windows, o solo quelli di tipo
UNIX; qualche volta succede di usare entrambi i tipi di fine-riga, se si è lavorato un
po’ con macchine Windows e un po’ con macchine Linux o Mac, e questo non piace ai
curatori dei siti ctan.
107
Capitolo 5.
La classe per comporre questa guida tematica
ad ottenerli dal file .dtx e in quali cartelle debbano essere collocati se si
esegue una installazione manuale.
Poi nella pagina interattiva indicata sopra si debbono riempire tutti i
campi e si deve scegliere (concordemente a quanto scritto in manifest.txt
incluso nel file .zip) la licenza a cui è sottoposto il pacchetto; conviene
scegliere sempre la licenza LPPL (LATEX Project Public License), a meno
che non ci siano altri validi motivi per scegliere una delle altre licenze; però,
se non si specifica una licenza libera, il curatore dell’archivio respinge il
contributo.
Invece, per caricare questi pacchetti nel sito di guIt, per ora non ci
sono procedure standardizzate né esiste ancora una pagina del sito adatta a
raccogliere questi contributi. Al momento di scrivere questa introduzione, il
guIt Web Team è al lavoro per definire l’amministrazione di questa pagina.
1
1
108
Caratteristiche della classe
109
† Web:
1
number v.1.5; ultima revisione 2014/09/03.
www.guitex.org
∗ Version
• La classe funziona sia con pdfLaTeX sia con XeLaTeX; le impostazioni sono
prefissate e i margini per ulteriori personalizzazioni sono ridotti al minimo;
lo scopo della classe è quello di dare una veste comune alle guide tematiche
della collana, facendo sì che siano riconoscibili a prima vista grazie al loro
stile uniforme di composizione.
• Tutte le opzioni inserite nell’istruzione \documentclass vengono trasferite
integralmente alla classe memoir; alcune opzioni per il formato della “carta”,
sono state ridefinite, ma l’utente non dovrebbe osservare nessuna variazione rispetto all’impostazione che si avrebbe senza queste ridefinizioni. Solo
l’opzione ipertesto è specifica della classe; serve all’utente per caricare il
pacchetto hyperref con alcune personalizzazioni, ritardandone il caricamento al momento di eseguire il comando \begin{document}; questo dipende
dal fatto che il pacchetto hyperref deve sempre venire caricato per ultimo.
Non è attivata di default, perché non tutte le guide, benché previste per
essere lette prevalentemente sullo schermo del proprio PC, hanno bisogno di
collegamenti ipertestuali interni ed esterni. Quindi caricare questo pacchetto
è una scelta esclusiva dell’autore della guida.
• La classe di supporto è la classe memoir.cls facente parte del sistema TeX
in qualsiasi distribuzione completa.
La classe guidatematica.cls serve per comporre libri in italiano con le seguenti
specifiche:
1
Questa classe guidatematica serve per comporre testi da pubblicare nella collana “Guide Tematiche” del GuIT. Si appoggia alla classe memoir ma
include molte personalizzazioni e i pacchetti necessari. Differisce dalla classe guidatematica delle versioni precedenti per il fatto che il disegno della
pagina è simmetrico e quindi si presta ugualmente bene per comporre (e
stampare) oneside o twoside. Solo le note marginali eventualmente presenti
mostrano la differente impostazione. Inoltre è costruita in modo da poter
lavorare indifferentemente con pdfLATEX, XeLATEX e LuaLATEX,
Sommario
26 dicembre 2014
GuIT†
La classe guidatematica.dtx∗
Codice commentato
2
Le due righe contenti il formato e l’identificazione della classe sono già state inserite
prima; ora possiamo passare alla gestione delle opzioni che vengono quasi tutte
passate alla classe memoir. Viene definita l’opzione ipertesto per caricare il
pacchetto hypertext che non non viene caricato di default, perché va caricato per
ultimo solo se viene specificata l’opzione suddetta.
L’autore potrebbe avere bisogno di caricare ulteriori pacchetti nel preambolo,
quindi è meglio che hyperref venga caricato dopo questi ulteriori pacchetti. Per
fare ciò basta che l’autore specifichi l’opzione ipertesto alla classe che provvede a caricare il pacchetto hyperref come ultima cosa al momento di iniziare la
composizione della guida tematica.
Vengono reimpostate le opzioni a4paper, a5paper e \b5paper e vengono definite le opzioni tablet e pad, per poter in tutti questi casi creare il layout della
pagina in modo simile e non personalizzabile. Per tutte questo opzioni bisogna
2
• Sono stati introdotti molti nuovi comandi e sono stati definiti molti nuovi
ambienti. Per maggiori informazioni si rimanda al documento guidatematicadoc.pdf distribuito con il “kit” guidatematica.zip.
• Con XeLaTeX viene caricato il pacchetto polyglossia e l’italiano viene
impostato come la lingua principale; altre lingue possono venire specificate mediante il comando \setotherlanguages o, con lingue particolari, con
\setotherlanguage con le opzioni specifiche per la lingua. Se questa richiede un alfabeto particolare bisogna ricordassi di specificare una famiglia di
font che contenga l’alfabeto desiderato.
• Con pdfLaTeX il pacchetto babel viene caricato con la sola opzione italian;
nei rari casi in cui fosse necessario usare anche altre lingue, esse vanno specificate come opzione alla classe, perché non si può chiamare babel due volte
con opzioni diverse. Le opzioni della classe sono globali e vengono passate
automaticamente a tutti i pacchetti che sanno che cosa farne.
• La codifica dei font di uscita con pdfLaTeX è T1 e non è possibile specificare
una codifica differente, cosa che sarebbe quanto mai sgradevole per comporre
in italiano dove sono presenti molte lettere accentate. Per altro se fosse
necessario comporre qualcosa in una lingua che usa un alfabeto diverso,
basta caricare i suoi pacchetti specifici; per scrivere una parola o due basta
caricare l’encoding dei font specifici in modo diretto: per esempio: se si
deve scrivere una parola in russo, basta caricare esplicitamente il file del
suo encoding con \input{t2enc.def} e poi specificare la codifica T2 con
\fontencoding{T2} seguito, se occorre, dai comandi per scegliere famiglia,
serie, forma e corpo del font cirillico che si vuole usare.
• La codifica di entrata deve essere utf8; per XeLaTeX essa è implicita;
con pdfLaTeX essa viene preimpostata e non è possibile con questa classe
specificare una codifica differente.
• La classe riconosce da sola il motore di composizione e imposta direttamente
quanto occorre nella forma richiesta dal programma di composizione.
§ 5.4
Conclusione
\LoadClassWithOptions{memoir}
\DeclareOption*{\PassOptionsToClass{\CurrentOption}{memoir}}
\ProcessOptions*\relax
\RequirePackage{iftex}
110
24
23
22
63
62
61
4
\normalfont
\ifPAD\setstocksize{160mm}{120mm}\fi
\iftablet\setstocksize{120mm}{90mm}\fi
64 \ifBv\setstocksize{250mm}{176mm}\fi
65 \ifAiv\setstocksize{293mm}{210mm}\fi
66 \ifAv\setstocksize{210mm}{146mm}\fi
67 \settrims{0pt}{0pt}
Il disegno della gabbia del testo è ispirato al pacchetto canoniclayout. Però
è stato osservato che se si compone in modo oneside la lettura a schermo è agevole, ma la stampa della guida risulta mal composta in fronte retro. Se invece si
compone in modo twoside da una pagina all’altra il testo si sposterebbe alternativamente a destra e a sinistra a seconda della parità del numero di pagina, visto
che il disegno della pagina prodotto da canoniclayout è asimmetrico.
Per ovviare a questi inconvenient contemporaneamente necessita centrare orizzontalmente la gabbia e definire successivamente le testatine e i piedini in forma
simmetrica così da rendere il layout delle pagine pari identiche a quelle dispari; la
lettura a schermo e la stampa risultano pertanto identiche. Per testatine e piedini
si veda più avanti. Per simmetria la gabbia viene centrata anche verticalmente.
Prima però bisogna definire il formato della carta a seconda del formato specificato con l’apposita opzione. Poi, visto che la classe memoir è già stata caricata,
si possono usare i suoi comandi specifici per definire gabbia, margini e le altre
dimensioni. Si sfruttano registri già definiti da memoir e si usano alcuni comandi
specifici della classe.
48
47
46
\RequirePackage{graphicx}
\RequirePackage{metalogo}
\RequirePackage{pict2e}[2009/06/01]
49 \RequirePackage{microtype}
50 \RequirePackage{etoolbox}
51 \RequirePackage{xcolor}
52 \RequirePackage{natbib}
53 \RequirePackage{multicol}
54 \RequirePackage{imakeidx}
55 \RequirePackage{fancyvrb}
56 \RequirePackage{afterpage}
57 \RequirePackage{enumitem}
58 \RequirePackage[right]{eurosym}
59 \RequirePackage{listings}
60 \lstloadlanguages{[LaTeX]TeX}
\fi
\fi
Si caricano poi i pacchetti ritenuti necessari; in questa versione della classe non
viene caricato il pacchetto guit.sty perché è incompatibile con XeLaTeX; certo
lo si sarebbe potuto caricare nel ramo true del test \ifPDFTeX e la definizione
del logo del gruppo in forma grafica (immagine pdf) la si sarebbe potuta limitare all’uso con XeLaTeX o di Lua\LaTeX; siccome alla data attuale il pacchetto
guit.sty è sottoposto a revisione per l’uso con i font OpenType, è molto meglio
usare temporaneamente l’immagine in ogni caso e modificare questa classe solo
con l’aggiunta di un nuovo pacchetto quando guit.sty sarà diventato compatibile con tuttii i programmi di composizione. Il logo tondo, il “timbro”, del GuIT
viene invece allegato come immagine, visto che si tratta di una variante nella quale
le lettere della scritta attorno al bordo non appaiono mai capovolte.
45
44
La classe per comporre questa guida tematica
3
\ifPDFTeX
\RequirePackage[utf8]{inputenc}
\RequirePackage[T1]{fontenc}
25 \RequirePackage[italian]{babel}
26 \RequirePackage[tt={oldstyle=false,tabular,monowidth}]{cfr-lm}
27 \else
28 \RequirePackage{fontspec}
29 \defaultfontfeatures[\rmfamily,\sffamily]{Ligatures=TeX,Numbers=OldStyle}
30 \defaultfontfeatures[\ttfamily,\tvfamily]{Numbers=Lining}
31 \setmainfont{Latin Modern Roman}[SmallCapsFont={* Caps}]
32 \setsansfont{Latin Modern Sans}
33 \setmonofont{Latin Modern Mono}
34 \newfontfamily{\tvfamily}{Latin Modern Mono Prop}
35 \DeclareTextFontCommand{\texttm}{\ttfamily}
36 \DeclareTextFontCommand{\texttv}{\tvfamily}
37 \def\textl#1{{\addfontfeature{Numbers=Lining}#1}}
38 \RequirePackage{unicode-math}
39 \setmathfont{Latin Modern Math}
40 \RequirePackage{polyglossia}
41 \setmainlanguage{italian}
42 \ifx\tmspace\@undefined
43
\newlength{\tmspace}\tmspace=\z@
Con xetex si carica il pacchetto fontspec e si impostano le varie forme dei font
Latin Modern OpenType, generando anche i comandi necessari per la compatibilità con i comandi da usare con pdftex quando si invoca il pacchetto cfr-lm
per la gestione estesa dei font Latin Modern Type 1. Si provvede nei due casi di
caricare i pacchetti necessari per la gestione della lingua italiana.
21
Si carica subito il pacchetto iftex che permette di distinguere quale motore
di composizione si sta usando fra pdftex, xetex, oppure luatex.
20
19
18
17
16
8
7
6
\newif\ifPAD\PADfalse
\DeclareOption{pad}{\PADtrue\tabletfalse\Aivfalse\Bvfalse\Avfalse}
\newif\iftablet\tabletfalse
9 \DeclareOption{tablet}{\tablettrue\Aivfalse\Bvfalse\Avfalse\PADfalse}
10 \newif\ifAiv \Aivfalse
11 \DeclareOption{a4paper}{\Aivtrue\tabletfalse\Bvfalse\Avfalse\PADfalse}
12 \newif\ifBv \Bvtrue
13 \DeclareOption{b5paper}{\Aivfalse\Bvtrue\tabletfalse\Avfalse\PADfalse}
14 \newif\ifAv \Avfalse
15 \DeclareOption{a5paper}{\Avtrue\Aivfalse\Bvfalse\tabletfalse\PADfalse}
5
1
\DeclareOption{ipertesto}{%
2 \AtBeginDocument{\RequirePackage[colorlinks,linkcolor={blue},
3
citecolor={blue!80!black},urlcolor={blue}]{hyperref}}
4}
ricorrere ad opportuni comandi condizionali, per poter ritardare la loro esecuzione
ad un momento successivo al caricamento della classe memoir.
Capitolo 5.
111
86
85
84
5
\let\@copymark\@empty % Di default è vuoto
\newcommand*\setcopymark[1]{\gdef\@copymark{#1}}
\newcommand*\@insertcopymark{%
87 \begin{picture}(0,0)\unitlength=1mm\relax
88 \if@twoside
89 \ifodd\value{page}
90
\put(\strip@pt\dimexpr\foremargin/2\relax,\strip@pt\footskip)%
91
{\rotatebox{90}{\makebox(0,0)[l]{\@copymark}}}
92 \else
93
\put(-\strip@pt\dimexpr\foremargin/2\relax,\strip@pt\footskip)%
94
{\rotatebox{90}{\makebox(0,0)[l]{\@copymark}}}
95 \fi
96 \else
97
\put(\strip@pt\dimexpr\foremargin/2\relax,\strip@pt\footskip)%
98
{\rotatebox{90}{\makebox(0,0)[l]{\@copymark}}}
99 \fi
100 \end{picture}%
101 }
Segue ora il comando \setcopymark che può venire usato in diversi modi; lo
si può usare per inserire il marchio di copyright e il nome del detentore del suo
diritto. Ma lo si può usare anche per marcare lo stato di avanzamento di bozze
successive. Il suo output viene scritto nel margine esterno della pagina. Per altri
usi di dichiarazioni di diritti si ritiene che sia meglio usare l’Introduzione invece del
retrofrontespizio, visto che queste guide vengono per lo più composte solo fronte
(almeno così si suggerisce) per una lettura confortevole a monitor.
78
77
76
\def\GetFileInfo#1{%
\def\filename{#1}%
\def\@tempb##1 ##2 ##3\relax##4\relax{%
79
\def\filedate{##1}%
80
\def\fileversion{##2}%
81
\def\fileinfo{##3}}%
82
\edef\@tempa{\csname ver@#1\endcsname}%
83
\expandafter\@tempb\@tempa\relax? ? \relax\relax}
Viene ora recuperato il comando \GetFileInfo dal pacchetto doc.sty in modo
da sfruttare la possibilità di recuperare il dati di un file che contenga in testa uno
dei comandi \ProvidesClass oppure \ProvidesPackage oppure \ProvidesFile,
completo di argomento obbligatorio e facoltativo nel formato previsto da questi comandi. L’argomento di \GetFileInfo è il nome del file di cui si vogliono
estrarre le informazioni, specificato completo di estensione. Il file deve essere già
stato caricato prima di usare questo comando; usandolo si recuperano nelle macro
\filename, \filedate e \fileversion le informazioni specifiche, che poi possono
venire usate come meglio si crede.
70
69
\settypeblocksize{\paperwidth}{\dimexpr\paperwidth*\paperwidth/\paperheight}{*}
\setlrmargins{*}{*}{*}
71 \setulmargins{*}{*}{*}
72 \setheadfoot{\baselineskip}{2\onelineskip}
73 \setheaderspaces{*}{\onelineskip}{*}
74 \setmarginnotes{7pt}{\dimexpr\foremargin-3em}{5pt}
75 \checkandfixthelayout[nearest]
68
6
Si noti che non sempre il rettangolo che rappresenta la gabbia è rasente agli ascendenti della prima riga della pagina e alla linea di base dell’ultima linea; questo
dipende dal fatto che il layout della pagina creato da memoir prevede un piccolo
aggiustamento dell’altezza della gabbia affinché contenga un numero intero di righe; si aggiunga che il programma di composizione talvolta inserisce un salto di
pagina quando il “goal” di altezza della gabbia non è ancora raggiunto; questa
cosa generalmente dipende dal contenuto della pagina stessa che potrebbe contenere oggetti il cui ingombro sulla pagina non corrisponde ad un numero intero di
124
123
122
\def\cblayoutdestro{%
\dimen256=\dimexpr\headheight+\topmargin+1in-4pt-\paperheight\relax
\dimen258=\dimexpr\oddsidemargin+1in\relax
125 \dimen262=1mm\relax
126 \dimen260=\dimexpr \paperwidth*\p@/\dimen262\relax
127 \dimen264=\dimexpr \paperheight-\topmargin-\headheight-1in
128
-\headsep-\textheight\relax
129 \begin{picture}(0,0)(\strip@pt\dimen258,-\strip@pt\dimen256)%
130 \put(0,0){\unitlength=\p@
131 \put(0,0){\framebox(\strip@pt\paperwidth,\strip@pt\paperheight){}}%
132 \color{red}%
133 \put(\strip@pt\dimen258,\strip@pt\dimen264){%
134
\framebox(\strip@pt\textwidth,\strip@pt\textheight){}}%
135
\Line(0,\strip@pt\paperheight)(\strip@pt\paperwidth,0)%
136
\put(\strip@pt\dimexpr\paperwidth/2\relax,%
137
\strip@pt\dimexpr\dimen264+\textheight/2\relax)%
138
{\circle{\strip@pt\paperwidth}}%
139 }
140 \end{picture}}
121
104
103
102
\def\cblayoutsinistro{%
\dimen256=\dimexpr\headheight+\topmargin+1in-4pt-\paperheight\relax
\dimen258=\dimexpr\evensidemargin+1in\relax
105 \dimen262=1mm\relax
106 \dimen260=\dimexpr \paperwidth*\p@/\dimen262\relax
107 \dimen264=\dimexpr \paperheight-\topmargin-\headheight-1in
108
-\headsep-\textheight\relax
109 \begin{picture}(0,0)(\strip@pt\dimen258,-\strip@pt\dimen256)%
110 \put(0,0){\unitlength=\p@
111 \put(0,0){\framebox(\strip@pt\paperwidth,\strip@pt\paperheight){}}%
112 \color{red}%
113 \put(\strip@pt\dimen258,\strip@pt\dimen264){%
114
\framebox(\strip@pt\textwidth,\strip@pt\textheight){}}%
115
\Line(0,0)(\strip@pt\paperwidth,\strip@pt\paperheight)%
116
\put(\strip@pt\dimexpr\paperwidth/2\relax,%
117
\strip@pt\dimexpr\dimen264+\textheight/2\relax)%
118
{\circle{\strip@pt\paperwidth}}%
119 }
120 \end{picture}}
Si definisce il comando per inserire il layout della pagina sotto il testo di una pagina specifica. Vengono specificati i comandi sia per la pagina destra sia per quella
sinistra, anche se si suppone che la maggior parte delle guide tematiche sia composta con l’opzione oneside. Questi comandi sono completamente parametrizzati
alle dimensioni del foglio rifilato e valgono per qualunque formato.
§ 5.4
Conclusione
112
Se anche tu trovi che questa guida tematica gratuita ti sia stata utile,
il mezzo principale per ringraziare gli autori è diventare socio.
\medskip
7
Si specificano ora i comandi di configurazione per la classe memoir. Non si
vuole il maiuscolo nelle testatine, perché verrà usato il maiuscoletto; non si vogliono filetti per separare la testatina e il piedino dal testo. Si vuole però che
179
178
L’adesione al \GuIT{} prevede un quota associativa compresa tra \EUR{12,00}
e \EUR{70,00} a seconda della tipologia di adesione prescelta ed ha
180 validità per l’anno solare in corso.
181 \newpage
182 }
177
169
168
Divenendo soci si ricevono gratuitamente:
\begin{itemize}
170 \item
171 l’abbonamento alla rivista \Ars;
172 \item
173 il DVD \TeX\ Collection;
174 \item
175 l’esclusivo tipometro realizzato da Massimo Caschili.
176 \end{itemize}
167
166
165
164
163
160
L’associazione per la diffusione di \TeX{} in Italia riconosciuta
161 ufficialmente in ambito internazionale, si sostiene \emph{unicamente}
162 con le quote sociali.
159
142
141
\providecommand*\Ars{%
\textsf{\lower -.48ex\hbox{\rotatebox{-20}{A}}\kern -.3em{rs}}\hskip0pt%
143
\kern -.05em\TeX\hskip0pt\kern -.17em\lower -.357ex\hbox{nica}}
144 \newcommand{\contribguit}{\newpage
145 \thispagestyle{empty}
146 \noindent{\Large
147 Associati anche tu al \GuIT
148 \hfill
149 \setlength{\unitlength}{1mm}
150 \begin{picture}(50,2)
151
\setlength{\fboxsep}{0pt}
152
\put(1,-3){\colorbox{gray}{\framebox(50,6.5){}}}
153
\put(0,-2){\colorbox{white}{\framebox(50,6.5){%
154
\href{http://www.guitex.org/home/it/diventa-socio/associarsi-a-guit}{%
155
Fai click per associarti}}}}
156 \end{picture}%
157 }
158 \bigskip
righe in corpo normale. Se l’aggiustamento è irrisorio, la diagonale della gabbia
del testo coincide con la diagonale della pagina.
Si specifica ora il comando \contribguit che realizza una pagina con le informazioni relative all’iscrizione nel gruppo. Il comando può essere utilizzato a
inizio o fine documento. Tuttavia, per garantire maggiore visibilità, si consiglia di
inserire \contribguit dopo \frontmatter e prima del capitolo di introduzione o
eventuali pagine con informazioni sulle licenze d’uso.
208
207
8
\makechapterstyle{guidatematica}{%
\renewcommand*{\chapnumfont}{%
209
\fontshape{it}\fontsize{40}{40}\selectfont}
210
\renewcommand*{\printchaptername}{}
211
\renewcommand*{\chapternamenum}{}
212
\renewcommand*{\chaptitlefont}{%
213
\fontsize{18}{16}\scshape}% sterlineato
214
\renewcommand{\printchapternum}{%
215
\noindent\rlap{\makebox[\textwidth][r]{\rlap{\makebox[\foremargin][l]{%
216
\chapnumfont \thechapter}}}}\printchaptertitle}
Viene definito lo stile per comporre la pagina iniziale dei capitoli; si compone
il titolo del capitolo in maiuscoletto e il numero del capitolo molto grande fuori
nel margine esterno. Si imposta questo stile al momento dell’inizio del documento
per contrastare eventuali ulteriori modifiche inserite nel preambolo.
203
202
\makepagestyle{headingslayout}
\makeevenhead{headingslayout}{\cblayoutsinistro}{\textsc{\small\leftmark}}{}
204 \makeevenfoot{headingslayout}{\@insertcopymark}{\textsc{\thepage}}{}
205 \makeoddhead{headingslayout}{\cblayoutdestro}{\textsc{\small\rightmark}}{}
206 \makeoddfoot{headingslayout}{}{\textsc{\thepage}}{\@insertcopymark}
Vengono definiti gli stili di pagina modificati con il layout disegnato sotto.
Non sono da usare sistematicamente, ma probabilmente come argomenti di
\thispagestyle.
200
199
198
\makepsmarks{headings}{%
\createmark{chapter}{both}{shownumber}{\@chapapp\space}{.\qquad}
\createmark{section}{right}{shownumber}{$\mathsection$\,}{\qquad}
201 \renewcommand*\indexmark{\markboth{\indexname}{\indexname}}}
Vengono definiti i comandi per “decorare” le intestazioni delle testatine.
195
194
\makeevenhead{headings}{}{\textsc{\small\leftmark}}{}
\makeoddhead{headings}{}{\textsc{\small\rightmark}}{}
196 \makeevenhead{myheadings}{}{\textsc{\small\leftmark}}{}
197 \makeoddhead{myheadings}{}{\textsc{\small\rightmark}}{}
I mark delle pagine destre e sinistre sono composti centrati sia nelle pagine destre
sia in quelle sinistre.
185
184
183
\nouppercaseheads
%\renewcommand{\footruleheight}{\normalrulethickness}
\renewcommand{\footruleskip}{0pt}
186 \makeheadrule{headings}{\textwidth}{0pt}
187 \makeheadrule{myheadings}{\textwidth}{0pt}
188 \makeevenfoot{plain}{\@insertcopymark}{\textsc{\thepage}}{}
189 \makeoddfoot{plain}{}{\textsc{\thepage}}{\@insertcopymark}
190 \makeevenfoot{headings}{\@insertcopymark}{\textsc{\thepage}}{}
191 \makeoddfoot{headings}{}{\textsc{\thepage}}{\@insertcopymark}
192 \makeevenfoot{myheadings}{\@insertcopymark}{\textsc{\thepage}}{}
193 \makeoddfoot{myheadings}{}{\textsc{\thepage}}{\@insertcopymark}
il \@copymark sia sempre presente nel piedino: vuol dire che se questa macro è
vuota non viene stampato niente.
Nei piedini il numero di pagina viene composto in maiuscoletto: la cosa non è
importantissima, ma all’occorrenza i numeri di pagina romani minuscoli vengono
composti col minuscolo del maiuscoletto e non hanno quell’aspetto orribile dei
numeri romani composti in tondo minuscolo.
Capitolo 5.
La classe per comporre questa guida tematica
218
217
\renewcommand*{\afterchapternum}{}
}
\AtBeginDocument{\chapterstyle{guidatematica}}
\renewcommand*\partnamefont{\normalfont\large\scshape}
\renewcommand*\partnumfont{\normalfont\large\scshape}
\renewcommand*\parttitlefont{\normalfont\huge\scshape}
113
9
Qui ora grazie al pacchetto enumitem si definiscono, o ridefiniscono, comunque si personalizzano i vari ambienti che formano liste di tipo diverso. Intanto in
253
\captiondelim{\quad}
254 \captionnamefont{\small\scshape}
255 \captiontitlefont{\small}
256 \captionstyle[\centering]{}
257 \hangcaption
258 \captionwidth{\dimexpr\textwidth-2\parindent\relax}\changecaptionwidth
Grazie alle funzionalità di memoir si ridefiniscono anche le modalità di
comporre le didascalie.
242
241
\aliaspagestyle{part}{empty}
\aliaspagestyle{chapter}{empty}
243 \copypagestyle{titlepage}{headings}
244 \renewcommand\cftpartpagefont{\scshape}
245 \renewcommand\cftpartfont{\large\scshape}
246 \renewcommand\cftchapterfont{\large\scshape}
247 \renewcommand\cftchapterpagefont{\scshape}
248 \renewcommand*{\cftchapterfillnum}[1]{%
249
{\cftchapterleader}\nobreak
250
\cftchapterformatpnum{#1}%
251
\cftchapterafterpnum\par\nobreak}
252 \setlength{\cftbeforechapterskip}{1.0em \@plus 2\p@}
240
235
\setsecheadstyle{\large\scshape\raggedright}
236 \setsubsecheadstyle{\large\scshape\raggedright}
237 \setsubsubsecheadstyle{\large\scshape\raggedright}
238 \setparaheadstyle{\small\scshape}
239 \setsubparaheadstyle{\small\scshape}
234
223
\setbeforesecskip{-3.5ex plus-1ex minus-0.2ex}
224 \setbeforesubsecskip{-3ex plus-1ex minus-0.2ex}
225 \setbeforesubsubsecskip{-2.5ex plus-1ex minus-0.2ex}
226 \setbeforeparaskip{1\onelineskip plus1ex minus0.2ex}
227 \setbeforesubparaskip{1\onelineskip plus1ex minus0.2ex}
228 \setaftersecskip{1.5ex plus0.2ex}
229 \setaftersubsecskip{1.5ex plus0.2ex}
230 \setaftersubsubsecskip{1.5ex plus0.2ex}
231 \setafterparaskip{-1em}
232 \setaftersubparaskip{-1em}
233 \setsubparaindent{\parindent}
Ora le spaziature prima, dopo, a destra e a sinistra dei titoli dei comandi di
sezionamento minori. Inoltre si definiscono gli stili dei titolini e altre informazioni
stilistiche per le parti e i capitoli.
222
221
220
Vengono ora fissati alcuni parametri stilistici per le pagine che iniziano una
“parte”, anche se si ritiene che le guide tematiche debbano essere sufficientemente
succinte da non richiedere di essere divise in parti.
219
\renewcommand\descriptionlabel[1]{\hspace\labelsep\normalfont\scshape #1}
\renewcommand\blockdescriptionlabel[1]{\normalfont\scshape #1}
\providecommand\plaindescriptionlabel[1]{\hspace\labelsep\normalfont #1}
\newlist{compactenumerate}{enumerate}{1}
\setlist[compactenumerate,1]{label=\arabic*.,
noitemsep, partopsep=\z@, topsep=.25\onelineskip}
\newlist{plaindescription}{description}{1}
\setlist[plaindescription]{before={\let\makelabel\plaindescriptionlabel}}
\newlist{compactdescription}{description}{1}
\setlist[compactdescription]{%
style=sameline,noitemsep,partopsep=\z@,topsep=.25\onelineskip}
\AtBeginDocument{\setsecnumdepth{subsection}
\settocdepth{subsection}\maxsecnumdepth{subsection}
\maxtocdepth{subsection}}
286
285
284
10
\DeclareMathSymbol{\virgola}{\mathpunct}{letters}{"3B}
\DeclareMathSymbol{\virgoladecimale}{\mathord}{letters}{"3B}
\unless\ifPDFTeX
287 \AtBeginDocument{\ifcsstring{xpg@main@language}{english}{\relax}{%
288
\mathcode‘\,=\string"8000}}
289 \else
290 \AtBeginDocument{\ifcsstring{languagename}{english}{\relax}{%
291
\mathcode‘\,=\string"8000}}
292 \fi
293 {\catcode ‘,=\active \gdef,{\futurelet\let@token\m@thcomma}}%
Viene ora definita la virgola intelligente; si veda una descrizione più dettagliata
della sua utilità in matematica per esempio della documentazioone di questa classe
gidatematica-doc.pdf. Qui si commenta solo il codice.
La prima parte del codice serve per rendere attiva la virgola solo in modo
matematico e solo quando la lingua principale non è l’inglese. Si fornisce anche
un comando \m@thcomma come cuore della definizione della virgola attiva.
283
282
281
Vengono poi impostati e differiti all’inizio del documento i contatori che regolano la profondità di numerazione delle sezioni e della loro inclusione nell’indice
generale.
280
279
278
277
275
274
\newlist{compactitemize}{itemize}{4}
\setlist[compactitemize]{label=•,
276
noitemsep,partopsep=\z@,topsep=.25\onelineskip}
273
272
271
270
269
268
267
266
264
263
\renewlist{blockdescription}{description}{1}
\setlist[blockdescription]{before={\let\makelabel\blockdescriptionlabel},
265 leftmargin=\z@,labelsep*=0.5em,labelindent=\z@,labelwidth=\z@}
262
261
260
259
tutte le liste descrittive l’etichetta viene sempre composta in maiuscoletto; se si
vuole cambiare font o stile basta usare gli appositi comandi nella forma hchiavei
= hvalorei forniti dal pacchetto enumitem. Solo per il nuovo ambiente descrittivo
plaindescription la didascalia di default è composta in \normalfont. L’ambiente blockdescription viene definito senza le etichette sporgenti e senza rientranza del margine sinistro. I nuovi ambienti compactenumerate, compactitemize e
compactdescription sono definiti in modo da annullare tutti gli spazi verticali
interni e in modo da ridurre gli spazi prima e dopo la lista.
§ 5.4
Conclusione
114
295
294
11
\AtEndPreamble{%
\gdef\m@thcomma#1{%
296 \unless\ifcat\noexpand\let@token*%
297
\virgola
298 \else
299 \expandafter\expandafter\expandafter
300
\ifcsname\expandafter\@gobble\string#1\endcsname
301
\virgola
302 \else
303
\ifnum‘#1<‘0\relax
304
\virgola
305
\else
306
\ifnum‘#1>‘9\relax
307
\virgola
308
\else
Poi, ritardando l’esecuzione alla fine del preambolo, si definisce \m@thcomma in modo che svolga il suo compito: \let@token contiene il token che segue \m@thcomma
nel file sorgente; precisamente il token che segue la virgola nel file sorgente. Perciò
esso può essere uno spazio, un carattere implicito, un carattere esplicito, una macro, un qualunque token di categoria diversa da 11 e da 12. Il comando \m@thcomma
assorbe anche il primo token che la segue, purché non sia uno spazio, eventualmente già memorizzato in \let@token. Lo scopo della virgola intelligente è quello
di sapere se il carattere che viene immediatamente dopo sia una cifra, che è di
categoria 12, come l’asterisco. Quindi per prima cosa si controlla se \let@token
ha categoria 12. Se non lo è allora non si tratta sicuramente di una cifra e la
virgola intelligente inserisce la virgola interpuntiva. Ma se lo è potrebbe essere
un carattere esplicito analfabetico oppure un carattere implicito di categoria 12.
In questo caso non lo si può usare per verificare se il carattere implicito sia una
cifra; ma in matematica nessuno si sognerebbe mai di indicare con un carattere
implicito una qualunque delle 10 cifre decimali; dunque se si tratta di un carattere implicito esso rappresenta qualche carattere diverso da una cifra e ci vuole
la virgola interpuntiva. Solo che per sapere se si tratta di un carattere implicito
bisogna verificare se esso ha la forma di una sequenza di controllo. Per fare questo
bisogna prendere la stringa che costituisce l’argomento di \m@thcomma, togliergli
il primo carattere (eventualmente un backslash) e vedere se quel che resta costituisce il nome di una sequenza di controllo a cui è stato assegnato un significato;
dunque se il token fosse per esempio \infty la stringa sarebbe formata dai caratteri \, i, n, f, t, e y, togliendo il primo dei quali resta la “parola” infty; il test
\ifcsname infty\endcsname restituisce il valore “vero” se \infty ha un significato; nel nostro caso quindi si tratterebbe di un carattere implicito e ci vuole la
virgola interpuntiva. Se invece il primo argomento della macro \m@thcomma fosse
un carattere esplicito di categoria 12 (non potrebbe essere altro a questo punto dei
test), questa operazione di togliere il primo carattere, lascerebbe una stringa vuota
cosicché il test \ifcsname\endcsname darebbe luogo ad un valore “falso”, quindi
abbiamo la certezza che si tratti di un carattere esplicito di categoria 12; bisogna
ora testare se si tratta di una cifra. I due test \ifnum‘#1<‘0 e \ifnum‘#1>‘9
controllano se il carattere in questione è esterno o interno all’intervallo ASCII
delle cifre; se esso è esterno ci vuole la virgola interpuntiva, altrimenti la virgola
decimale.
Non tanto semplice ma efficace sia con pdfLaTeX sia con XeLaTeX.
\virgoladecimale
\fi
\fi
312 \fi
313 \fi#1}%
314 }
\renewcommand{\bibsection}{\chapter{\bibname}\prebibhook}
\AtBeginDocument{\bibliographystyle{guidatematica}%
335
334
12
\unless\ifPDFTeX
\ifcsstring{xpg@main@language}{italian}%
Come configurazione generale con XeLaTeX si impone lo stile senza il rientro del
primo capoverso di un capitolo o di ogni sezione. Con pdfLaTeX non è necessario,
perché questa funzionalità è predefinita. Tuttavia ogni autore di guide tematiche
è padronissimo di impostarsi il pacchetto indentfirst se vuole rientrare tutti i
capoversi, anche quelli che seguono ogni comando di sezionamento.
333
All’inizio del documento si inserisce l’indicazione per lo stile bibliografico.
Avendo caricato il pacchetto natbib e lo stile bibliografico guidatematica.bst le
citazioni e l’elenco dei riferimenti bibliografici vengono eseguiti con lo stile “autoreanno”. natbib da parte sua mette a disposizione tanti comandi della famiglia
\cite, che si possono usare più di una mezza dozzina di tali comandi per avere lo
stile predefinito, fra parentesi, solo l’autore, solo l’anno, eccetera.
318
317
316
\let\imki@idxprologue\empty
\def\imki@columns{2}
\renewenvironment{theindex}
319 {%
320 \clearforchapter
321
\csname phantomsection\endcsname
322
\chapter{\indexname}%
323
\indexmark%
324
\parindent\z@
325
\parskip\z@ \@plus .3\p@\relax
326
\let\item\@idxitem
327
\begin{multicols}{\imki@columns}[\imki@idxprologue]
328
\raggedright
329 }
330 {%
331
\end{multicols}\gdef\imki@idxprologue{}\clearpage
332 }
Per l’indice o gli indici analitici non dovrebbero esserci problemi, nel senso che
il pacchetto imakeidx ridefinisce a sua volta quelli analitici per poterli gestire a
modo suo. Probabilmente è del tutto inutile la ridefinizione fatta in questa classe,
ma non dà nessun fastidio, quindi la si lascia lo stesso.
315
Si ridefiniscono l’ambiente thebibliography e theindex per poterne inserire
il titolo nell’indice e per poter avere il “target” nel punto giusto quando si clicca su
un link ipertestuale che porti all’inizio di queste “sezioni”. Per giunta queste parti
dovrebbero cadere nella back matter, quindi non verrebbero nemmeno numerati.
Per la bibliografia si sfruttano i comandi interni di memoir per ottenere quello
che si desidera e nello stesso tempo per consentire di mettere un prologo prima
dell’elenco bibliografico. La documentazione di memoir dice che bisogna ridefinire
il comando interno \bibsection.
311
310
309
Capitolo 5.
La classe per comporre questa guida tematica
\fi}
{\csgappto{init@extras@italian}{\nofrench@indent}}{}%
\providecommand\subtitle[1]{\gdef\@subtitle{#1}}
\let\@subtitle\empty
115
366
365
364
360
359
358
13
\newenvironment{sintassi}{\flushleft\medaglione}%
{\endmedaglione\endflushleft}
\newenvironment{medaglione}[1][\linewidth]{%
\begin{lrbox}{0}%
\begin{minipage}{\dimexpr#1-2\fboxsep-2\fboxrule}
361 }{%
362
\end{minipage}\end{lrbox}\fbox{\usebox{0}}\relax
363 }
Invece sono importanti questi due ambienti: medaglione e sintassi. Il primo
serve per incorniciare un testo; per la larghezza l’ambiente medaglione accetta un
argomento facoltativo, predefinito alla giustezza corrente (quindi una giustezza che
cambia all’interno delle liste); determina la giustezza di composizione all’interno
del medaglione tenendo conto dello spessore del filetto della cornice e dello spazio
di separazione fra la cornice e il testo in essa contenuto.
I secondo ambiente, sintassi è un medaglione adatto per incorniciare i comandi e quindi per descrivere la loro sintassi. Spesso l’ambiente sintassi contiene la
descrizione della sintassi di un solo comando; dovendo indicare la sintassi di molti
comandi è opportuno sfruttare la composizione sbandierata con l’allineamento a
sinistra (predefinito) ma con un “a capo” automatico ogni volta che nel sorgente si
incontra un “a capo” nel testo sorgente; in questi casi sta all’utente di specificare
il comando \obeylines all’inizio dell’ambiente cosicché non dovrà più ricordarsi
di mettere esplicitamente un comando \\ alla fine di ogni riga.
349
348
347
\renewcommand\maketitle{
\begin{titlepage}
\vspace*{\stretch{.7}}
350
{\centering\LARGE\scshape\@title\par}
351
\ifdefvoid{\@subtitle}{}{\vspace{2\onelineskip}
352
{\centering\scshape\Large\@subtitle\par}}
353
\vspace{\stretch{.7}}
354
{\centering\includegraphics[width=0.23\paperwidth]{logoguittondo}\par}
355
\vspace*{\stretch{.7}}
356
\end{titlepage}
357 }
346
345
344
343
339
338
\newenvironment{titlepage}{\clearpage
\pagestyle{titlepage}
340
\makeoddhead{titlepage}{}{\smash{\Large\scshape\@author}}{}
341
\makeoddfoot{titlepage}{}{\smash{\large\scshape\@date}}{}
342 }{\clearpage}
L’ambiente per la pagina del titolo, titlepage non è definita con la classe
memoir; qui la si definisce apposta e funzionalmente per questa classe, non è un
comando da usare da parte dell’utente; egli deve invece limitarsi a dare i comandi
author, un solo autore, o una lista di autori separati da virgole o altri spaziatori;
\title con il titolo della guida; \subtitle per un eventuale sottotitolo; \date
con le informazioni che ritiene più opportune.
337
336
14
Invece i comandi che seguono servono per comporre con un certo stile grafico
certi elementi del linguaggio dagli ambienti alle classi fino ai codici di allineamento
di certi oggetti con gli oggetti circostanti; ci si può riferire alla documentazione
d’uso della classe guidatematica-doc.pdf distribuita con il kit di composizione delle
guide tematiche.
Si noti che molti di questi oggetti possono venire inseriti in uno o più indici
analitici; sta al compositore stabilire se la Guida tematica abbia necessità di uno
o più indici analitici; la documentazione guidatematica-doc.pdf contiene maggiori
dettagli. Qui vale la pena di sottolineare che i comandi il cui nome termina con
style servono solo per gestire lo stile di composizione; quelli invece che cominciano con la stessa “parola” ma non terminano con style compongono nel testo la
locuzione specifica con lo stile che le si addice ma, se è stato specificato il comando
\makeindex, eventualmente con le sue opzioni, inviano anche le apposite informa-
369
368
367
\newcommand*\hz{\nobreak\hskip\z@}
\renewcommand*\meta[1]{$\langle$\textit{\hz#1}$\rangle$}
\renewcommand*\marg[1]{\texttt{\char123}\meta{#1}\texttt{\char125}}
370 \renewcommand*\oarg[1]{\texttt{[}\meta{#1}\texttt{]}}
371 \newcommand*\Arg[1]{\texttt{\char123\relax#1\char125}}
372 \def\GT@splitargs#1,#2!{\def\@tempA{#1}\def\@tempB{#2}}
373 \newcommand\garg[1]{\GT@splitargs#1!\texttt{(}\meta{\@tempA}%
374
\texttt{,}\meta{\@tempB}\texttt{)}}
375 \newcommand*\comando[1]{\texttt{\string#1}}
376 \renewcommand*{\cs}[1]{\texttt{\char92#1}\index{#1@\texttt{\char92#1}}}
377 \let\csindex\cs
378 \newcommand*\Sambiente[2]{\cs{begin}\marg{#1}\oarg{#2}\,\dots
379
\cs{end}\marg{#1}}
380 \newcommand*\Dambiente[3]{\cs{begin}\marg{#1}\oarg{#2}\oarg{#3}\,\dots
381
\cs{end}\marg{#1}}
382 \newcommand*\Bambiente[1]{\cs{begin}\texttt{\char123#1\char125}}
383 \newcommand*\Eambiente[1]{\cs{end}\texttt{\char123#1\char125}}
Per descrivere la sintassi sono utili i comandi seguenti al fine di semplificare la
scrittura delle parti di testo corrente e differenziare gli argomenti generici; quelli
obbligatori e quelli facoltativi; dovendo descrivere delle cose riguardanti il disegno
programmato, le coordinate spesso vengono distinte con due valori, separati da
una virgola e racchiusi fra parentesi tonde; anche in questo caso siamo di fronte
alla descrizione di una sintassi e si dispone di un apposito comando per descrivere
le coordinate geometriche.
I comandi sono \meta per un hargomento genericoi; \marg per un
{hargomento obbligatorioi}; \oarg per un [hargomento facoltativoi]; \garg
per le (hcoordinatei,hgeometrichei); \comando per un \comando completo del
suo backslash; \cs per il nome (senza backslash) di un \comando al quale viene anteposto il suo necessario backslash quando esso viene composto;
\Sambiente per descrivere la sintassi di uno specifico ambiente che accetta
un argomento come in \begin{hambientei}[hargomentoi] . . . \end{hambientei};
\Dambiente per descrivere la sintassi di un ambiente che accetta un argomento facoltativo per il quale bisogna indicare il valore predefinito, come in
\begin{hambientei}[hargomentoi][hdefaulti] . . . \end{hambientei}; Bambiente
per indicare l’apertura di un ambiente specifico; \Eambiente per indicare la chiusura di un ambiente specifico; \Arg per indicare fra graffe un argomento specifico
{123}.
§ 5.4
Conclusione
386
385
384
116
15
%
\DeclareRobustCommand*\ambstyle[1]{\textsf{\slshape#1}}
\DeclareRobustCommand*\classstyle[1]{\texttv{\itshape#1}}
387 \DeclareRobustCommand*\filestyle[1]{\texttm{\textl{#1}}}
388 \unless\ifPDFTeX
389
\DeclareRobustCommand*\packstyle[1]{\texttm{\itshape{#1}}}
390 \else
391
\DeclareRobustCommand*\packstyle[1]{\texttm{\itshape\textl{#1}}}
392 \fi
393 \DeclareRobustCommand*\progstyle[1]{\textsf{#1}}
394 \DeclareRobustCommand*\prog[1]{\progstyle{#1}%
395
\index{programma!#1@\progstyle{#1}}}
396 \DeclareRobustCommand*\pack[1]{\packstyle{#1}%
397
\index{pacchetto!#1@\packstyle{#1}}}
398 \DeclareRobustCommand*\class[1]{\classstyle{#1}%
399
\index{classe!#1@\classstyle{#1}}}
400 \DeclareRobustCommand*\file[1]{\filestyle{#1}%
401
\index{file!#1@\filestyle{#1}}}
402 \DeclareRobustCommand*\amb[1]{\ambstyle{#1}%
403
\index{ambiente!#1@\ambstyle{#1}}}
404 %
405 \DeclareRobustCommand*\opzstyle[1]{\textsl{\textl{#1}}}
406 \DeclareRobustCommand*\contastyle[1]{\texttm{#1}}
407 \DeclareRobustCommand*\stilestyle[1]{\texttm{#1}}
408 \DeclareRobustCommand*\numeristyle[1]{\texttm{#1}}
409 \DeclareRobustCommand*\umisurastyle[1]{\texttm{#1}}
410 \DeclareRobustCommand*\chiavestyle[1]{\texttm{#1}}
411 \DeclareRobustCommand*\descrittorestyle[1]{\texttm{#1}}
412 \DeclareRobustCommand*\posizionestyle[1]{\texttm{#1}}
413 \DeclareRobustCommand*\allineamentostyle[1]{\texttm{#1}}
414 %
415 \DeclareRobustCommand*\opz[1]{\opzstyle{#1}%
416
\index{opzione!#1@\opzstyle{#1}}}
417 \DeclareRobustCommand*\conta[1]{\contastyle{#1}%
418
\index{contatore!#1@\contastyle{#1}}}
419 \DeclareRobustCommand*\stile[1]{\stilestyle{#1}%
420
\index{stile della pagina!#1@\stilestyle{#1}}}
421 \DeclareRobustCommand*\numeri[1]{\numeristyle{#1}%
422
\index{numerazione!#1@\numeristyle{#1}}}
423 \DeclareRobustCommand*\umisura[1]{\umisurastyle{#1}%
424
\index{unit\‘a di misura!#1@\umisurastyle{#1}}}
425 \DeclareRobustCommand*\chiave[1]{\chiavestyle{#1}%
426
\index{chiave!#1@\chiavestyle{#1}}}
427 \DeclareRobustCommand*\descrittore[1]{\descrittorestyle{#1}%
428
\index{descrittore di colonna!#1@\descrittorestyle{#1}}}
429 \DeclareRobustCommand*\posizione[1]{\posizionestyle{#1}%
430
\index{posizione degli oggetti flottanti!#1@\posizionestyle{#1}}}
431 \DeclareRobustCommand*\allineamento[1]{\allineamentostyle{#1}%
zioni al file di servizio \jobname.idx per essere poi elaborati con il programma
makeidx per avere le varie voci in ordine alfabetico gerarchico, al fine di poter
comporre l’indice analitico come prescritto. I comandi che seguono permettono di
inserire le voci in un unico indice analitico; se ne occorre più di uno essi possono
o debbono venire ridefiniti in modo da inviare la voce all’indice desiderato.
Capitolo 5.
La classe per comporre questa guida tematica
Bibliografia
LATEX 3 Project Team (2006). «LATEX 2ε for class and package writers».
PDF document. Leggibile con texdoc clsguide nella distribuzione TeX
Live.
Abrahams, P., Berry, K. e Hargreaves, K. (1991). TEX per l’impaziente.
Addison Wesley. In italiano.
Beccari, C. (2011a). «Introduzione all’arte della composizione tipografica
con LATEX». PDF document. URL http://www.guitex.org/home/.
— (2011b). «Package canoniclayout». PDF document. Leggibile con
texdoc canoniclayout nella distribuzione TeX Live.
Beccari, C. e Gregorio, E. (2010). «Package imakeidx». PDF document.
Leggibile con texdoc imakeidx nella distribuzione TeX Live.
Berry, K. (2011). «The TEX Live guide». PDF document. Leggibile con
texdoc texlive nella distribuzione TeX Live.
Bezos, J. (2011a). «Customizing lists with the enumitem package». PDF
document. Leggibile con texdoc enumitem nella distribuzione TeX Live.
— (2011b). «The titlesec, titleps, titletoc, packages». PDF document.
Leggibile con texdoc titlesec nella distribuzione TeX Live.
Bringhurst, R. (2004). The elements of typographic style. Hartley &
Marks.
Carlisle, D. (2007). «The file ltxdoc.dtx for use with LATEX 2ε ». PDF
document. Leggibile con texdoc ltxdoc nella distribuzione TeX Live.
Bibliografia
Charette, F. (10). «Polyglossia: a babel replacement for XELATEX». PDF
document. Leggibile con texdoc polyglossia nella distribuzione TeX
Live.
Cochran, S. D. (2005). «The subfig package». PDF document. Leggibile
con texdoc subfig nella distribuzione TeX Live.
Daly, P. W. (2010). «Natural sciences citations and references». PDF
document. Leggibile con texdoc natbib nella distribuzione TeX Live.
Gäßlein, H., Niepraschk, R. e Tkadlec, J. (2011). «The pict2e package». PDF document. Leggibile con texdoc pict2e nella distribuzione
TeX Live.
Gilardi, G. (1993). Il TEX. Zanichelli/Decibel.
Goossens, M. (1997). The LATEX Graphics companion. Addison Wesley.
— (1999). The LATEX Web Companion. Addison Wesley.
Gregorio, E. (2009). «Appunti di programmazione in LATEX e TEX».
PDF document. URL http://profs.sci.univr.it/~gregorio/egtex.
html.
— (2010a). «LATEX, breve guida ai pacchetti di uso più comune».
PDF document. URL http://profs.sci.univr.it/~gregorio/egtex.
html.
— (2010b). «Installare TEX live 2010 su ubuntu». PDF document. URL
http://profs.sci.univr.it/~gregorio/egtex.html. Nelle istruzioni contenute nel testo bisogna cambiare le indicazioni degli anni
corrispondentemente alla versione che si vuole installare.
Knuth, D. E. (1984). The TEXbook. Addison Wesley. Nonostante l’anno
di pubblicazione nell’arco degli anni sono state stampate molte ristampe
rivedute e corrette.
Kopka, H. e Daly, P. W. (2004). Guide to LATEX. Addison Wesley, 4ª
edizione.
118
Bibliografia
Lamport, L. (1994). LATEX: A document prparation system – User guide
and reference manual. Addison Wesley, 2ª edizione.
Lehman, P. (2011a). «The biblatex package». PDF document. Leggibile
con texdoc biblatex nella distribuzione TeX Live.
— (2011b). «The etoolbox paclage». PDF document. Leggibile con texdoc
etoolbox nella distribuzione TeX Live.
Lingnau, A. (2001). «An impoved environment for floats». PDF document.
Leggibile con texdoc float nella distribuzione TeX Live.
Mittelbach, F. (2011). «The varioref package». PDF document. Leggibile
con texdoc varioref nella distribuzione TeX Live.
Mittelbach, F. et al. (2003). «The DocStrip program». PDF document.
Leggibile con texdoc docstrip nella distribuzione TeX Live.
— (2004). The LATEX Companion. Addison Wesley, 2ª edizione.
— (2006). «LaTeX font encodings». PDF document. Leggibile con texdoc
encguide nella distribuzione TeX Live.
Pakin, S. (2004). «How to package your LATEX package». PDF document.
Leggibile con texdoc dtxtut nella distribuzione TeX Live.
Pantieri, L. e Gordini, T. (2012). «L’arte di scrivere con LATEX». PDF
document. URL http://www.guitex.org/home/.
Rahtz, S. e Oberdiek, H. (2011). «Hypertext marks in LATEX: a manual
for hyperref». PDF document. Leggibile con texdoc hyperref nella
distribuzione TeX Live.
Sommerfeldt, A. (2011a). «Customizing captions of floating environments
using the caption package». PDF document. Leggibile con texdoc
caption nella distribuzione TeX Live.
— (2011b). «The subcaption package». PDF document. Leggibile con
texdoc subcaption nella distribuzione TeX Live.
Umeki, H. (2010). «The geometry package». PDF document. Leggibile
con texdoc geometry nella distribuzione TeX Live.
119
Bibliografia
van Oostrum, P. (2004). «Page layout in LATEX». PDF document.
Leggibile con texdoc fancyhdr nella distribuzione TeX Live.
Wilson, P. (2009). «A few notes on book design». PDF document.
Leggibile con texdoc memdesign nella distribuzione TeX Live.
— (2010). «The tocloft package». PDF document. Leggibile con texdoc
tocloft nella distribuzione TeX Live.
Wilson, P. e Madsen, L. (2011). «The memoir class for configurable
typesetting – User guide». PDF document. Leggibile con texdoc memoir
nella distribuzione TeX Live.
120
Fly UP