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

# Skrivning af din egen pakke

Nogle gange er den bedste løsning til at bruge dine egne kommandoer og makroer i et dokument at skrive en ny pakke fra bunden. Denne artikel forklarer den overordnede struktur i en ny pakke.

## Introduktion

Det første man skal gøre før man koder en ny pakke, er at afgøre, om man virkelig har brug for en ny pakke eller ej. Det anbefales at [søge på CTAN (Comprehensive TeX Archive Network)](http://www.ctan.org/ctan-portal/search/) og se, om nogen allerede har lavet noget lignende det, du har brug for.

En anden vigtig ting at have i tankerne er [forskellen mellem pakker og klasser](/latex/da/klassefiler/01-understanding-packages-and-class-files.md). At træffe det forkerte valg kan påvirke det færdige produkts fleksibilitet.

## Generel struktur

Strukturen af alle pakkefiler kan groft beskrives i de næste fire dele:

* ***Identifikation***. Filen erklærer sig selv som en pakke skrevet med LaTeX2ε-syntaksen.
* ***Foreløbige erklæringer***. Her importeres de eksterne pakker, der er nødvendige. Også i denne del af filen kodes de kommandoer og definitioner, som de erklærede indstillinger har brug for.
* ***Indstillinger***. Pakken erklærer og behandler indstillingerne.
* ***Flere erklæringer***. Pakken hoveddel. Næsten alt, en pakke gør, defineres her.

I de næste underafsnit præsenteres en mere detaljeret beskrivelse af strukturen og et fungerende eksempel, *examplepackage.sty*, vil blive præsenteret.

### Identifikation

Der er to enkle kommandoer, som alle pakker skal have:

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

Kommandoen `\NeedsTeXFormat{LaTeX2e}` sætter den LaTeX-version, som pakken skal arbejde med. Derudover kan en dato tilføjes i klammer for at angive den minimale nødvendige udgivelsesdato.

Kommandoen `ProvidesPackage{examplepackage}[...]` identificerer denne pakke som *examplepackage* og inde i klammerne er udgivelsesdatoen og nogle yderligere oplysninger inkluderet. Datoen skal være på formen ÅÅÅÅ/MM/DD

[Åbn et eksempel på, hvordan man skriver en pakke i Overleaf](https://www.sharelatex.com/project/new/template?zipUrl=/project/53f11ec1eceb82a67658cb02/download/zip\&templateName=PackageExample\&compiler=pdflatex)

### Foreløbige erklæringer

De fleste pakker udvider og tilpasser eksisterende pakker og har også brug for nogle eksterne pakker for at fungere. Nedenfor tilføjes der lidt mere kode til eksempelpakken "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}
```

Kommandoerne i denne del initialiserer enten nogle parametre, der senere vil blive brugt til at håndtere indstillingerne, eller importerer eksterne filer.

Kommandoen `\RequirePackage` er meget lig den velkendte `\usepackage`, og at tilføje valgfrie parametre i klammer vil også fungere. Den eneste forskel er, at den `\usepackage` ikke kan bruges før `\documentclass` kommandoen. Det anbefales kraftigt at bruge `\RequirePackage` når man skriver nye pakker eller klasser.

[Åbn et eksempel på, hvordan man skriver en pakke i Overleaf](https://www.sharelatex.com/project/new/template?zipUrl=/project/53f11ec1eceb82a67658cb02/download/zip\&templateName=PackageExample\&compiler=pdflatex)

### Indstillinger

For at give pakkerne lidt fleksibilitet er nogle ekstra indstillinger meget nyttige. Den næste del i filen "examplepackage.sty" håndterer de parametre, der sendes til den kommando, der importerer pakken.

```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
```

Nedenfor er en beskrivelse af de vigtigste kommandoer, der kan håndtere de indstillinger, der sendes til pakken.

Kommandoen `\DeclareOption{}{}` håndterer en given indstilling. Den tager to parametre: den første er navnet på indstillingen, og den anden er den kode, der skal udføres, hvis indstillingen gives.

Kommandoen `\OptionNotUsed` vil udskrive en besked i compileren og logfilerne; indstillingen vil ikke blive brugt.

Kommandoen `\Declareoption*{}` håndterer alle indstillinger, der ikke er eksplicit defineret. Den tager kun én parameter, koden der skal udføres, når en ukendt indstilling gives. I dette tilfælde vil den udskrive en advarsel via den næste kommando:

`\PackageWarning{}{}`. Se [håndtering af fejl](#handling-errors) for en beskrivelse af, hvad denne kommando gør.

`\CurrentOption` gemmer navnet på den pakkeindstilling, der håndteres på et givet tidspunkt.

Kommandoen `\ProcessOptions\relax` udfører koden for hver indstilling og skal indsættes, efter at alle kommandoerne til håndtering af indstillinger er skrevet. Der findes en stjerne-version af denne kommando, som vil udføre indstillingerne i nøjagtig den rækkefølge, der er angivet af de kaldende kommandoer.

I eksemplet, hvis indstillingerne *rød* eller *blå* sendes til `\usepackage` kommandoen i dokumentet, bliver kommandoen `\wordcolor` omdefineret. Begge farver og standardgråfarven blev defineret i de [foreløbige erklæringer](#preliminary-declaration) efter importen af *xcolor* pakken.

[Åbn et eksempel på, hvordan man skriver en pakke i Overleaf](https://www.sharelatex.com/project/new/template?zipUrl=/project/53f11ec1eceb82a67658cb02/download/zip\&templateName=PackageExample\&compiler=pdflatex)

### Flere erklæringer

I denne del vil de fleste kommandoer optræde. I "examplepackage.sty". Nedenfor kan du se den fulde pakkefil.

```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

%%Nummereret miljø
\newcounter{example}[section]
\newenvironment{example}[1][]{\refstepcounter{example}\par\medskip
\noindent \textbf{Mit~miljø~\theexample. #1} \rmfamily}{\medskip}

%%Vigtige ord tilføjes til indekset og udskrives i en anden farve
\newcommand{\important}[1]
{\IfSubStr{#1}{!}
    {\textcolor{\wordcolour}{\textbf{\StrBefore{#1}{!}~\StrBehind{#1}{!}}}\index{#1}}
    {\textcolor{\wordcolour}{\textbf{#1}}\index{#1}\kern-1pt}
}
```

Denne pakke definerer det nye miljø `eksempel`, samt en ny kommando `\important`, der udskriver ordene i en særlig farve og tilføjer dem til indekset.

For fuldt ud at forstå hver kommando, se [referencevejledningen](#reference-guide) og linksene i [sektionen for videre læsning](#further-reading).

Nedenfor et dokument, der bruger pakken *examplepackage.sty*.

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

\usepackage[red]{examplepackage}

\makeindex

\title{Package Example}
\author{Team Learn ShareLaTeX}
\\date{ }

\begin{document}

\maketitle

\section{Introduktion}
I dette dokument testes en ny pakke. Denne pakke tillader særlige nummererede
miljøer

\begin{example}
Denne tekst er inde i et særligt miljø, noget fed skrift udskrives
i begyndelsen, og der sættes en ny indrykning.
\end{example}

Derudover er der en særlig kommando til \important{vigtige!ord}, som vil blive
udskrevet i en særlig \important{farve} afhængigt af den parameter, der bruges i
\important{pakke}-importudsagnet. Fordi det er \important{vigtigt}.

\printindex

\end{document}
```

![WrittingPackagesEx1.png](/files/68ade9fa060cf59240e6d6d50d55108419692e1a)

Bemærk kommandoen

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

[Åbn et eksempel på, hvordan man skriver en pakke i Overleaf](https://www.sharelatex.com/project/new/template?zipUrl=/project/53f11ec1eceb82a67658cb02/download/zip\&templateName=PackageExample\&compiler=pdflatex)

## Håndtering af fejl

Når det kommer til at udvikle nye pakker, er det vigtigt at håndtere mulige fejl for at lade brugeren vide, at noget gik galt. Der er fire hovedkommandoer til at rapportere fejl i compileren.

* `\PackageError{*package-name*}{*error-text*}{*help-text*}`. Tager tre parametre, hver især i klammer: pakkenavnet, fejlteksten som vil blive vist (kompileringsprocessen vil blive sat på pause), og hjælpeteksten som vil blive udskrevet, hvis brugeren trykker på "h" når kompileringen pauser på grund af fejlen.
* `\PackageWarning{*package-name*}{*warning-text*}`. I dette tilfælde vises teksten, men kompileringsprocessen stopper ikke. Den vil vise linjenummeret, hvor advarslen opstod.
* `\PackageWarningNoLine{*package-name*}{*warning-text*}`. Fungerer ligesom den forrige kommando, men den vil ikke vise linjen, hvor advarslen opstod.
* `\PackageInfo{*package-name*}{*info-text*}`. I dette tilfælde vil oplysningerne i det andet parameter kun blive udskrevet i transkriptfilen, inklusive linjenummeret.

[Åbn et eksempel på, hvordan man skriver en pakke i Overleaf](https://www.sharelatex.com/project/new/template?zipUrl=/project/53f11ec1eceb82a67658cb02/download/zip\&templateName=PackageExample\&compiler=pdflatex)

## Referencevejledning

**Liste over kommandoer, der ofte bruges i pakker og klasser**

* `\newcommand{*name*}{*definition*}`. Definerer en [ny kommando](/latex/da/kommandoer/01-commands.md#defining-a-new-command), det første parameter er navnet på den nye kommando, det andet parameter er det, kommandoen vil gøre.
* `\renewcommand{}{}`. Det samme som `\newcommand` men vil overskrive en eksisterende kommando.
* `\providecommand{}{}`. Fungerer ligesom `\newcommand` men hvis kommandoen allerede er defineret, vil denne blive ignoreret uden en fejlmeddelelse.
* `\CheckCommand{}{}`. Syntaksen er den samme som `\newcommand`, men i stedet vil den tjekke, om kommandoen findes og har den forventede definition; LaTeX vil vise en advarsel, hvis kommandoen er nu det, som `\CheckCommand` forventes.
* `\setlength{}{}`. Sætter længden på det element, der gives som første parameter, til værdien skrevet som anden parameter.
* `\mbox{}`. Opretter en boks, der indeholder elementerne skrevet inde i klammerne.
* `\fbox{}`. Det samme som `\mbox`, men der udskrives faktisk en ramme omkring indholdet.

## Yderligere læsning

For mere information, se

* [Forstå pakker og klassefiler](/latex/da/klassefiler/01-understanding-packages-and-class-files.md)
* [Skriv din egen klasse](/latex/da/klassefiler/04-writing-your-own-class.md)
* [Kommandoer](/latex/da/kommandoer/01-commands.md) og [Miljøer](/latex/da/kommandoer/02-environments.md)
* [Længder i LaTeX](/latex/da/formatering/01-lengths-in-latex.md)
* [Brug af farver i LaTeX](/latex/da/formatering/13-using-colors-in-latex.md)
* [Håndtering i et stort projekt](/latex/da/dokumentstruktur/07-management-in-a-large-project.md)
* [LaTeX2ε til pakker og pakke-forfattere](http://www.latex-project.org/guides/clsguide.pdf)
* [Noter om programmering i TeX](http://pgfplots.sourceforge.net/TeX-programming-notes.pdf)
* [Minutter i stedet for timer: Brug af LaTeX-ressourcer](https://tug.org/pracjourn/2005-4/hefferon/hefferon.pdf)
* [The LaTeX Companion. Anden udgave](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/da/klassefiler/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.
