[successivo] [precedente] [inizio] [fine] [indice generale] [violazione GPL] [licenze] [indice analitico] [tomo] [parte]
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.(2)
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 169.1 riepiloga gli applicativi da cui dipende il buon funzionamento di Alml.
Tabella 169.1. Applicativi da cui dipende Alml.
Alml viene fornito solo 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 169.2, che rappresentano l'essenziale.
Tabella 169.2. Contenuto essenziale dell'archivio di distribuzione di Alml.
Gli eseguibili, alml, alml-sp2be e alml-pageref, 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.
I file alml.cat
, alml.dcl
e alml.dtd
vanno collocati nella directory /etc/alml/
, oppure vanno realizzati dei collegamenti equivalenti. Inoltre, tutto il contenuto della directory entities/
va collocato all'interno di /etc/alml/entities/
, oppure può bastare un altro collegamento simbolico alla directory intera.
Per completare l'installazione, sarebbe opportuno provvedere a trasferire le directory html/
e xml/
, nella directory /etc/alml/
, in modo da ottenere /etc/alml/html/
e /etc/alml/xml/
. Tuttavia, ciò serve solo per abilitare la verifica formale di documenti in HTML e in XML.
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
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,(3) 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-sp2be e alml-sp2be:
# 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]; }
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 <pinco.pallino@brot.dg></author> <date>2011.11.11</date> <legal> <p>Copyright © Pinco Pallino, <pinco.pallino@brot.dg></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
Con il comando seguente, si ottiene la composizione in HTML, su più file distinti:
$
alml --html esempio.sgml
L'utilizzo di Alml può generare file differenti a seconda del tipo di operazione che viene richiesta. La tabella 169.3 riepiloga questi file.
Tabella 169.3. File generati dall'utilizzo di Alml. I file nome.sgml
e nome.css
devono essere già presenti.
È 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.(4) 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
o n.ps
.
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.
--help
Mostra la guida rapida interna e conclude il funzionamento.
--version
Mostra le informazioni sulla versione e conclude il funzionamento.
--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.
--compact
Quando il contesto lo permette, serve per ottenere una composizione compatta, risparmiando spazio.
--long
Quando si usa in abbinamento all'opzione --ps, cioè quando si vuole ottenere un risultato in formato PostScript, permette di ottenere una composizione speciale, a due colonne con il testo ridotto della metà. Di solito si abbina a questa anche l'opzione --compact.
--extralong
Come --long, su tre colonne verticali, molto rimpicciolite.
--large
Come --long, su tre colonne in orizzontale.
--extralarge
Come --large, su quattro colonne in orizzontale, molto rimpicciolite.
--clean
Rimuove alcuni file temporanei abbinati al file sorgente indicato. Si tratta per la precisione di nome.pageref
, nome.diag
, nome.aux
e nome.log
.
--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.
--derivation=derivazione
Permette di richiedere il filtro di una derivazione particolare. Si tratta di un nome attraverso il quale si stabilisce una porzione particolare del sorgente da prendere in considerazione (verrà spiegato meglio in seguito di cosa si tratta).
--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.
--replace-char=carattere,rimpiazzo
Attraverso questa opzione, che può essere usata anche più volte, è possibile definire la sostituzione di un carattere con una stringa corrispondente. Può servire se nel sorgente viene usato sistematicamente un simbolo speciale con un significato differente da quello che dovrebbe avere. A puro titolo di esempio, si potrebbe immaginare di volere utilizzare l'asterisco per rappresentare lo spazio non interrompibile, che in condizioni normali si indica con la macro . Per questo si potrebbe usare l'opzione --replace-char="*, ".
--page-numbering={plain|default}
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.
--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 per le immagini, secondo il modello n.ps
.
--ps | --postscript
Genera un risultato in formato PostScript. L'elaborazione crea una serie di file EPS per le immagini, secondo il modello n.ps
; una volta ottenuto il file PostScript finale, questi file non servono più.
Genera un risultato in formato PDF.
--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 e con tabelle testuali. Il file ottenuto può essere consultato con Lynx e con questo può essere convertito in un testo puro e semplice, attraverso il comando:
lynx -dump -nolist -dont_wrap_pre 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
Se sono stati installati i file necessari, consente la verifica formale di un file XML secondo le specifiche del DTD relativo (attualmente solo XHTML).
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 \ longps \ extralongps \ largeps \ extralargeps \ 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)*.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 *.html ; \ rm -f *.bak ; \ rm -f *.jpg ; \ rm -f *.ps ; \ rm -f *\~ check: @alml --sgml-check \ --verbose \ $(DOC_PREFIX).sgml dvi: @alml --dvi \ --verbose \ $(DOC_PREFIX).sgml ps: @alml --ps \ --verbose \ $(DOC_PREFIX).sgml longps: @alml --ps \ --verbose \ --compact \ --long \ --page-numbering=plain \ $(DOC_PREFIX).sgml extralongps: @alml --ps \ --verbose \ --compact \ --extralong \ --page-numbering=plain \ $(DOC_PREFIX).sgml largeps: @alml --ps \ --verbose \ --compact \ --large \ --page-numbering=plain \ $(DOC_PREFIX).sgml extralargeps: @alml --ps \ --verbose \ --compact \ --extralarge \ --page-numbering=plain \ $(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 ; \ lynx -dump \ -nolist \ -dont_wrap_pre \ $(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 otterrà la composizione in PostScript, generando in particolare il file example.ps
.
A parte le differenze che ci possono essere nell'organizzazione di un DTD rispetto a un altro, Alml ha delle particolarità specifiche che vanno considerate.
La prima di queste è la possibilità di definire delle derivazioni diverse dello stesso documento, delimitando le parti attraverso dei commenti SGML appositi, nella forma:
<!-- START derivazione -->
...
...
<!-- STOP derivazione -->
Si può intuire il significato di queste istruzioni particolari, con le quali si delimita una porzione di sorgente appartenente alla derivazione indicata. Si osservi che la dichiarazione dell'inizio di una derivazione, non conclude implicitamente le altre. In questo senso è utile che tali istruzioni abbiano la forma di commenti SGML, in modo che alla fine non interferiscano con l'analizzatore SGML stesso.
Se non si vuole usare questa possibilità, non è necessario dichiarare una derivazione, che in modo predefinito corrisponde al nome MAIN. In altri termini, è come se fosse sempre dichiarata all'inizio del sorgente l'istruzione
<!-- START MAIN -->
La gestione di derivazioni di un documento può rivelarsi eccessivamente complessa. In generale, se non si tratta di una funzionalità importante, è meglio evitare la gestione di derivazioni. |
Oltre a questa particolarità di Alml, va considerato l'elemento verbatimpre, il cui scopo è quello di contenere testo da riprodurre letteralmente. L'SGML consentirebbe l'utilizzo di sezioni marcate di tipo CDATA; tuttavia questa possibilità può essere valida se il sistema di composizione successivo è in grado di accettare l'informazione letterale. Alml gestisce simultaneamente due sistemi di composizione antagonisti: LaTeX e HTML; per questa ragione, si è preferita una soluzione differente, in cui l'elemento che si intende debba contenere testo letterale, viene in realtà preparato prima dell'analisi SGML. Per questa ragione, l'elemento verbatimpre va usato in un modo preciso:
<verbatimpre> ... ... ... </verbatimpre>
In pratica, occorre che i marcatori che delimitano l'elemento siano usati da soli in una riga, iniziando dalla prima colonna.
Textchk e Checkbot, descritti rispettivamente nel capitolo 168 e nella sezione 157.5, 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
$
checkbot --url file://`pwd`/mio_file.html
Per usare Ispell, è conveniente generare prima una versione del documento in formato testo puro. Per questo si potrebbe usare Lynx, ma all'interno del pacchetto di Alml è disponibile uno script speciale, in grado di convertire opportunamente un file HTML per questo scopo. Si tratta di a2engine che va usato con l'opzione --html-to-text-for-spell:
a2engine --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 la barre oblique inverse (\).
Naturalmente, usando poi Ispell nel file generato in questo modo, non ha senso fare delle correzioni, che invece vanno applicate al sorgente originale, in modo manuale.
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).
Qui vengono annotate le modifiche che si sono rese necessarie per riuscire a completare la composizione di Appunti di informatica libera, così da permettere al lettore di comprendere dove potrebbe essere necessario intervenire.
main_memory = 1000000 hash_extra = 40000 pool_size = 700000 max_strings = 60000 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:
42853 strings out of 55918
Dipende dalla variabile max_string. In questo caso gli era stato assegnato il valore 60 000.
510063 string characters out of 647843
Dipende dalla variabile pool_size. In questo caso gli era stato assegnato il valore 700 000.
200381 words of memory out of 1000001
Dipende dalla variabile main_memory. In questo caso gli era stato assegnato il valore 1 000 000.
44744 multiletter control sequences out of 10000+40000
Il valore finale che si somma a 10 000, dipende dalla variabile hash_extra, a cui era stato assegnato il valore 40 000.
221835 words of font info for 188 fonts, out of 400000 for 1000
I due valori finali dipendono rispettivamente da font_mem_size e da font_max.
14 hyphenation exceptions out of 1000
Dipende dalla variabile hiph_size a cui esattamente il valore finale.
Al termine delle modifiche a questo file, occorre ricordare di lanciare il comando texconfig init, con i privilegi dell'utente root:(5)
#
texconfig init
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 riesca 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:(6)
@!inf_save_size = 600; @!sup_save_size = 100000;
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.
Viene creato un file TeX in cui le etichette (le ancore) usano il comando \AlmlLabel
\AlmlLabel{etichetta}
e i riferimenti alle pagine si fanno con comandi del tipo
\AlmlPageRef{0}{000}{etichetta}
Viene avviato TeX che elabora il file e genera un file .pageref
in base ai comandi \AlmlLabel.
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}
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}
1) Alml GNU GPL
2) Questo capitolo e i successivi descrivono il sistema di composizione Alml. 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.
3) Nelle distribuzioni Debian si tratta del pacchetto liblocale-gettext-perl.
4) A seconda del tipo di composizione finale, può darsi che sia necessario convertire le immagini in un altro formato. In questi casi, viene usato ImageMagick per generare automaticamente ciò che serve. Per la precisione, il formato PNG di partenza è ciò che serve per la composizione in PDF; per la composizione in PostScript servono immagini EPS; per la composizione HTML vengono generati file in formato JPG.
5) 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.
6) 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] [violazione GPL] [licenze] [indice analitico]