> For the complete documentation index, see [llms.txt](https://ayakaleaf-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://ayakaleaf-pro.ayaka.space/latex/nl/class-bestanden/03-writing-your-own-package.md).

# Je eigen pakket schrijven

Soms is de beste optie om je eigen commando's en macro's in een document te gebruiken, een nieuw pakket helemaal vanaf nul te schrijven. Dit artikel legt de hoofdstructuur van een nieuw pakket uit.

## Inleiding

Het eerste wat je moet doen voordat je een nieuw pakket codeert, is bepalen of je echt een nieuw pakket nodig hebt of niet. Het wordt aanbevolen om [te zoeken op CTAN (Comprehensive TeX Archive Network)](http://www.ctan.org/ctan-portal/search/) en te kijken of iemand al iets heeft gemaakt dat lijkt op wat je nodig hebt.

Een ander belangrijk punt om in gedachten te houden is [het verschil tussen pakketten en klassen](/latex/nl/class-bestanden/01-understanding-packages-and-class-files.md). De verkeerde keuze kan de flexibiliteit van het eindproduct beïnvloeden.

## Algemene structuur

De structuur van alle pakketbestanden kan grofweg worden beschreven in de volgende vier delen:

* ***Identificatie***. Het bestand verklaart zichzelf als een pakket geschreven met de LaTeX2ε-syntaxis.
* ***Voorlopige declaraties***. Hier worden de benodigde externe pakketten geïmporteerd. Ook worden in dit deel van het bestand de commando's en definities gecodeerd die door de gedeclareerde opties nodig zijn.
* ***Opties***. Het pakket declareert en verwerkt de opties.
* ***Meer declaraties***. Het hoofdgedeelte van het pakket. Bijna alles wat een pakket doet, wordt hier gedefinieerd.

In de volgende subsecties worden een gedetailleerdere beschrijving van de structuur en een werkend voorbeeld, *examplepackage.sty*, gepresenteerd.

### Identificatie

Er zijn twee eenvoudige commando's die alle pakketten moeten hebben:

```latex
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{examplepackage}[2014/08/24 Example LaTeX package]
```

Het commando `\NeedsTeXFormat{LaTeX2e}` stelt de LaTeX-versie in waarmee het pakket werkt. Daarnaast kan tussen vierkante haken een datum worden toegevoegd om de minimale vereiste releasedatum op te geven.

Het commando `ProvidesPackage{examplepackage}[...]` identificeert dit pakket als *examplepackage* en binnen de haken zijn de releasedatum en enkele aanvullende gegevens opgenomen. De datum moet de vorm YYYY/MM/DD hebben

[Open een voorbeeld van hoe je een pakket schrijft in Overleaf](https://www.sharelatex.com/project/new/template?zipUrl=/project/53f11ec1eceb82a67658cb02/download/zip\&templateName=PackageExample\&compiler=pdflatex)

### Voorlopige declaraties

De meeste pakketten breiden bestaande pakketten uit en passen ze aan, en hebben ook enkele externe pakketten nodig om te werken. Hieronder wordt nog wat code toegevoegd aan het voorbeeldpakket "examplepackage.sty".

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

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

De commando's in dit deel initialiseren ofwel enkele parameters die later zullen worden gebruikt om de opties te beheren, ofwel importeren externe bestanden.

Het commando `\RequirePackage` lijkt sterk op de bekende `\usepackage`, het toevoegen van optionele parameters tussen vierkante haken werkt ook. Het enige verschil is dat de `\usepackage` kan niet worden gebruikt vóór `\documentclass` commando. Het wordt sterk aanbevolen om `\RequirePackage` te gebruiken bij het schrijven van nieuwe pakketten of klassen.

[Open een voorbeeld van hoe je een pakket schrijft in Overleaf](https://www.sharelatex.com/project/new/template?zipUrl=/project/53f11ec1eceb82a67658cb02/download/zip\&templateName=PackageExample\&compiler=pdflatex)

### Opties

Om wat flexibiliteit in de pakketten toe te laten, zijn enkele extra opties erg nuttig. Het volgende deel in het bestand "examplepackage.sty" verwerkt de parameters die aan de pakket-importverklaring worden doorgegeven.

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

\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}{Unknown ‘\CurrentOption’}}
\ProcessOptions\relax
```

Hieronder staat een beschrijving van de belangrijkste commando's die de opties kunnen afhandelen die aan het pakket worden doorgegeven.

Het commando `\DeclareOption{}{}` verwerkt een gegeven optie. Het neemt twee parameters: de eerste is de naam van de optie en de tweede is de code die moet worden uitgevoerd als de optie wordt doorgegeven.

Het commando `\OptionNotUsed` zal een bericht afdrukken in de compiler en in de logs; de optie zal niet worden gebruikt.

Het commando `\Declareoption*{}` verwerkt elke optie die niet expliciet is gedefinieerd. Het neemt slechts één parameter, de code die moet worden uitgevoerd wanneer een onbekende optie wordt doorgegeven. In dat geval wordt een waarschuwing afgedrukt via het volgende commando:

`\PackageWarning{}{}`. Zie [fouten afhandelen](#handling-errors) voor een beschrijving van wat dit commando doet.

`\CurrentOption` slaat de naam op van de pakketoptie die op een bepaald moment wordt verwerkt.

Het commando `\ProcessOptions\relax` voert de code uit voor elke optie en moet worden ingevoegd nadat alle opties-verwerkende commando's zijn getypt. Er is een versie met ster van dit commando die de opties in exact de volgorde uitvoert die door de aanroepende commando's is gespecificeerd.

In het voorbeeld, als de opties *red* of *blauw* worden doorgegeven aan het `\usepackage` commando binnen het document, wordt het commando `\wordcolor` opnieuw gedefinieerd. Beide kleuren en de standaard grijze kleur werden gedefinieerd in de [voorlopige declaraties](#preliminary-declaration) na het importeren van de *xcolor* pakket niet te gebruiken.

[Open een voorbeeld van hoe je een pakket schrijft in Overleaf](https://www.sharelatex.com/project/new/template?zipUrl=/project/53f11ec1eceb82a67658cb02/download/zip\&templateName=PackageExample\&compiler=pdflatex)

### Meer declaraties

In dit deel zullen de meeste commando's verschijnen. In "examplepackage.sty". Hieronder zie je het volledige pakketbestand.

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

\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}{Unknown ‘\CurrentOption’}}
\ProcessOptions\relax

%%Genummerde omgeving
\newcounter{example}[section]
\newenvironment{example}[1][]{\refstepcounter{example}\par\medskip
\noindent \textbf{Mijn~omgeving~\theexample. #1} \rmfamily}{\medskip}

%%Belangrijke woorden worden aan de index toegevoegd en in een andere kleur afgedrukt
\newcommand{\important}[1]
{\IfSubStr{#1}{!}
    {\textcolor{\wordcolour}{\textbf{\StrBefore{#1}{!}~\StrBehind{#1}{!}}}\index{#1}}
    {\textcolor{\wordcolour}{\textbf{#1}}\index{#1}\kern-1pt}
}
```

Dit pakket definieert de nieuwe omgeving `example`, en een nieuw commando `\important`, dat de woorden in een speciale kleur afdrukt en ze aan de index toevoegt.

Om elk commando volledig te begrijpen, zie de [naslaggids](#reference-guide) en de links in de [sectie verder lezen](#further-reading).

Hieronder staat een document dat het pakket gebruikt *examplepackage.sty*.

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

\usepackage[red]{examplepackage}

\makeindex

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

\begin{document}

\maketitle

\section{Introduction}
In dit document wordt een nieuw pakket getest. Dit pakket maakt speciale genummerde
omgevingen

\begin{example}
Deze tekst staat in een speciale omgeving, sommige vetgedrukte tekst wordt afgedrukt
aan het begin en er wordt een nieuwe inspringing ingesteld.
\end{example}

Ook is er een speciaal commando voor \important{belangrijk!woorden} dat zal worden
afgedrukt in een speciale \important{kleur}, afhankelijk van de parameter die wordt gebruikt in de
\important{pakket}-importverklaring. Omdat het \important{belangrijk} is.

\printindex

\end{document}
```

![WrittingPackagesEx1.png](/files/9829e00cba7cb758281951790e850c4d5919bb10)

Merk het commando op

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

[Open een voorbeeld van hoe je een pakket schrijft in Overleaf](https://www.sharelatex.com/project/new/template?zipUrl=/project/53f11ec1eceb82a67658cb02/download/zip\&templateName=PackageExample\&compiler=pdflatex)

## Fouten afhandelen

Bij het ontwikkelen van nieuwe pakketten is het belangrijk om mogelijke fouten af te handelen, zodat de gebruiker weet dat er iets misging. Er zijn vier hoofdcommando's om fouten in de compiler te melden.

* `\PackageError{*package-name*}{*error-text*}{*help-text*}`. Neemt drie parameters, elk tussen accolades: de pakketnaam, de fouttekst die zal worden weergegeven (het compilatieproces wordt gepauzeerd), en de hulptekst die wordt afgedrukt als de gebruiker op "h" drukt wanneer de compilatie pauzeert vanwege de fout.
* `\PackageWarning{*package-name*}{*warning-text*}`. In dit geval wordt de tekst weergegeven, maar het compilatieproces stopt niet. Het toont het regelnummer waar de waarschuwing optrad.
* `\PackageWarningNoLine{*package-name*}{*warning-text*}`. Werkt net als het vorige commando, maar toont niet de regel waar de waarschuwing optrad.
* `\PackageInfo{*package-name*}{*info-text*}`. In dit geval wordt de informatie in de tweede parameter alleen afgedrukt in het transcriptbestand, inclusief het regelnummer.

[Open een voorbeeld van hoe je een pakket schrijft in Overleaf](https://www.sharelatex.com/project/new/template?zipUrl=/project/53f11ec1eceb82a67658cb02/download/zip\&templateName=PackageExample\&compiler=pdflatex)

## Naslaggids

**Lijst van commando's die vaak worden gebruikt in pakketten en klassen**

* `\newcommand{*name*}{*definition*}`. Definieert een [nieuw commando](/latex/nl/opdrachten/01-commands.md#defining-a-new-command), de eerste parameter is de naam van het nieuwe commando, de tweede parameter is wat het commando zal doen.
* `\renewcommand{}{}`. Hetzelfde als `\newcommand` maar zal een bestaand commando overschrijven.
* `\providecommand{}{}`. Werkt precies als `\newcommand` maar als het commando al is gedefinieerd, wordt dit commando stilzwijgend genegeerd.
* `\CheckCommand{}{}`. De syntaxis is hetzelfde als `\newcommand`, maar in plaats daarvan controleert het of het commando bestaat en de verwachte definitie heeft; LaTeX toont een waarschuwing als het commando nu niet is wat `\CheckCommand` verwacht werd.
* `\setlength{}{}`. Stelt de lengte van het element dat als eerste parameter wordt doorgegeven in op de waarde die als tweede parameter is geschreven.
* `\mbox{}`. Maakt een vak dat de elementen bevat die tussen de accolades staan.
* `\fbox{}`. Hetzelfde als `\mbox`, maar er wordt daadwerkelijk een vak om de inhoud heen afgedrukt.

## Verder lezen

Zie voor meer informatie

* [Begrijpen van pakketten en klassebestanden](/latex/nl/class-bestanden/01-understanding-packages-and-class-files.md)
* [Je eigen class schrijven](/latex/nl/class-bestanden/04-writing-your-own-class.md)
* [Opdrachten](/latex/nl/opdrachten/01-commands.md) en [Omgevingen](/latex/nl/opdrachten/02-environments.md)
* [Lengtes in LaTeX](/latex/nl/opmaak/01-lengths-in-latex.md)
* [Kleuren gebruiken in LaTeX](/latex/nl/opmaak/13-using-colors-in-latex.md)
* [Beheer in een groot project](/latex/nl/documentstructuur/07-management-in-a-large-project.md)
* [LaTeX2ε voor pakket- en pakketschrijvers](http://www.latex-project.org/guides/clsguide.pdf)
* [Opmerkingen over programmeren in TeX](http://pgfplots.sourceforge.net/TeX-programming-notes.pdf)
* [Minuten in minder dan uren: LaTeX-bronnen gebruiken](https://tug.org/pracjourn/2005-4/hefferon/hefferon.pdf)
* [The LaTeX Companion. Tweede editie](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://ayakaleaf-pro.ayaka.space/latex/nl/class-bestanden/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.
