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

# Skrive din egen pakke

Noen ganger er det beste alternativet for å bruke egne kommandoer og makroer i et dokument å skrive en ny pakke fra bunnen av. Denne artikkelen forklarer hovedstrukturen til en ny pakke.

## Innledning

Det første man bør gjøre før man koder en ny pakke, er å avgjøre om du virkelig trenger en ny pakke eller ikke. Det anbefales å [søke på CTAN (Comprehensive TeX Archive Network)](http://www.ctan.org/ctan-portal/search/) og se om noen allerede har laget noe som ligner på det du trenger.

En annen viktig ting å ha i mente er [forskjellen mellom pakker og klasser](/latex/no/klassefiler/01-understanding-packages-and-class-files.md). Å velge feil kan påvirke fleksibiliteten til det endelige produktet.

## Generell struktur

Strukturen til alle pakke-filer kan grovt beskrives i de neste fire delene:

* ***Identifikasjon***. Filen erklærer seg selv som en pakke skrevet med LaTeX2ε-syntaksen.
* ***Foreløpige deklarasjoner***. Her importeres de eksterne pakkene som trengs. Dessuten kodes kommandoene og definisjonene som trengs av de deklarerte alternativene i denne delen av filen.
* ***Alternativer***. Pakken deklarerer og behandler alternativene.
* ***Flere deklarasjoner***. Hoveddelen av pakken. Nesten alt en pakke gjør, er definert her.

I de neste underseksjonene vil en mer detaljert beskrivelse av strukturen og et fungerende eksempel, *examplepackage.sty*, bli presentert.

### Identifikasjon

Det finnes to enkle kommandoer som alle pakker må ha:

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

Kommandoen `\NeedsTeXFormat{LaTeX2e}` angir LaTeX-versjonen pakken skal fungere med. I tillegg kan en dato legges til i hakeparenteser for å spesifisere den minimale utgivelsesdatoen som kreves.

Kommandoen `ProvidesPackage{examplepackage}[...]` identifiserer denne pakken som *examplepackage* og, inne i hakeparentesene, er utgivelsesdatoen og noe tilleggsinformasjon inkludert. Datoen bør være på formen ÅÅÅÅ/MM/DD

[Åpne 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øpige deklarasjoner

De fleste pakkene utvider og tilpasser eksisterende pakker, og trenger også noen eksterne pakker for å fungere. Nedenfor er det lagt til litt mer kode i 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}
```

Kommandoene i denne delen initialiserer enten noen parametere som senere vil bli brukt til å håndtere alternativene, eller importerer eksterne filer.

Kommandoen `\RequirePackage` er svært lik den velkjente `\usepackage`, og det fungerer også å legge til valgfrie parametere i hakeparenteser. Den eneste forskjellen er at `\usepackage` ikke kan brukes før `\documentclass` kommandoen. Det anbefales sterkt å bruke `\RequirePackage` når man skriver nye pakker eller klasser.

[Åpne 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)

### Alternativer

For å gi pakkene noe fleksibilitet er noen ekstra alternativer svært nyttige. Neste del i filen "examplepackage.sty" håndterer parameterne som sendes til uttalelsen om import av 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 av hovedkommandoene som kan håndtere alternativene som sendes til pakken.

Kommandoen `\DeclareOption{}{}` håndterer et gitt alternativ. Den tar to parametere, den første er navnet på alternativet og den andre er koden som skal kjøres hvis alternativet er sendt.

Kommandoen `\OptionNotUsed` vil skrive ut en melding i kompilatoren og i loggene, alternativet vil ikke bli brukt.

Kommandoen `\Declareoption*{}` håndterer alle alternativer som ikke er eksplisitt definert. Den tar bare én parameter, koden som skal kjøres når et ukjent alternativ sendes. I dette tilfellet vil den skrive ut en advarsel ved hjelp av neste kommando:

`\PackageWarning{}{}`. Se [håndtering av feil](#handling-errors) for en beskrivelse av hva denne kommandoen gjør.

`\CurrentOption` lagrer navnet på pakkealternativet som håndteres på et bestemt tidspunkt.

Kommandoen `\ProcessOptions\relax` kjører koden for hvert alternativ og må settes inn etter at alle kommandoene for håndtering av alternativer er skrevet. Det finnes en stjernemarkert versjon av denne kommandoen som kjører alternativene i nøyaktig den rekkefølgen som er spesifisert av kallende kommandoer.

I eksemplet, hvis alternativene *rød* eller *blue* sendes til `\usepackage` kommandoen i dokumentet, blir kommandoen `\wordcolor` omdefinert. Både fargene og den standard grå fargen ble definert i de [foreløpige deklarasjonene](#preliminary-declaration) etter import av *xcolor* pakken.

[Åpne 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 deklarasjoner

I denne delen vil de fleste kommandoene dukke opp. I "examplepackage.sty". Nedenfor kan du se hele pakkefilen.

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

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

%%Viktige ord legges til i indeksen og skrives ut i en annen farge
\newcommand{\important}[1]
{\IfSubStr{#1}{!}
    {\textcolor{\wordcolour}{\textbf{\StrBefore{#1}{!}~\StrBehind{#1}{!}}}\index{#1}}
    {\textcolor{\wordcolour}{\textbf{#1}}\index{#1}\kern-1pt}
}
```

Denne pakken definerer det nye miljøet `eksempel`, og en ny kommando `\important`, som skriver ordene i en spesiell farge og legger dem til i indeksen.

For å forstå hver kommando fullt ut, se [referanseguiden](#reference-guide) og lenkene i [delen for videre lesning](#further-reading).

Nedenfor, et dokument som bruker 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{Innledning}
I dette dokumentet testes en ny pakke. Denne pakken tillater spesielle nummererte
miljøer

\begin{example}
Denne teksten er inne i et spesielt miljø, noe fet tekst skrives ut
i begynnelsen og en ny innrykksetting er satt.
\end{example}

I tillegg finnes det en spesiell kommando for \important{viktige!ord} som vil bli
skrevet ut i en spesiell \important{farge} avhengig av parameteren som brukes i
\important{pakken}-importuttalelsen. Fordi det er \important{viktig}.

\printindex

\end{document}
```

![WrittingPackagesEx1.png](/files/96bd0024426786446a3f00eef91ba8c896117462)

Legg merke til kommandoen

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

[Åpne 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 av feil

Når det gjelder å utvikle nye pakker, er det viktig å håndtere mulige feil for å la brukeren vite at noe gikk galt. Det finnes fire hovedkommandoer for å rapportere feil i kompilatoren.

* `\PackageError{*package-name*}{*error-text*}{*help-text*}`. Tar tre parametere, hver inne i krøllparenteser: pakkenavnet, feilmeldingen som skal vises (kompileringsprosessen vil bli satt på pause), og hjelpeteksten som vil bli skrevet ut hvis brukeren trykker "h" når kompileringen stopper på grunn av feilen.
* `\PackageWarning{*package-name*}{*warning-text*}`. I dette tilfellet vises teksten, men kompileringsprosessen stopper ikke. Den vil vise linjenummeret der advarselen oppsto.
* `\PackageWarningNoLine{*package-name*}{*warning-text*}`. Fungerer akkurat som forrige kommando, men den vil ikke vise linjen der advarselen oppsto.
* `\PackageInfo{*package-name*}{*info-text*}`. I dette tilfellet vil informasjonen i den andre parameteren bare bli skrevet ut i transkripsjonsfilen, inkludert linjenummeret.

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

## Referanseguide

**Liste over kommandoer som ofte brukes i pakker og klasser**

* `\newcommand{*name*}{*definition*}`. Definerer en [ny kommando](/latex/no/kommandoer/01-commands.md#defining-a-new-command), den første parameteren er navnet på den nye kommandoen, den andre parameteren er det kommandoen skal gjøre.
* `\renewcommand{}{}`. Det samme som `\newcommand` men vil overskrive en eksisterende kommando.
* `\providecommand{}{}`. Fungerer akkurat som `\newcommand` men hvis kommandoen allerede er definert, vil denne bli ignorert uten varsel.
* `\CheckCommand{}{}`. Syntaksen er den samme som `\newcommand`, men den vil i stedet sjekke om kommandoen finnes og har den forventede definisjonen. LaTeX vil vise en advarsel hvis kommandoen nå er det som `\CheckCommand` forventet.
* `\setlength{}{}`. Setter lengden til elementet som sendes som første parameter til verdien skrevet som andre parameter.
* `\mbox{}`. Oppretter en boks som inneholder elementene skrevet inne i krøllparentesene.
* `\fbox{}`. Det samme som `\mbox`, men en boks skrives faktisk rundt innholdet.

## Videre lesning

For mer informasjon, se

* [Forstå pakker og klassefiler](/latex/no/klassefiler/01-understanding-packages-and-class-files.md)
* [Å skrive din egen klasse](/latex/no/klassefiler/04-writing-your-own-class.md)
* [Kommandoer](/latex/no/kommandoer/01-commands.md) og [Miljøer](/latex/no/kommandoer/02-environments.md)
* [Lengder i LaTeX](/latex/no/formatering/01-lengths-in-latex.md)
* [Bruke farger i LaTeX](/latex/no/formatering/13-using-colors-in-latex.md)
* [Håndtering i et stort prosjekt](/latex/no/dokumentstruktur/07-management-in-a-large-project.md)
* [LaTeX2ε for pakke- og pakkeskribenter](http://www.latex-project.org/guides/clsguide.pdf)
* [Notater om programmering i tex](http://pgfplots.sourceforge.net/TeX-programming-notes.pdf)
* [Minutter på mindre enn timer: Bruk av LaTeX-ressurser](https://tug.org/pracjourn/2005-4/hefferon/hefferon.pdf)
* [The LaTeX Companion. Andre utgave](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/no/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.
