Die Fibel für neue Mitarbeiter des FreeBSD-Dokumentationsprojekts

Vielen Dank für Ihr Interesse und Ihre Mitarbeit an der FreeBSD-Dokumentation. Jeder Beitrag ist für uns sehr wichtig.

In dieser Fibel wird von der eingesetzten Software bis hin zu den Vorstellungen des FreeBSD-Dokumentationsprojekts alles behandelt, was Sie wissen müssen, wenn Sie sich am FreeBSD-Dokumentationsprojekt beteiligen wollen.

Bitte beachten Sie, dass diese Fibel jederzeit unter Bearbeitung und noch nicht vollständig ist.

Redistribution and use in source (SGML DocBook) and 'compiled' forms (SGML, HTML, PDF, PostScript, RTF and so forth) with or without modification, are permitted provided that the following conditions are met:

  1. Redistributions of source code (SGML DocBook) must retain the above copyright notice, this list of conditions and the following disclaimer as the first lines of this file unmodified.

  2. Redistributions in compiled form (transformed to other DTDs, converted to PDF, PostScript, RTF and other formats) must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.

Wichtig: THIS DOCUMENTATION IS PROVIDED BY THE FREEBSD DOCUMENTATION PROJECT "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FREEBSD DOCUMENTATION PROJECT BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS DOCUMENTATION, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.


Inhaltsverzeichnis
Benutzungshinweise
Die Eingabeaufforderungen
Typographische Festlegungen
Anmerkungen, Tips, wichtige Hinweise, Warnungen und Beispiel
Danksagungen
1. Überblick
1.1. Die FreeBSD-Dokumentationsreihe
1.2. Bevor es losgeht
1.3. Der Schnellstart
2. Die Werkzeuge
2.1. Notwendige Werkzeuge
2.1.1. Software
2.1.2. Die DTDs und die Entitäten
2.1.3. Die Stilvorlagen
2.2. Optionale Werkzeuge
2.2.1. Software
3. Die SGML-Fibel
3.1. Überblick
3.2. Von Elementen, Tags und Attributen
3.2.1. Was dafür getan werden muss;...
3.3. Die DOCTYPE-Deklaration
3.3.1. Formale Öffentliche Bezeichner
3.3.2. Alternativen zu Formalen Öffentlichen Bezeichnern
3.4. Die Rückkehr zu SGML
3.5. Kommentare
3.5.1. Fingerübungen...
3.6. Entitäten
3.6.1. Allgemeine Entitäten
3.6.2. Parameterentitäten
3.6.3. Fingerübungen...
3.7. Dateien mit Entitäten einbinden
3.7.1. Dateien mit Allgemeinen Entitäten einbinden
3.7.2. Dateien mit Parameterentitäten einbinden
3.7.3. Fingerübungen...
3.8. Markierte Bereiche
3.8.1. Schlüsselworte für markierte Bereiche
3.8.2. Fingerübung...
3.9. Schlußbemerkung
4. SGML-Dokumente erstellen
4.1. HTML
4.1.1. Formale Öffentliche Bezeichner
4.1.2. Die Elemente <head> und <body>
4.1.3. Blockelemente
4.1.4. Flußelemente
4.1.5. Links
4.2. Die DocBook DTD
4.2.1. Die FreeBSD-Erweiterungen
4.2.2. Formelle Öffentliche Bezeichner
4.2.3. Die Struktur von DocBook-Dokumenten
4.2.4. Blockelemente
4.2.5. Flußelemente
4.2.6. Bilder und Grafiken
4.2.7. Querverweise
5. Stylesheets
5.1. DSSSL
5.2. CSS
5.2.1. Die DocBook-Dokumente
6. Verzeichnisstruktur unter doc/
6.1. doc/ als höchste Ebene
6.2. Die Verzeichnisse Sprache.Kodierung/
6.3. Dokumentenspezifische Informationen
6.3.1. Das Handbuch
7. Die Erzeugung der Zieldokumente
7.1. Für den Bau der FreeBSD-Dokumentation benötigte Werkzeuge
7.2. Die Makefiles des Dokumentationsbaums verstehen
7.2.1. Unterverzeichnis-Makefiles
7.2.2. Dokument-Makefiles
7.3. Make-Includes des FreeBSD Documentation Projects
7.3.1. doc.project.mk
7.3.2. doc.subdir.mk
8. Die Webseite
8.1. Vorbereitung
8.1.1. Die einfache Methode: csup verwenden
8.1.2. Die flexible Methode: Ein lokales doc/www-CVS-Repository verwenden
8.2. Die Webseiten bauen
8.3. Installieren der Webseiten auf Ihrem Server
8.4. Umgebungsvariablen
9. Übersetzungen
10. Der Schreibstil
10.1. Anleitungen für einen korrekten Schreibstil
10.1.1. Groß- und Kleinschreibung
10.1.2. Abkürzungen (Akronyme)
10.1.3. Einrückung
10.1.4. Die korrekte Schreibweise von Tags
10.1.5. Markup-Änderungen (white space changes)
10.1.6. Vermeiden von fehlerhaften Zeilenumbrüchen (Nutzung von nonbreaking space)
10.2. Häufig verwendete Wörter
11. sgml-mode und Emacs
12. Weiterführende Quellen
12.1. Das FreeBSD-Dokumentationsprojekt
12.2. SGML
12.3. HTML
12.4. DocBook
12.5. Das Linux-Dokumentationsprojekt
A. Beispiele
A.1. DocBook-Buch (<book>)
A.2. DocBook-Artikel (<article>)
A.3. Ausgabeformate erzeugen
A.3.1. Benutzung von Jade
Beispiele
1. Ein Beispiel
3-1. Verwendung eines Elements (Start- und Endtag)
3-2. Verwendung eines Elements (nur Starttag)
3-3. Verschachtelte Elemente: <em>
3-4. Elemente mit Attributen nutzen
3-5. Attribute mit einfachen Anführungszeichen
3-6. .profile, für sh(1) und bash(1) Benutzer
3-7. .cshrc, für csh(1)- und tcsh(1)-Benutzer
3-8. Beispiele für Kommentare in SGML
3-9. Fehlerhafte SGML-Kommentare
3-10. Allgemeine Entitäten festlegen
3-11. Parameterentitäten festlegen
3-12. Dateien mit Allgemeinen Entitäten einbinden
3-13. Dateien mit Parameterentitäten einbinden
3-14. Aufbau eines markierten Bereiches
3-15. CDATA als Inhaltsmodell für markierte Bereiche
3-16. Anwendung von INCLUDE und IGNORE in markierten Abschnitten
3-17. Kontrolle von markierten Bereichen über Parameterentitäten
4-1. Die Struktur eines HTML-Dokumentes
4-2. <h1>, <h2>...
4-3. Falsche Verschachtelung von Überschriften
4-4. Absätze mit dem Element <p>
4-5. Blockzitat
4-6. Listen mit <ul> und <ol> erstellen
4-7. Definitionslisten mit <dl> erstellen
4-8. Vorformatierten Text mit <pre> erstellen
4-9. Einfache Tabelle mit <table>
4-10. Anwendung des Attributes rowspan
4-11. Anwendung des Attributes colspan
4-12. Gemeinsame Anwendung der Attrbute rowspan und colspan
4-13. Text mit <em> und <strong> hervorheben
4-14. Text mit <b> und <i> formatieren
4-15. Nicht-proportionale Schrift mit <tt>
4-16. Schriftgröße ändern mit <big>, <small> und <font>
4-17. <a href="..."> benutzen
4-18. Anwendung von <a name="...">
4-19. Auf einen Abschnitt eines anderen Dokumentes verweisen
4-20. Buchvorlage <book> mit <bookinfo>
4-21. Artikelvorlage <article> mit <articleinfo>
4-22. Ein einfaches Kapitel
4-23. Ein leeres Kapitel
4-24. Unterkapitel
4-25. Absatz mit <para>
4-26. <blockquote>
4-27. <warning>
4-28. <itemizedlist>, <orderedlist> und <procedure>
4-29. <programlisting>
4-30. Das <co>- und das <calloutlist>-Element
4-31. Tabellen mittels <informaltable> auszeichnen
4-32. Tabelle mit Attribut frame="none"
4-33. <screen>, <prompt> und <userinput>
4-34. Das Element <emphasis>
4-35. Richtig zitieren
4-36. Tasten, Maustasten und Tastenkombinationen
4-37. Anwendungen, Befehle und Optionen
4-38. Das Element <filename>
4-39. Portsnamen und das Element <filename>
4-40. Gerätenamen per <devicename> auszeichnen
4-41. role und <hostid>
4-42. Das Element <username>
4-43. <maketarget> und <makevar>
4-44. <literal>
4-45. Das Element <replaceable>
4-46. Das Element <errorname>
4-47. <chapter> und <section> mit dem Attribut id
4-48. Querverweise und das Element <anchor>
4-49. Einsatz von <xref>
4-50. <link> beutzen
4-51. Verweise mit <ulink>
A-1. Ein DocBook-Buch (<book>)
A-2. Ein DocBook-Artikel (<article>)
A-3. Ein DocBook-Dokument in eine einzelne HTML-Datei umwandeln
A-4. Ein DocBook-Dokument in mehrere kleine HTML-Dateien umwandeln
A-5. Ein DocBook-Dokument nach Postscript umwandeln
A-6. Eine PDF-Datei aus einem DocBook-Dokument erzeugen

Benutzungshinweise

Die Eingabeaufforderungen

Die folgende Tabelle zeigt die normale Eingabeaufforderung des Systems und die Eingabeaufforderung des Superusers. Die in diesem Buch vorkommenden Beispiele benutzen die jeweilige Eingabeaufforderung, um zu zeigen, unter welchem Benutzer die Beispiele ausgeführt werden sollten.

Benutzer Eingabeaufforderung
Normaler Benutzer %
Superuser #

Typographische Festlegungen

Um die Lesbarkeit zu erhöhen, werden in diesem Dokument die im folgenden genannten typographischen Festlegungen verwendet:

Bedeutung Beispiel
Kommandonamen Geben Sie ls -a ein, um alle Dateien anzuzeigen.
Datei- und Verzeichnisnamen Bearbeiten Sie die Datei .login.
Bildschirmein- und ausgaben
You have mail.
Referenzen auf Hilfeseiten Mit su(1) können Sie sich als ein anderer Benutzer anmelden.
Benutzer- und Gruppennamen Ich bin root, ich darf das.
Hervorhebungen Hier müssen Sie vorsichtig sein.
Argumente auf der Kommandozeile, die durch existierende Namen, Dateien oder Variablen ersetzt werden müssen Dateien können Sie mit dem Befehl rm Dateiname löschen.
Umgebungsvariablen $HOME ist Ihr Benutzerverzeichnis.

Anmerkungen, Tips, wichtige Hinweise, Warnungen und Beispiel

An einigen Stellen innerhalb dieses Buchs werden wichtige oder nützliche Hinweise gegeben, die besonders hervorgehoben sind. Hier ein kurzer Überblick über die verwendeten Darstellungen.

Anmerkung: Anmerkungen werden so dargestellt. Sie enthalten Informationen die Sie nur zu lesen brauchen, wenn Sie direkt davon betroffen sind.

Tipp: Tipps sind Informationen, die vielleicht hilfreich sein könnten oder aufzeigen, wie bestimmte Dinge einfacher zu bewerkstelligen sind.

Wichtig: Besonders wichtige Punkte werden so hervorgehoben. Meist enthalten sie Hinweise auf vielleicht zusätzlich auszuführende Schritte oder Dinge, die besonders zu beachten sind.

Warnung: Warnungen werden wie dieser Abschnitt dargestellt und weisen auf mögliche Schäden hin, die entstehen können, falls die beschriebenen Schritte nicht genau befolgt oder Hinweise nicht beachtet werden. Die Palette der möglichen Schäden reicht von Hardwareschäden bis hin zu Datendatenverlust durch ein versehentliches Löschen von wichtigen Dateien oder ganzen Verzeichnissen.

Beispiel 1. Ein Beispiel

Beispiele, die so wie hier dargestellt werden, enthalten meist kleine Übungen, die nachvollzogen werden sollten, um das vorher beschriebene besser zu verinnerlichen oder mit den erzeugten Ausgaben vertraut zu werden.


Danksagungen

Ich möchte mich bei Sue Blake, Patrick Durusau, Jon Hamilton, Peter Flynn und Christopher Maden bedanken, die sich die Zeit genommen haben, die frühen Entwürfe dieses Dokuments zu lesen und viele hilfreiche Hinweise und Ratschläge gegeben haben.


Kapitel 1. Überblick

Herzlich Willkommen beim FreeBSD-Dokumentationsprojekt. Qualitativ hochwertige Dokumentation ist ein wichtiger Erfolgsfaktor und sehr bedeutend für die Verbreitung von FreeBSD. Die wichtigste Quelle dafür ist das FreeBSD-Dokumentationsprojekt (FDP). Jeder Beitrag, der zu diesem Projekt geleistet wird, ist ungemein wertvoll.

Es ist das Anliegen dieser Fibel, den Leser mit dem FDP vertraut zu machen und zu erklären, wie das FDP organisiert ist, wie man selber Dokumente erstellt und an das FDP einreicht und wie die verfügbaren Werkzeuge effektiv beim Schreiben eingesetzt werden können.

Wie jedes Opensourceprojekt, ist auch das FDP auf die Mithilfe vieler angewiesen. Deshalb ist jeder herzlich eingeladen mitzuarbeiten. Die dafür erforderlichen Voraussetzungen sind gering und es gibt keine Verpflichtung eine bestimmte Menge an Dokumenten pro Monat oder Jahr beizusteuern. Das Einzige was Sie tun müssen, ist sich auf der Mailingliste FreeBSD documentation project einzutragen.

Nach dem Lesen der FDP-Fibel sollte man wissen:


1.1. Die FreeBSD-Dokumentationsreihe

Das FDP umfaßt vier verschiedene Kategorien:

Hilfeseiten

Die englischen Hilfeseiten wurden nicht vom FDP geschrieben, da sie ein Teil des Basissystems sind. Jedoch können bzw. wurden bereits Teile von existierenden Hilfeseiten umformuliert, um sie verständlicher zu machen oder um Fehler zu beheben.

Für die Übersetzung der Hilfeseiten des Systems in die verschiedenen Sprachen sind die einzelnen Übersetzergruppen verantwortlich. Alle dabei entstandenen Übersetzungen gehören zum FDP.

Die FAQ

Das Ziel der FAQ ist es, Fragen, die auf den verschiedenen Maillinglisten und in Newsgruppen regelmäßig diskutiert werden, nach einem einfachen Frage- und Antwort-Muster zu behandeln. Das schließt nicht aus, das auf bestimmte Fragen ausführlich und umfassend eingegangen wird.

Das Handbuch

Das Ziel des Handbuches ist es, die umfassende Quelle und Referenz im Netz für FreeBSD-Benutzer zu sein.

Die Webseite

Die Webseite http://www.FreeBSD.org und ihre vielen Spiegel auf der ganzen Welt vertreten das FreeBSD-Projekt im WWW. Für viele Menschen ist sie der erste Kontakt mit FreeBSD.

Jede dieser vier Kategorien wird im FreeBSD-CVS-Baum verwaltet. Das bedeutet, dass alle Änderungen an den Dateien für jeden verfügbar sind und jeder sich mittels eines Programms wie CVSup oder CTM eine lokale Kopie der Dokumentation anlegen kann.

Parallel zum FDP haben viele Menschen Anleitungen geschrieben und Webseiten mit Bezug zu FreeBSD erstellt. Einige davon werden im CVS-Archiv verwaltet, sofern der Autor dem zugestimmt hat. In anderen Fällen hat sich der Autor entschlossen, seine Dokumentation außerhalb des zentralen FreeBSD-CVS-Archivs zu verwalten. Das FDP bemüht sich, so viele Verweise wie möglich auf solche Quellen bereitzustellen.


1.2. Bevor es losgeht

Zum Verständnis der folgenden Kapitel sollte folgendes bereits bekannt sein:

  • Wie eine aktuelle Kopie der FreeBSD-Dokumentation entweder auf Basis des FreeBSD-CVS-Archivs mittels CVS, CTM oder CVSup angelegt und gepflegt wird, oder wie mit CVSup eine frische Kopie des CVS-Archivs heruntergeladen wird.

  • Wie neue Programme mit Hilfe des FreeBSD-Portsystems oder mittels pkg_add(1) heruntergeladen und installiert werden.


1.3. Der Schnellstart

Falls man einfach loslegen möchte und sich sicher genug fühlt, um alles weitere erst bei Bedarf nachzusehen, kann man einfach den folgenden Anweisungen folgen:

  1. Zuerst muß der Metaport textproc/docproj auf dem betreffenden Arbeitsrechner installiert werden.

    # cd /usr/ports/textproc/docproj
    # make JADETEX=no install
    
  2. Anschließend sollte eine lokale Kopie des FreeBSD-doc-Verzeichnisbaumes angelegt werden. Hierfür kann man entweder auf CVSup im checkout-Modus zurückgreifen oder mittels cvs eine komplette Kopie des CVS-Archivs anlegen.

    Wenn man lieber mit einer Kopie des CVS-Archivs arbeiten möchte, werden als Minimum die Verzeichnisse doc/share und doc/de_DE.ISO8859-1/share benötigt.

    % cvs checkout doc/share
    % cvs checkout doc/de_DE.ISO8859-1/share
    

    Für den Fall, dass ausreichend Platz auf der Festplatte vorhanden ist, kann auch eine eine vollständige Arbeitskopie des gesamten CVS-Baumes anlegt werden.

    % cvs checkout doc
    
  3. Sollte geplant sein, ein existierendes Buch oder einen existierenden Artikel zu ändern, muß natürlich noch zusätzlich das betreffende Verzeichnis aus dem CVS-Archiv geholt werden. Soll hingegen ein neues Buch oder ein neuer Artikel geschrieben werden, empfiehlt es sich, auf bestehende Bücher und Artikel zurückzugreifen und diese als Vorlage zu nutzen.

    Ein Artikel über die Konfiguration eines VPNs zwischen FreeBSD und Windows 2000 kann wie folgt erstellt werden:

    1. Zuerst wird das Verzeichnis articles aus dem FreeBSD-CVS-Archiv lokal angelegt:

      % cvs checkout doc/de_DE.ISO8859-1/articles
      
    2. Anschließend kopiert man einen bereits existierenden Artikel und nutzt ihn als Vorlage. In diesem Beispiel soll der neue Artikel im Verzeichnis vpn-w2k liegen:

      % cd doc/de_DE.ISO8859-1/articles
      % cp -R committers-guide vpn-w2k
      

    Bereits exisitierende Dokumente, die geändert werden sollen, können direkt aus dem CVS-Archiv geholt werden. Das folgende Beispiel zeigt das für die FAQ aus dem Verzeichnis doc/de_DE.ISO8859-1/books/faq:

    % cvs checkout doc/de_DE.ISO8859-1/books/faq
    
  4. Jetzt können die .sgml Dateien mit einem beliebigen Texteditor bearbeitet werden.

  5. Danach ist make mit dem Ziel lint aufzurufen, um das gesamte Dokument auf Auszeichnungsfehler hin zu untersuchen, ohne dass zeitaufwändige Transformationen vorgenommen werden.

    % make lint
    

    Soll anschließend das Zieldokument erstellt werden, kann mit Hilfe der Variable FORMATS bestimmt werden, welche Ausgabeformate erzeugt werden sollen. Unterstützt werden momentan html, html-split, txt, ps, pdf und rtf. Die aktuelle Liste der unterstützten Formate befindet sich am Anfang der Datei doc/share/mk/doc.docbook.mk. Bei der Verwendung dieser Variable ist es wichtig, darauf zu achten, dass die Angabe der gewünschten Formate in Anführungszeichen eingeschlossen wird, sofern mehr als nur ein Format gleichzeitig erstellt werden soll.

    Wenn das Dokument beispielsweise nach HTML konvertiert werden soll, kann dies so vorgenommen werden:

    % make FORMATS=html
    

    Soll es hingegen in den Formaten html und txt erzeugt werden, kann man entweder make(1) zweimal hintereinander aufrufen:

    % make FORMATS=html
    % make FORMATS=txt
    

    oder beide Formate mit einem Aufruf von make(1) erzeugen:

    % make FORMATS="html txt"
    
  6. Zum Schluß müssen die Änderungen an das FDP mittels send-pr(1) eingesandt werden.


Kapitel 2. Die Werkzeuge

Innerhalb des FDPs werden verschiedene Programme für die Verwaltung der FreeBSD-Dokumentation, ihrer Transformation in verschiede Formate und weitere Aufgaben eingesetzt. Wer an der FreeBSD-Dokumentation mitarbeiten möchte, wird diese Programme benötigen.

Doch dies ist kein Grund zur Angst, da alle notwendigen Programme als FreeBSD-Ports und fertige Pakete vorhanden sind, wodurch sich die Installation drastisch vereinfacht.

Allerdings müssen diese Programme installiert werden, bevor alle Beispiele der folgenden Kapitel ausprobiert werden können.

Wenn es möglich ist, sollte der Port textproc/docproj verwendet werden: Durch die Installation des Ports textproc/docproj kann die Installation vereinfacht und eine Menge Zeit gespart werden. Bei diesem Port handelt es sich um einen Metaport, der selbst keine Programme oder ähnliches installiert. Stattdessen enthält er eine Vielzahl von Abhängigkeiten zu anderen Ports und setzt deren korrekte Installation voraus. Durch seine Installation sollten automatisch alle Pakete, die in diesem Kapitel genannt werden, auf den Rechner geladen und dort installiert werden.

Ein nur unter bestimmten Umständen benötigter Port ist das JadeTeX-Makro-Paket, das seinerseits eine TeX-Installation voraussetzt. TeX ist ein ziemlich großes Programmpaket und sollte nur installiert werden, sofern Zieldokumente im PostScript- oder PDF-Format generiert werden sollen.

Um den Platz und die Zeit für die Installation von JadeTeX und TeX zu sparen, muß bei der Installation angeben werden, ob JadeTeX (und damit auch TeX) installiert werden soll oder nicht.

Daher sollte der docproj-Port entweder mit

# make JADETEX=yes install

oder mit

# make JADETEX=no install

installiert werden, je nachdem was gewünscht wird. Alternativ können Sie auch direkt die Ports textproc/docproj-jadetex oder textproc/docproj-nojadetex installieren. Die Variable JADETEX wird von diesen Ports automatisch entsprechend gesetzt. Ohne JadeTeX können Sie nur die Formate HTML und ASCII erzeugen. Die Formate PostScript und PDF erfordern TeX.


2.1. Notwendige Werkzeuge

2.1.1. Software

Die folgenden Programme sind notwendig, um sinnvoll an der FreeBSD-Dokumentation arbeiten und diese in andere Formate wie HTML, reinen Text und RTF umwandeln zu können. Sie müssen diese aber nicht seperat installieren, da alle Programme automatisch durch den Metaport textproc/docproj installiert werden.

Jade (textproc/jade)

Eine DSSSL-Implementierung. Sie wird gebraucht, um Dokumente in andere Formate wie HTML und TeX zu übersetzen.

Tidy (www/tidy)

Ein Formatierer, mit dem man Teile der automatisch generierten HTML-Dateien neuformatieren kann, um ihre Lesbarkeit zu erhöhen.

Links (www/links)

Ein Textbrowser, der HTML-Dateien in einfache Textdateien umwandeln kann.

peps (graphics/peps)

Einige der Dokumente enthalten Grafiken, die nur im EPS-Format vorliegen. Damit diese von dem meisten Webbrowsern angezeigt werden können, müssen sie nach PNG konvertiert werden.


2.1.2. Die DTDs und die Entitäten

Das FDP benutzt verschiedene DTDs und Entitätensätze, die installiert sein müssen, bevor mit der Arbeit an einem beliebigen Dokument begonnen werden kann.

HTML DTD (textproc/html)

HTML ist die bevorzugte Auszeichnungssprache des World Wide Web und wird durchgängig für die FreeBSD-Webseite genutzt.

DocBook DTD (textproc/docbook)

DocBook ist als Auszeichnungssprache für technische Dokumentationen entwickelt worden. Die gesamte FreeBSD-Dokumentation wird mittels DocBook erstellt.

ISO 8879-Entitäten (textproc/iso8879)

19 der ISO 8879:1986-Zeichensätze, die von vielen DTDs benötigt werden. Darin enthalten sind mathematische Symbole, zusätzliche Zeichen, die für auf dem lateinischen beruhende Alphabete benötigt werden sowie griechische Zeichen.


2.1.3. Die Stilvorlagen

Die Stilvorlagen werden während der Transformation und der Formatierung von Dokumenten, beispielsweise für die Bildschirmdarstellung oder den Druck, benutzt.

Modular DocBook Stylesheets (textproc/dsssl-docbook-modular)

Die Modular DocBook Stylesheets werden benötigt, wenn mittels DocBook erstellte Dokumente in Formate wie HTML oder RTF konvertiert werden sollen.


2.2. Optionale Werkzeuge

Die in diesem Kapitel genannten Programme müssen nicht unbedingt installiert werden. Allerdings können sie die Arbeit an der Dokumentation erleichtern und die Anzahl an möglichen Ausgabeformaten erhöhen.


2.2.1. Software

JadeTeX und teTeX (print/jadetex und print/teTeX)

Jade und teTeX werden eingesetzt, um DocBook-Dokumente nach DVI, Postscript und PDF zu konvertieren. Hierfür müssen die JadeTeX Makros installiert sein.

Ist es nicht geplant, die Dokumente in einem dieser Formate zu erzeugen, wenn also HTML, Text und RTF ausreichend sind, brauchen JadeTeX und teTeX nicht installiert zu werden. Da die Installation von teTeX insgesamt 30 MB benötigt, kann so Zeit und Plattenplatz gespart werden.

Wichtig: Wird sich für die Installation von JadeTeX und teTeX entschieden, muß teTeX anschließend noch eingerichtet werden. Die Datei print/jadetex/pkg-message enthält detailierte Angaben zu den dafür notwendigen Schritten.

Emacs oder XEmacs (editors/emacs oder editors/xemacs)

Beide Texteditoren haben einen speziellen Modus zur Bearbeitung von SGML-Dokumenten entsprechend den Vorgaben einer SGML-DTD. Zusätzlich bieten sie Funktionen an, mit denen sich der Tippaufwand reduzieren und Fehlerwahrscheinlichkeit senken läßt.

Natürlich muß nicht mit einem dieser Texteditoren gearbeitet werden; jeder andere Editor kann dafür genausogut genutzt werden, doch vielleicht wird die Arbeit durch sie als effektiver empfunden werden.

Sofern Sie Vorschläge haben, welche andere Software für die Verarbeitung oder Bearbeitung von SGML-Dokumenten in diese Liste mitaufgenommen werden sollte, senden Sie diese bitte an Documentation Engineering Team .


Kapitel 3. Die SGML-Fibel

Die Mehrzahl der Dokumente des FDPs sind in SGML geschrieben. Ziel dieses Kapitels ist es, genau zu erklären, was das bedeutet und wie man die SGML-Quellen liest und versteht. Ebenso werden die in den Quellen genutzten Kniffe erklärt, auf die man beim Lesen der Dokumente stoßen wird.

Teile dieses Kapitels basieren auf Mark Galassis “Get Going With DocBook”.


3.1. Überblick

In den guten alten Zeiten war der Umgang mit “elektronischem” Text einfach. Man musste lediglich wissen, welcher Zeichensatz (ASCII, EBCDIC oder ein anderer) vorlag. Text war einfach Text und sah so aus, wie man ihn sah. Keine Extras, keine Formatierungen und kein sonstiger Schnickschnack.

Für viele Zwecke war dies allerdings nicht ausreichend. Von einem machinenlesbaren Text wird erwartet, dass er auch von Maschinen gelesen und intelligent weiterverarbeitet werden kann. Einzelne Stellen sollen hervorgehoben werden, andere sollen in ein Glossar aufgenommen werden oder auf andere Textstellen verweisen. Dateinamen wiederum sollen in einer “schreibmaschinenähnlichen” Schrift auf dem Bildschirm dargestellt werden, der Ausdruck soll jedoch in “Schrägschrift” oder in einer beliebigen anderen Darstellungsform erfolgen.

Anfänglich gab es die Hoffnung, dass die Künstliche Intelligenz (KI) helfen würde, dieses Ziel zu erreichen. Computer sollte den Text lesen und dazu in der Lage sein, selbstständig wichtige Formulierungen, Dateinamen, Benutzereingaben oder Beispiele zu erkennen. Leider verlief die Entwicklung in diesem Bereich nicht wie gewünscht und Computer benötigen nach wie vor etwas Unterstützung, bevor sie Texte vernünftig verarbeiten können.

Genauer gesagt, man muss ihnen sagen, was was ist. Sehen wir uns folgende Zeilen an:

Löschen Sie /tmp/foo mittels rm(1).

% rm /tmp/foo

Es fällt uns leicht, zu erkennen, was ein Dateiname, ein einzugebender Befehl oder ein Verweis auf eine Hilfeseite ist. Das kann ein Computer, der einen Text verarbeitet, nicht. Aus diesem Grund ist es notwendig, Texte mit weiteren Informationen “auszuzeichnen”.

Der Begriff “Auszeichnung[1]” bedeutet, dass sich der Wert eines Textes erhöht, aber auch seine Kosten. Durch Auszeichnungen wird einem Dokument zusätzlicher Text hinzugefügt, der aber von dem eigentlichen Dokumenteninhalt auf eine bestimmte Art und Weise unterschieden werden kann, so dass Programme die Auszeichnung erkennen können und mittels dieser Informationen während der Verarbeitung in der Lage sind, Entscheidungen zu treffen. Texteditoren können diese Auszeichnungselemente vor dem Benutzer verbergen, um zu vermeiden, dass er durch sie abgelenkt wird.

Die durch die Auszeichnungselemente im Textdokument zusätzlich abgelegten Informationen erhöhen den Wert des Dokuments. Allerdings muss diese Arbeit in den meisten Fällen von einem Menschen getan werden - wären Maschinen dazu fähig, wären zusätzliche Auszeichnungselemente unnötig. Der damit verbundene Aufwand erhöht die Kosten, die durch die Erstellung des Dokuments entstehen.

Das etwas weiter oben gegebene Beispiel sieht im Quelltext so aus:

<para>Löschen Sie <filename>/tmp/foo</filename> mittels <citerefentry/<refentrytitle/rm/<manvolnum/1//.</para>

<screen><prompt>%</prompt> <userinput>rm /tmp/foo</userinput></screen>

Die Auszeichnungselemente sind deutlich vom eigentlichen Inhalt zu unterscheiden.

Die Einführung von Auszeichnungselementen setzt voraus, dass festgelegt wird, welche Bedeutung einzelne Elemente haben und wie diese interpretiert werden. Sie brauchen daher eine Auszeichnungssprache, der Sie folgen, wenn Sie eigene Dokumente verfassen.

Natürlich kann es keine universelle Auszeichnungssprache geben und eine einzige mag nicht ausreichend für alle möglichen Anwendungsfälle sein. Eine Sprache für technische Dokumente wird sich wahrscheinlich stark von einer für Kochrezepte unterscheiden. Die universelle Lösung ist eine Basissprache, mit deren Hilfe weitere Sprachen entwickelt werden können - eine Meta-Auszeichungssprache also.

Genau diese Anforderung wird von der Standard Generalized Markup Language (SGML) erfüllt. Mit ihrer Hilfe wurden viele andere Auszeichungssprachen wie beispielsweise HTML und DocBook, welche beide von FDP genutzt werden, entwickelt.

Die eigentliche Sprachdefinition erfolgt in einer Dokumenten-Typ-Definition (DTD). Innerhalb dieser DTD werden die Namen der einzelnen Elemente, deren mögliche Reihenfolge und Verschachtelung sowie weitere Informationen festgelegt.

Eine DTD ist eine vollständige Definition aller möglichen Sprachelemente, ihrer Reihenfolge[2], optionaler Elemente und so weiter und so weiter. Dank dieser recht formalen Festlegung ist es möglich, SGML-Parser zu entwickeln, die sowohl ein Dokument als auch seine DTD einlesen und anhand dieser DTD prüfen können, ob das Dokument allen Anforderungen der DTD entspricht. Dieser Vorgang wird allgemein als Validierung des Dokuments bezeichnet.

Anmerkung: Das Validieren eines SGML-Dokuments gegen eine DTD überprüft lediglich die korrekte Syntax des Dokuments, dass heißt, ob nur gültige Auszeichnungselemente verwendet wurden und ihre Reihenfolge stimmt. Dabei wird nicht geprüft, ob die Elemente der DTD sinngemäß verwandt wurden. Sollten beispielsweise alle Dateinamen als Funktionsnamen ausgezeichnet worden sein, so würde der Parser keinen Fehler signalisieren. Formaler ausgedrückt: Der Parser prüft die Syntax, aber nicht die Semantik.

Es ist anzunehmen, dass, wenn man selber vor hat Dokumentation für das FDP zu schreiben, der größte Teil davon mit Hilfe von HTML oder DocBook geschrieben werden wird. Aus diesem Grunde wird an dieser Stelle nicht erklärt, wie eine DTD entwickelt wird.


3.2. Von Elementen, Tags und Attributen

Alle in SGML geschriebenen DTDs haben bestimmte gemeinsame Eigenschaften. Das ist nicht verwunderlich, da sich die hinter SGML stehende Idee unweigerlich bemerkbar macht. Zwei der markantesten Merkmale dieser Idee sind die Begriffe Inhalt und Element.

Von einem Dokument, unabhängig, ob es sich um eine einzelne Webseite oder ein langes Buch handelt, wird angenommen, dass es einen wie auch immer gearteten Inhalt hat. Dieser lässt sich selbst wiederum in Teilelemente aufspalten, die ebenso zerlegbar sind. Durch die Aufnahme von Auszeichnungselementen in einen Text, werden diese einzelnen Elemente eindeutig benannt und voneinander abgegrenzt.

Nimmt man zum Beispiel ein typisches Buch, so kann man es auf der obersten Ebene als ein Ganzes, als ein Element betrachten. Dieses “Buch”-Element enthält nun Kapitel, die wiederum selbst als Elemente bezeichnet werden können. Jedes einzelne Kapitel enthält weitere Elemente. So gibt es beispielsweise Absätze, Zitate und Fußnoten. Jeder Absatz kann wiederum selbst Elemente enthalten, die helfen, den Absatzinhalt als direkte Rede oder als Namen eines der Protagonisten einer Geschichte zu identifizieren.

Wenn man möchte, kann man sich das als “Unterteilung”[3] des Inhalts vorstellen. Auf der obersten Ebene gibt es ein Element: das Buch selbst. Schaut man ein wenig tiefer, findet man weitere Teilelemente: die einzelnen Kapitel. Diese sind wiederum unterteilt in Absätze, Fußnoten, Namen und so weiter und so weiter.

Anzumerken ist an dieser Stelle, dass das eben gesagte ohne weiteres auf jeden Inhaltstyp angewandt werden kann, auch ohne dass von SGML die Rede ist. Man könnte beispielsweise einfach verschiedene Stifte nehmen und einen Ausdruck dieser Fibel vor sich hinlegen und dann mit verschiedenen Farben die einzelnen Abschnitte des Buchinhalts markieren.

Leider gibt es keinen elektronischen Stift, um das zu tun. Deshalb muss ein anderer Weg gewählt werden, um zu bestimmen, zu welchem Element die einzelnen Inhalte gehören. In SGML-basierten Auszeichnungssprachen wie HTML und DocBook werden dafür so genannte Tags eingesetzt.

Mit einem solchen Tag wird eindeutig festgelegt, wo ein bestimmtes Element beginnt und wo es endet. Allerdings gehört der Tag selber nicht zum Element. Er legt lediglich die Grenzen des Elements fest. Da jede DTD mit dem Ziel entwickelt wurde, einen speziellen Inhaltstyp auszuzeichnen, wird jede DTD verschiedene Elemente kennen, die daher natürlich auch unterschiedlich benannt sein werden.

Der Starttag für ein imaginäres Element mit dem Namen elementname ist <<elementname>>. Sein Gegenstück, der schließende Endtag, ist <</elementname>>.

Beispiel 3-1. Verwendung eines Elements (Start- und Endtag)

HTML kennt das Element <p>, um festzulegen, dass ein bestimmter abgegrenzter Bereich einen Absatz darstellt. Dieses Element hat sowohl einen Start- als auch einen Endtag.

<p>Das ist ein Absatz. Er beginnt mit Starttag
  für das Element 'p' und endet mit dem Endtag für
  das Element 'p'.</p>

<p>Das ist ein etwas kürzerer Absatz.</p>

Elemente müssen nicht notwendigerweise einen Endtag haben. Ebenso ist es nicht notwendig, dass Elemente einen Inhalt haben. Beispielsweise kann in HTML-Dokumenten mittels eines speziellen Elements festgelegt werden, dass eine horizontale Linie an einer bestimmten Stelle erscheinen soll. Da dieses Element offensichtlich keinen Inhalt hat, wird auch kein Endtag benötigt.

Beispiel 3-2. Verwendung eines Elements (nur Starttag)

In HTML kann man mit dem Element <hr> festlegen, dass an einer bestimmten Stelle eine horizontale Linie angezeigt werden soll. Da dieses Element keinen Inhalt umschließt, hat es nur einen Starttag.

<p>Das ist ein Abschnitt.</p>

<hr>

<p>Das ist ein weiterer Absatz. Eine horizontale Linie
  trennt ihn vom vorherigen Absatz.</p>

Elemente können andere Elemente enthalten. Im anfangs erwähnten Buch enthielt das Buch-Element alle Kapitel-Elemente, die wiederum alle Absatz-Elemente enthielten und so fort.

Beispiel 3-3. Verschachtelte Elemente: <em>

<p>Das ist ein einfacher <em>Abschnitt</em>, in dem
  einige <em>Worte</em> <em>hervorgehoben</em> wurden.

Welche Elemente andere Elemente enthalten können und welche das sind, wird innerhalb der DTD eines Dokuments festgelegt.

Wichtig: Viele Leute sind oft verwirrt, wenn es um die richtige Benutzung der Begriffe Tag und Element geht. Im Ergebnis werden sie oft so genutzt, als wären sie austauschbar. Allerdings sind sie das nicht.

Ein Element ist ein konzeptioneller Teil eines Dokuments und hat einen festgelegten Anfang und ein festgelegtes Ende. Ein Tag hingegen markiert die Stelle, an der ein Element beginnt und endet.

Wenn in diesem Dokument vom “Tag <p>” gesprochen wird, ist damit der Text gemeint, der aus den drei Zeichen <, p und > besteht. Wird hingegen von dem “Element <p>” gesprochen, ist damit das gesamte Element gemeint.

Diese Unterscheidung ist sicherlich subtil. Trotzdem sollte man sie sich vergegenwärtigen.

Elemente können selber Attribute haben, die aus einem Namen und einem Wert bestehen. Die Attribute haben die Aufgabe, dem Element zusätzliche Informationen hinzuzufügen. Denkbar sind hier Festlegungen über die Darstellung, Bezeichner, über die das Element eindeutig identifiziert werden kann, oder beliebige andere Informationen.

Elementattribute werden in den Starttag eingefügt und haben die Form Attributename="Wert".

Bei einigen HTML-Versionen kennt das Element <p> das Attribut <align>, mit dessen Hilfe die Textausrichtung eines Absatzes bestimmt werden kann.

align akzeptiert einen von vier vorgegebenen Werten: left, center, right und justify. Ist align nicht angegeben, wird vom Standardwert left ausgegangen.

Beispiel 3-4. Elemente mit Attributen nutzen

<p align="left">Die Verwendung des align-Attributs
  für diesen Absatz ist überflüssig, da left
  der Standardwert ist.</p>

<p align="center">Dieser Absatz wird hoffentlich mittig dargestellt.</p>

Einige Attribute akzeptieren nur bestimmte Werte, wie beispielsweise left oder justify. Andere akzeptieren jeden beliebigen Wert. Enthält Attributwert doppelte Anführungszeichen ("), wird der Wert in einfachen Anführungszeichen eingeschlossen.

Beispiel 3-5. Attribute mit einfachen Anführungszeichen

<p align='right'>Ich stehe rechts!</p>

Manchmal können die Anführungszeichen um den Attributwert weggelassen werden. Allerdings sind die Regeln, die festlegen wann dies zulässig ist, sehr spitzfindig. Am besten schließen Sie Attributwerte immer in Anführungszeichen ein.

Die Informationen über Attribute, Elemente und Tags sind in SGML-Katalogen abgelegt und werden von den verschiedenen Werkzeugen des Dokumentationsprojektes genutzt, um die geschriebenen Dokumente zu validieren. Die Programme die durch textproc/docproj installiert werden, bringen ihre eigenen Katalogvarianten mit, zudem pflegt das FDP seine eigenen Kataloge. Beide Katalogarten müssen von allen Programmen gefunden werden können.


3.2.1. Was dafür getan werden muss;...

Damit die Beispiele dieser Fibel ausgeführt werden können, ist es notwendig, dass einige Programme auf dem Rechner installiert sind und das eine Umgebungsvariable korrekt gesetzt wird.

  1. Der erste Schritt ist die Installation des Ports textproc/docproj über das FreeBSD-Portsystem. textproc/docproj ist ein Metaport, der alle vom FDP benötigten Programme und Daten aus dem Netz laden und installieren sollte.

  2. Anschließend muss in den Shellkonfigurationsdateien die Variable SGML_CATALOG_FILES [4] gesetzt werden.

    Beispiel 3-6. .profile, für sh(1) und bash(1) Benutzer

    SGML_ROOT=/usr/local/share/sgml
    SGML_CATALOG_FILES=${SGML_ROOT}/jade/catalog
    SGML_CATALOG_FILES=${SGML_ROOT}/docbook/4.1/catalog:$SGML_CATALOG_FILES
    SGML_CATALOG_FILES=${SGML_ROOT}/html/catalog:$SGML_CATALOG_FILES
    SGML_CATALOG_FILES=${SGML_ROOT}/iso8879/catalog:$SGML_CATALOG_FILES
    SGML_CATALOG_FILES=/usr/doc/share/sgml/catalog:$SGML_CATALOG_FILES
    SGML_CATALOG_FILES=/usr/doc/en_US.ISO8859-1/share/sgml/catalog:$SGML_CATALOG_FILES
    SGML_CATALOG_FILES=/usr/doc/de_DE.ISO8859-1/share/sgml/catalog:$SGML_CATALOG_FILES
    export SGML_CATALOG_FILES
    

    Beispiel 3-7. .cshrc, für csh(1)- und tcsh(1)-Benutzer

    setenv SGML_ROOT /usr/local/share/sgml
    setenv SGML_CATALOG_FILES ${SGML_ROOT}/jade/catalog
    setenv SGML_CATALOG_FILES ${SGML_ROOT}/docbook/4.1/catalog:$SGML_CATALOG_FILES
    setenv SGML_CATALOG_FILES ${SGML_ROOT}/html/catalog:$SGML_CATALOG_FILES
    setenv SGML_CATALOG_FILES ${SGML_ROOT}/iso8879/catalog:$SGML_CATALOG_FILES
    setenv SGML_CATALOG_FILES /usr/doc/share/sgml/catalog:$SGML_CATALOG_FILES
    setenv SGML_CATALOG_FILES /usr/doc/en_US.ISO8859-1/share/sgml/catalog:$SGML_CATALOG_FILES
    setenv SGML_CATALOG_FILES /usr/doc/de_DE.ISO8859-1/share/sgml/catalog:$SGML_CATALOG_FILES
    

    Damit die Änderungen wirksam werden, meldet man sich ab und anschließend wieder an - oder man führt die obigen Anweisungen direkt in der Shell aus und setzt so die benötigten Umgebungsvariablen.

  1. Nun sollte man eine Datei beispiel.sgml anlegen, die den folgenden Text enthält:

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    
    <html>
      <head>
        <title>Eine Beispieldatei in HTML</title>
      </head>
    
      <body>
        <p>Das ist ein Absatz mit etwas Text.</p>
    
        <p>Das ist ein Absatz mit anderem Text.</p>
    
        <p align="right">Dieser Absatz wird rechtsbündig
          ausgerichtet.</p>
      </body>
    </html>
    
  2. Nachdem die Datei abgespeichert wurde, kann sie mit Hilfe eines SGML-Parsers validiert werden.

    Bestandteil von textproc/docproj ist nsgmls - ein validierender Parser. nsgmls liest ein Dokument entsprechend einer SGML-DTD ein und gibt anschließend ein Element-Structure-Information-Set (ESIS) aus. Allerdings ist das an dieser Stelle nicht weiter wichtig.

    Wird nsgmls mit der Option -s aufgerufen, werden nur Fehlermeldungen ausgegeben. Dadurch kann leicht geprüft werden, ob ein Dokument gültig ist oder nicht.

    So prüft man mit nsgmls, ob die neuangelegte Beispieldatei gültig ist:

    % nsgmls -s beispiel.sgml
    

    Sofern das Beispiel korrekt abgetippt wurde, wird sich nsgmls ohne jegliche Ausgabe beenden. Das bedeutet, dass das Dokument erfolgreich validiert werden konnte und somit gültig ist.

  3. Jetzt sollten die Tags <title> und </title> aus dem Dokument gelöscht und das Dokument erneut validiert werden:

    % nsgmls -s beispiel.sgml
    nsgmls:beispiel.sgml:5:4:E: character data is not allowed here
    nsgmls:beispiel.sgml:6:8:E: end tag for "HEAD" which is not finished
    

    Die Fehlermeldungen, die von nsgmls ausgegeben werden, sind in durch Doppelpunkte getrennte Spalten unterteilt.

    Spalte Bedeutung
    1 Der Name des Programms, das den Fehler meldet. Hier wird immer nsgmls stehen.
    2 Der Name der fehlerhaften Datei.
    3 Die Zeilennummer des Fehlers.
    4 Die Spaltenummer des Fehlers.
    5 Ein einbuchstabiger Code, der über die Art des Fehlers informiert. I steht für eine informelle Meldung, W für eine Warnung und E für Fehler[a] und X für einen Querverweis. Bei den oben stehenden Ausgaben handelt es sich also um Fehlermeldungen.
    6 Die Meldung.
    Bemerkungen:
    a. Nicht immer besteht eine Meldung aus fünf Spalten. Die Ausgabe von nsgmls -sv ist beispielsweise nsgmls:I: SP version "1.3" (natürlich abhängig von der Version). Wie man sehen kann, handelt es sich hier um eine informelle Meldung.

    Durch das Weglassen des Tags <title> sind zwei unterschiedliche Fehler entstanden.

    Der erste Fehler besagt, dass Inhalt (in diesem Falle Zeichen anstatt eines Starttags) an einer Stelle gefunden wurde, an der der Parser etwas anderes erwartet hat. Genauer gesagt wurde der Starttag eines Elements erwartet, das innerhalb von <head> auftreten kann.

    Der zweite Fehler wurde dadurch verursacht, dass das Element <head> ein Element <title> enthalten muss und nsgmls nicht berücksichtigt, dass dieser Fehler auf dem vorhergehenden beruht. Es wird lediglich festgestellt, dass der Endtag von <head> auftritt, obwohl nicht alle notwendigen Elemente vorhanden sind.

  4. Zum Schluß sollte der Tag <title> wieder in die Beispieldatei eingefügt werden.


3.3. Die DOCTYPE-Deklaration

Am Anfang jedes Dokuments muss der Name der dem Dokument zugrundeliegenden DTD angegeben werden. Mit Hilfe dieser Information können SGML-Parser die verwendete DTD feststellen und prüfen, ob das Dokument zu ihr konform ist.

Üblicherweise steht diese Information in einer Zeile, die als DOCTYPE-Deklaration bezeichnet wird.

Eine Deklaration für ein HTML-Dokument, das nach den Vorgaben der DTD für HTML 4.0 geschrieben wurde, sieht so aus:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0//EN">

und besteht aus verschiedenen Teilen.

<!

Die Zeichenkette <! dient hier als Indikator, dass es sich bei diesem Ausdruck um eine SGML-Deklaration handelt und diese Zeile den Dokumententyp festlegt.

DOCTYPE

Zeigt an, dass dies die SGML-Deklaration für den Dokumententyp ist.

html

Nennt das erste Element, das im Dokument auftaucht.

PUBLIC "-//W3C//DTD HTML 4.0//EN"

Nennt den Formalen Öffentlichen Bezeichner [5] der DTD des Dokuments. Diese Information wird von SGML-Parsern ausgewertet, um die von dem Dokument referenzierte DTD zu bestimmen.

Das Schlüsselwort PUBLIC gehört nicht zum öffentlichen Bezeichner, sondern legt fest, wie ein SGML-Parser die DTD finden kann. Alternative Wege eine DTD zu referenzieren werden später gezeigt.

>

Schließt den mit <! begonnenen Ausdruck ab.


3.3.1. Formale Öffentliche Bezeichner

Anmerkung: Dieser Abschnitt braucht nicht unbedingt zu gelesen zu werden. Dennoch ist es empfehlenswert, da er nützliche Hintergrundinformationen enthält, die hilfreich sein können, falls der SGML-Prozessor die genutzte DTD nicht finden kann.

Jeder öffentliche Bezeichner muss eine bestimmte Syntax haben, die wie folgt lautet:

"Besitzer//Schlüsselwort Beschreibung//Sprache"
Besitzer

Nennt den Besitzer des öffentlichen Bezeichners.

Falls diese Zeichenkette mit “ISO” beginnt, gehört der Bezeichner dem ISO-Kommitee. Der Bezeichner "ISO 8879:1986//ENTITIES Greek Symbols//EN" nennt “ISO 8879:1986” als den Besitzer des Satzes von Entitäten für griechische Zeichen. ISO 8879:1986 ist die ISO-Bezeichnung für den SGML-Standard.

Beginnt die Zeichenkette nicht mit “ISO”, sieht sie entweder so -//Besitzer oder so +//Besitzer aus. Beide Varianten unterscheiden sich also nur durch das anfängliche + bzw. -.

Sofern am Anfang ein - steht, ist der Bezeichner nicht öffentlich registriert, steht hingegen ein + am Anfang, ist er registriert.

Im ISO-Standard ISO 9070:1991 wurde festgelegt, wie registrierte Namen erzeugt werden können. Unter anderem können sie von den Bezeichnungen von ISO-Publikationen, von ISBN-Nummern oder einer Organisationsbezeichnungen entsprechend ISO 6523 abgeleitet werden. Anträge für neue offiziell registrierte Bezeichner werden vom ISO-Kommitee an das American National Standards Institute (ANSI) weitergeleitet.

Da das FreeBSD-Projekt seine Bezeichner nicht hat registrieren lassen, ist der Besitzer -//FreeBSD. Unter anderem kann man daran auch sehen, dass das W3C sich nicht hat registrieren lassen.

Schlüsselwort

Es gibt verschiedene Schlüsselwörter mit denen man die Art der gegebenen Informationen beschreiben kann. Einige der üblichsten sind DTD, ELEMENT, ENTITIES und TEXT. DTD wird nur für Dateien mit DTDs verwandt, ELEMENT findet für Dateien mit Fragmenten von DTDs Verwendung, die nur Deklarationen für Entitäten und Elemente enthalten. TEXT wird für SGML-Inhalte (Texte und Tags) verwendet.

Beschreibung

Eine frei wählbare Beschreibung des Inhalts der referenzierten Datei. Möglich sind hier Versionsnummern oder ein kurzer und sinnvoller Text, der innerhalb der SGML-Welt eindeutig ist.

Sprache

Ein ISO-Code aus zwei Buchstaben, der die für die Datei verwendete Sprache nennt. EN steht hier für Englisch, DE für Deutsch.


3.3.1.1. Die catalog-Dateien

Wenn man die oben beschriebene Syntax für Bezeichner verwendet und ein Dokument durch einen SGML-Prozessor schickt, muss dieser die Möglichkeit haben, den Bezeichner auf eine real existierende Datei abzubilden, die die benötigte DTD enthält.

Einer der möglichen Wege hierfür sind Katalogdateien. Eine solche Datei, die üblicherweise catalog heißt, besteht aus einzelnen Zeilen, die Bezeichner auf Dateinamen abbilden. Enthält ein Katalog beispielsweise die Zeile

PUBLIC "-//W3C//DTD HTML 4.0//EN"             "4.0/strict.dtd"

kann ein SGML-Prozessor darüber feststellen, dass die benötigte DTD in der Datei strict.dtd im Unterverzeichnis 4.0 des Verzeichnisses des Katalogs zu finden ist.

Ein gutes Beispiel für einen Katalog ist /usr/local/share/sgml/html/catalog. Diese Datei enthält den Katalog für alle HTML DTDs, die im Zuge der Installation von textproc/docproj installiert wurden.


3.3.1.2. Die Variable SGML_CATALOG_FILES

Natürlich muss einem SGML-Prozessor noch mitgeteilt werden können, wo er seine Kataloge finden kann. Viele Programme bieten hierfür Kommandozeilenoptionen an, über die man einen oder mehrere Kataloge angeben kann.

Zusätzlich besteht noch die Möglichkeit mit der Umgebungsvariablen SGML_CATALOG_FILES auf SGML-Kataloge zu verweisen. Die Einträge von SGML_CATALOG_FILES müssen aus den vollständigen Pfadnamen der Kataloge, jeweils durch Komma getrennt, bestehen.

Üblicherweise werden die folgenden Kataloge über SGML_CATALOG_FILES für die Arbeit an den Dokumenten des FDPs eingebunden:

  • /usr/local/share/sgml/docbook/4.1/catalog

  • /usr/local/share/sgml/html/catalog

  • /usr/local/share/sgml/iso8879/catalog

  • /usr/local/share/sgml/jade/catalog

Allerdings sollte das schon geschehen sein.


3.3.2. Alternativen zu Formalen Öffentlichen Bezeichnern

Anstatt mit einem Bezeichner die zum Dokument gehörende DTD zu referenzieren, kann auch explizit auf die Datei der DTD verwiesen werden.

Die Syntax des DOCTYPE-Deklaration ist in diesem Falle anders:

<!DOCTYPE html SYSTEM "/pfad/zur/dokumenten.dtd">

Das Schlüsselwort SYSTEM legt fest, dass ein SGML-Prozessor die DTD auf “systemspezifische” Art und Weise bestimmen soll. Meistens, aber nicht immer, wird so auf eine Datei im Dateisystem verwiesen.

Allerdings sollte man öffentliche Bezeichner aus Gründen der Portabilität bevorzugen, da man so nicht eine Kopie der DTD mit dem Dokument selber verteilen muss, beziehungsweise da man, wenn man mit SYSTEM arbeitet, nicht davon ausgehen kann, dass die benötigte DTD auf anderen Systemen genau unter dem gleichen Pfad verfügbar ist.


3.4. Die Rückkehr zu SGML

An einer früheren Stelle wurde erwähnt, dass man SGML nur benötigt, falls man selbst eine DTD entwickeln möchte. Genaugenommen ist das nicht 100%ig richtig. Einige Teile der SGML-Syntax können auch in normalen Dokumenten verwendet werden, falls dies gewünscht oder notwendig ist.

In diesem Falle muss dafür Sorge getragen werden, dass ein SGML-Prozessor feststellen kann, dass ein bestimmter Abschnitt des Inhalts SGML ist, das er verarbeiteten muss.

Solche SGML-Abschnitte werden mittels <! ... > in Dokumenten besonders gekennzeichnet. Alles, was sich zwischen diesen Begrenzungen befindet, ist SGML, wie es auch in DTDs gefunden werden kann.

Demnach ist die DOCTYPE-Deklaration ein gutes Beispiel für SGML, das in Dokumenten verwendet werden muss...


3.5. Kommentare

Kommentare sind SGML-Konstrukte, die normalerweise nur in DTDs gültig sind. Dennoch ist es, wie in Abschnitt 3.4 gezeigt, möglich Fragmente mit SGML-Syntax in Dokumenten zu verwenden.

Zum Abgrenzen von SGML-Kommentaren wird ein doppelter Bindestrich “--” verwendet. Mit seinem ersten Auftreten öffnet er einen Kommentar, mit seinem zweiten schließt er ihn wieder.

Beispiel 3-8. Beispiele für Kommentare in SGML

<!-- Testkommentar -->
<!-- Text innerhalb eines Kommentars -->

<!-- Ein anderer Kommentar    -->

<!-- So können mehrzeilige Kommentare
     genutzt werden -->

<!-- Eine andere Möglichkeit für --
  -- mehrzeilige Kommentare.     -->

Hat man früher schon Erfahrungen mit HTML gesammelt, wird man vielleicht andere Regeln für den Gebrauch von Kommentaren kennengelernt haben. Beispielsweise wird oft angenommen, dass Kommentare mit <!-- begonnen und nur mit --> beendet werden.

Dies ist nicht der Fall. Viele Webbrowser haben fehlerhafte HTML-Parser, die dies akzeptieren. Die SGML-Parser, die vom FDP verwendet werden, halten sich strenger an die SGML-Spezifikation und verwerfen Dokumente mit solchen Fehlern.

Beispiel 3-9. Fehlerhafte SGML-Kommentare

<!-- Innerhalb eines Kommentars --

     DIES IST NICHT TEIL EINES KOMMENTARS

  -- Wieder innerhalb eines Kommentars -->

SGML-Parser würden die mittlere Zeile wie folgt interpretieren:

<!DIES IST NICHT TEIL EINES KOMMENTARS>

Da es sich hierbei nicht um gültiges SGML handelt, kann diese Zeile zur verwirrenden Fehlermeldungen führen.

<!--------------- Eine wirklich schlechte Idee  --------------->

Wie das Beispiel zeigt, sollten solche Kommentare tunlichst vermieden werden.

<!--===================================================-->

Ein solcher Kommentar ist (ein wenig) besser, kann aber jemanden, der mit SGML noch nicht so vertraut ist, verwirren.


3.5.1. Fingerübungen...

  1. Zur Übung können Sie einige Kommentare in die Datei beispiel.sgml einfügen und überprüfen, ob die Datei nun noch erfolgreich von nsgmls validiert werden kann.

  2. Zu Testzwecken sollten Sie auch noch ein paar fehlerhafte Kommentare hinzufügen und sich die resultierenden Fehlermeldungen von nsgmls ansehen.


3.6. Entitäten

Entitäten stellen einen Mechanismus dar, mit dem einzelnen Dokumententeilen ein Name zugewiesen werden kann. Findet ein SGML-Parser während des Parsens eine Entität, ersetzt er diese durch den ihr zugewiesenen Inhalt.

Dadurch steht eine einfache Möglichkeit zur Verfügung, mit der variabler Inhalt in SGML-Dokumenten eingebunden werden kann. Zusätzlich sind Entitäten der einzige Weg, über den eine Datei in eine andere Datei mit SGML-Mitteln eingebunden werden kann.

Es werden zwei Arten von Entitäten unterschieden: Allgemeine Entitäten und Parameterentitäten.


3.6.1. Allgemeine Entitäten

Allgemeine Entitäten können nur in Dokumenten benutzt werden. Sie können zwar im SGML-Kontext definiert aber dort nicht benutzt werden. Vergleichen Sie dies mit Im Parameterentitäten.

Jede allgemeine Entität hat einen Namen, über den sie angesprochen werden kann, um den von ihr referenzierten Inhalt in ein Dokument einzubinden. Dafür muss an der betreffenden Stelle der Namen der Entität per &entitaetenname; einfügt werden. Eine Entität current.version könnte beispielsweise durch die aktuelle Versionsnummer eines Programms ersetzt werden. Man könnte also schreiben:

<para>Die aktuelle Version des
  Programms ist &current.version;.</para>

Wenn sich die Versionsnummer ändert, muss nur die Entität angepasst und anschließend das Dokument neu erzeugt werden.

Eine weitere Einsatzmöglichkeit für Allgemeine Entitäten ist das Einbinden von Zeichen, die auf andere Weise nicht in ein SGML-Dokument eingefügt werden könnten. Ein Beispiel für solche Zeichen sind < und &, die normalerweise nicht direkt in SGML-Dokumenten erlaubt sind. Stößt ein SGML-Parser bei seiner Arbeit auf das Symbol <, nimmt er an, dass der Anfang eines Start- oder Endtags gefunden wurde. Bei einem & wird er annehmen, den Anfang einer Entität gefunden zu haben.

Wenn eines der beiden Zeichen benötigt wird, werden daher die allgemeinen Entitäten &lt; und &amp; verwendet.

Allgemeine Entitäten können nur in einem SGML-Kontext definiert werden. Üblich ist es, dies direkt nach der DOCTYPE-Deklaration zu tun:

Beispiel 3-10. Allgemeine Entitäten festlegen

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0//EN" [
<!ENTITY current.version    "3.0-RELEASE">
<!ENTITY last.version       "2.2.7-RELEASE">
]>

Wichtig ist an dieser Stelle, dass die DOCTYPE-Deklaration durch eine eckige Klammer am Ende der ersten Zeile erweitert wurde. Die beiden Entitäten selber werden in den folgenden zwei Zeilen definiert, bevor in der letzten Zeile die eckige Klammer und die DOCTYPE-Deklaration wieder geschlossen werden.

Die eckigen Klammern sind notwendig um festzulegen, dass man die über DOCTYPE genannte DTD erweitern möchte.


3.6.2. Parameterentitäten

Genau wie Allgemeine Entitäten werden Parameterentitäten eingesetzt um wiederverwendbare Inhaltsteile mit Namen zu versehen. Im Gegensatz zu Allgemeinen Entitäten können sie aber nur innerhalb eines SGML-Kontextes genutzt werden.

Die Definition von Parameterentitäten erfolgt ähnlich zu der Allgemeiner Entitäten. Sie werden lediglich mit %entitaetenname; anstelle von &entitaetenname; referenziert[6]. Wichtig ist, dass das %-Zeichen zwischen ENTITY und dem Entitätennamen ein Teil der Definition ist.

Beispiel 3-11. Parameterentitäten festlegen

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0//EN" [
<!ENTITY % param.etwas "etwas">
<!ENTITY % param.text "Text">
<!ENTITY % param.neu  "%param.etwas mehr %param.text">

<!-- %param.neu ist jetzt "etwas mehr Text" -->
]>

3.6.3. Fingerübungen...

  1. Fügen Sie in beispiel.sgml eine Allgemeine Entität ein.

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" [
    <!ENTITY version "1.1">
    ]>
    
    <html>
      <head>
        <title>Eine HTML-Beispieldatei</title>
      </head>
    
      <body>
        <p>Das ist ein Absatz mit etwas Text.</p>
    
        <p>Das ist ein Absatz mit anderem Text.</p>
    
        <p align="right">Dieser Absatz wird rechtsbündig
          ausgerichtet.</p>
    
        <p>Die aktuelle Version ist: &version;</p>
      </body>
    </html>
    
  2. Validieren Sie diese Datei mit nsgmls

  3. Öffnen Sie nun beispiel.sgml mit Ihrem Webbrowser. Es kann notwendig sein, dass Sie die Datei vorher in beispiel.html umbenennen müssen, damit die Datei auch als HTML-Dokument erkannt wird.

    Nur wenn Sie einen sehr modernen Browser haben, werden Sie sehen können, dass &version; durch die Versionsnummer ersetzt wurde. Leider haben die meisten Webbrowser sehr einfache SGML-Parser, die nicht richtig mit SGML umgehen können[7].

  4. Die Lösung hierfür ist, das Dokument zu normalisieren. Zu diesem Zweck liest ein Normer das Dokument ein und gibt anschließend semantisch gleichwertiges SGML wieder aus, dass auf verschiedene Arten transformiert worden sein kann. Eine dieser möglichen Transformationen ist das Ersetzen der Referenzen auf Entitäten mit dem von ihnen präsentierten Inhalt.

    Versuchen Sie, die Beispieldatei mittels sgmlnorm zu normalisieren:

    % sgmlnorm beispiel.sgml > beispiel.html
    

    Anschließend sollten Sie eine normalisierte Version, dass heißt eine, bei der die Entitäten gegen ihren Inhalt ersetzt wurden, in der Datei beispiel.html finden. Diese Datei können Sie sich nun mit Ihrem Browser ansehen.

  5. Wenn Sie sich die Ausgaben von sgmlnorm ansehen, werden Sie feststellen, dass die DOCTYPE-Deklaration am Anfang der Datei nicht mehr enthalten ist. Möchten Sie die Deklaration behalten, muss sgmlnorm mit der Option -d aufrufen werden:

    % sgmlnorm -d beispiel.sgml > beispiel.html
    

3.7. Dateien mit Entitäten einbinden

Sowohl Allgemeine als auch Parameterentitäten sind nützliche Helfer, wenn es darum geht, eine Datei in eine andere einzubinden.


3.7.1. Dateien mit Allgemeinen Entitäten einbinden

Angenommen man hat ein Buch geschrieben, dessen Inhalt auf mehrere Dateien aufgeteilt und mittels SGML ausgezeichnet. Jedes Kapitel wurde dazu in einer eigenen Datei (kapitel1.sgml, kapitel2.sgml usw.) abgelegt und über eine Datei buch.sgml sollen alle physischen Dateien wieder mit der Hilfe von Entitäten zu einem logischen Dokument zusammengeführt werden.

Damit der Inhalt der Dateien mit Entitäten eingebunden werden kann, muss die Deklaration der Entitäten das Schlüsselwort SYSTEM enthalten. SGML-Parser werden so angewiesen, den Inhalt der referenzierten Datei als Wert für die jeweilige Entität zu nehmen.

Beispiel 3-12. Dateien mit Allgemeinen Entitäten einbinden

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0//EN" [
<!ENTITY kapitel.1 SYSTEM "kapitel1.sgml">
<!ENTITY kapitel.2 SYSTEM "kapitel2.sgml">
<!ENTITY kapitel.3 SYSTEM "kapitel3.sgml">
<!-- Und so weiter... -->
]>

<html>
  <!-- Jetzt werden die Kapitel über die Entitäten eingebunden -->

  &kapitel.1;
  &kapitel.2;
  &kapitel.3;
</html>

Warnung: Wenn man Allgemeine Entitäten benutzt, um andere Dateien einzubinden, dürfen diese Dateien (kapitel1.sgml, kapitel2.sgml, ...) keine eigene DOCTYPE-Deklaration haben.


3.7.2. Dateien mit Parameterentitäten einbinden

Wie bereits festgestellt, können Parameterentitäten nur innerhalb eines SGML-Kontexts genutzt werden. Warum möchte man aber Dateien innerhalb eines SGML-Kontexts einbinden? Der Vorteil liegt in der Möglichkeit, die Deklaration von Entitäten in eine andere Datei auslagern zu können, wodurch diese leichter wiederverwendbar sind.

Angenommen das Buch aus dem vorherigen Kapitel besteht aus sehr vielen Kapiteln und diese sollen auch in einem anderen Buch, aber in einer anderen Reihenfolge, verwendet werden. Eine Möglichkeit wäre es, die dafür notwendigen Entitäten am Anfang jedes Buches einzeln festzulegen - was allerdings mit der Zeit unhandlich und fehlerträchtig wird.

Alternativ bietet sich dazu an, die Deklarationen in eine separate Datei auszulagern und deren Inhalt anschließend in beide Bücher über Parameterentitäten einzubinden.

Beispiel 3-13. Dateien mit Parameterentitäten einbinden

Zuerst werden die Entitäten in einer separaten Datei namens kapitel.ent deklariert. kapitel.ent enthält für dieses Beispiel die folgenden Zeilen:

<!ENTITY kapitel.1 SYSTEM "kapitel1.sgml">
<!ENTITY kapitel.2 SYSTEM "kapitel2.sgml">
<!ENTITY kapitel.3 SYSTEM "kapitel3.sgml">

Im zweiten Schritt fügt man in beide Bücher eine Parameterentität ein, die den Inhalt von kapitel.ent referenziert, und lädt über diese dann die Deklarationen. Anschließend können die so geladenen Entitäten wie gewohnt genutzt werden.

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0//EN" [
<!-- Definieren einer Parameterentität um die Allgemeinen Entitäten für -->
<!-- die Kapitel laden zu können                                        -->
<!ENTITY % kapitel SYSTEM "kapitel.ent">

<!-- Nun wird der Inhalt der referenzierten Datei geladen -->
%kapitel;
]>

<html>
  &kapitel.1;
  &kapitel.2;
  &kapitel.3;
</html>

3.7.3. Fingerübungen...

3.7.3.1. Binden Sie Dateien über Allgemeine Entitäten ein

  1. Legen Sie drei Dateien (absatz1.sgml, absatz2.sgml und absatz3.sgml) mit jeweils einer Zeile wie

    <p>Erster Absatz.</p>
    
    an.

  2. Ändern Sie beispiel.sgml so ab, dass sie wie folgt aussieht:

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0//EN" [
    <!ENTITY version "1.1">
    <!ENTITY absatz1 SYSTEM "absatz1.sgml">
    <!ENTITY absatz2 SYSTEM "absatz2.sgml">
    <!ENTITY absatz3 SYSTEM "absatz3.sgml">
    ]>
    
    <html>
      <head>
        <title>Eine HTML-Beispieldatei</title>
      </head>
    
      <body>
        <p>Die aktuelle Version dieses Dokuments ist &version;</p>
    
        &absatz1;
        &absatz2;
        &absatz3;
      </body>
    </html>
    
  3. Erzeugen Sie nun die Datei beispiel.html, indem Sie beispiel.sgml normalisieren:

    % sgmlnorm -d beispiel.sgml > beispiel.html
    
  4. Öffnen Sie beispiel.html nun mit einem Webbrowser und vergewissern Sie sich, dass der Inhalt der Dateien absatzN.sgml in beispiel.html übernommen wurde.


3.7.3.2. Binden Sie Dateien mit Parameterentitäten ein

Anmerkung: Hierfür müssen Sie die vorherige Fingerübung gemacht haben.

  1. Ändern Sie beispiel.sgml so ab, dass es wie folgt aussieht:

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0//EN" [
    <!ENTITY % entitaeten SYSTEM "entitaeten.sgml"> %entitaeten;
    ]>
    
    <html>
      <head>
        <title>Eine HTML-Beispieldatei</title>
      </head>
    
      <body>
        <p>Die aktuelle Version dieses Dokuments ist &version;</p>
    
        &absatz1;
        &absatz2;
        &absatz3;
      </body>
    </html>
    
  2. Legen Sie eine weitere Datei entitaeten.sgml an, die folgenden Inhalt hat:

    <!ENTITY version "1.1">
    <!ENTITY absatz1 SYSTEM "absatz1.sgml">
    <!ENTITY absatz2 SYSTEM "absatz2.sgml">
    <!ENTITY absatz3 SYSTEM "absatz3.sgml">
    
  3. Erzeugen Sie die Datei beispiel.html, indem Sie beispiel.sgml normalisieren:

    % sgmlnorm -d beispiel.sgml > beispiel.html
    
  4. Öffnen Sie beispiel.html nun mit einem Webbrowser und vergewissern Sie sich, dass der Inhalt der Dateien absatzN.sgml in beispiel.html übernommen wurde.


3.8. Markierte Bereiche

SGML erlaubt es, dass bestimmte Dokumentabschnitte während der Verarbeitung besonders behandelt werden sollen. Diese Abschnitte werden als “markierte Bereiche” [8] bezeichnet.

Beispiel 3-14. Aufbau eines markierten Bereiches

<![ SCHLÜSSELWORT [
  Inhalt des markierten Bereiches
]]>

Da es sich bei markierten Bereichen um SGML-Konstrukte handelt, werden sie mit <! eingeleitet. Der eigentliche Anfang des markierten Bereiches wird von der folgenden eckigen Klammer bestimmt. Das darauf folgende SCHLÜSSELWORT legt fest, wie der “markierte Inhalt” durch einen SGML-Prozessor während der Verarbeitung behandelt werden soll. Der “markierte” Inhalt selbst beginnt erst nach der zweiten eckigen Klammer und erstreckt sich bis zu den zwei schließenden eckigen Klammern am Ende des Bereiches. Mit Hilfe des > Zeichens wird der mit <! begonnene SGML-Kontext wieder verlassen.


3.8.1. Schlüsselworte für markierte Bereiche

3.8.1.1. CDATA und RCDATA

Die Schlüsselworte CDATA und RCDATA bestimmen das Inhaltsmodell für markierte Bereiche. Dadurch ist es möglich, vom Standardmodell abzuweichen.

Ein SGML-Prozessor muss während der Verarbeitung eines Dokuments zu jedem Zeitpunkt wissen, welches Inhaltsmodell gerade anzuwenden ist.

Was ist ein Inhaltsmodell? Kurz gesagt beschreibt das Inhaltsmodell, welche Art von Inhalt der Parser zu erwarten und wie er damit umzugehen hat.

Bei CDATA und RCDATA handelt es sich wahrscheinlich um die nützlichsten Inhaltsmodelle. CDATA steht für Zeichendaten[9]. Trifft ein Parser auf dieses Inhaltsmodell, wird er annehmen, dass sich im zugehörigen Dokumentenbereich nur “gewöhnliche” Zeichen befinden. Das bedeutet, dass < und & ihre besondere Bedeutung verlieren und als einfache Zeichen behandelt werden.

RCDATA steht für Entitätenreferenzen und Zeichendaten[10]. Für einen Bereich mit diesem Inhaltsmodell, wird ein Parser davon ausgehen, dass er sowohl Zeichen als auch Enitätenreferenzen finden kann. < verliert hier zwar auch seine besondere Bedeutung, doch & wird weiterhin als Anfang einer Entität interpretiert.

Nützlich ist das CDATA-Modell vor allem dann, wenn es darum geht Texte eins-zu-eins zu übernehmen, in denen < und & gehäuft auftreten. Zwar kann man solche Texte überarbeiten und jedes < durch ein &lt; und jedes & durch ein &amp; ersetzen, doch es wird in den meisten Fällen einfacher sein, für den betreffenden Text CDATA als Inhaltsmodell festzulegen. Ein SGML-Parser wird dann, sobald er auf < oder & trifft, diese als Zeichen in einem Text betrachten.

Anmerkung: Bei der Verwendung von CDATA und RCDATA als Inhaltsmodell für SGML-Beispiele, wie sie in diesem Dokument enthalten sind, muss bedacht werden, dass der Inhalt eines CDATA-Bereiches nicht validiert wird. dass das SGML in diesen Bereichen gültig ist, muss auf andere Weise sichergestellt werden. Denkbar ist beispielsweise, es in einem separaten Dokument zu erstellen, dort zu prüfen und erst dann in das eigentliche Dokument einzufügen.

Beispiel 3-15. CDATA als Inhaltsmodell für markierte Bereiche

<para>Das ist ein Beispiel, wie man einen Text,
  der viele &lt;- und &amp;-
  Entitäten enthält, in ein Dokument einbinden kann.
  Das Beispiel selbst, das sich innerhalb des markierten Bereiches befindet,
  ist ein HTML-Fragment. Der diesen Text umschließende Tag, beginnend mit
  mit <para> und endend mit </para>, stammt aus der DocBook DTD.</para>

<programlisting>
  <![ RCDATA [  
    <p>Dieses Beispiel demonstriert die Verwendung von HTML-Elementen.
      Da spitze Klammern so oft vorkommen, ist es einfacher, das
      gesamte Beispiel als CDATA Abschnitt auszuweisen, als die
      entsprechenden Entit&auml;ten zu nutzen.</p>

    <ul>
      <li>Das ist ein Listenelement.</li>
      <li>Das ist ein zweites Listenelement.</li>
      <li>Das ist ein drittes Listenelement.</li>
    </ul>

    <p>Und das hier, das ist das Ende des Beispiels.</p>
  ]]>
</programlisting>

Liest man die Quellen dieser Fibel, wird man feststellen, dass diese Technik durchgängig angewandt wurde.


3.8.1.2. INCLUDE und IGNORE

Das Schlüsselwort INCLUDE legt fest, dass der Inhalt des betreffenden Abschnittes mitverarbeitet wird. Demgegenüber bestimmt IGNORE, dass er ignoriert wird, dass heißt, dass er bei der Verarbeitung übergangen wird und in der Ausgabe nicht enthalten ist.

Beispiel 3-16. Anwendung von INCLUDE und IGNORE in markierten Abschnitten

<![ INCLUDE [
  Dieser Text wird verarbeitet und eingebunden.
]]>

<![ IGNORE [
  Dieser Text wird weder verarbeitet noch eingebunden.
]]>

Für sich alleine ist IGNORE als Anweisung nicht besonders nützlich, da ein Bereich, der von der Verarbeitung ausgenommen sein soll, auch auskommentiert werden kann.

Kombiniert man IGNORE hingegen mit Parameterentitäten, steht so ein Weg zur Verfügung, um dessen Anwendung besser steuern zu können. Zwar können Parameterentitäten nur in einem SGML-Kontext einsetzt werden, da aber markierte Bereiche ebenfalls SGML-Konstrukte sind, ist diese Einschränkung irrelevant.

Soll beispielsweise ein und dasselbe Dokument in zwei unterschiedlichen Varianten produziert werden, einer gedruckten und einer digitalen, und soll nur die digitale zusätzliche Informationen enthalten, kann dies mit einem Trick erreicht werden.

Man definiert eine Parameterentität, der man als Wert die Zeichenkette INCLUDE zuweist und deklariert den betreffenden Bereich, der nur in der digitalen Variante erscheinen soll, als markierten Abschnitt und setzt als Schlüsselwort die zuvor definierte Parameterentität ein.

Soll anstelle der digitalen die gedruckte Variante produziert werden, muss lediglich der Entität IGNORE als Wert zugewiesen und das Ursprungsdokument erneut durch den SGML-Prozessor geschickt werden.

Beispiel 3-17. Kontrolle von markierten Bereichen über Parameterentitäten

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0//EN" [
<!ENTITY % digitale.kopie "INCLUDE">
]]>

...

<![ %digitale.kopie [
  Dieser Satz sollte nur in der digitalen Version enthalten sein.
]]>

Bei der Produktion der gedruckten Variante muss der Wert der Entität geändert werden.

<!ENTITY % digitale.kopie "IGNORE">

Bei der Verarbeitung wird als Schlüsselwort in beiden Fällen der von %digitale.kopie repräsentierte Wert verwendet. Im ersten Fall wird der Inhalt des markierten Bereichs mitverarbeitet, im zweiten Fall nicht.


3.8.2. Fingerübung...

  1. Legen Sie eine neue Datei abschnitt.sgml an, die folgenden Inhalt hat:

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0//EN" [
    <!ENTITY % text.ausgabe "INCLUDE">
    ]>
    
    <html>
      <head>
        <title>Ein Beispiel mit markierten Abschnitten</title>
      </head>
    
      <body>
        <p>Dieser Absatz <![ CDATA [beinhaltet viele <
          Zeichen (< < < < <). Weshalb es einfacher ist,
          ihn als CDATA Bereich auszuweisen. ]]></p>
    
        <![ IGNORE [
        <p>Dieser Absatz wird NICHT in der Ausgabe enthalten sein.</p>
        ]]>
    
        <![ %text.ausgabe [
         <p>Dieser Absatz wird in Abhängigkeit von %text.ausgabe
           mitausgegeben.</p>
        ]]>
      </body>
    </html>
    
  2. Normalisieren Sie den Inhalt dieser Datei mit Hilfe von sgmlnorm und sehen Sie sich das Ergebnis an. Achten Sie dabei darauf, welche Absätze enthalten beziehungsweise nicht enthalten sind und was aus den CDATA-Bereichen geworden ist.

  3. Ändern Sie die Definition von text.ausgabe so, dass es den Wert IGNORE zugewiesen bekommt. Verarbeiten Sie dann die Datei erneut mit sgmlnorm und vergleichen die Ausgabe mit der vom ersten sgmlnorm Lauf.


3.9. Schlußbemerkung

Aus Platzgründen, und um der Verständlichkeit Willen, wurden viele Gesichtspunkte nicht in aller Tiefe beziehungsweise gar nicht besprochen. Trotzdem sollte in den bisherigen Kapiteln genügend Wissen über SGML vermittelt worden sein, um den Aufbau der Dokumentation des FDPs zu verstehen.


Kapitel 4. SGML-Dokumente erstellen

In diesem Kapitel werden die beiden vom FDP eingesetzen Auszeichnungssprachen HTML und DocBook behandelt. Hierbei beschränkt sich dieses Kapitel auf die Elemente, die bei der täglichen Arbeit am ehesten zum Einsatz kommen werden.

Beide Sprachen besitzen eine große Anzahl von Elementen. Das erschwert es, das richtige Element in der richtigen Situation auszuwählen. Aus diesem Grund werden zu jedem Element auch immer Beispiele angeboten, die den richtigen Einsatz des Elements verdeutlichen sollen.

Es ist nicht das Ziel dieses Kapitels möglichst viele Elemente beider Sprachen zu behandeln - dies wäre nur eine Wiederholung der eigentlichen Sprachreferenz. Sofern es Unklarheiten zur Verwendung einzelner Elemente und Auszeichnung von bestimmten Sachverhalten gibt, können diese an FreeBSD documentation project geschickt werden.

Fluß- kontra Blockelemente: Wenn im folgenden von Flußelementen die Rede ist, sind damit Elemente gemeint, die in einem Blockelement auftreten können und keinen Zeilenumbruch hervorrufen. Blockelemente hingegen erzeugen unter anderem einen Zeilenumbruch[11].


4.1. HTML

HTML, die HyperText Markup Language, ist die Auszeichnungssprache des Internets. Weitere Informationen zu HTML finden sich unter http://www.w3.org/.

Sie kommt bei der Erstellung der Webseiten des FreeBSD-Projektes zum Einsatz. Für technische Dokumentationen sollte HTML jedoch nicht eingesetzt werden, da DocBook eine größere und bessere Auswahl an Elementen bietet. Folglich sollte HTML nur für die FreeBSD-Webseiten verwendet werden.

Die HTML-Spezifikation liegt bis jetzt in mehreren Versionen vor: 1, 2, 3.0, 3.2 und (die aktuelle) 4.0. Von letzterer existieren zwei Varianten: “streng” (HTML 4.0 Strict) und “locker” (HTML 4.0 Transitional).

Die HTML-DTDs sind über den Port textproc/html verfügbar und werden automatisch als Teil des Metaports textproc/docproj mitinstalliert.


4.1.1. Formale Öffentliche Bezeichner

Da es mehrere Version von HTML gibt, existieren auch mehrere FÖPs, zu denen ein HTML-Dokument konform erklärt werden kann. Die Mehrzahl der sich auf der FreeBSD-Webseite befindenen HTML-Seiten sind zu der lockeren Version von HTML 4.0 konform.

PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"

4.1.2. Die Elemente <head> und <body>

Ein HTML-Dokument unterteilt sich normalerweise in zwei Bereiche: “head” und “body”. Der Kopf (head) enthält Metadaten wie den Dokumententitel und Angaben zum Autor. Der Rumpf (body) umfaßt den eigentlichen Dokumenteninhalt, der für den Leser bestimmt ist. In einem HTML-Dokument werden diese Bereiche über die Elemente <head> und <body> voneinander abgegrenzt. Beide sind Kinder des Wurzelelementes <html>.

Beispiel 4-1. Die Struktur eines HTML-Dokumentes

<html>
  <head>
    <title>Der Dokumententitel</title>
  </head>

  <body>

    ...

  </body>
</html>

4.1.3. Blockelemente

4.1.3.1. Überschriften

HTML kennt sechs verschiedene Elemente, mit denen Überschriften ausgezeichnet werden können. Das bekannteste Element ist <h1>, das sich am Anfang der Überschriftenhierarchie befindet. <h1> folgen die Überschriftenelemente <h2> bis <h6>. Der Inhalt von <hN> stellt den Text der Überschrift dar.

Beispiel 4-2. <h1>, <h2>...

Fügen Sie in eine der existierenden Übungsdateien folgendes ein:

<h1>Erstes Kapitel</h1>

<!-- Hier steht die Einführung -->

<h2>Das ist die Überschrift des ersten Kapitels</h2>

<!-- Hier steht der Inhalt des ersten Kapitels -->

<h3>Das ist die Überschrift des ersten Unterkapitels</h3>

<!-- Hier steht der Inhalt des ersten Unterkapitels -->

<h2>Das ist die Überschrift des zweiten Kapitels</h2>

<!-- Hier steht der Inhalt des zweiten Kapitels -->

Eine HTML-Seite sollte immer nur eine Überschrift <h1> haben. Dieser Überschrift können beliebig viele Kapitel mit einer Überschrift <h2> folgen, die selbst wiederum eine beliebige Anzahl von Kapiteln mit einer Überschrift <h3> enthalten können. Diese Verschachtelung setzt sich bis zu Kapiteln mit einer <h6>-Überschrift fort. Es sollte vermieden werden, Elemente in der Überschriftenhierarchie auszulassen.

Beispiel 4-3. Falsche Verschachtelung von Überschriften

Fügen Sie in eine der existierenden Übungsdateien folgendes ein:

<h1>Erstes Kapitel</h1>

<!-- Allgemeines zum Dokument -->

<h3>Unterkapitel</h3>

<!-- h3 folgt direkt auf h1. h2 wurde ausgelassen -->

4.1.3.2. Absätze

Absätze können in HTML mit Hilfe des Elementes <p> ausgezeichnet werden.

Beispiel 4-4. Absätze mit dem Element <p>

Fügen Sie in eine der existierenden Übungsdateien folgendes ein:

<p>Das hier, das ist ein Absatz. Absätze können
  andere Elemente enhalten.</p>

4.1.3.3. Blockzitate

Ein Blockzitat ist ein etwas umfangreicheres Zitat aus einem anderen Text, das nicht zum aktuellen Absatz gehört.

Beispiel 4-5. Blockzitat

Fügen Sie in eine der existierenden Übungsdateien folgendes ein:

<blockquote>
  <p>Artikel 1: Menschenwürde; Grundrechtsbindung der
    staatlichen Gewalt</p>

  <ol>
    <li>
      <p>Die Würde des Menschen ist unantastbar. Sie zu achten
        und zu schützen ist Verpflichtung aller staatlichen
        Gewalten.</p>
    </li>
    <li>
      <p>Das Deutsche Volk bekennt sich darum zu unverletzlichen
        und unveräußerlichen Menschenrechten als Grundlage jeder
        menschlichen Gemeinschaft, des Friedens und der
        Gerechtigkeit in der Welt.</p>
    </li>
    <li>
      <p>Die nachfolgenden Grundrechte binden Gesetzgebung,
        vollziehende Gewalt und Rechtsprechung als
        unmittelbar geltendes Recht.</p>
    </li>
  </ol>
</blockquote>

4.1.3.4. Listen

HTML kennt drei Arten von Listen: sortierte, unsortierte und Definitionslisten. Ein Eintrag in einer sortierten Liste wird üblicherweise mit einer Nummer versehen, Einträge in unsortierten Listen hingegen mit einem Aufzählungspunkt. Definitionslisten wiederum bestehen aus zwei Teilen: Der erste enthält den Begriff der definiert werden soll und der zweite dessen Erläuterung.

Sortierte Listen werden mit dem Element <ol> (für ordered list) ausgezeichnet, unsortierte Listen mit <ul> (für unordered list) und Definitionslisten mit <dl>.

Listenpunkte sortierter und unsortierter Listen werden mit dem Element <li> ausgezeichnet, welches Text oder andere Blockelemente enthalten kann. Begriffe, die in einer Definitionslisten enthalten sind, werden mit dem Element <dt> (für definition term) ausgezeichnet. Die Erklärung zu diesem Begriff wird mit Hilfe des Elementes <dd> (für definition description) markiert. So wie <li>, kann das Element <dd> ebenfalls andere Blockelemente aufnehmen.

Beispiel 4-6. Listen mit <ul> und <ol> erstellen

Fügen Sie in eine der existierenden Übungsdateien folgendes ein:

<p>Jetzt folgt eine unsortierte Liste. Wahrscheinlich werden
  die einzelnen Einträge mit einem vorangehenden Punkt dargestellt.</p>

<ul>
  <li>Erster Eintrag</li>

  <li>Zweiter Eintrag</li>

  <li>Dritter Eintrag</li>
</ul>

<p>Die zweite Liste ist sortiert und ihre Einträge bestehen aus mehreren Absätzen.
  Jeder Listeneintrag ist nummeriert.</p>

<ol>
  <li><p>Das ist der erste Eintrag mit nur einem Absatz.</p></li>

  <li><p>Das ist der erste Absatz des zweiten Eintrags.</p>

    <p>Und das ist der zweite Absatz des zweiten Eintrags.</p></li>

  <li><p>Der dritte Eintrag besteht ebenfalls nur aus einem Eintrag.</p></li>
</ol>

Beispiel 4-7. Definitionslisten mit <dl> erstellen

Fügen Sie in eine der existierenden Übungsdateien folgendes ein:

<dl>
  <dt>Erster Begriff</dt>

  <dd><p>Erster Absatz der Erklärung</p>

    <p>Zweiter Absatz der Erklärung.</p></dd>

  <dt>Zweiter Begriff</dt>

  <dd><p>Erster Absatz der Erklärung.</p></dd>

  <dt>Dritter Begriff</dt>

  <dd>Erster Absatz der Erklärung zum dritten Begriff.</dd>
</dl>

4.1.3.5. Vorformatierter Text

In einigen Fällen ist es gewollt, dass die Formatierung eines Textes im Quelldokument erhalten bleibt, damit der Leser diesen genau so sieht, wie ihn der Autor erstellt hat. In der HTML-Spezifikation ist dafür das Element <pre> vorgesehen, welches dafür sorgt, dass Zeilenumbrüche erhalten bleiben und Leerzeichen nicht zusammengefaßt werden. Browser verwenden für den Inhalt des Elementes <pre> üblicherweise eine Fixschrift.

Beispiel 4-8. Vorformatierten Text mit <pre> erstellen

Der Originaltext einer E-Mail läßt sich beispielsweise wie folgt einbinden:

<pre>  From: nik@FreeBSD.org
  To: freebsd-doc@FreeBSD.org
  Subject: Neue Version verfügbar

  Es ist eine neue Version der Fibel für neue Mitarbeiter am
  FreeBSD-Dokumentationsprojekt verfügbar:

    <URL:http://people.FreeBSD.org/~nik/primer/index.html>

  Kommentare und Anmerkungen sind willkommen.

  N</pre>

Beachten Sie, dass < und & nach wie vor als Sonderzeichen erkannt werden. Daher wird in diesem Beispiel auch &lt; an Stelle von < verwendet. Aus dem gleichen Grund wurde auch &gt; an Stelle von > verwendet. Achten Sie also stets auf Sonderzeichen, wenn Sie normalen Text aus E-Mails, Programmcode oder einer anderen Quelle kopieren.


4.1.3.6. Tabellen

Anmerkung: Die meisten Textbrowser, beispielsweise Lynx, können Tabellen nicht besonders gut darstellen. Deshalb sollten Auszeichnungsalternativen in Betracht gezogen werden, um eine angemessene Darstellung sicherzustellen.

Tabellen lassen sich in HTML mit Hilfe des Elements <table> auszeichnen. Eine Tabelle setzt sich aus einer oder mehreren Zeilen (<tr>) zusammen, von denen jede mindestens eine Zelle (<td>) enthält. Zellen können wiederum andere Blockelemente, wie Absätze oder Listen, enthalten. Auch können sie auch andere Tabellen aufnehmen, wobei die Verschachtelungs