Double Columns
Posted: Marzo 8th, 2007 | Author: packz | Filed under: Programmazione, TeX | Commenti disabilitati su Double ColumnsPartiamo con una delle routine più semplici, ma che coinvolge l'aspetto forse più importante del TeX: quella che alla fine crea la pagina finale che viene scritta nel file .dvi che eventualmente trasformeremo nel formato che più ci aggrada. Una volta che il TeX ha analizzato il nostro file sorgente, si preoccupa di assemblare assieme paragrafi su paragrafi fino a raggiungere le dimensioni volute del materiale (accumulato nel box255) e chiama la routine output: molto importante notare che questa procedura non può essere chiamata direttamente dall'utente, il quale al massimo può modificarne il comportamento.
Il comando vero e proprio che trasforma del materiale in TeX in un documento elettronico è il comando shipout (ship in inglese significa 'imbarcare', 'caricare') che prende come argomento appunto il materiale (dei box in particolare) in esame. Per capirci se impostassimo
output{shipouthbox{Ciao}}
otterremo (oltre che dei warning) un tot di pagine con solamente scritta la parola 'Ciao' in ognuna di esse! inutile dire che una procedura di questo tipo è totalmente inutile (se non come scherzo ad un amico;-)).
Nel plain TeX la routine con cui viene costruita la pagina è la seguente
output{plainoutput}
defplainoutput{shipoutvbox{makeheadlinepagebodymakefootline}%
advancepageno
ifnumoutputpenalty>-20000 elsedosuperejectfi}
il cui significato di ogni sequenza di controllo è lasciato alla sua denominazione (per approfondimenti leggere il Texbook).
Come possiamo dire alla routine di creare due colonne di testo affiancate? la modalità forse più semplice è quella di impostare la larghezza della pagina a metà della situazione normale e chiamare la shipout ogni due pagine affiancandole; per iniziare si può definire un contatore che terrà conto delle mezze pagine:
count1=1
output{iffoddcount1globalsetbox254box255
elseshipouthbox{box254quadbox255}
advancepagenofi
globaladvancecount1 by 1}
Nel codice qui sopra viene TeXificato quanto detto precedentemente: nella prima riga si inizializza il contatore ad 1, nella seconda viene definita la procedura output, che controlla se count1 è dispari (iffoddcount1) e in tal caso imposta il box254 con il contenuto del box255 (cioé la pagina corrente); in caso contrario vuol dire che abbiamo le due pagine pronte per la stampa e quindi possiamo mandarle al file .dvi, affiancate una all'altra (shipout{box254quadbox255}) e ovviamente incrementare il numero delle pagine (globaladvancepageno), in ogni caso count1 viene aggiornato.
Ovviamente si necessitano molti aggiustamenti in quanto manca sia l'headline che la footline, tuttavia basta poco per giungere a risultati accettabili: questa per esempio è la mia macro che uso per generare l'indice analitico nei miei appunti:
output{%
ifoddcount1% è la pagina dispari?
globalsetbox254box255% se si salvala
else% altrimenti
shipoutvbox{% "emetti"
hsize=savehsize%
ifheading% c'è una intestazione?
unvboxheading% allora metti il suo contenuto qui
globalheadingfalse% rimposta la variabile
vskip1cm% salta 1cm
globalvsize=savevsize% rimposta la dim verticale
else% se non c'è l'intestazione
makeheadline% metti la headline
fi% (fine ifheading)
hbox{box254quadbox255}% pagina affiancate
makefootline% linea a piè di pagina
}%
advancepageno% avanza il numero di pagina
fi% (fine ifodd)
globaladvancecount1 by 1% avanza il contatore di coppia
}
Vi è inoltre la possibilità di inserire una intestazione (che prende tutta la larghezza della pagine) tramite beginheading, endheading definite in questo modo
newboxheading
newififheadingheadingfalse
defbeginheading{headingtruesetboxheadingvboxbgroupnoindentignorespaces}
defendheanding{egrouphsize=halfsizevresize=htheadingadvancevsize by-vresize}
Per chi non avesse voglia di ricopiare il tutto o non avesse il TeX e vuole vedere l'effetto che fa
- double_columns.ps
- double_columns.tex (per vederlo al meglio impostate le tabulazioni a due spazi, in vim con 'set tabstop=2')
P.S: Proprio mentre vado in stampa, mi accorgo che le note a pié di pagina non me le inserisce, strano… stay tuned.