> For the complete documentation index, see [llms.txt](https://overleaf-pro.ayaka.space/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://overleaf-pro.ayaka.space/latex/de/klassendateien/04-writing-your-own-class.md).

# Ihre eigene Klasse schreiben

Manchmal ist die beste Option zur Anpassung eines Dokuments, eine neue Klasse von Grund auf neu zu schreiben. Dieser Artikel erklärt die Hauptstruktur und die Befehle, die in einer neuen Klasse benötigt werden.

## Einführung

Das Erste, was man vor dem Schreiben einer neuen Klasse tun sollte, ist festzustellen, ob man wirklich eine neue Klasse braucht oder nicht. Es wird empfohlen, [auf CTAN (Comprehensive TeX Archive Network) zu suchen](http://www.ctan.org/ctan-portal/search/) und zu sehen, ob jemand bereits etwas Ähnliches zu der Dokumentklasse erstellt hat, die Sie benötigen.

Eine weitere wichtige Sache, die man im Hinterkopf behalten sollte, ist [der Unterschied zwischen Paketen und Klassen](/latex/de/klassendateien/01-understanding-packages-and-class-files.md). Eine falsche Wahl kann die Flexibilität des Endprodukts beeinträchtigen.

## Allgemeine Struktur

Die Struktur aller Klassendateien lässt sich grob in die nächsten vier Teile beschreiben:

* ***Identifikation***. Die Datei deklariert sich als eine Klasse, die mit der LaTeX2ε-Syntax geschrieben wurde.
* ***Vorläufige Deklarationen***. Hier werden die benötigten externen Pakete und Klassen importiert. Außerdem werden in diesem Teil der Datei die Befehle und Definitionen codiert, die von den deklarierten Optionen benötigt werden.
* ***Optionen***. Die Klasse deklariert und verarbeitet die Optionen.
* ***Weitere Deklarationen***. Der Hauptteil der Klasse. Fast alles, was eine Klasse tut, wird hier definiert.

In den nächsten Unterabschnitten werden eine ausführlichere Beschreibung der Struktur und ein funktionierendes Beispiel, *exampleclass.cls*, vorgestellt.

### Identifikation

Es gibt zwei einfache Befehle, die alle Klassen haben müssen:

```latex
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{exampleclass}[2014/08/16 Example LaTeX class]
```

Der Befehl `\NeedsTeXFormat{LaTeX2e}` legt die LaTeX-Version fest, mit der die Klasse funktionieren soll. Zusätzlich kann in eckigen Klammern ein Datum angegeben werden, um das erforderliche Mindest-Release-Datum festzulegen.

Der Befehl `ProvidesClass{exampleclass}[...]` kennzeichnet diese Klasse als *exampleclass* und in den Klammern sind das Veröffentlichungsdatum und einige zusätzliche Informationen enthalten. Das Datum sollte in der Form JJJJ/MM/TT angegeben werden

[Öffnen Sie in Overleaf ein Beispiel dafür, wie man eine Klasse schreibt](https://www.overleaf.com/project/new/template/19419?id=65524436\&templateName=An+example+of+writing+a+LaTeX+class\&latexEngine=\&texImage=texlive-full%3A2020.1\&mainFile=)

### Vorläufige Deklarationen

Die meisten Klassen erweitern und passen vorhandene an und benötigen außerdem einige externe Pakete, um zu funktionieren. Unten wird der Beispielklasse noch etwas mehr Code hinzugefügt `exampleclass.cls`.

```latex
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{exampleclass}[2014/08/16 Example LaTeX class]

\newcommand{\headlinecolor}{\normalcolor}
\LoadClass[twocolumn]{article}
\RequirePackage{xcolor}
\definecolor{slcolor}{HTML}{882B21}
```

Die Befehle in diesem Teil initialisieren entweder einige Parameter, die später zur Verwaltung der Optionen verwendet werden, oder importieren externe Dateien.

Der Befehl `\LoadClass[twocolumn]{article}` lädt die Klasse `article` mit dem zusätzlichen Parameter `twocolumn`. Daher werden alle Befehle in der Standard- `article` klasse automatisch in der **Beispiel-** klasse verfügbar sein, außer dass das Dokument in einem Zweispaltenformat gedruckt wird.

`\RequirePackage` ist dem bekannten `\usepackage`sehr ähnlich; das Hinzufügen optionaler Parameter in eckigen Klammern funktioniert ebenfalls. Der einzige Unterschied ist, dass \RequirePackage `\usepackage` nicht vor dem `\documentclass` Befehl verwendet werden kann. Es wird dringend empfohlen, \RequirePackage `\RequirePackage` beim Schreiben neuer Klassen oder Pakete zu verwenden.

[Öffnen Sie in Overleaf ein Beispiel dafür, wie man eine Klasse schreibt](https://www.overleaf.com/project/new/template/19419?id=65524436\&templateName=An+example+of+writing+a+LaTeX+class\&latexEngine=\&texImage=texlive-full%3A2020.1\&mainFile=)

### Optionen

Um den Klassen etwas Flexibilität zu ermöglichen, sind einige zusätzliche Optionen sehr nützlich. Der nächste Teil in der Datei `exampleclass.cls` verarbeitet die an den Befehl der Dokumentklasse übergebenen Parameter. Wir haben außerdem `\LoadClass` zu *hinter* die Verarbeitung der Optionen verschoben, damit Optionen, die in der .tex-Datei gesetzt werden, an die Basisklasse weitergegeben werden können.

```latex
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{exampleclass}[2014/08/16 Example LaTeX class]

\newcommand{\headlinecolor}{\normalcolor}
\RequirePackage{xcolor}
\definecolor{slcolor}{HTML}{882B21}

\DeclareOption{onecolumn}{\OptionNotUsed}
\DeclareOption{green}{\renewcommand{\headlinecolor}{\color{green}}}
\DeclareOption{red}{\renewcommand{\headlinecolor}{\color{slcolor}}}
\DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}}
\ProcessOptions\relax
\LoadClass[twocolumn]{article}
```

Hier gibt es vier Hauptbefehle, die die an die Klasse übergebenen Optionen verarbeiten.

Der Befehl `\DeclareOption{}{}` verarbeitet eine gegebene Option. Sie nimmt zwei Parameter entgegen: Der erste ist der Name der Option und der zweite der Code, der ausgeführt wird, wenn die Option übergeben wird.

Der Befehl `\OptionNotUsed` gibt eine Meldung im Compiler und in den Protokollen aus; die Option wird nicht verwendet. In diesem Fall ist das Dokument auf Zweispalten gesetzt, und wenn der Benutzer versucht, es auf eine Spalte zu ändern, funktioniert das nicht; die Option wird ignoriert.

Der Befehl `\Declareoption*{}` verarbeitet jede Option, die nicht ausdrücklich definiert ist. Sie nimmt nur einen Parameter entgegen, den Code, der ausgeführt wird, wenn eine unbekannte Option übergeben wird. In diesem Fall wird der nächste Befehl ausgeführt:

`\PassOptionsToClass{}{}`. Überträgt die Option innerhalb des ersten Klammerpaares an die Dokumentklasse, die innerhalb des zweiten Klammerpaares festgelegt ist. Im Beispiel werden alle unbekannten Optionen an die **article** Dokumentklasse weitergegeben.

`\CurrentOption` speichert den Namen der Klassenoption, die zu einem bestimmten Zeitpunkt verarbeitet wird.

Der Befehl `\ProcessOptions\relax` führt den Code für jede Option aus und muss eingefügt werden, nachdem alle Befehle zur Behandlung von Optionen eingetippt wurden. Es gibt eine Sternversion dieses Befehls, die die Optionen in genau der von den aufrufenden Befehlen angegebenen Reihenfolge ausführt.

Im Beispiel gilt: Wenn die Optionen `red` oder `green` an das Dokument übergeben werden, wird die für die Überschrift und die Abschnitte verwendete Schrift auf die entsprechende Farbe gesetzt. Die Farbe namens `slcolor` wurde in den [vorläufigen Deklarationen](#preliminary-declaration) nach dem Import von `xcolor` Paket.

[Öffnen Sie in Overleaf ein Beispiel dafür, wie man eine Klasse schreibt](https://www.overleaf.com/project/new/template/19419?id=65524436\&templateName=An+example+of+writing+a+LaTeX+class\&latexEngine=\&texImage=texlive-full%3A2020.1\&mainFile=)

### Weitere Deklarationen

In diesem Teil werden die meisten Befehle vorkommen. In „exampleclass.cls“ werden die Seitenabmessungen und die Schriftgröße für den Titel, den Haupttext und die Abschnitte festgelegt. Unten können Sie die vollständige Klassendatei sehen.

```latex
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{exampleclass}[2014/08/16 Example LaTeX class]

\newcommand{\headlinecolor}{\normalcolor}
\RequirePackage{xcolor}
\definecolor{slcolor}{HTML}{882B21}

\DeclareOption{onecolumn}{\OptionNotUsed}
\DeclareOption{green}{\renewcommand{\headlinecolor}{\color{green}}}
\DeclareOption{red}{\renewcommand{\headlinecolor}{\color{slcolor}}}
\DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}}
\ProcessOptions\relax
\LoadClass[twocolumn]{article}

\renewcommand{\maketitle}{%
    \twocolumn[%
        \fontsize{50}{60}\fontfamily{phv}\fontseries{b}%
        \fontshape{sl}\selectfont\headlinecolor
        \@title
        \medskip
        ]%
}

\renewcommand{\section}{%
    \@startsection
    {section}{1}{0pt}{-1.5ex plus -1ex minus -.2ex}%
    {1ex plus .2ex}{\large\sffamily\slshape\headlinecolor}%
}

\renewcommand{\normalsize}{\fontsize{9}{10}\selectfont}
\setlength{\textwidth}{17.5cm}
\setlength{\textheight}{22cm}
\setcounter{secnumdepth}{0}
```

Um den Rest der Befehle zu verstehen, sehen Sie den [Referenzleitfaden](#reference-guide) und die Links im [Abschnitt „Weiterführende Lektüre“](#further-reading).

Die letzten vier Befehle im Beispiel zeigen die vier Dinge, die alle Klassen enthalten müssen:

* Die Definition von `normalsize`. Legt die Standard- [Schriftgröße](/latex/de/schriftarten/01-font-sizes-families-and-styles.md).
* Ein Standardwert für [`textwidth`](/latex/de/formatierung/07-page-size-and-margins.md)
* Ein Standardwert für [`textheight`](/latex/de/formatierung/07-page-size-and-margins.md)
* Die Vorgaben für die [Seitennummerierung](/latex/de/formatierung/03-page-numbering.md).

Unten ein Dokument, das die Klasse *exampleclass.cls*.

```latex
\documentclass[red]{exampleclass}
\usepackage[utf8]{inputenc}
\usepackage[english]{babel}

\usepackage{blindtext}

\title{Beispiel zur Demonstration, wie Klassen funktionieren}
\author{Team Learn ShareLaTeX}
\date{August 2014}

\begin{document}

\maketitle

\noindent
Beginnen wir hier mit einem einfachen funktionierenden Beispiel.

\blindtext

\section{Einleitung}

Das Monty-Hall-Problem...

\section{Dasselbe}

Der Monty...
```

![WrittingClassesEx1.png](/files/f0afbb34386d4fc1d9bd4155396ad75f5fecdc2a)

Beachten Sie, dass der erste Befehl hier

```latex
\documentclass[red]{exampleclass}
```

[Öffnen Sie in Overleaf ein Beispiel dafür, wie man eine Klasse schreibt](https://www.overleaf.com/project/new/template/19419?id=65524436\&templateName=An+example+of+writing+a+LaTeX+class\&latexEngine=\&texImage=texlive-full%3A2020.1\&mainFile=)

## Fehlerbehandlung

Wenn es darum geht, neue Klassen zu entwickeln, ist es wichtig, mögliche Fehler zu behandeln, damit der Benutzer weiß, dass etwas schiefgelaufen ist. Es gibt vier Hauptbefehle, um Fehler im Compiler zu melden.

* `\ClassError{*class-name*}{*error-text*}{*help-text*}`. Nimmt drei Parameter entgegen, jeweils in geschweiften Klammern: den Klassennamen, den Fehlertext, der angezeigt werden soll (der Kompilierungsprozess wird angehalten), und den Hilfetext, der ausgegeben wird, wenn der Benutzer "h" drückt, während die Kompilierung wegen des Fehlers angehalten ist.
* `\ClassWarning{*class-name*}{*warning-text*}`. In diesem Fall wird der Text angezeigt, der Kompilierungsprozess wird jedoch nicht angehalten. Es wird die Zeilennummer angezeigt, in der die Warnung aufgetreten ist.
* `\ClassWarningNoLine{*class-name*}{*warning-text*}`. Funktioniert genau wie der vorherige Befehl, zeigt aber nicht die Zeile an, in der die Warnung aufgetreten ist.
* `\ClassInfo{*class name*}{*info-text*}`. In diesem Fall wird die Information im zweiten Parameter nur in der Transcript-Datei ausgegeben, einschließlich der Zeilennummer.

[Öffnen Sie in Overleaf ein Beispiel dafür, wie man eine Klasse schreibt](https://www.overleaf.com/project/new/template/19419?id=65524436\&templateName=An+example+of+writing+a+LaTeX+class\&latexEngine=\&texImage=texlive-full%3A2020.1\&mainFile=)

## Referenzleitfaden

**Liste von Befehlen, die häufig in Klassen und Paketen verwendet werden**

* `\newcommand{*name*}{*definition*}`. Definiert einen [neuen Befehl](/latex/de/befehle/01-commands.md#defining-a-new-command), der erste Parameter ist der Name des neuen Befehls, der zweite Parameter ist das, was der Befehl tun wird.
* `\renewcommand{}{}`. Dasselbe wie `\newcommand` aber überschreibt einen vorhandenen Befehl.
* `\providecommand{}{}`. Funktioniert genauso wie `\newcommand` aber wenn der Befehl bereits definiert ist, wird dieser stillschweigend ignoriert.
* `\CheckCommand{}{}`. Die Syntax ist dieselbe wie `\newcommand`, aber stattdessen wird geprüft, ob der Befehl existiert und die erwartete Definition hat. LaTeX zeigt eine Warnung an, wenn der Befehl nicht dem entspricht, was `\CheckCommand` erwartet.
* `\setlength{}{}`. Setzt die Länge des als ersten Parameter übergebenen Elements auf den als zweiten Parameter angegebenen Wert.
* `\mbox{}`. Erzeugt eine Box, die die innerhalb der geschweiften Klammern geschriebenen Elemente enthält.
* `\fbox{}`. Dasselbe wie `\mbox`, aber um den Inhalt wird tatsächlich eine Box gezeichnet.

## Weiterführende Lektüre

Weitere Informationen finden Sie unter

* [Pakete und Klassendateien verstehen](/latex/de/klassendateien/01-understanding-packages-and-class-files.md)
* [Ihr eigenes Paket schreiben](/latex/de/klassendateien/03-writing-your-own-package.md)
* [Befehle](/latex/de/befehle/01-commands.md) und [Umgebungen](/latex/de/befehle/02-environments.md)
* [Längen in LaTeX](/latex/de/formatierung/01-lengths-in-latex.md)
* [Farben in LaTeX verwenden](/latex/de/formatierung/13-using-colors-in-latex.md)
* [Verwaltung in einem großen Projekt](/latex/de/dokumentstruktur/07-management-in-a-large-project.md)
* [LaTeX2ε für Autoren von Klassen und Paketen](http://www.latex-project.org/guides/clsguide.pdf)
* [Hinweise zur Programmierung in TeX](http://pgfplots.sourceforge.net/TeX-programming-notes.pdf)
* [Minuten statt Stunden: LaTeX-Ressourcen verwenden](https://tug.org/pracjourn/2005-4/hefferon/hefferon.pdf)
* [The LaTeX Companion. Zweite Ausgabe](http://ptgmedia.pearsoncmg.com/images/9780201362992/samplepages/0201362996.pdf)


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://overleaf-pro.ayaka.space/latex/de/klassendateien/04-writing-your-own-class.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
