Ricerca tra la vecchia roba

Double Columns

Posted: Marzo 8th, 2007 | Author: | Filed under: Programmazione, TeX | Commenti disabilitati su Double Columns

Partiamo 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

P.S: Proprio mentre vado in stampa, mi accorgo che le note a pié di pagina non me le inserisce, strano… stay tuned.


Comments are closed.