> 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/03-writing-your-own-package.md).

# Ihr eigenes Paket schreiben

Manchmal ist die beste Option, eigene Befehle und Makros in einem Dokument zu verwenden, das Schreiben eines neuen Pakets von Grund auf. Dieser Artikel erklärt die Hauptstruktur eines neuen Pakets.

## Einführung

Das Erste, was man vor dem Programmieren eines neuen Pakets tun sollte, ist festzustellen, ob man wirklich ein neues Paket braucht oder nicht. Es wird empfohlen, [auf CTAN (Comprehensive TeX Archive Network) zu suchen](http://www.ctan.org/ctan-portal/search/) und zu prüfen, ob jemand bereits etwas Ähnliches wie das, was Sie benötigen, erstellt hat.

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). Die falsche Wahl kann die Flexibilität des Endprodukts beeinträchtigen.

## Allgemeine Struktur

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

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

In den nächsten Unterabschnitten werden eine genauere Beschreibung der Struktur und ein funktionsfähiges Beispiel, *examplepackage.sty*, vorgestellt.

### Identifikation

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

```latex
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{examplepackage}[2014/08/24 Beispiel-LaTeX-Paket]
```

Der Befehl `\NeedsTeXFormat{LaTeX2e}` legt die LaTeX-Version fest, mit der das Paket funktionieren soll. Zusätzlich kann innerhalb von Klammern ein Datum hinzugefügt werden, um das erforderliche Mindest-Veröffentlichungsdatum anzugeben.

Der Befehl `ProvidesPackage{examplepackage}[...]` kennzeichnet dieses Paket als *examplepackage* und innerhalb der Klammern sind das Veröffentlichungsdatum und einige zusätzliche Informationen enthalten. Das Datum sollte die Form JJJJ/MM/TT haben

[Ein Beispiel zum Schreiben eines Pakets in Overleaf öffnen](https://www.sharelatex.com/project/new/template?zipUrl=/project/53f11ec1eceb82a67658cb02/download/zip\&templateName=PackageExample\&compiler=pdflatex)

### Vorläufige Deklarationen

Die meisten Pakete erweitern und passen bestehende an und benötigen außerdem einige externe Pakete, um zu funktionieren. Unten wird dem Beispielpaket „examplepackage.sty“ noch etwas Code hinzugefügt.

```latex
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{examplepackage}[2014/08/21 Beispielpaket]

\RequirePackage{imakeidx}
\RequirePackage{xstring}
\RequirePackage{xcolor}
\definecolor{greycolour}{HTML}{525252}
\definecolor{sharelatexcolour}{HTML}{882B21}
\definecolor{mybluecolour}{HTML}{394773}
\newcommand{\wordcolour}{greycolour}
```

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

Der Befehl `\RequirePackage` ist dem bekannten `\usepackage`sehr ähnlich; das Hinzufügen optionaler Parameter innerhalb von Klammern funktioniert ebenfalls. Der einzige Unterschied besteht darin, dass das `\usepackage` nicht vor dem `\documentclass` Befehl verwendet werden kann. Es wird dringend empfohlen, `\RequirePackage` zu verwenden, wenn neue Pakete oder Klassen geschrieben werden.

[Ein Beispiel zum Schreiben eines Pakets in Overleaf öffnen](https://www.sharelatex.com/project/new/template?zipUrl=/project/53f11ec1eceb82a67658cb02/download/zip\&templateName=PackageExample\&compiler=pdflatex)

### Optionen

Um den Paketen etwas Flexibilität zu geben, sind einige zusätzliche Optionen sehr nützlich. Der nächste Teil in der Datei „examplepackage.sty“ behandelt die an die Paket-Einbindungsanweisung übergebenen Parameter.

```latex
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{examplepackage}[2014/08/21 Beispielpaket]

\RequirePackage{imakeidx}
\RequirePackage{xstring}
\RequirePackage{xcolor}
\definecolor{greycolour}{HTML}{525252}
\definecolor{sharelatexcolour}{HTML}{882B21}
\definecolor{mybluecolour}{HTML}{394773}
\newcommand{\wordcolour}{greycolour}

\DeclareOption{red}{\renewcommand{\wordcolour}{sharelatexcolour}}
\DeclareOption{blue}{\renewcommand{\wordcolour}{mybluecolour}}
\DeclareOption*{\PackageWarning{examplepackage}{Unbekannt ‘\CurrentOption’}}
\ProcessOptions\relax
```

Unten steht eine Beschreibung der wichtigsten Befehle, die die an das Paket übergebenen Optionen verarbeiten können.

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

Der Befehl `\OptionNotUsed` gibt eine Meldung im Compiler und in den Protokollen aus; die Option wird nicht verwendet.

Der Befehl `\Declareoption*{}` verarbeitet jede Option, die nicht ausdrücklich definiert wurde. Sie nimmt nur einen Parameter an, den auszuführenden Code, wenn eine unbekannte Option übergeben wird. In diesem Fall wird über den nächsten Befehl eine Warnung ausgegeben:

`\PackageWarning{}{}`. Siehe [Fehlerbehandlung](#handling-errors) für eine Beschreibung dessen, was dieser Befehl tut.

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

Der Befehl `\ProcessOptions\relax` führt den Code für jede Option aus und muss nach allen Befehlen zur Behandlung von Optionen eingefügt werden. Es gibt eine Sternchen-Version dieses Befehls, die die Optionen genau in der Reihenfolge ausführt, die durch die aufrufenden Befehle festgelegt wurde.

Im Beispiel werden, wenn die Optionen *red* oder *blue* an den `\usepackage` Befehl im Dokument übergeben werden, der Befehl `\wordcolor` wird neu definiert. Sowohl die Farben als auch die standardmäßige graue Farbe wurden in den [vorläufigen Deklarationen](#preliminary-declaration) nach dem Import von *xcolor* Pakets erkunden.

[Ein Beispiel zum Schreiben eines Pakets in Overleaf öffnen](https://www.sharelatex.com/project/new/template?zipUrl=/project/53f11ec1eceb82a67658cb02/download/zip\&templateName=PackageExample\&compiler=pdflatex)

### Weitere Deklarationen

In diesem Teil werden die meisten Befehle erscheinen. In „examplepackage.sty“. Unten sehen Sie die vollständige Paketdatei.

```latex
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{examplepackage}[2014/08/21 Beispielpaket]

\RequirePackage{imakeidx}
\RequirePackage{xstring}
\RequirePackage{xcolor}
\definecolor{greycolour}{HTML}{525252}
\definecolor{sharelatexcolour}{HTML}{882B21}
\definecolor{mybluecolour}{HTML}{394773}
\newcommand{\wordcolour}{greycolour}

\DeclareOption{red}{\renewcommand{\wordcolour}{sharelatexcolour}}
\DeclareOption{blue}{\renewcommand{\wordcolour}{mybluecolour}}
\DeclareOption*{\PackageWarning{examplepackage}{Unbekannt ‘\CurrentOption’}}
\ProcessOptions\relax

%%Nummerierte Umgebung
\newcounter{example}[section]
\newenvironment{example}[1][]{\refstepcounter{example}\par\medskip
\noindent \textbf{Meine~Umgebung~\theexample. #1} \rmfamily}{\medskip}

%%Wichtige Wörter werden zum Index hinzugefügt und in unterschiedlicher Farbe gedruckt
\newcommand{\important}[1]
{\IfSubStr{#1}{!}
    {\textcolor{\wordcolour}{\textbf{\StrBefore{#1}{!}~\StrBehind{#1}{!}}}\index{#1}}
    {\textcolor{\wordcolour}{\textbf{#1}}\index{#1}\kern-1pt}
}
```

Dieses Paket definiert die neue Umgebung `Beispiel`, und einen neuen Befehl `\important`, der die Wörter in einer speziellen Farbe ausgibt und sie dem Index hinzufügt.

Um jeden Befehl vollständig zu verstehen, siehe die [Referenzleitfaden](#reference-guide) und die Links im [Abschnitt „Weiterführende Literatur“](#further-reading).

Unten ein Dokument, das das Paket verwendet *examplepackage.sty*.

```latex
\documentclass{article}
\usepackage[utf8]{inputenc}

\usepackage[red]{examplepackage}

\makeindex

\title{Paketbeispiel}
\author{Team Learn ShareLaTeX}
\date{ }

\begin{document}

\maketitle

\section{Einleitung}
In diesem Dokument wird ein neues Paket getestet. Dieses Paket ermöglicht spezielle nummerierte
Umgebungen

\begin{example}
Dieser Text befindet sich in einer speziellen Umgebung, am Anfang wird etwas fett gesetzter Text ausgegeben
und eine neue Einrückung wird festgelegt.
\end{example}

Außerdem gibt es einen speziellen Befehl für \important{wichtig!Wörter}, der
je nach dem im
\important{Paket}-Einbindungsbefehl verwendeten Parameter in einer speziellen \important{Farbe} ausgegeben wird. Weil es \important{wichtig} ist.

\printindex

\end{document}
```

![WrittingPackagesEx1.png](/files/efb9163d6f9630773fda99924c9b24a294b09771)

Beachten Sie den Befehl

```latex
\usepackage[red]{examplepackage}
```

[Ein Beispiel zum Schreiben eines Pakets in Overleaf öffnen](https://www.sharelatex.com/project/new/template?zipUrl=/project/53f11ec1eceb82a67658cb02/download/zip\&templateName=PackageExample\&compiler=pdflatex)

## Fehlerbehandlung

Wenn es darum geht, neue Pakete 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.

* `\PackageError{*package-name*}{*error-text*}{*help-text*}`. Nimmt drei Parameter an, jeweils in geschweiften Klammern: den Paketnamen, den Fehlertext, der angezeigt werden soll (der Kompilierungsvorgang wird angehalten), und den Hilfetext, der ausgegeben wird, wenn der Benutzer bei angehaltener Kompilierung wegen des Fehlers „h“ drückt.
* `\PackageWarning{*package-name*}{*warning-text*}`. In diesem Fall wird der Text angezeigt, aber der Kompilierungsvorgang wird nicht angehalten. Es wird die Zeilennummer angezeigt, in der die Warnung aufgetreten ist.
* `\PackageWarningNoLine{*package-name*}{*warning-text*}`. Funktioniert genauso wie der vorherige Befehl, aber die Zeile, in der die Warnung aufgetreten ist, wird nicht angezeigt.
* `\PackageInfo{*package-name*}{*info-text*}`. In diesem Fall werden die Informationen im zweiten Parameter nur in der Protokolldatei ausgegeben, einschließlich der Zeilennummer.

[Ein Beispiel zum Schreiben eines Pakets in Overleaf öffnen](https://www.sharelatex.com/project/new/template?zipUrl=/project/53f11ec1eceb82a67658cb02/download/zip\&templateName=PackageExample\&compiler=pdflatex)

## Referenzhandbuch

**Liste der in Paketen und Klassen häufig verwendeten Befehle**

* `\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, 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 die gleiche wie bei `\newcommand`, aber stattdessen wird geprüft, ob der Befehl existiert und die erwartete Definition hat. LaTeX zeigt eine Warnung an, wenn der Befehl jetzt nicht das ist, was `\CheckCommand` erwartet wurde.
* `\setlength{}{}`. Setzt die Länge des als ersten Parameter übergebenen Elements auf den als zweiten Parameter geschriebenen Wert.
* `\mbox{}`. Erstellt eine Box, die die in den Klammern geschriebenen Elemente enthält.
* `\fbox{}`. Dasselbe wie `\mbox`, aber um den Inhalt wird tatsächlich ein Rahmen gedruckt.

## Weiterführende Lektüre

Weitere Informationen finden Sie unter

* [Pakete und Klassen-Dateien verstehen](/latex/de/klassendateien/01-understanding-packages-and-class-files.md)
* [Eine eigene Klasse schreiben](/latex/de/klassendateien/04-writing-your-own-class.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 Paket- und Paketautoren](http://www.latex-project.org/guides/clsguide.pdf)
* [Hinweise zum Programmieren in TeX](http://pgfplots.sourceforge.net/TeX-programming-notes.pdf)
* [Minuten in weniger als Stunden: Verwendung von LaTeX-Ressourcen](https://tug.org/pracjourn/2005-4/hefferon/hefferon.pdf)
* [Der LaTeX-Begleiter. Zweite Auflage](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/03-writing-your-own-package.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.
