Textausrichtung (nicht nur) für Word-Umsteiger

Vor einiger Zeit fragte mich ein Bekannter, ob man in auch so viel mit Tabellen arbeitet, um Text zu positionieren, wie in Word – wobei es im Kern der Frage vor allem auch darum ging, ob die Tabelle immer das beste Mittel ist und ob es für die verschiedenen Anforderungen nicht einfacher geht. In diesem Sinne beschäftig sich das Bespiel für den April mit verschiedenen Möglichkeiten, Text und andere Seitenelemente auszurichten.

Ich bat um ein Beispieldokument aus Word, das typische Anwendungsfälle für Tabellen in Word zeigt und das in der ZIP enthalten ist. Diese Anwendungsfälle wollen wir im Folgenden aufgreifen und nach Umsetzungsmöglichkeiten in suchen. Dazu werden wir die Word-Vorlage in nachbauen.

Datei ausrichtung.tex

Um die Word-Vorlage umzusetzen, legen wir die Datei ausrichtung.tex mit der folgenden Präambel an. In der Umsetzung ignorieren wir der Einfachheit halber allerdings die Einstellungen zu Seitenrändern und Schriften.

Als erstes laden wir die Klasse (FAQ 2) und die üblichen Pakete zur Kodierung (FAQ 3) und Sprach- (FAQ 5) sowie Schrifteinstellung (FAQ 4).

\documentclass[ngerman]{scrartcl}
 
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{babel}

Kopf- und Fußzeilen

„Die Kopf- und Fußzeile verwenden übrigens auch Tabellen. Zum einen wird die Information dadurch schön ausgerichtet, zum anderen kann man damit auf einfache Weise eine Linie zeichnen, die Kopf- und Fußzeile vom Text trennt.“

Die Kopf- und Fußzeilen stellen wir über das Paket scrlayer-scrpage ein, das wir im November 2015 kennen gelernt haben. Der Einsatz von Tabellen ist hier nicht notwendig, da das Paket bereits eine eingebaute Möglichkeit hat, die verschiedenen Bereiche einer Kopf- oder Fußzeile anzusprechen.

Neben scrlayer-scrpage laden wir auch das Paket lastpage, um die Gesamtseitenzahl ausgeben zu können, sowie das Paket currfile mit der Option abspath, für die Ausgabe des Dateipfades.

\usepackage{scrlayer-scrpage}
\usepackage{lastpage}
\usepackage[abspath]{currfile}

Nachdem wir mit \clearpairofpagestyles die Voreinstellungen gelöscht haben, setzen wir mit \ihead etc. die einzelnen Elemente. Damit \currfileabspath funktioniert, müssen wir pdflatex mit der Option -recorder ausführen (siehe dazu die Paketanleitung).

\clearpairofpagestyles
\ihead{Titel des Dokumentes}
\chead{Autor des Dokumentes}
\ohead{Seite \thepage\ von \pageref{LastPage}}
\ifoot{\currfileabspath}

Die Schrift der Fußzeile setzen wir mit \setkomafont auf eine kleinere Größe und eine Schreibmaschinenschrift.

\setkomafont{pagefoot}{\footnotesize\ttfamily}

Zuletzt aktivieren wir noch die Trennlinien zwischen Kopf- bzw. Fußzeile und Seiteninhalt.

\KOMAoptions{%
   headsepline,
   footsepline,
}
\begin{document}

Pakete für Tabellen und Abbildungen

Für die Tabellen im Dokument laden wir diese beiden Pakete.

\usepackage{tabularx}
\usepackage{booktabs}

Damit wir die Gleitumgebungen {table} und {figure} am Gleiten hindern können, laden wir float, das uns u. a. den Gleitparameter H zur Verfügung stellt.

\usepackage{float}

Um Unterabbildungen bequem bezeichnen zu können, verwenden wir später den Befehl \subcaption aus dem gleichnamigen Paket, das wir hier laden.

\usepackage{subcaption}

Als letztes Paket laden wir graphicx, um externe Bilder einbinden zu können.

\usepackage{graphicx}

Begriffe und Abkürzungen, Teil 1

Um ein Glossar zu erstellen, können wir manuell vorgehen und eine {description}-Umgebung verwenden (s. u.). Alternativ wollen wir uns hier noch mit der automatisierten Lösung befassen, die das Paket glossaries bietet. Wir werden das Paket hier nur sehr knapp besprechen, für weitere Fragen sei auf The glossaries package v4.21: a guide for beginners und natürlich die Paketanleitung verwiesen.

Beim Laden des Paketes benutzen wir die Optionen nopostdot, um den automatischen Punkt am Ende der Begriffserklärung zu unterdrücken, und nonumberlist, um die Seitenzahlenangaben in der Liste abzuschalten.

\usepackage[%
   nopostdot,
   nonumberlist,
]{glossaries}

Um die Begriffe und Abkürzungen zu definieren, stellt glossries u. a. den Befehl \newglossaryentry zur Verfügung. Dabei müssen wir ein Kürzel für den Begriff angeben, mit dem wir später im Text auf den Begriff verweisen wollen und dann können wir den Begriff selbst (name) und seine Definition (description) angeben.

\newglossaryentry{gnu}{
   name = GNU,
   description = {Gnu is not Unix},
}
\newglossaryentry{ab}{
   name = AB,
   description = {Anrufbeantworter},
}
\newglossaryentry{hp}{
   name = HP,
   description={Homepage},
}
\newglossaryentry{hrkind}{
   name = Hurenkind,
   description = {%
      Letzte Zeile eines Absatzes, wenn sie zugleich die
      erste einer neuen Seite oder Spalte ist.%
   },
}

Um eine Liste aller verwendeten Begriffe zu generieren verwenden wir \makenoidxglossaries. Die Liste wird dann von nach den englischen Regeln sortiert. Für höhere Anforderungen könnten wir glossaries aber auch zusammen mit makeindex oder xindy verwenden.

\makenoidxglossaries

Strukturierte Informationen, Teil 1

„Tabellen werden bei Word gerne eingesetzt, um viel Information, die immer gleich strukturiert ist, in immer gleicher Formatierung darzustellen.“

Für diesen Anwendungsfall könnten wir in auch mit einer Tabelle arbeiten, grundsätzlich ist es aber wesentlich praktischer, wenn wir uns einen eigenen Befehl definieren, um die Formatierung durchzuführen. Dadurch sind wir absolut flexibel, wenn wir später die Darstellung der Informationen ändern wollen.

Natürlich spricht nichts dagegen, in der eigenen Definition auch mit Tabellen zu arbeiten! Es geht nur darum, die Formatierung nicht direkt im Dokument vorzunehmen – also nicht hard zu coden –, um flexibel zu bleiben.

Hier im Beispiel wollen wir zwei verschiedene Definitionen anschauen, von denen wir eine auskommentieren müssen, damit es beim Kompilieren keine Fehler gibt. Beide Darstellungsformen sind nicht besonders ausgearbeitet, erfüllen für das Beispiel aber ihren Zweck.

Die erste Definition ist recht einfach (zu \newcommand siehe FAQ 10) und verwendet \minisec, um die Nummer sowie die Bezeichnung der Phase zu formatieren.

\newcommand{\phase}[3]{%
   \minisec{#1 -- \textit{#2}}
   #3
}

Die alternative Definition ist etwas komplexer:

\newcommand{\phase}[3]{%

Um die Wirkung der Schriftänderung zu begrenzen, verwenden wir eine Gruppe (FAQ 7).

   {%

Dann stellen wir mit \par sicher, dass wir den vorhergehenden Absatz abschließen, setzen den Einzug für alle Absätze in dieser Gruppe auf Null und fügen einen vertikalen Abstand ein.

      \par
      \setlength{\parindent}{0pt}
      \vspace{10mm}

Als nächstes fügen wir eine vertikale Linie und noch etwas Abstand ein.

      \hrule
      \vspace{1mm}

Mit \bfseries schalten wir auf die fette Schrift um und setzen dann die Nummer der Phase (#1) in einer Box der Breite 15mm ([15mm]) links ausgerichtet ([l]) und dann den Namen der Phase (#2).

      \bfseries
      \makebox[15mm][l]{#1}#2

Mit \par beginnen wir einen neuen Absatz für die Artefakte der Phase (#3), die wir nicht fett, aber kursiv darstellen wollen.

      \par
      \mdseries\itshape
      #3

Zuletzt beenden wir auch diesen Absatz und fügen noch etwas Abstand und eine weitere Linie ein.

      \par
      \vspace{1mm}
      \hrule
 

Ende der Gruppe und der Definition

   }%
}
\begin{document}

Titelseite

„Auf der Titelseite wird für die Information über Autor, Datum, Prüfer, usw. ebenfalls eine Tabelle eingesetzt, um die Texte aneinander auszurichten. Die Tabelle hat keine Rahmenlinien. Als Co-Autor fällt es schwer, hier eine Tabelle zu erkennen. Wenn man eine Information ergänzt oder löscht, „zerschießt“ man leicht die ursprüngliche Tabelle. Das geschieht umso leichter, wenn die Anzeige der Absatzmarken und Formatierungen ausgeschaltet ist.“

Das zuletzt angesprochene Problem kann in natürlich nicht auftreten, da hier Struktur/Inhalt (Code) und Layout/Darstellung getrennt sind und man eine Tabelle im Code sofort erkennt. Für die Umsetzung der Titelseite erinnern wir uns an das Beispiel aus dem Februar, in dem wir bereits über die Erstellung von Titelseiten gesprochen haben. Für die Anordnung des Informationsblocks nutzen wir in ebenfalls eine Tabelle. (Zu Tabellen siehe das Beispiel des letzten Monats)

Die Titelseite setzen wir in einer {titlepage}-Umgebung. Dadurch erhalten wir anders als in der Word-Vorlage auf dieser Seite auch keine Kopf- und Fußzeilen, was allerdings nicht unüblich ist.

Um die Abstände in der Tabelle zu erzeugen, verwenden wir einfach leere Zeilen.

\begin{titlepage}
   \centering
   \vspace*{10mm}
   Name der Hochschule\\
   Name der Fakultät
 
   \vspace{35mm}
   {
      \huge\bfseries
      Thema der Arbeit
      \par
   }
 
   \vspace{40mm}
   Abschlußarbeit zur Erlangung des akademischen Grades\\
   Bachelor of Engineering
 
   \vfill
   \begin{tabular}{ l l }
      Datum der Erstellung: & 2016-02-18 \\
      Dokumentennummer: & TUH-BA-2016-00010 \\
      & \\
      Vorgelegt von: & Bernd Mustermann \\
      Matrikelnummer: & 123 654 789 \\
      & \\
      Erstprüfer: & Prof. Dr. Franz Bauer \\
      Zweitprüfer: & Dr.-Ing. Peter Lustig \\
   \end{tabular}
\end{titlepage}

Verteiler und Änderungsübersicht

Den Verteiler setzen wir als Tabelle mit {tabularx} in einer {table}-Umgebung. Um das Gleiten zu verhindern und die Tabelle genau dort auszugeben, wo sie im Code steht, benutzen wir hier den Parameter H (aus float).

\begin{table}[H]
   \begin{tabularx}{\textwidth}{ X X X }
      \toprule
      Name & Organisation & Grund \\
      \midrule
      Bauer, Prof. Dr. Franz & Hochschulname & Prüfer \\
      Lustig, Dr.-Ing. Peter & Hochschulname & Prüfer \\
      Paschulke, Klaus & Hochschulname & Archiv \\
      \bottomrule
   \end{tabularx}
   \caption{Verteilerliste}
\end{table}

Den Parameter H sollte man allerdings nur in Ausnahmefällen verwenden und in der Regel die Positionierung der Gleitobjekte überlassen!

Für die Versionsübersicht verwenden wir ebenfalls eine Tabelle. Sofern diese Übersicht länger wird als eine Seite, müssten wir mit longtable arbeiten. Alternativ wäre es auch hier sinnvoll, einen eigenen Befehl zu definieren, um die Darstellung im Nachhinein schnell anpassen zu können oder Funktionen wie das Sortieren und Ein-/Ausblenden verschiedener Einträge hinzuzufügen. Das führt an dieser Stelle aber zu weit, weshalb wir es bei einer einfachen Tabelle belassen wollen.

\begin{table}[H]
   \begin{tabularx}{\textwidth}{ l l X X l }
      \toprule
      Version & Datum & Änderungsgrund & Geänderte Kapitel & Bearbeiter \\
      \midrule
      1 & 2016-02-18 & Ersterstellung & Alle & Bernd Mustermann \\
      \bottomrule
   \end{tabularx}
   \caption{Änderungsübersicht}
\end{table}

Begriffe und Abkürzungen, Teil 2

Um Begriffs- und/oder Abkürzungslisten darzustellen, müssen wir zuerst entscheiden, ob wir diese manuell anlegen, sortieren und verwalten wollen oder nicht. Im einfachsten Fall können wir dann mit einer {description}-Liste arbeiten. Für eine automatische Sortierung und weitere Annehmlichkeiten können wir bspw. mit glossaries arbeiten, dessen Verwendung wir oben schon vorbereitet haben. Ein weiteres in diesem Zusammenhang nützliches Paket, das wir aber nicht weiter besprechen wollen, ist acronyms.

Für die manuelle Lösung benutzen wir {description}. Innerhalb der Umgebung beginnt jeder Begriff mit \item und der Angabe des Begriffs in eckigen Klammern.

\begin{description}
   \item[GNU] Gnu is not Unix
   \item[AB] Anrufbeantworter
   \item[HP] Homepage
   \item[Hurenkind] Letzte Zeile eines Absatzes, wenn sie zugleich die erste
      einer neuen Seite oder Spalte ist
\end{description}

Wenn wir mit glossaries arbeiten, sollten wir die Begriffe im Fließtext konsequent mit \gls und ihrem Kürzel schreiben. Das Paket bietet dabei auch die Möglichkeit Pluralformen etc. zu definieren.

Die Einträge haben wir bereits ins der Präambel definiert und
können jetzt bspw. \gls{hrkind} verwenden.

Um die Liste aller mit \gls verwendeten Begriffe auszugeben, benutzen wir hier \printnoidxglossaries. Um alle definierten Begriffe auszugeben, könnten wir vor \printnoidxglossaries den Befehl \glsaddall aufrufen.

\printnoidxglossaries

Literaturverzeichnis

Um ein Literaturverzeichnis auszugeben, bietet uns von Haus aus mit {thebibliography} eine relativ rudimentäre Möglichkeit, die wir im Folgenden kurz betrachten werden. Für umfangreichere Verzeichnisse, automatische Sortierung, flexible Zitierstile und mehr sollte man das Paket biblatex zusammen mit biber verwenden.

Die Literaturliste geben wir in der Umgebung {thebibliography} an, wobei diese als Argument das längste Label erwartet. Das Label ist in unserem Fall einfach eine Nummer und da wir nur wenige Einträge haben, geben wir hier einfach eine Neun ein.

Vergleichen Sie die Ausgabe, wenn Sie anstelle von 9 bspw. ABCDE01 angeben.

\begin{thebibliography}{9}

Innerhalb der Umgebung beginnt jeder Eintrag mit \bibitem und der Angabe eines eindeutigen Schlüssels. Danach folgt jeweils der manuell formatierte Verzeichniseintrag. Zur besseren Übersicht schreiben wir hier Autor, Titel und Verlag/Jahr jeweils in eine eigene Zeile; diese werden in der Ausgabe aber wie gewöhnlich zu einem Absatz zusammengefasst.

   \bibitem{Wir03}
      R. Wirfs-Brock und A. McKean:
      Object Design. Roles, Responsibilities, and Collaboration,
      Addison-Wesley, 2002.
   \bibitem{Sch11}
      J. Schlosser:
      Wissenschaftliche Arbeiten schreiben mit \LaTeX. Leitfaden für Einsteiger,
      mitp Verlag, 2011
   \bibitem{Koh02}
      M. Kohm:
      \textit{Satzspiegelkonstruktionen im Vergleich.}
      In: Die TeXnische Komödie N/YYYY,
      DANTE e.\,V., 2002

Ende des Verzeichnisses

\end{thebibliography}

Wenn wir im Text auf eine Quelle verweisen wollen, verwenden wir den Befehl \cite und geben dabei den Zitierschlüssel an.

Das kann man auch in \cite{Sch11} nachlesen.

Bemerkung 1

„Ein interessanter Effekt: Verwendet man Tabellen wie in Kapitel 1 im Übermaß und wendet man konsequent auch Beschriftungen auf die Tabellen an, dann landen alle diese Tabellen im Tabellenverzeichnis. In diesem Fall sind die Tabellenbeschriftungen außerdem identisch mit den Überschriften. Viel Redundanz.“

Das Problem der Redundanz tritt in der -Version natürlich ebenso auf, wenn wir Überschriften und Tabellenbeschriftungen verwenden. Die naheliegende und sinnvolle Lösung ist, für die Tabellen für Verteiler und Änderungen auf die Beschriftung zu verzichten, so dass sie erstens keine zusätzliche Information enthält und zweitens auch nicht notwendig ist. Schließlich gleiten die Tabellen nicht und auf sie muss auch nicht über eine Nummer verwiesen werden (ein Verweis würde ggf. auf die zugehörige Abschnittsnummer erfolgen).

Bilder ausrichten

„Bilder lassen sich mit Hilfe von Tabellen leichter an der Stelle im Text fixieren, an der sie nach Meinung des Autors hingehören. Der Bildanker springt nicht wild umher, wie er es bei frei platzierten Bildern gerne macht. Außerdem kann man damit ‚schöne‘ Rahmen um das Bild zeichnen und sogar zwei Abbildungen nebeneinander mit einer Beschriftung versehen.“

Bilder an einer konkreten Stelle im Text zu fixieren sollte man in nach Möglichkeit vermeiden und stattdessen mit der Gleitumgebung {figure} arbeiten. Dadurch können die Bilder in der Ausgabe so verschoben werden, dass sich ein schönes Gesamtbild der Seite ergibt und Absätze nicht unbedingt zerrissen werden müssen. Im Text sollte man dann anstelle von Formulierungen wie „in der folgenden Abbildung“ auf die Nummer der Abbildung verweisen.

Um mehrere (Teil-)Abbildungen in einer Gleitumgebung zusammenzufassen, können wir {minipage}s verwenden. Einen einfachen Rahmen kann man bspw. mit \fbox{\includegraphics{...}} hinzufügen, so das denn wirklich gewünscht ist …

Für unsere Abbildung benutzen wir die Gleitumgebung {figure} mit den optionalen Platzierungsparametern h und b.

\begin{figure}[hb]

Um zwei Bilder nebeneinander anzuordnen, verwenden wir die Umgebung {minipage}, die sich wie auch {tabular} in die Zeile einfügt. Sie hat eine im optionalen Argument definierte Breite, aber eine vom Inhalt abhängige flexible Höhe.

Hier wollen wir zwei Bilder gleichmäßig nebeneinander anordnen, weshalb die beiden Umgebungen halb so breit sein sollen wie der Text. Dabei ist es wichtig, das Zeilenende nach der ersten Umgebung mit einem % auszukommentieren, da andernfalls an dieser Stelle ein Leerzeichen ausgegeben würde (FAQ 6) und die Zeile dann zu läng wäre.

Innerhalb der beiden {minipage}s zentrieren wir die Abbildungen mit \centering. Für die Skalierung der Abbildungen verwenden wir anstelle von \textwidth die Länge \linewidth, da erstere immer für die Gesamttextbreite und letztere immer für die Länge der aktuellen Zeile steht. Da beide Abbildungen zusammengehören, verwenden wir \subcaption für die Beschriftung. Wären die Abbildungen unabhängig, könnten wir hier auch \caption nutzen.

   \begin{minipage}{0.5\textwidth}
      \centering
      \includegraphics[width = 0.9\linewidth]{example-image-a}
      \subcaption{Ein Bild}
   \end{minipage}%
   \begin{minipage}{0.5\textwidth}
      \centering
      \includegraphics[width = 0.9\linewidth]{example-image-b}
      \subcaption{Ein anderes Bild}
   \end{minipage}

Die Gesamtabbildung beschriften wir noch mit \caption.

   \caption{Zwei Abbildungen nebeneinander}

Ende der Gleitumgebung

\end{figure}

Strukturierte Informationen, Teil 2

Für die strukturierte Darstellung von Prozessen verwenden wir den in der Präambel definierten Befehl \phase.

Der von uns definierte Befehl hat drei Argumente: die Nummer der Phase, die Bezeichnung der Phase und die Artefakte der Phase. Innerhalb der Artefakte nutzen wir {itemize}, um eine Aufzählung zu erzeugen.

Je nachdem, welche der beiden obigen Definitionen wir nutzen, unterscheidet sich die Ausgabe, die \phase erzeugt.

\phase{SE1}{Systemanalyse}{%
   \begin{itemize}
      \item Vertrag
      \item Analysedokument
   \end{itemize}
}
\phase{SE2}{Systementwurf}{%
   \begin{itemize}
      \item Systementwurfsdokument
      \item Modell
      \begin{itemize}
         \item Klassendiagramm
         \item Anwendungsfälle
      \end{itemize}
   \end{itemize}
}
\phase{SE3}{SW-Anforderungsanalyse}{Anforderungsdokument}
\end{document}

Bemerkung 2

„Generell stellt sich die Frage, wann Information als Tabelle dargestellt wird und wann besser in einer anderen Form“

Wie schon im letzten Monat besprochen, müssen wir zwischen „inhaltlich motivierten“ und als Anordnungswerkzeug dienenden Tabellen unterscheiden. Erstere sollten überall dort verwendet werden, wo der Leser den Inhalt auch als Tabelle im engeren Sinn erfassen soll. Diese Tabellen sollten außerdem immer in der Gleitumgebung {table} stehen und eine Beschriftung (\caption) haben. Tabellen, die wir nur zur Anordnung von Elementen verwenden, sind für den Leser in der Regel nicht als solche zu erkennen und können überall dort eingesetzt werden, wo ihr Einsatz zielführend ist. Sinnvollerweise sollte man nach dem Don’t-repeat-yourself-Prinzip (DRY) arbeiten und für ähnlich strukturierte Inhalte eigene Befehle und/oder Umgebungen definieren, wie wir es im Beispiel kurz angerissen haben.