@slide(layout=chapter-slide)

@number
3

@title
Komplexere Projekte


@slide(layout=content-and-preview)

@title
Zielsetzung

@content
Ein größeres LaTeX-Projekt anlegen und dabei …

* verhindern, dass LaTeX-Dokumente zu monströser Größe anwachsen <span class="emoji">👹</span>
* den Überblick über die Struktur eines Projekts behalten

@preview
![](svg/project-structure/langes-dokument.jpg){style="padding: .2em; height: 100vh"}


@slide(layout=content-and-preview)

@title
Hauptdatei <span class="emoji">👑</span>

@content
*	enthält Grundgerüst, Titel, Inhaltsverzeichnis etc.
*	bindet einzelne Kapitel ein mit \
    `\input{pfad/zur/datei}`

``` {.lang-tex .hljs data-sourcefile=main.tex}
\documentclass{article}
\usepackage[ngerman]{babel}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\title{Ein Titel}
\begin{document}
    \maketitle
    \tableofcontents
    \input{abschnitt1.tex}
    \input{abschnitt2.tex}
\end{document}
```

@preview
![](svg/project-structure/hauptdatei-orig.svg)


@slide(layout=content-and-preview)

@title
Datei mit Teilabschnitt

@content
* enthält **keine Präambel**
* enthält **kein** `\begin{document}` und `\end{document}`

``` {.hljs .lang-tex data-sourcefile=part1.tex}
\section{Dies ist Abschnitt 1}
Hier ein Absatz zum
Inhalt von Abschnitt 1.

% …
```

``` {.hljs .lang-tex data-sourcefile=part2.tex}
\section{Dies ist Abschnitt 2}
Hier ein Absatz zum
Inhalt von Abschnitt 2.

% …
```

@preview
![](svg/project-structure/hauptdatei-teile-crop.svg){.thin-padding}


@slide(layout=content-only)

@title
Kompilieren des Projekts

@content
* **Nur die Hauptdatei** wird kompiliert, um das fertige PDF-Dokument zu erhalten.
* ++ Fehlermeldungen enthalten dann Verweis, in welcher Unterdatei sie aufgetreten sind.
* ++ Die Unterdateien können wegen ihrer fehlenden Präambel nicht selbstständig kompiliert werden.


@slide(layout=task)

@task-number
3

@title
Ein strukturiertes Projekt

@content
::: {.box .warning}
**Schließt alle offenen Tabs** aus vorherigen Aufgaben.
:::

Im Ordner `exercises/project-structure` findet ihr eine Datei namens `main.tex`.

* Erstellt neue Dateien (z.&thinsp;B. `section1.tex` und `section2.tex` und verschiebt die Abschnitte in diese.
* Importiert die Fragmente anschließend mit Hilfe des `\input`-Befehls.
* Lagert die Präambel auf demselben Weg in eine eigene Datei aus.
* Schaut euch abschließend die Gesamtstruktur unseres Projektarchivs an, beginnend mit `main-exercises.tex` im Wurzelverzeichnis. Wie binden wir hier die einzelnen Abschnitte ein?


@slide(layout=extra-content-only)

@title
PDF-Dokumente einbetten

@content
Das Paket `pdfpages` erlaubt das Einbetten ganzer PDF-Dokumente.

``` {.lang-tex .hljs}
\includepdf[pages={<from>-<to>}]{<file>}
```

Weitere Parameter lassen mehrere Seiten in Kacheln nebeneinander erscheinen oder ändern die Ausrichtung zu Querformat. Die [Paket-Dokumentation](https://www.ctan.org/pkg/pdfpages) enthält eine abschließende Liste aller Möglichkeiten.


@slide(layout=extra-wide-content)

@title
Makros

@content
Manchmal ist es nützlich, oft genutzten Codes durch Makros zu vereinfachen.

``` {.lang-tex .hljs}
\newcommand{\<name>}[<parameter_count>][<default>]{<content>}
```

Im Skript haben wir solche Makros unter anderem verwendet, um Abstände und Akronyme zu definieren (siehe `commands.tex` für weitere Beispiele):

``` {.lang-tex .hljs}
\newcommand{\widefiguremargin}{-.22\textwidth}
\newcommand{\acro}[1]{\textsc{\lowercase{#1}}}
```

Es ist auch möglich, bestehende Befehle anzupassen. $\LaTeX$ erlaubt es sogar, Programmierkonstrukte wie Variablen, Verzweigungen und Schleifen zu nutzen. Für weitere Einblicke dient [dieses Kapitel des WikiBooks](https://en.wikibooks.org/wiki/LaTeX/Macros).

@slide(layout=content-and-preview-with-category)

@category
Exkurs

@title
Dateipfade angeben <span class="emoji">👣</span>

@content
* wichtig für `\input{}` sowie später für das Einbinden von Bildern und anderen Medien
* Datei- und Ordnerstruktur = Baumstruktur <span class="emoji">🌳</span>
* bei `\input{}` kann der Pfad zu einer Unterdatei relativ zur Hauptdatei angeben werden

<p data-category="Achtung!" class="fragment">Bei LaTeX muss stets die **Unix-Syntax** für Pfadangaben verwendet werden. Pfadelemente werden durch einen Schrägstrich getrennt: `pfad/zur/datei`. Deshalb werden wir im Folgenden diese Schreibweise verwenden.</p>

@preview
![](svg/project-structure/tree-crop.svg)


@slide(layout=content-and-preview-with-category)

@category
Exkurs

@title
Dateipfade angeben <span class="emoji">👣</span>

@content
<p data-category="Beispiel">`main-exercises.tex` → `praeamble.tex`</p>

::: {.fragment}
`./praeamle.tex`

Der **einfache Punkt »`.`«** bezieht sich bei relativen Pfaden auf den aktuellen Ordner (hier: `latex-script`). Er ist optional, es könnte also auch nur `praeamble.tex` geschrieben werden.
:::

@preview
![](svg/project-structure/relative-path-crop.svg)


@slide(layout=content-and-preview-with-category)

@category
Exkurs

@title
Dateipfade angeben <span class="emoji">👣</span>

@content
<p data-category="Beispiel">`main-exercises.tex` → `basic-document-structure.tex` (in einem Unterordner)</p>

::: {.fragment}
`./content/basic-document-structure.tex`
:::

@preview
![](svg/project-structure/relative-path-subdir-crop.svg)



@slide(layout=content-and-preview-with-category)

@category
Exkurs

@title
Dateipfade angeben <span class="emoji">👣</span>

@content
<p data-category="Beispiel">`basic-functionality.tex` → `graphics.raw.tex`</p>

(wenn `basic-functionality.tex` von `main-exercises.tex` importiert wird)

::: {.fragment}
`./exercises/graphics/graphics.raw.tex`

<p data-category="Achtung!">Pfade sind immer relativ zum Wurzelelement, auch wenn dieses noch andere Dateien einbindet, die wiederum andere Dateien referenzieren.</p>
:::

@preview
![](svg/project-structure/relative-path-transitive-crop.svg)



@slide(layout=content-only)

@title
Hinweis

@content

+ Von nun an kompilieren wir die Datei `main-exercises.tex` im Wurzelverzeichnis des Projektordners. 
+ Klickt hierzu in TeXstudio mit der rechten Maustaste auf die Datei und wählt **„Explizit als Root-Dokument setzen“**. 
+ Anschließend könnt ihr wie gewohnt kompilieren.