[successivo] [precedente] [inizio] [fine] [indice generale] [docinfo] [Indice analitico]


Capitolo 9.   Alml: preparazione e visione generale

Alml (1) è il sistema di composizione SGML di questo documento, Appunti di informatica libera. Si tratta di un programma Perl, alml, che controlla l'analizzatore SGML e altri programmi necessari per arrivare alla composizione finale del documento. Tuttavia, per poter comprendere quanto esposto, è necessario prima conoscere ciò che è stato descritto a proposito dell'SGML, di TeX e dei sistemi comuni di composizione basati sull'SGML.

Alml, con il suo DTD, è destinato a evolversi assieme all'opera Appunti di informatica libera. Chi desidera utilizzare questo sistema di composizione deve tenere in considerazione tale dinamicità; pertanto, prima di passare a un eventuale aggiornamento, deve valutare l'opportunità del cambiamento.

Alml si avvale di altri programmi per l'analisi SGML e per la generazione di alcuni formati finali. In particolare, è necessario disporre di nsgmls che fa parte generalmente del pacchetto SP (anche se la propria distribuzione GNU/Linux potrebbe nominarlo in modo differente); inoltre è fondamentale la presenza di LaTeX per generare la composizione da stampa. La tabella 9.1 riepiloga gli applicativi da cui dipende il buon funzionamento di Alml.

Tabella 9.1. Applicativi da cui dipende Alml.

Applicativo Compito
Perl Alml è scritto in Perl.
Perl-gettext Modulo Perl per l'utilizzo di Gettext.
SP Verifica la validità SGML e genera una prima conversione.
LaTeX Compone in un formato finale per la stampa.
PSUtils Riorganizza, ingrandisce e riduce un file PostScript.
Dvipdfm Consente una conversione in PDF a partire dal file DVI.
Uuencode Estrae le immagini incorporate da file esterni.
ImageMagick Converte i file delle immagini nei formati appropriati, adattando le dimensioni.
Ghostscript Serve a ImageMagick per la conversione di file PostScript in altri formati.
HTML2ps Consente l'incorporazione di codice HTML nella composizione per la stampa.
Links o W3M Converte un file HTML in testo puro.
Lilypond Consente l'incorporazione di codice Lilypond.
Xfig Consente l'incorporazione di codice Xfig.

9.1   Installazione di Alml

Alml viene fornito attraverso archivi tradizionali di tipo tar+gzip, in file con nomi del tipo:

alml-versione.tar.gz

Estraendo il contenuto dell'archivio, si dovrebbero ottenere in particolare i file e le sottodirectory elencati nella tabella 9.2, che rappresentano l'essenziale.

Tabella 9.2. Contenuto essenziale dell'archivio di distribuzione di Alml.

File o directory Descrizione
bin/* File eseguibili.
doc/* Esempi e documentazione eventuale.
etc/* File di configurazione da inserire a partire dalla directory /etc/.
man/* Pagine di manuale relative agli eseguibili.
share/sgml/* File e directory da collocare in /usr/share/sgml/alml/.

Gli eseguibili, che nel pacchetto di distribuzione si trovano nella directory bin/, devono essere raggiungibili attraverso il percorso di ricerca del sistema, rappresentato dalla variabile di ambiente PATH. Pertanto vanno collocati opportunamente, oppure vanno predisposti dei collegamenti adeguati.

Quanto contenuto nella directory share/sgml/, va collocato nella directory /usr/share/sgml/alml/, oppure vanno realizzati dei collegamenti equivalenti.

In generale, se la propria distribuzione GNU/Linux non è predisposta per la gestione delle entità standard ISO 8879, conviene modificare il collegamento simbolico alml.cat, che nella sua collocazione finale deve trovarsi nella directory /usr/share/sgml/alml/. Normalmente questo punta al file alml.cat.debian, ma in caso di problemi conviene modificarlo in modo che punti a alml.cat.normal.

9.1.1   Gettext

I messaggi di Alml possono essere tradotti. Se si dispone del file PO relativo alla lingua preferita, è necessario compilarlo come nell'esempio seguente:

msgfmt -vvvv -o alml.mo it.po[Invio]

In questo esempio, il file it.po viene compilato generando il file alml.mo. Trattandosi evidentemente della traduzione italiana, questo file può essere collocato in /usr/share/locale/it/LC_MESSAGES/, o in un'altra posizione analoga in base agli standard del proprio sistema operativo.

Se non è disponibile il modulo Perl-gettext,(2) che serve a Alml per accedere alle traduzioni, è possibile eliminare il suo utilizzo e simulare la funzione di Gettext. In pratica si commentano le istruzioni seguenti all'inizio dei programmi alml, alml-sp2sp, alml-sp2be e alml-extra:

# We *don't* want to use gettext.
#use POSIX;
#use Locale::gettext;
#setlocale (LC_MESSAGES, "");
#textdomain ("alml");

Inoltre, si tolgono i commenti dalla dichiarazione della funzione fittizia gettext(), come si vede qui:

sub gettext
{
    return $_[0];
}

9.2   Esempio iniziale

Un esempio iniziale può servire per comprendere il funzionamento generale di Alml.

<!DOCTYPE ALML PUBLIC "-//Daniele Giacomini//DTD Alml//EN">

<alml lang="it" spacing="uniform">
<head>
    <admin>
        <description>Un esempio per l'utilizzo del sistema Alml</description>
        <keywords>SGML, XML, HTML, Alml</keywords>
    </admin>
    <title>Esempio di utilizzo di Alml</title>
    <author>Pinco Pallino &lt;pinco.pallino@brot.dg&gt;</author>
    <date>2011.11.11</date>
    <legal>
        <p>Copyright &copy; Pinco Pallino, &lt;pinco.pallino@brot.dg&gt;</p>

        <p>Permission is granted to copy, distribute and/or modify this
        document under the terms of the GNU Free Documentation License,
        Version 1.1 or any later version published by the Free Software
        Foundation; with no Invariant Sections, with no Front-Cover
        Texts, and with no Back-Cover Texts. A copy of the license is
        included in the section entitled "GNU Free Documentation
        License".</p>
    </legal>
    <maincontents levels="2">Indice generale</maincontents>
</head>
<intro>
<h1>
Introduzione al documento
</h1>

<p>Questo documento è scritto per... bla bla bla bla bla bla bla bla bla
bla bla bla bla bla bla bla bla bla bla bla bla bla...</p>

<p>Bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla
bla bla bla bla bla...</p>

</intro>
<body>
<h1 id="capitolo-primo">
Lavorando con bla bla bla...
<indexentry>lavorare con bla bla</indexentry>
<indexentry>bla bla</indexentry>
</h1>

<p>Lavorare con bla bla è molto semplice... bla bla bla bla bla bla bla
bla bla bla bla bla bla...</p>

<p>Bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla
bla bla bla bla bla...</p>

<h2>
Fare di meglio
</h2>

<p>C'è anche un modo migliore per... bla bla bla bla bla bla bla bla bla
bla bla bla bla...</p>

<p>Bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla
bla bla bla bla bla...</p>

<h1 id="capitolo-secondo">
Non dover lavorare più
<indexentry>relaxing</indexentry>
</h1>

<p>Se non si lavora ci si può riposare, ma questo si può fare solo se si
dispone già di una certa disponibilità economica... bla bla bla bla bla
bla bla bla bla bla bla bla bla bla bla...</p>

<p>Bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla
bla bla bla bla bla...</p>

</body>
<appendix>
<h1>
Alcune note
</h1>

<p>Bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla
bla bla bla bla bla...</p>

<p>Bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla
bla bla bla bla bla...</p>

</appendix>
<index>
<h1>
Index
</h1>

<printindex index="main">

</index>
</alml>

Se tutto viene copiato correttamente nel file ipotetico esempio.sgml, con il comando seguente si ottiene la composizione in PostScript, attraverso LaTeX e Dvips:

alml --ps esempio.sgml[Invio]

Con il comando seguente, si ottiene la composizione in HTML, su più file distinti:

alml --html esempio.sgml[Invio]

9.3   Cosa si genera con la composizione

L'utilizzo di Alml può generare file differenti a seconda del tipo di operazione che viene richiesta. La tabella 9.3 riepiloga questi file.

Tabella 9.3. File generati dall'utilizzo di Alml. I file nome.sgml e nome.css devono essere già presenti.

File Descrizione
nome.sgml Il sorgente SGML principale da cui hanno origine gli altri file.
nome.css Foglio di stile CSS necessario per la composizione HTML.
nome.aux File ausiliario e temporaneo della composizione attraverso LaTeX.
nome.diag File diagnostico generato da alml.
nome.pageref File temporaneo con i riferimenti alle pagine nella composizione con LaTeX.
nome.pageloc File contenente i riferimenti alle pagine per individuare i volumi e le parti, quando questi vanno estratti separatamente.
nome.log File diagnostico generato da LaTeX.
nome.sp File intermedio, ottenuto dall'elaborazione SGML di SP.
nome.sp2 File intermedio, ottenuto rielaborando il file nome.sp, per sostituire le entità di tipo «SDATA» in codice appropriato per il tipo di composizione prescelto.
nome.dvi Composizione in DVI, finale o transitoria.
nome.pdf Composizione in PDF.
nome.ps Composizione in PostScript.
nome.tex Composizione transitoria in formato LaTeX.
nome.html Primo file della composizione in HTML.
nomen.html n-esimo file della composizione in HTML.
n.jpg n-esimo file delle immagini relativo alla composizione in HTML.
n.midi n-esimo file MIDI, relativo alla composizione in HTML, generato da codice Lilypond incorporato.
n.ps n-esimo file delle immagini relativo alla composizione in PostScript o PDF.
n.pdf n-esimo file delle immagini relativo alla composizione in PostScript o PDF.
*~ File temporaneo non meglio precisato.

È bene sottolineare che i file indicati come nome.sgml e nome.css devono essere già presenti perché si possa usare Alml; inoltre, il sorgente SGML principale potrebbe a sua volta incorporare altri file SGML.

Se il sorgente SGML fa riferimento a immagini collocate in file esterni, è necessario che queste siano in formato PNG.

A seconda del tipo di composizione finale, è necessario convertire le immagini nel formato appropriato. In questi casi, viene usato ImageMagick per generare automaticamente ciò che serve. Per la composizione in PostScript e in PDF servono immagini EPS; per la composizione HTML vengono generati file in formato JPG. Le immagini convertite in PDF potrebbero servire per la composizione nello stesso formato, ma per il momento si evita questo utilizzo, in modo da poter ottenere indifferentemente i due formati per la stampa a partire dal file DVI accompagnato dai file EPS.

In generale, conviene prevedere una directory apposita per questi file, in modo da non essere intralciati quando la composizione in HTML, o in PostScript, genera la copia delle immagini richieste nella directory corrente, utilizzano i nomi nella forma n.jpg, n.ps o n.pdf.

Alle volte si possono incontrare problemi inspiegabili nell'inserimento di immagini, che si possono manifestare in modo particolare nella composizione in PDF. Spesso si superano questi problemi usando ImageMagick e facendo un passaggio intermedio nel formato JPG. Per esempio, disponendo del file pippo.png che risulta corretto e perfettamente visibile con gli strumenti normali, ma che si comporta in modo strano nella composizione PDF, può convenire il passaggio seguente:

convert pippo.png pippo.jpg[Invio]

convert pippo.jpg pippo.png[Invio]

Al termine, il file pippo.jpg può essere eliminato.

9.4   Sintassi nell'uso del programma frontale

Il programma frontale attraverso cui si gestisce il sistema di composizione Alml è alml:

alml opzioni sorgente_sgml
alml --help
alml --version

Come si vede dal modello sintattico, a parte i casi delle opzioni --help e --version, è sempre richiesta l'indicazione di un file sorgente SGML, a cui applicare un qualche tipo di elaborazione.

Opzione Descrizione

--help

Mostra la guida rapida interna e conclude il funzionamento.

--version

Mostra le informazioni sulla versione e conclude il funzionamento.

--clean

Rimuove alcuni file temporanei abbinati al file sorgente indicato. Si tratta per la precisione di nome.pageref, nome.diag, nome.aux, nome.log, nome.sp e nome.sp2.

--verbose

Segnala il procedere dell'elaborazione con informazioni dettagliate. In generale tali informazioni sono ottenibili dal file nome.diag; tuttavia, in presenza di file sorgenti di grandi dimensioni, può servire per sapere a che punto è l'elaborazione.

--input-encoding={latin1|utf8}

Dichiara il formato dei file sorgenti SGML utilizzati per la composizione; in mancanza di questa opzione, il formato viene determinato in base allo stato della configurazione locale.

--paper={a4|letter}

Permette di specificare le dimensioni della carta in base a un nome standard. Il formato predefinito è A4, che corrispondente alla parola chiave a4.

--paper-orientation={portrait|landscape}

Permette di specificare l'orientamento della carta.

--draft

Quando il contesto lo permette, serve per ottenere una composizione particolare, con più informazioni utili alla correzione o alla revisione del testo. A differenza di quanto si potrebbe essere portati a pensare, in questo modo l'elaborazione è più complessa del normale, proprio per portare in risalto tali informazioni.

--sgml-include=entità_parametrica

Attraverso questa opzione, che può essere usata anche più volte, è possibile «includere» delle entità parametriche. Per la precisione, è come se nel sorgente venisse dichiarata un'entità parametrica corrispondente, assegnandole la parola chiave INCLUDE. Ciò viene usato per controllare l'inclusione di porzioni di sorgente, secondo le convenzioni dell'SGML.

--page-numbering={plain|default|tome}

Questa opzione permette di definire in che modo gestire la numerazione delle pagine nei formati di composizione cartacei. In condizioni normali, la numerazione è realizzata attraverso sequenze differenti: una per la parte iniziale fino alla fine dell'introduzione, una per il corpo (comprese le appendici) e una finale per gli indici analitici. Assegnando la parola chiave plain si fa in modo che la numerazione sia unica, cosa che potrebbe essere conveniente per il formato PDF. Nel caso particolare della parola chiave tome, si ottiene una numerazione separata dei volumi, con la conseguenza che alcuni indici, a seconda del contesto, oltre a indicare la pagina aggiungono un prefisso corrispondente al numero del volume in cui si trova.

--sgml-syntax

--sgml-check

Una qualunque di queste due opzioni permette di ottenere la verifica formale del sorgente, in base al DTD.

--sp

Con questa opzione si vuole raggiungere solo un formato intermedio per il controllo diagnostico del funzionamento di Alml.

--tex

--latex

Con questa opzione si vuole raggiungere solo un formato intermedio in LaTeX per il controllo diagnostico del funzionamento di Alml.

--dvi

Genera un risultato in formato DVI. L'elaborazione crea una serie di file EPS e PDF per le immagini, secondo i modelli n.ps e n.pdf.

--ps | --postscript

Genera un risultato in formato PostScript. L'elaborazione crea una serie di file EPS e PDF per le immagini, secondo i modelli n.ps e n.pdf; una volta ottenuto il file PostScript finale, questi file non servono più.

--pdf

Genera un risultato in formato PDF. L'elaborazione crea una serie di file EPS e PDF per le immagini, secondo i modelli n.ps e n.pdf; una volta ottenuto il file PDF finale, questi file non servono più.

--html

Genera un risultato in formato HTML, articolato in più file, dove il primo è nome.html e gli altri sono nomen.html. Inoltre, viene fatta una copia dei file delle immagini, secondo il modello n.jpg (le due numerazioni sono indipendenti).

--html-text

Genera un risultato in formato HTML speciale, in un file unico, senza riferimenti a immagini esterne. Il file ottenuto può essere consultato con Links e con questo può essere convertito in un testo puro e semplice, attraverso il comando:
links -dump nome.html > nome.txt
Oppure:
w3m -dump nome.html > nome.txt

--html-check

--html401-check

Se sono stati installati i file necessari, consente la verifica formale di un file HTML secondo le specifiche della versione 4.01.

--html320-check

Se sono stati installati i file necessari, consente la verifica formale di un file HTML secondo le specifiche della versione 3.2.

--xml-check

Se sono stati installati i file necessari, consente la verifica formale di un file XML secondo le specifiche del DTD relativo (attualmente solo XHTML).

9.5   Codifica del sorgente

Il sorgente SGML usato da Alml può essere scritto secondo la codifica ISO 8859-1 (Latin-1), oppure la codifica UTF-8. In pratica, nel secondo caso si può usare la codifica universale, dove però solo una piccola porzione di punti di codifica ha una corrispondenza effettiva nella composizione.

Allo stato attuale è possibile scrivere usando lingue latine, il greco e il russo, come si può vedere meglio nel capitolo 11.

Esiste comunque la necessità che tutti i file che compongono il sorgente SGML siano scritti nella stessa codifica: tutti ISO 8859-1, oppure tutti UTF-8. In generale, non si presenta la necessità di usare la codifica UTF-8, nemmeno quando si volesse selezionare un carattere a cui non risulta associata alcuna entità standard. Infatti, in questi casi, si può usare un riferimento numerico nella forma:

&#xhhhh;

In pratica, volendo fare riferimento al punto di codifica U+266E in forma numerica (♮), si potrebbe scrivere &#x266E;.

Dal momento che non c'è un modo pratico per distinguere automaticamente se un file sia scritto usando l'una o l'altra codifica, è possibile usare l'opzione --input-encoding per specificarlo espressamente. Tuttavia, se questa opzione non viene usata, Alml fa delle congetture basandosi sullo stato attuale della variabile di ambiente LANG e delle variabili LC_*; in pratica, tenta di determinarlo dalla configurazione locale.

9.6   Organizzare un file-make

Un file-make opportuno può facilitare l'uso di Alml. Viene proposto un esempio elementare, riferito al file example.sgml, in cui si può vedere anche l'utilizzo proposto di alml.

# file name prefix.
DOC_PREFIX=example

# Notice that "text" generates an HTML file with the same name
# for the first HTML page. This is why it is before the standard
# HTML typesetting.
#
all:    \
clean   \
text    \
html    \
ps      \
pdf

clean:
        @echo "Cleaning..."                             ; \
        find . -name core    -exec rm -f \{\} \;        ; \
        rm -f $(DOC_PREFIX)*.tex                        ; \
        rm -f $(DOC_PREFIX)*.dvi                        ; \
        rm -f $(DOC_PREFIX)*.sp                         ; \
        rm -f $(DOC_PREFIX)*.sp2                        ; \
        rm -f $(DOC_PREFIX)*.ps                         ; \
        rm -f $(DOC_PREFIX)*.pdf                        ; \
        rm -f $(DOC_PREFIX)*.txt                        ; \
        rm -f $(DOC_PREFIX)*.log                        ; \
        rm -f $(DOC_PREFIX)*.aux                        ; \
        rm -f $(DOC_PREFIX)*.tmp                        ; \
        rm -f $(DOC_PREFIX)*.diag                       ; \
        rm -f $(DOC_PREFIX)*.pageref                    ; \
        rm -f $(DOC_PREFIX)*.pageloc                    ; \
        rm -f *.html                                    ; \
        rm -f *.bak                                     ; \
        rm -f *.jpg                                     ; \
        rm -f *.ps                                      ; \
        rm -f *.midi                                    ; \
        rm -f *\~

check:
        @alml --sgml-check              \
              --verbose                 \
              $(DOC_PREFIX).sgml

dvi:
        @alml --dvi                     \
              --verbose                 \
              $(DOC_PREFIX).sgml

ps:
        @alml --ps                      \
              --verbose                 \
              $(DOC_PREFIX).sgml

pdf:
        @alml --pdf                     \
              --verbose                 \
              --page-numbering=plain    \
              $(DOC_PREFIX).sgml

html:
        @alml --html                    \
              --verbose                 \
              $(DOC_PREFIX).sgml

text:
        @alml --html-text               \
              --verbose                 \
              $(DOC_PREFIX).sgml        ; \
        links -dump                      \
             $(DOC_PREFIX).html         \
              > $(DOC_PREFIX).txt

textw:
        @alml --html-text               \
              --verbose                 \
              $(DOC_PREFIX).sgml        ; \
        w3m -dump                      \
             $(DOC_PREFIX).html         \
              > $(DOC_PREFIX).txt

Si può osservare in particolare l'obiettivo clean che elimina tutti i file non indispensabili e in particolare tutti i file il cui nome termina per .html e per .ps.

Se per esempio si utilizza il comando make ps, si ottiene la composizione in PostScript, generando in particolare il file example.ps.

9.7   Particolarità del sistema Alml

Recentemente, Alml è stato modificato e alcune sue funzionalità particolari, non sono più disponibili.

Non esiste più la gestione delle derivazioni, pertanto, non si possono più usare strutture come quelle seguenti:

<!-- START derivazione -->
...
...
<!-- STOP derivazione -->

Gli elementi verbatimpre, asciiart e uri, vanno usati assieme a una sezione marcata di tipo CDATA:

<verbatimpre>
<![CDATA[
...
...
...
]]>
</verbatimpre>

<asciiart>
<![CDATA[
...
...
...
]]>
</asciiart>

<uri><![CDATA[indirizzo]]></uri>

Non esistono più alcune opzioni che consentivano di ottenere formati particolari. Si tratta di --compact, --long, --extralong, --large, --extralarge e --thin. Inoltre, l'opzione --paper-orientation richiede adesso come attributo la parola chiave portrait o landscape.

9.8   Usare Textchk, Checkbot e Ispell con Alml

Textchk e Checkbot, descritti rispettivamente nel capitolo 8 e nella sezione 5.4, possono essere usati facilmente con Alml. In generale, si passa per una composizione in formato HTML singolo, quindi si utilizzano questi programmi. Supponendo di avere generato il file mio_file.html:

textchk --input-type=html mio_file.html mio_file.tchk mio_file.tdiag[Invio]

checkbot --url file://`pwd`/mio_file.html[Invio]

Per usare Ispell, è conveniente generare prima una versione del documento in formato testo puro. Per questo si potrebbe usare Lynx o Links, ma all'interno del pacchetto di Alml è disponibile un programma di supporto speciale, in grado di convertire opportunamente un file HTML per questo scopo. Si tratta di alml-extra che va usato con l'opzione --html-to-text-for-spell:

alml-extra --html-to-text-for-spell < file_html > file_testo_non_formattato

In particolare, per evitare problemi con Ispell, nel file che si ottiene sono eliminate le barre oblique inverse (\).

Naturalmente, usando poi Ispell nel file generato in questo modo, non ha senso fare delle correzioni, che invece vanno applicate manualmente al sorgente originale.

9.9   Espandere le potenzialità elaborative di TeX

Il file LaTeX generato da Alml tende a richiedere risorse impreviste a TeX. È molto probabile che per documenti di dimensioni medie, sia necessario espandere i limiti posti dalla configurazione di TeX.

In generale, si dovrebbe disporre di una distribuzione teTeX, per la quale si interviene nel file texmf/web2c/texmf.cnf (eventualmente potrebbe trattarsi meglio di /etc/texmf/texmf.cnf, o simile).

Per la composizione di Appunti di informatica libera si è resa necessaria la modifica di alcune variabili; quello che si vede sotto sono i valori minimi da assegnare alle variabili rispettive:(3)

main_memory = 2000000
font_mem_size = 800000
pool_size = 250000
hash_extra = 10000
buf_size = 100000
save_size = 40000

Si può tenere in considerazione l'abbinamento seguente, tra il rapporto generato da TeX e il file di configurazione texmf.cnf, tenendo conto che in situazioni particolari il programma può segnalare la mancanza di una risorsa differente da quelle comuni:

Here is how much of TeX's memory you used:

Al termine delle modifiche a questo file, occorre ricordare di lanciare il comando texconfig init, con i privilegi dell'utente root:(4)

texconfig init[Invio]

Nel caso particolare della distribuzione Debian, il file di configurazione /var/lib/texmf/texmf.cnf è ottenuto attraverso la fusione di file differenti, contenuti nella directory /etc/texmf/texmf.d/. In tal caso, per modificare le voci descritte in precedenza, occorre intervenire probabilmente nel file /etc/texmf/texmf.d/95NonPath.cnf; successivamente occorre eseguire il comando update-texmf, il quale ricostruisce un file /var/lib/texmf/texmf.cnf nuovo; infine si deve eseguire texconfig init.

Si osservi comunque che nel pacchetto sorgente di Alml è disponibile il file etc/texmf/texmf.d/94alml.cnf, che collocato correttamente nella directory /etc/texmf/texmf.d/ risolve il problema senza intaccare gli altri file .cnf (richiedendo comunque l'avvio di texconfig init, cosa che viene svolta automaticamente quando si installa il pacchetto Debian di Alml).

9.9.1   Limiti strutturali di TeX

Le distribuzioni normali di TeX potrebbero non essere in grado di gestire un gran numero di comandi \label, anche se si tenta di intervenire nella configurazione. Questo si traduce in pratica in un limite insuperabile per ciò che nella configurazione viene mostrato come la variabile save_size.

I comandi \label generano delle annotazioni in un file con estensione .aux, simili all'esempio seguente:

\newlabel{anchor7}{{}{25}}

In questo caso si afferma che l'etichetta anchor7 corrisponde alla pagina 25.

Generalmente, la composizione con i programmi *tex viene ripetuta per tre volte, allo scopo di acquisire le informazioni contenute in questo file: la prima volta viene costruito da zero, la seconda volta il testo viene reimpaginato utilizzando queste informazioni, rigenerandole nuovamente; infine, la terza volta non ci dovrebbero essere ulteriori spostamenti nell'impaginazione e il procedimento termina. Pertanto, la seconda e la terza volta viene letto il file con estensione .aux.

Sia i comandi \label, sia i comandi \newlabel contenuti nel file ausiliario che viene incluso automaticamente, vanno a ridurre la memoria definita dalla variabile save_size. Così succede normalmente che si riesce a completare la prima elaborazione del file, mentre nella successiva, caricando anche il file ausiliario la memoria non basta più. La segnalazione di errore tipica è la seguente:

! TeX capacity exceeded, sorry [save size=40000].

Di fatto, questa variabile non può superare il valore 65 535, anche se si tenta di modificare i sorgenti di teTeX intervenendo nel file texk/web2c/tex.ch. Dovrebbe esserci una riga simile a quella seguente:

@!inf_save_size = 600;
@!sup_save_size = 40000;

Si può anche provare, aumentando il valore assegnato a sup_save_size, per esempio come nel caso seguente, ma in pratica, il limite massimo che si riesce a raggiungere resta quello di 65 535:(5)

@!inf_save_size = 600;
@!sup_save_size = 100000;

9.9.2   Soluzione attuata da Alml

Alml è un sistema di composizione pensato per la realizzazione di opere molto grandi, con indici generali e analitici gestiti autonomamente. In questo modo, la composizione tradizionale attraverso TeX genererebbe un file .aux con una quantità di voci molto grande. Per evitare di saturare il limite di TeX, questi riferimenti vengono inseriti in un altro file, con estensione .pageref e gestiti esternamente a TeX.

In breve, Alml gestisce le cose nel modo seguente.

  1. Viene creato un file TeX in cui le etichette (le ancore) usano il comando \AlmlLabel:

    \AlmlLabel{etichetta}

    Inoltre, i riferimenti alle pagine si fanno con comandi del tipo:

    \AlmlPageRef{0}{000}{etichetta}

  2. Viene avviato TeX che elabora il file e genera un file .pageref in base ai comandi \AlmlLabel.

  3. Viene letto il file .pageref e con quelle informazioni, il file TeX viene modificato intervenendo sui riferimenti alle pagine, che diventano:

    \AlmlPageRef{1}{pagina}{etichetta}

  4. Si riavvia TeX che genera un nuovo file .pageref.

  5. Viene letto il file .pageref e, con quelle informazioni, il file TeX viene modificato intervenendo sui riferimenti alle pagine, che diventano:

    \AlmlPageRef{2}{pagina}{etichetta}

  6. Si riavvia TeX per l'ultima volta.

9.9.3   Suddivisione automatica in volumi e parti della composizione finale PostScript e PDF

Per facilitare la suddivisione della composizione PostScript in file contenenti solo un volume o solo una parte, vengono inserite nel sorgente TeX delle istruzioni per creare un file con estensione .pageloc, contenente le informazioni necessarie:

BOF
tome{1}pageoffset{12}relativepage{1}
part{1}pageoffset{12}relativepage{7}
part{2}pageoffset{12}relativepage{19}
part{3}pageoffset{12}relativepage{105}
part{4}pageoffset{12}relativepage{121}
part{5}pageoffset{12}relativepage{171}
part{6}pageoffset{12}relativepage{203}
part{7}pageoffset{12}relativepage{269}
part{8}pageoffset{12}relativepage{319}
part{9}pageoffset{12}relativepage{351}
part{10}pageoffset{12}relativepage{383}
part{11}pageoffset{12}relativepage{411}
part{12}pageoffset{12}relativepage{415}
part{13}pageoffset{12}relativepage{469}
tome{2}pageoffset{12}relativepage{541}
part{14}pageoffset{12}relativepage{545}
eof{}pageoffset{12}relativepage{552}
EOF

Il significato dovrebbe essere intuitivo. Per esempio, il primo volume inizia dalla 13-esima pagina (ottenuta sommando 12 a 1) e termina all'inizio del volume successivo, ovvero alla 552-esima pagina (541+12-1). L'ultima pagina è la 564-esima.

In questo esempio, il valore 12 ricorrente rappresenta le pagine che precedono il contenuto vero e proprio del documento, in cui ci possono essere indici generali e introduzioni. Questo valore, definito qui come page offset, viene semplicemente sommato a quello finale.

9.10   Programma di supporto

Alml dispone di un programma di supporto, costituito dall'eseguibile alml-extra, che consente di facilitare lo svolgimento di funzioni accessorie, in particolare per la riorganizzazione dei file PostScript.

alml-extra opzione [argomento]

A seconda dell'opzione utilizzata, può essere richiesto un argomento o meno, che fa riferimento a un file.

Dal momento che le opzioni che riguardano la conversione di file PostScript sono piuttosto difficili da ricordare, è disponibile anche uno script molto semplice che ne facilita l'uso:

alml-extra-menu file_ps

Figura 9.1. Aspetto di alml-extra-menu, avviato con l'argomento esempio.ps.

.-----------------------alml-extra OPTION esempio.ps-------------------------.
|                                                                            |
| Select the option:                                                         |
| .------------------------------------------------------------------------. |
| |--a4-to-a5-2-a4              A4 to A5, no folding                       | |
| |--a4-to-a6-4-a4              A4 to A6, no folding                       | |
| |--a4-to-a5-2-a4-1h-1         A4 to A5, folded, signature 1              | |
| |--a4-to-a5-2-a4-1h-10        A4 to A5, folded, signature 10             | |
| |--a4-to-a6-4-a4-2h-2         A4 to A6, folded twice, signature 2        | |
| |--a4-to-a6-4-a4-2h-4         A4 to A6, folded twice, signature 4        | |
| |--a4-to-a6-4-a4-2h-6         A4 to A6, folded twice, signature 6        | |
| |--a4-to-a6-4-a4-2h-8         A4 to A6, folded twice, signature 8        | |
| |--a4-to-a6-4-a4-2h-10        A4 to A6, folded twice, signature 10       | |
| |--a4-to-a6-4-a4-1v-1         A4 to A6, folded vertically, signature 1   | |
| |--a5x4-to-a7x4               A5x4 to A7x4, no folding                   | |
| |--a5x4-to-a7x4-2-a4          A5x4 to A4, no folding                     | |
| |--a7x4-to-a7x4-2-a4          A7x4 to A4, no folding                     | |
| |--a7x4-to-a7x4-2-a4-1v-1     A7x4 to A7x4, folded vertically, signatu   | |
| |--a7x4-to-a7x4-2-a4-1v-10    A7x4 to A7x4, folded vertically, signatu   | |
| `-(+)--------------------------------------------------------------------' |
|                                                                            |
|----------------------------------------------------------------------------|
|                       <  OK   >            <Annulla>                       |
`----------------------------------------------------------------------------'

Le opzioni che vengono descritte nel seguito si riferiscono a alml-extra, usato direttamente, dal momento che alml-extra non prevede l'uso di opzioni proprie.

Opzione Descrizione

--help

Mostra la guida rapida interna e conclude il funzionamento.

--version

Mostra le informazioni sulla versione e conclude il funzionamento.

--ps-group-pages=n_pagine

Prevede che l'argomento finale sia un file PostScript, in cui vengono modificate le stringhe di definizione delle pagine, in modo che si possano individuare raggruppamenti di n pagine, di solito per facilitare la rilegatura. In pratica, in questo modo, si individuano più facilmente le pagine che compongono una segnatura.

--ps-renumber-pages

Prevede che l'argomento finale sia un file PostScript, in cui vengono modificate le stringhe di definizione delle pagine, in modo che la sequenza sia rinumerata a partire da uno.

--alml-ps-split-tome=file_posizione_pagine

Prevede che l'argomento finale sia un file PostScript, generato attraverso Alml, per il quale sia disponibile un file contenente la posizione di inizio dei vari volumi (dovrebbe trattarsi di un file con estensione .pageloc), che va indicato come argomento dell'opzione stessa. Quello che si ottiene sono diversi file PostScript, con estensione .n.ps, dove in particolare .0.ps contiene le pagine precedenti al primo volume effettivo, con la presenza eventuale di file con estensione .app.ps e ndx.ps, per le pagine delle appendici e degli indici analitici rispettivamente.

--alml-dvi-split-tome=file_posizione_pagine

Funziona come --alml-ps-split-tome, ma si riferisce a file DVI.

--alml-dvi-to-pdf-split-tome=file_posizione_pagine

Funziona come --alml-dvi-split-tome, ma converte il risultato in PDF.

--alml-ps-split-part=file_posizione_pagine

Prevede che l'argomento finale sia un file PostScript, generato attraverso Alml, per il quale sia disponibile un file contenente la posizione di inizio dei vari volumi (dovrebbe trattarsi di un file con estensione .pageloc), che va indicato come argomento dell'opzione stessa. Quello che si ottiene sono diversi file PostScript, con estensione .n.ps, dove in particolare .0.ps contiene le pagine precedenti alla prima parte effettiva, con la presenza eventuale di file con estensione .app.ps e ndx.ps, per le pagine delle appendici e degli indici analitici rispettivamente.

--alml-dvi-split-part=file_posizione_pagine

Funziona come --alml-ps-split-part, ma si riferisce a file DVI.

--alml-dvi-to-pdf-split-part=file_posizione_pagine

Funziona come --alml-dvi-split-part, ma converte il risultato in PDF.

--html-index=directory

Genera, attraverso lo standard output, un file HTML che potrebbe essere utilizzato come file index.html, contenente un elenco molto semplice dei file contenuti nella directory indicata.

--html-index-basic=directory

Come --html-index, senza mostrare le date dei file.

--html-index-basic-recursive

Genera una serie di file index.html, a partire dalla directory corrente e in tutte le sottodirectory.

--html-to-text-for-spell

Legge lo standard input, che dovrebbe essere costituito da un file HTML, filtrandolo allo scopo di generare un file di testo puro, utilizzabile per un controllo ortografico di qualche tipo. Il file che si ottiene viene emesso attraverso lo standard output.

--perl-to-gettext

Legge lo standard input, che dovrebbe essere costituito da un file sorgente Perl, filtrandolo allo scopo di generare un file di testo, adatto all'analisi da parte di Gettext, che solitamente riconosce bene solo le stringhe del linguaggio C. Il file che si ottiene viene emesso attraverso lo standard output.

--dos2unix

Legge lo standard input, che dovrebbe essere un file di testo con interruzioni di riga in stile Dos (<CR><LF>), filtrandolo allo scopo di generare un file di testo con interruzioni di riga in stile Unix (<LF>). Il file che si ottiene viene emesso attraverso lo standard output.

--unix2dos

Legge lo standard input, che dovrebbe essere un file di testo con interruzioni di riga in stile Unix (<LF>), filtrandolo allo scopo di generare un file di testo con interruzioni di riga in stile Dos (<CR><LF>). Il file che si ottiene viene emesso attraverso lo standard output.

--a4-to-a5-2-a4

Prevede che l'argomento finale sia un file PostScript, in formato A4, che viene rielaborato in modo da ottenere due pagine A5 per ogni pagina A4 finale.
Si ottiene un file con estensione .a5-2-a4.ps.

--a4-to-a6-4-a4

Prevede che l'argomento finale sia un file PostScript, in formato A4, che viene rielaborato in modo da ottenere quattro pagine A6 per ogni pagina A4 finale.
Si ottiene un file con estensione .a6-4-a4.ps.

--a4-to-a5-2-a4-1h-1

Prevede che l'argomento finale sia un file PostScript, in formato A4, che viene rielaborato in modo da ottenere due pagine A5 per ogni pagina A4 finale, che deve essere piegata a metà, in orizzontale, rilegando il tutto a segnature di un solo foglio.
Si ottiene un file con estensione .a5-2-a4-1h-1.ps.

--a4-to-a5-2-a4-1h-10

Prevede che l'argomento finale sia un file PostScript, in formato A4, che viene rielaborato in modo da ottenere due pagine A5 per ogni pagina A4 finale, che deve essere piegata a metà, in orizzontale, rilegando il tutto a segnature di 10 fogli.
Si ottiene un file con estensione .a5-2-a4-1h-10.ps.

--a4-to-a6-4-a4-2h-2

Prevede che l'argomento finale sia un file PostScript, in formato A4, che viene rielaborato in modo da ottenere quattro pagine A6 per ogni pagina A4 finale, che deve essere piegata a metà, in orizzontale, per due volte, rilegando il tutto a segnature di due fogli. In pratica, ogni segnatura si ottiene da un solo foglio A4 che viene piegato due volte.
Si ottiene un file con estensione .a6-4-a4-2h-2.ps.

--a4-to-a6-4-a4-2h-4

Prevede che l'argomento finale sia un file PostScript, in formato A4, che viene rielaborato in modo da ottenere quattro pagine A6 per ogni pagina A4 finale, che deve essere piegata a metà, in orizzontale, per due volte, rilegando il tutto a segnature di quattro fogli. In pratica, ogni segnatura si ottiene da due fogli A4 che vengono piegati assieme per due volte.
Si ottiene un file con estensione .a6-4-a4-2h-4.ps.

--a4-to-a6-4-a4-2h-6

Prevede che l'argomento finale sia un file PostScript, in formato A4, che viene rielaborato in modo da ottenere quattro pagine A6 per ogni pagina A4 finale, che deve essere piegata a metà, in orizzontale, per due volte, rilegando il tutto a segnature di sei fogli. In pratica, ogni segnatura si ottiene da tre fogli A4 che vengono piegati assieme per due volte.
Si ottiene un file con estensione .a6-4-a4-2h-6.ps.

--a4-to-a6-4-a4-2h-8

Prevede che l'argomento finale sia un file PostScript, in formato A4, che viene rielaborato in modo da ottenere quattro pagine A6 per ogni pagina A4 finale, che deve essere piegata a metà, in orizzontale, per due volte, rilegando il tutto a segnature di otto fogli. In pratica, ogni segnatura si ottiene da quattro fogli A4 che vengono piegati assieme per due volte.
Si ottiene un file con estensione .a6-4-a4-2h-8.ps.

--a4-to-a6-4-a4-2h-10

Prevede che l'argomento finale sia un file PostScript, in formato A4, che viene rielaborato in modo da ottenere quattro pagine A6 per ogni pagina A4 finale, che deve essere piegata a metà, in orizzontale, per due volte, rilegando il tutto a segnature di 10 fogli. In pratica, ogni segnatura si ottiene da cinque fogli A4 che vengono piegati assieme per due volte.
Si ottiene un file con estensione .a6-4-a4-2h-10.ps.

--a4-to-a6-4-a4-1v-1

Prevede che l'argomento finale sia un file PostScript, in formato A4, che viene rielaborato in modo da ottenere quattro pagine A6 per ogni pagina A4 finale, che deve essere piegata a metà, in verticale, rilegando il tutto a segnature di un foglio.
Si ottiene un file con estensione .a6-4-a4-1v-1.ps.

--a5x4-to-a7x4

Prevede che l'argomento finale sia un file PostScript, in formato A5x4, che viene ridotto al formato A7x4.
Si ottiene un file con estensione .a7x4.ps.

--a5x4-to-a7x4-2-a4

Prevede che l'argomento finale sia un file PostScript, in formato A5x4, che viene rielaborato in modo da ottenere due pagine A7x4 per ogni pagina A4 finale.
Si ottiene un file con estensione .a7x4-2-a4.ps.

--a7x4-to-a7x4-2-a4-1v-1

Prevede che l'argomento finale sia un file PostScript, in formato A7x4, che viene rielaborato in modo da ottenere due pagine A7x4 per ogni pagina A4 finale, che deve essere piegata a metà, in verticale, rilegando il tutto a segnature di un foglio.
Si ottiene un file con estensione .a7x4-2-a4-1v-1.ps.

--a7x4-to-a7x4-2-a4-1v-10

Prevede che l'argomento finale sia un file PostScript, in formato A7x4, che viene rielaborato in modo da ottenere due pagine A7x4 per ogni pagina A4 finale, che deve essere piegata a metà, in verticale, rilegando il tutto a segnature di 10 fogli.
Si ottiene un file con estensione .a7x4-2-a4-1v-10.ps.

Editoria elettronica con Alml 2004.05.20 --- Copyright © 2000-2004 Daniele Giacomini -- daniele @ swlibero.org


1) Alml   GNU GPL

2) Nelle distribuzioni Debian si tratta del pacchetto liblocale-gettext-perl.

3) La distribuzione GNU/Linux Debian organizza la configurazione del file texmf.cnf attraverso un insieme di file più piccoli, come viene descritto più avanti.

4) Non tutte le modifiche che si apportano a questo file richiedono l'esecuzione di texconfig init; tuttavia è meglio ripeterlo, anche per quelle situazioni in cui non serve.

5) Il limite strutturale sembra dipendere da un'organizzazione del programma pensata per l'elaborazione su architetture a 16 bit.


Dovrebbe essere possibile fare riferimento a questa pagina anche con il nome alml_preparazione_e_visione_generale.html

[successivo] [precedente] [inizio] [fine] [indice generale] [docinfo] [Indice analitico]

Valid ISO-HTML!