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

# Skriva ditt eget paket

Ibland är det bästa alternativet för att använda dina egna kommandon och makron i ett dokument att skriva ett nytt paket från grunden. Den här artikeln förklarar den huvudsakliga strukturen i ett nytt paket.

## Introduktion

Det första man bör göra innan man kodar ett nytt paket är att avgöra om du verkligen behöver ett nytt paket eller inte. Det rekommenderas att [söka på CTAN (Comprehensive TeX Archive Network)](http://www.ctan.org/ctan-portal/search/) och se om någon redan har skapat något liknande det du behöver.

En annan viktig sak att ha i åtanke är [skillnaden mellan paket och klasser](/latex/sv/klassfiler/01-understanding-packages-and-class-files.md). Att göra fel val kan påverka slutproduktens flexibilitet.

## Allmän struktur

Strukturen för alla paketfiler kan grovt beskrivas i följande fyra delar:

* ***Identifiering***. Filen deklarerar sig själv som ett paket skrivet med LaTeX2ε-syntaxen.
* ***Inledande deklarationer***. Här importeras de externa paket som behövs. I denna del av filen kodas också de kommandon och definitioner som behövs för de deklarerade alternativen.
* ***Alternativ***. Paketet deklarerar och bearbetar alternativen.
* ***Fler deklarationer***. Paketets huvuddel. Nästan allt som ett paket gör definieras här.

I följande underrubriker kommer en mer detaljerad beskrivning av strukturen och ett fungerande exempel, *examplepackage.sty*, att presenteras.

### Identifiering

Det finns två enkla kommandon som alla paket måste ha:

```latex
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{examplepackage}[2014/08/24 Exempel på LaTeX-paket]
```

Kommandot `\NeedsTeXFormat{LaTeX2e}` anger LaTeX-versionen som paketet ska fungera med. Dessutom kan ett datum läggas till inom hakparenteser för att ange det minsta utgåvedatum som krävs.

Kommandot `ProvidesPackage{examplepackage}[...]` identifierar detta paket som *examplepackage* och inom hakparenteserna ingår utgivningsdatumet och viss ytterligare information. Datumet ska skrivas i formen ÅÅÅÅ/MM/DD

[Öppna ett exempel på hur man skriver ett paket i Overleaf](https://www.sharelatex.com/project/new/template?zipUrl=/project/53f11ec1eceb82a67658cb02/download/zip\&templateName=PackageExample\&compiler=pdflatex)

### Inledande deklarationer

De flesta paket utökar och anpassar befintliga paket och behöver också vissa externa paket för att fungera. Nedan läggs mer kod till i exempelpaketet "examplepackage.sty".

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

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

Kommandona i denna del initierar antingen några parametrar som senare kommer att användas för att hantera alternativen, eller importerar externa filer.

Kommandot `\RequirePackage` är mycket lik det välkända `\usepackage`, att lägga till valfria parametrar inom hakparenteser fungerar också. Den enda skillnaden är att `\usepackage` kan inte användas före `\documentclass` kommandot. Det rekommenderas starkt att använda `\RequirePackage` när man skriver nya paket eller klasser.

[Öppna ett exempel på hur man skriver ett paket i Overleaf](https://www.sharelatex.com/project/new/template?zipUrl=/project/53f11ec1eceb82a67658cb02/download/zip\&templateName=PackageExample\&compiler=pdflatex)

### Alternativ

För att ge lite flexibilitet i paketen är några ytterligare alternativ mycket användbara. Nästa del i filen "examplepackage.sty" hanterar parametrarna som skickas till paketimport-satsen.

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

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

Nedan följer en beskrivning av de viktigaste kommandona som kan hantera alternativen som skickas till paketet.

Kommandot `\DeclareOption{}{}` hanterar ett givet alternativ. Det tar två parametrar, den första är alternativets namn och den andra är den kod som ska köras om alternativet skickas.

Kommandot `\OptionNotUsed` kommer att skriva ut ett meddelande i kompilatorn och i loggarna, alternativet kommer inte att användas.

Kommandot `\Declareoption*{}` hanterar alla alternativ som inte uttryckligen definierats. Det tar bara en parameter, den kod som ska köras när ett okänt alternativ skickas. I detta fall kommer det att skriva ut en varning med hjälp av nästa kommando:

`\PackageWarning{}{}`. Se [felhantering](#handling-errors) för en beskrivning av vad detta kommando gör.

`\CurrentOption` lagrar namnet på paketalternativet som hanteras vid ett visst tillfälle.

Kommandot `\ProcessOptions\relax` kör koden för varje alternativ och måste infogas efter att alla kommandon för alternativhantering har skrivits. Det finns en variant av detta kommando med stjärna som kör alternativen i exakt den ordning som anges av anropande kommandon.

I exemplet, om alternativen *red* eller *blå* skickas till `\usepackage` kommandot i dokumentet, kommandot `\wordcolor` definieras om. Både färgerna och standardfärgen grå definierades i [de inledande deklarationerna](#preliminary-declaration) efter att ha importerat *xcolor* paketet.

[Öppna ett exempel på hur man skriver ett paket i Overleaf](https://www.sharelatex.com/project/new/template?zipUrl=/project/53f11ec1eceb82a67658cb02/download/zip\&templateName=PackageExample\&compiler=pdflatex)

### Fler deklarationer

I denna del kommer de flesta kommandona att förekomma. I "examplepackage.sty". Nedan kan du se hela paketfilen.

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

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

%%Numrerad miljö
\newcounter{example}[section]
\newenvironment{example}[1][]{\refstepcounter{example}\par\medskip
\noindent \textbf{Min~miljö~\theexample. #1} \rmfamily}{\medskip}

%%Viktiga ord läggs till i indexet och skrivs ut i olika färg
\newcommand{\important}[1]
{\IfSubStr{#1}{!}
    {\textcolor{\wordcolour}{\textbf{\StrBefore{#1}{!}~\StrBehind{#1}{!}}}\index{#1}}
    {\textcolor{\wordcolour}{\textbf{#1}}\index{#1}\kern-1pt}
}
```

Detta paket definierar den nya miljön `exempel`, och ett nytt kommando `\important`, som skriver ut orden i en särskild färg och lägger till dem i indexet.

För att fullt ut förstå varje kommando, se [referensguiden](#reference-guide) och länkarna i [avsnittet för vidare läsning](#further-reading).

Nedan finns ett dokument som använder paketet *examplepackage.sty*.

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

\usepackage[red]{examplepackage}

\makeindex

\title{Paketexempel}
\author{Teamet Learn ShareLaTeX}
\date{ }

\begin{document}

\maketitle

\section{Introduktion}
I detta dokument testas ett nytt paket. Detta paket tillåter särskilda numrerade
miljöer

\begin{example}
Den här texten finns i en särskild miljö, viss text i fetstil skrivs ut
i början och en ny indragning ställs in.
\end{example}

Dessutom finns det ett särskilt kommando för \important{viktiga!ord} som kommer att
skrivas ut i en särskild \important{färg} beroende på den parameter som används i
\important{paketets} importdeklaration. Eftersom det är \important{viktigt}.

\printindex

\end{document}
```

![WrittingPackagesEx1.png](/files/8cf3534a8772522919ae5ddff36ae948085ab3df)

Observera kommandot

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

[Öppna ett exempel på hur man skriver ett paket i Overleaf](https://www.sharelatex.com/project/new/template?zipUrl=/project/53f11ec1eceb82a67658cb02/download/zip\&templateName=PackageExample\&compiler=pdflatex)

## Felhantering

När det gäller att utveckla nya paket är det viktigt att hantera möjliga fel för att låta användaren veta att något gick fel. Det finns fyra huvudkommandon för att rapportera fel i kompilatorn.

* `\PackageError{*package-name*}{*error-text*}{*help-text*}`. Tar tre parametrar, var och en inom klamrar: paketnamnet, feltexten som ska visas (kompileringen pausas), och hjälptexten som kommer att skrivas ut om användaren trycker på "h" när kompileringen pausas på grund av felet.
* `\PackageWarning{*package-name*}{*warning-text*}`. I detta fall visas texten men kompileringen stoppar inte. Den visar radnumret där varningen uppstod.
* `\PackageWarningNoLine{*package-name*}{*warning-text*}`. Fungerar precis som det föregående kommandot, men det visar inte raden där varningen uppstod.
* `\PackageInfo{*package-name*}{*info-text*}`. I detta fall kommer informationen i den andra parametern endast att skrivas ut i transkriptfilen, inklusive radnumret.

[Öppna ett exempel på hur man skriver ett paket i Overleaf](https://www.sharelatex.com/project/new/template?zipUrl=/project/53f11ec1eceb82a67658cb02/download/zip\&templateName=PackageExample\&compiler=pdflatex)

## Referensguide

**Lista över kommandon som vanligtvis används i paket och klasser**

* `\newcommand{*name*}{*definition*}`. Definierar ett [nytt kommando](/latex/sv/kommandon/01-commands.md#defining-a-new-command), den första parametern är namnet på det nya kommandot, den andra parametern är vad kommandot ska göra.
* `\renewcommand{}{}`. Samma som `\\newcommand` men kommer att skriva över ett befintligt kommando.
* `\providecommand{}{}`. Fungerar precis som `\\newcommand` men om kommandot redan är definierat kommer detta att ignoreras tyst.
* `\CheckCommand{}{}`. Syntaxen är densamma som `\\newcommand`, men istället kommer det att kontrollera om kommandot finns och har den förväntade definitionen, LaTeX kommer att visa en varning om kommandot nu är det som `\CheckCommand` förväntar sig.
* `\setlength{}{}`. Ställer in längden på elementet som skickas som första parameter till det värde som skrivs som andra parameter.
* `\mbox{}`. Skapar en ruta som innehåller elementen som skrivs inuti klamrarna.
* `\fbox{}`. Samma som `\mbox`, men en ruta skrivs faktiskt runt innehållet.

## Vidare läsning

För mer information, se

* [Förstå paket och klassfiler](/latex/sv/klassfiler/01-understanding-packages-and-class-files.md)
* [Att skriva din egen klass](/latex/sv/klassfiler/04-writing-your-own-class.md)
* [Kommandon](/latex/sv/kommandon/01-commands.md) och [Miljöer](/latex/sv/kommandon/02-environments.md)
* [Längder i LaTeX](/latex/sv/formatering/01-lengths-in-latex.md)
* [Använda färger i LaTeX](/latex/sv/formatering/13-using-colors-in-latex.md)
* [Hantering i ett stort projekt](/latex/sv/dokumentstruktur/07-management-in-a-large-project.md)
* [LaTeX2ε för paket- och paketförfattare](http://www.latex-project.org/guides/clsguide.pdf)
* [Anteckningar om programmering i tex](http://pgfplots.sourceforge.net/TeX-programming-notes.pdf)
* [Minuter på mindre än timmar: Användning av LaTeX-resurser](https://tug.org/pracjourn/2005-4/hefferon/hefferon.pdf)
* [The LaTeX Companion. Andra upplagan](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/sv/klassfiler/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.
