@slide(layout=chapter-slide)

@number
9

@title
Tabellen


@slide(layout=content-only)

@title
Grundstruktur <span class="emoji">🗒️</span>

@content
Für typografisch schöne Tabellen nutzen wir das Paket `booktabs`.

``` {.hljs .lang-tex}
\usepackage{booktabs}
```

``` {.hljs .lang-tex}
\begin{table}[<position>]
	\caption{<tabellenüberschrift>}
	\begin{tabular}{<spaltendefinition>}
		% Tabelleninhalt
	\end{tabular}
\end{table}
```

Die Positionierung erfolgt analog zu Grafiken.


@slide(layout=content-and-preview)

@title
Spaltendefinitionen

@content
``` {.hljs .lang-tex}
\begin{tabular}{lrcl}
    % Tabelleninhalt
\end{tabular}
```

<table>
	<tr>
		<th>Kürzel</th>
		<th>Bedeutung</th>
	</tr>
	<tr class="fragment">
		<td>l</td>
		<td>linksbündige Spalte</td>
	</tr>
	<tr class="fragment">
		<td>c</td>
		<td>zentrierte Spalte</td>
	</tr>
	<tr class="fragment">
		<td>r</td>
		<td>rechtsbündige Spalte</td>
	</tr>
</table>

++ Vertikale Trennlinien und doppelte horizontale Linien sind unter Typograph\*innen nicht gern gesehen und sollten vermieden werden.

@preview
![](svg/tables/tabelle-beispiel-crop.svg){.thin-padding}


@slide(layout=content-and-preview)

@title
Tabelleninhalt

@content
``` {.hljs .lang-tex}
\begin{tabular}{lll}
    \toprule
    Spalte 1 & Spalte 2 & Spalte 3 \\
    \midrule
    Inhalt a & Inhalt b & Inhalt c \\
    Inhalt e & Inhalt f & Inhalt g \\
    Inhalt i & Inhalt j & Inhalt k \\
    \bottomrule
\end{tabular}
```
*	++ Zellen werden durch ›`&`‹ abgetrennt.
*	++ Reihen werden durch ›`\\`‹ beendet.
*	++ `\toprule`, `\midrule` und `\bottomrule` strukturieren die Tabelle.

@preview
![](svg/tables/tabelle-inhalt-beispiel-crop.svg){.thin-padding}


@slide(layout=wide-content)

@title
Die gesamte Tabelle

@content
``` {.hljs .lang-tex}
\begin{table}[h]
    \caption{Bekannte Programmiersprachen}
    \begin{tabular}{lrcl}
        \toprule
        Sprache & Autor             & Erscheinungsjahr & Dateiendung \\
        \midrule
        C++     & Bjarne Stroustrup & 1985             & .cpp        \\
        Java    & James Gosling     & 1998             & .java       \\
        Python  & Guido van Rossum  & 1991             & .py         \\
        \bottomrule
    \end{tabular}
\end{table}
```

<p data-category="Hinweis">Mit `@{}` vor und nach einer Spaltendefinition wird der umgebende Weißraum unterdrückt.</p>

<p data-category="Beispiel">`\begin{tabular}{@{}lrcl@{}}` beschränkt die Linien auf die Breite des Tabelleninhalts.</p>


@slide(layout=content-only)

@title
Mehr Komfort

@content
Der [Tables Generator](https://tablesgenerator.com/) ist ein wunderbares Werkzeug, um schnell Tabellen verschiedener Formate zu erstellen.

[![](svg/tables/tables-generator.png)](https://tablesgenerator.com/)


@slide(layout=task)

@task-number
9

@title
Tabellen setzen

@content
* 	Die Liste in der Datei `exercises/tables/tables.tex` enthält Infos zu ein paar Lehrveranstaltung an der Fakultät WIAI.
*	Wandelt die Liste in eine **Tabelle** um. 
*	Die Tabelle soll Spalten für den *Namen*, das *Kürzel* und das *Semester* der Vorlesungen haben.
*	Fügt außerdem eine **zentrierte Spalte** ganz links in der Tabelle hinzu, in der ihr die Lehrveranstaltungen **nummeriert**.



@slide(layout=extra-content-only)

@title
Besonders lange Tabellen

@content
Tabellen, die über eine Seite hinaus gehen, werden von `tabular` einfach abgeschnitten. Die Lösung bietet hier das Paket `longtable`:

``` {.hljs .lang-tex}
\usepackage{longtable}
```

``` {.hljs .lang-tex}
\begin{longtable}{<spaltendefinition>}
    \caption{<tabellenüberschrift>}
    \label{<label>}
    % Tabelleninhalt
\end{longtable}
```


@slide(layout=extra-content-only)

@title
Hinweise zu `longtable`

@content
``` {.hljs .lang-tex}
\begin{longtable}{<spaltendefinition>}
    \caption{<tabellenüberschrift>}
    \label{<label>}
    % Tabelleninhalt
\end{longtable}
```
*	Die `longtable`-Umgebung vereint die `tabular`-Umgebung und die `table`-Umgebung.
*	Titel und Label können deshalb direkt unter dem Tabelleninhalt stehen.
*	Sofern das Paket `booktabs` eingebunden ist, stehen seine Features auch in `longtable` zur Verfügung.


@slide(layout=extra-content-only)

@title
Besonders breite Tabellen

@content
Sollte die Tabelle einmal zu breit für eine Seite werden, kann sie auch im Querformat dargestellt werden:

``` {.hljs .lang-tex}
\usepackage{rotating}
```

``` {.hljs .lang-tex}
\begin{sidewaystable}[<position>]
	\begin{tabular}{<spaltendef.>}
		% Tabelleninhalt
	\end{tabular}
\end{sidewaystable}
```

@slide(layout=extra-content-and-preview)

@title
Eine Tabelle einfärben

@content
``` {.hljs .lang-tex}
\usepackage[table]{xcolor}
```

``` {.hljs .lang-tex}
\begin{tabular}{lll}
	\toprule
	Eine & \cellcolor{yellow}gelbe & Zelle \\
    Ein  & \cellcolor{yellow!25}helleres & Gelb \\
	\rowcolor[HTML]{FFDE21}
	Eine & gelbe & Zeile \\
	\bottomrule
\end{tabular}
```

* Mit `\cellcolor` färbt man einzelne Zellen ein.
* Mit `\rowcolor` färbt man ganze Zeilen ein.
* Farben können mit Namen, Prozentwerten (z. B. `yellow!25`) oder Hex-Codes (`[HTML]{...}`) angegeben werden.


@preview
![](svg/tables/tabelle-farbe-crop.svg){.thin-padding}

@slide(layout=extra-content-and-preview)

@title
Zellen verbinden

@content
``` {.hljs .lang-tex}
\begin{tabular}{lll}
	\toprule
	Tier    & Futter  & Größe \\
	\midrule
	Pferd   & Heu     & groß  \\
	Frosch  & Fliegen & klein \\
	Fooboar & \multicolumn{2}{c}{unbekannt} \\
	\bottomrule
\end{tabular}
```
* `\multicolumn{2}{c}{...}` verbindet zwei Spalten zu einer.
* Das zweite Argument legt die Ausrichtung (und Ränder) fest.


@preview
![](svg/tables/tabelle-zellen-verbinden-crop.svg){.thin-padding}

@slide(layout=extra-content-and-preview)

@title
Zeilenumbruch in einer Zelle

@content
``` {.hljs .lang-tex}
\usepackage{makecell}
```

``` {.hljs .lang-tex}
\begin{tabular}{ll}
	\toprule
	Name  & Beschreibung \\
	\midrule
	Katze & \makecell[l]{klein \\ schläft gerne} \\
	Hund  & \makecell[l]{treu \\ braucht Spaziergänge} \\
	\bottomrule
\end{tabular}
```

* Standardmäßig zentriert `\makecell` den Inhalt.
* Mit `\makecell[l]{Inhalt}` kann man ihn linksbündig ausrichten.


@preview
![](svg/tables/tabelle-zeilenumbruch-crop.svg){.thin-padding}

@slide(layout=extra-content-and-preview)

@title
Feste Spaltenbreite

@content
Die Spalte `p{4cm}` bricht den Text automatisch auf 4cm Breite um.
``` {.hljs .lang-tex}
\begin{tabular}{lp{4cm}}
	\toprule
	Gegenstand & Beschreibung               \\
	\midrule
	Stuhl      & Vier Beine, eine Fläche    \\
	Tisch      & Wie ein Stuhl, aber anders \\
	\bottomrule
\end{tabular}
```

@preview
![](svg/tables/tabelle-feste-breite-crop.svg){.thin-padding}

@slide(layout=extra-content-and-preview)

@title
Weiterführendes Beispiel

@content
``` {.hljs .lang-tex}
\begin{table}[h]
    \begin{tabular}{llr}
        \toprule
        Struktur  & \multicolumn{2}{l}{Zeitkomplexität für Zugriff} \\ \cmidrule(r){2-3} & Average & Worst \\
        \midrule
        Stack     & $\mathcal{O}(n)$      & $\mathcal{O}(n)$      \\
        Binärbaum & $\mathcal{O}(log(n))$ & $\mathcal{O}(log(n))$ \\
        AVL-Baum  & $\mathcal{O}(log(n))$ & $\mathcal{O}(log(n))$ \\
        \bottomrule
    \end{tabular}
\end{table}
```

@preview
![](svg/tables/tabelle-fortgeschritten-beispiel-crop.svg){.thin-padding}

@slide(layout=extra-content-only)

@title
Weitere Ressourcen

@content 

* Für Hinweise zur Formatierung von Tabellen – z. B. was linksbündig sein sollte, wie Spalten zu beschriften sind 
  und wann Rahmenlinien sinnvoll sind – hilft der APA Style Guide weiter:

[<span class="emoji">🔗</span> Tabellenrichtlinien](https://apastyle.apa.org/style-grammar-guidelines/tables-figures/tables)

* Das Paket `booktabs` bietet Befehle für hochwertige Tabellen:

[<span class="emoji">🔗</span> Dokumentation zu Booktabs](https://ctan.org/pkg/booktabs/)