Tabellen

Das Thema Tabellen ist sicherlich das umfassendste und komplizierteste Thema im Bezug auf DocBook. Da dieses Thema jedoch im Vergleich zu Tabellen in HTML von geringerer Wichtigkeit und höherer Kompliziertheit ist, verzichte ich darauf hier in voller Gänze darauf einzugehen, sondern werde nur die Grundlagen und einige Praxisbeispiele anbringen.

DocBook nutzt das CALS-Tabellenmodell

DocBook verwendet das CALS-Tabellen-Modell. Tiefergehende Informationen zu diesem Modell findet man auf den OASIS-Webseiten, in der CALS Table Model Document Type Definition.

Wie auch bei Beispielen und Abbildungen können Tabellen einen Titel haben, dann erstellt man sie mit table, oder auch nicht, dann benutzt man informaltable. Das table-Element kann mehrere, jedoch mindestens einen tgroup enthalten, in denen der eigentliche Tabelleninhalt angegeben wird.

Anmerkung

Eine formelle Tabelle (table) kann aus mehreren Tabellenkörpern (tgroup) bestehen

Tabellen unterstützen verschiedene Umrandungsmodi

Die Darstellung einer Tabelle kann man über verschiedene Attribute steuern. Wenn man den Wert von colsep auf „1“ setzt, so werden die Spalten der Tabelle durch Linien getrennt. Gleiches gilt analog für die Zeilen und das Attribut rowsep. Mit dem Attribut frame kann die äußere Umrandung der Tabelle gesteuert werden. Der Wert „all“ bedeutet, dass um die gesamte Tabelle vier Linien gezogen werden, „none“ unterdrückt jede Umrandung, „top“ erzeugt eine Linie oben, „bot“ eine Linie unten, „topbot“ eine Linie oben und eine unten und mit dem Wert „sides“ werden Linien links und rechts der Tabelle gezogen.

Weitere wichtige Attribute, die identisch zu der Behandlung von Abbildungen sind, sind label (Zeichenkette zur Präsentation) und pgwide (Darstellung außerhalb der Spalte). Mit dem Attribut orient kann man die Orientierung der Tabelle angeben, wobei „land“ für landscape, also Querformat und port für portrait, also Hochformat steht.

Der Tabellenkörper

Tabellen haben Kopf, Rumpf und Fuß

Das Element tgroup stellt einen Container für den eigentlichen Inhalt der Tabelle dar. Dessen Inhalt wiederum besteht aus Spezifikationen für die Spalten der Tabelle und das Verschmelzen von Spalten (dazu später mehr), einen optionalen Tabellenkopf thead, einem optionalen Tabellenfuß tfoot und einem obligatorischen Tabellenrumpf. Die Elemente für Tabellenkopf, -Rumpf und -Fuß sind vom Inhalt her identisch daher gehe ich nur auf tbody ein.

Die Attribute colsep und rowsep sind schon von table bekannt und sie haben hier die gleiche Wirkung. Neu und unbedingt erforderlich ist das Attribut cols, welches die Zahl der Spalten angibt.

Der Tabellenrumpf tbody enthält eine Reihe von Zeilen (row) welche wiederum zwei Arten von Einträgen für die Zellen enthalten können. Die erste Variante, entry ist eine einfache Tabellenzelle, in der Text stehen kann, aber auch andere Block- und Inline-Elemente. Die zweite Variante, entrytbl, bedeutet schlichtweg, dass der Eintrag wiederum aus einer neuen Tabelle besteht.

Beispiel 2.26. Eine einfache Tabelle

<!DOCTYPE table PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
          "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd">
<table frame="none">
  <title>
    DNS-Tabelle
  </title>
  <tgroup>
    <thead>
      <row>
        <entry>
          Rechnername
        </entry>
        <entry>
           IP-Adresse
        </entry>
      </row>
    </thead>
    <tbody>
      <row>
        <entry>
          www.google.com
        </entry>
        <entry>
           216.239.39.101
        </entry>
      </row>
      <row>
        <entry>
          www.docbook.org
        </entry>
        <entry>
           206.72.196.15
        </entry>
      </row>
      <row>
        <entry>
          www.hpi.uni-potsdam.de
        </entry>
        <entry>
           141.89.225.98
        </entry>
      </row>
    </tbody>
  </tgroup>
</table>

Das Beispiel sieht im Dokument folgendermaßen aus:

Tabelle 2.1. DNS-Tabelle

RechnernameIP-Adresse
www.google.com216.239.39.101
www.docbook.org206.72.196.15
www.hpi.uni-potsdam.de141.89.225.98

Verbinden von Zeilen und Spalten

Unter Umständen besteht der Bedarf, dass eine Tabellenzelle den Raum mehrerer Zellen umfasst. Wenn dies der Fall ist, so muss zuerst definiert werden, welche Spalten die Tabelle überhaupt hat. Man verwendet dazu das Element colspec, welches in das Element tgroup, noch vor allen anderen Elementen eingefügt wird. Das Element colspec muss exakt so oft auftreten, wie der Wert des Attributs cols des Elements tgroup vorgibt. Außerdem können die einzelnen thead, tbody und tfoot ebenfalls colspec enthalten, wenn für die einzelnen Bereiche eine andere Formatierung erwünscht ist.

Um Zellen zu verbinden, muss die Aufteilung der Spalten bekannt sein

Das Element colspec ist leer, allein seine Attribute sind von Interesse. Von besonderer Wichtigkeit ist zum einen das Attribut colnum. Es gibt an, auf welche Tabellenspalte man sich bezieht. Wenn man die Angabe dieses Attributs weglässt, so ist die Spaltennummer um eins höher als colnum der vorhergegangenen Definition. Wenn es keine solche Definition gibt, so ist die Spaltennummer gleich eins. Zum anderen von Interesse ist das Attribut colname, weil auf den Wert dieses Attributs verwiesen wird, um zwei Zellen zu verbinden.

Verbinden von Zellen über Zeilengrenzen. 

Überschriebene Zellen werden weggelassen

Diese Aufgabe ist denkbar einfach. Dem entry-Element der betreffenden Zelle wird das Attribut morerows verliehen, der Wert gibt an, wie viele Zeilen die Zelle zusätzlich übergreifen soll. Die entry-Tags die dort erscheinen würden, wo jetzt die vergrößerte Zelle hinreicht, werden weggelassen.

Beispiel 2.27. Zeilenübergreifende Verbindung

<!DOCTYPE table PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
          "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd">
<table frame="none">
  <title>
    DNS-Tabelle
  </title>
  <tgroup>
    <thead>
      <row>
        <entry>
          Rechnername
        </entry>
        <entry>
           IP-Adresse
        </entry>
      </row>
    </thead>
    <tbody>
      <row>
        <entry>
          sourceforge.net
        </entry>
        <entry morerows="1">
          66.35.250.203
        </entry>
      </row>
      <row>
        <entry>
          sf.net
        </entry>
      </row>
      <row>
        <entry>
          www.google.com
        </entry>
        <entry>
           216.239.39.101
        </entry>
      </row>
      <row>
        <entry>
          www.docbook.org
        </entry>
        <entry>
           206.72.196.15
        </entry>
      </row>
      <row>
        <entry>
          www.hpi.uni-potsdam.de
        </entry>
        <entry>
           141.89.225.98
        </entry>
      </row>
    </tbody>
  </tgroup>
</table>

Das Beispiel sieht im Dokument folgendermaßen aus:

Tabelle 2.2. DNS-Tabelle

RechnernameIP-Adresse
sourceforge.net66.35.250.203
sf.net
www.google.com216.239.39.101
www.docbook.org206.72.196.15
www.hpi.uni-potsdam.de141.89.225.98

Verbinden von Zellen über Spaltengrenzen. 

Überschriebene Zellen werden weggelassen

Um Zellen über Spaltengrenzen zu verbinden, gibt man dem entry-Element das Attribut namest, welches als Wert eine Referenz auf die Spalte hat, in der die übergreifende Zelle beginnen soll. Das Attribut nameend referenziert die Spalte, in der die übergreifende Zelle enden soll. Die entry-Tags aller überschriebenen Zellen werden weggelassen.

Beispiel 2.28. Spaltenübergreifende Verbindungen

<!DOCTYPE table PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
          "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd">
<table frame="none">
  <title>
    DNS-Tabelle
  </title>
  <tgroup>
    <colspec colname="name" />
    <colspec colname="ip" />
    <thead>
      <row>
        <entry>
          Rechnername
        </entry>
        <entry>
           IP-Adresse
        </entry>
      </row>
    </thead>
    <tbody>
      <row>
        <entry namest="name" nameend="ip">
          www.dokbuk.de konnte nicht aufgelöst werden
        </entry>
      </row>
      <row>
        <entry>
          www.google.com
        </entry>
        <entry>
           216.239.39.101
        </entry>
      </row>
      <row>
        <entry>
          www.docbook.org
        </entry>
        <entry>
           206.72.196.15
        </entry>
      </row>
      <row>
        <entry>
          www.hpi.uni-potsdam.de
        </entry>
        <entry>
           141.89.225.98
        </entry>
      </row>
    </tbody>
  </tgroup>
</table>

Das Beispiel sieht im Dokument folgendermaßen aus:

Tabelle 2.3. DNS-Tabelle

RechnernameIP-Adresse
www.dokbuk.de konnte nicht aufgelöst werden
www.google.com216.239.39.101
www.docbook.org206.72.196.15
www.hpi.uni-potsdam.de141.89.225.98

Ausrichtung von Inhalten und Formatierung von Tabellen

Tabellenzellen können individuell formatiert werden

Die Ausrichtung einer Tabelle oder Tabellenzelle kann mittels des Attributs align bestimmt werden. Das Attribut akzeptiert die Werte „center“ für zentriert, „left“ und „right“ für links und rechts, „justify“, um Blocksatz zu erzwingen und „char“, um eine Ausrichtung am Dezimalpunkt von Zahlen zu erreichen. Das Attribut „align“ kann in folgenden Elementen verwendet werden: tgroup (wenn es sich auf die gesamte Tabelle bezieht), colspec (wenn es sich auf eine ganze Spalte bezieht) und entry, wenn es sich auf eine einzelne Zelle bezieht.

Um die vertikale Ausrichtung zu bestimmen, gibt es in den Elementen entry, tbody, thead, tfoot das Attribut valign, welches die Werte „bottom“ (unten) „middle“ (in der Mitte) und „top“ (oben) annehmen kann. Das Element entry gestattet weiterhin die Benutzung der Attribute rowsep und colsep, um eine Trennung zur nächsten Zeile bzw. rechten Nachbarzelle zu fordern. Durch Setzen des Attributs rotate auf 1 kann weiterhin der Inhalt der Zelle um 90° gedreht werden, was jedoch nicht alle Zielmedien unterstützen.