Avanti Indietro Indice

6. Come funziona LinuxDoc-Tools

Tecnicamente, i tag e le convenzioni che sono stati analizzati nelle precedenti sezioni di questa guida rappresentano ciò che è chiamato un linguaggio di marcatura: un modo di inserire informazioni di formattazione in un documento così che i programmi possano farci cose utili. HTML, Tex e le macro delle pagine man di Unix sono esempi ben conosciuti di linguaggi di marcatura.

6.1 Panoramica su SGML

LinuxDoc-Tools usa un metodo per descrivere il linguaggio di marcatura chiamato SGML (Standard Generalized Markup Language). L'SGML, in se stesso, non descrive un linguaggio di marcatura; piuttosto, è un linguaggio per scrivere specifiche per linguaggi di marcatura. La ragione per cui SGML è utile, è che una specifica di marcatura SGML per un linguaggio può essere usata per generare programmi che "riconoscono" tale linguaggio con molti meno sforzi (e un tasso molto più basso di bug!) che se fosse necessario scriverne il codice a mano.

Nel gergo SGML, una specifica di un linguaggio di marcatura è chiamata ``DTD'' (Document Type Definition). Un DTD permette di specificare la struttura di un tipo di documento: cioè quali parti e in quale ordine, compongano un documento di quel tipo. Dato un DTD, un analizzatore SGML può verificare la correttezza di un documento. Una combinazione analizzatore SGML/DTD può anche rendere facile scrivere programmi che traducono questa struttura in un altro linguaggio di marcatura; è esattamente così che LinuxDoc-tools effettivamente lavora.

LinuxDoc-Tools fornisce un DTD SGML chiamato ``linuxdoc'' e un insieme di ``file di sostituzione'' che convertono il documento linuxdoc in sorgenti groff, LaTeX, HTML, GNU Info, LyX e RTF. Questo è il motivo per cui il documento d'esempio ha al suo inizio il cookie magico che afferma ``linuxdoc system''; quello è il modo in cui si comunica all'analizzatore SGML quale DTD usare.

Attualmente, LinuxDoc-Tools fornisce una coppia di DTD strettamente correlati. Ma quelli che non sono linuxdoc sono ancora sperimentali e probabilmente non si vorrà provare a lavorare con essi a meno che non si sia guru di LinuxDoc-Tools.

Se si è un guru SGML, si potrà trovare interessante sapere che i DTD di LinuxDoc-Tools sono basati pesantemente sul QWERTZ DTD di Tom Gordon, thomas.gordon@gmd.de.

Se non si è un guru SGML, forse non si saprà che l'HTML (il linguaggio di marcatura usato nel World Wide Web) è esso stesso definito da un DTD.

6.2 Come funziona l'SGML

Un SGML DTD come linuxdoc specifica il nome di ``elementi'' all'interno di un tipo di documento. Un elemento è solo una parte della struttura; come una sezione, una sottosezione, un paragrafo, o qualcosa di più piccolo come un testo enfatizzato.

Diversamente da LaTeX, comunque, questi elementi non sono per nulla intrinseci a SGML stesso. Il linuxdoc DTD definisce elementi molto simili ai corrispondenti LaTeX: ci sono sezioni, sottosezioni, ``ambienti'' verbatim e così via. Comunque, usando SGML si può definire qualsiasi tipo di struttura per il documento che si desidera. In un certo senso, SGML è come un TeX a basso livello, mentre il linuxdoc DTD è simile a LaTeX.

Non ci si deve confondere con questa analogia. L'SGML non è un sistama di formattazione testi. Non ci sono ``formattatori SGML''. Il sorgente SGML è solamente convertito in altri formati per l'elaborazione. Inoltre, l'SGML stesso è usato solo per specificare la struttura del documento. Non ci sono servizi o ``macro'' di formattazione del testo intrinseci a SGML stesso. Tutte queste cose sono definite nel DTD. Non si può usare SGML senza un DTD: un DTD definisce cosa SGML deve fare.

6.3 Che cosa succede quando LinuxDoc-Tools elabora un documento

Qui vediamo come funziona l'elaborazione di un documento da parte di LinuxDoc-Tools. Prima è necessario un DTD, che definisce la struttura del documento. Una piccola porzione del DTD normale (linuxdoc) è simile alla seguente:

<!element article - -
         (titlepag, header?,
         toc?, lof?, lot?, p*, sect*,
         (appendix, sect+)?, biblio?) +(footnote)>

Questa parte imposta la struttura generale per un ``articolo'', che è simile a un ``documentstyle'' di LaTeX. L'articolo consiste in una pagina titolo (titlepag), un'intestazione opzionale (header), un indice opzionale (toc), liste opzionali di figure (lof) e tabelle (lot), un numero qualsiasi di paragrafi (p), un numero qualsiasi di sezioni principali (sect), eventuali appendici (appendix), una bibliografia opzionale (biblio) e note a piè di pagina (footnote).

Come si può vedere, il DTD non dice niente su come il documento deve essere formattato o su come dovrebbe apparire. Esso definisce solo quali parti compongono il documento. La struttura di titlepag, header, sect e di altri elementi è definita altrove nel DTD.

Non è necessario sapere nulla sulla sintassi del DTD per scrivere documenti. Viene qui presentato solo in modo da sapere come appare e come funziona. È necessario prendere familiarità con la struttura del documento definita dal DTD. Altrimenti si potrebbe violare la struttura quando si prova a scrivere un documento ed essere molto confusi dai messaggi d'errore risultanti.

Il passo successivo è quello di scrivere un documento usando la struttura definita dal DTD. Di nuovo, il linuxdoc DTD fa apparire il documento molto simile a LaTeX o HTML: è molto semplice da seguire. Nel gergo di SGML, un singolo documento scritto con un particolare DTD è conosciuto come una ``istanza'' di quel DTD.

Per trasformare il sorgente SGML in altri formati (come LaTeX o groff) per l'elaborazione, il sorgente SGML (il documento che si è scritto) è analizzato insieme al DTD dall'analizzatore SGML. LinuxDoc-Tools usa l'analizzatore onsgmls in OpenJade, o l'analizzatore nsgmls in Jade. Il primo è il successore del secondo. L'analizzatore sgmls è stato scritto da James Clark, jjc@jclark.com, che è anche l'autore di groff. Siamo in buone mani. L'analizzatore (onsgmls o nsgmls) semplicemente scorre il documento e verifica che sia utilizzata correttamente la struttura richiesta dal DTD. Esso produce anche una versione più esplicita del documento, con tutte le ``macro'' e gli elementi espansi, che è capita da sgmlsasp, la fase successiva del processo.

sgmlsasp è responsabile della conversione dell'output di sgmls in altri formati (tipo LaTeX). Ciò viene fatto attraverso file di sostituzione che descrivono come convertire gli elementi nel documento originale SGML in un corrispondente sorgente nel formato di ``destinazione'' (come LaTeX o groff).

Per esempio, una parte del file di sostituzione per LaTeX appare così

<itemize>       +       "\\begin{itemize}      +
</itemize>      +       "\\end{itemize}        +

il che dice che ogni volta che si inizia un elemento itemize nel sorgente SGML, esso deve essere sostituito con:

\begin{itemize}

nel sorgente LaTeX. (Come già accennato, gli elementi nel DTD sono molto simili ai corrispondenti LaTeX).

Così, per convertire SGML in altri formati, tutto quello che si deve fare è scrivere un nuovo file di sostituzione per quel formato con le appropriate analogie tra gli elementi SGML e il nuovo formato. In pratica, non è così semplice: per esempio, se si sta tentando di convertire in un formato che non è strutturato per nulla come il proprio DTD, si avranno dei problemi. Ad ogni modo, è molto più semplice da fare piuttosto che scrivere analizzatori e convertitori diversi per ogni tipo di formato in uscita; SGML fornisce un sistema generalizzato per convertire un sorgente in diversi formati.

Una volta che sgmlsasp ha completato il proprio lavoro, si avrà un sorgente LaTeX che corrisponde al documento originale SGML e che può essere formattato con LaTeX come si farebbe normalmente.

6.4 Ulteriori informazioni


Avanti Indietro Indice