> 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/04-writing-your-own-class.md).

# Skriva din egen klass

Ibland är det bästa alternativet för att anpassa ett dokument att skriva en ny klass från grunden. Den här artikeln förklarar den huvudsakliga strukturen och de kommandon som behövs i en ny klass.

## Introduktion

Det första man bör göra innan man kodar en ny klass är att avgöra om du verkligen behöver en ny klass 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 den dokumentklass 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 klassfiler kan grovt beskrivas i följande fyra delar:

* ***Identifiering***. Filen deklarerar sig själv som en klass skriven med LaTeX2ε-syntaxen.
* ***Inledande deklarationer***. Här importeras de externa paket och klasser som behövs. Dessutom kodas de kommandon och definitioner som behövs för de deklarerade alternativen i denna del av filen.
* ***Alternativ***. Klassen deklarerar och bearbetar alternativen.
* ***Fler deklarationer***. Huvuddelen av klassen. Nästan allt som en klass gör definieras här.

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

### Identifiering

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

```latex
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{exampleclass}[2014/08/16 Example LaTeX class]
```

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

Kommandot `ProvidesClass{exampleclass}[...]` identifierar denna klass som *exampleclass* och inom hakparenteserna ingår utgivningsdatumet och viss ytterligare information. Datumet ska skrivas i formen ÅÅÅÅ/MM/DD

[Öppna ett exempel på hur man skriver en klass i Overleaf](https://www.overleaf.com/project/new/template/19419?id=65524436\&templateName=An+example+of+writing+a+LaTeX+class\&latexEngine=\&texImage=texlive-full%3A2020.1\&mainFile=)

### Inledande deklarationer

De flesta klasser utökar och anpassar befintliga, och behöver också några externa paket för att fungera. Nedan läggs lite mer kod till i exempelklassen `exampleclass.cls`.

```latex
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{exampleclass}[2014/08/16 Example LaTeX class]

\newcommand{\headlinecolor}{\normalcolor}
\LoadClass[twocolumn]{article}
\RequirePackage{xcolor}
\definecolor{slcolor}{HTML}{882B21}
```

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 `\LoadClass[twocolumn]{article}` läser in klassen `article` med den extra parametern `twocolumn`. Därför kommer alla kommandon i standard `article` klassen automatiskt att vara tillgängliga i **exempel** klassen, förutom att dokumentet kommer att skrivas ut i tvåspaltsformat.

`\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 du skriver nya klasser eller paket.

[Öppna ett exempel på hur man skriver en klass i Overleaf](https://www.overleaf.com/project/new/template/19419?id=65524436\&templateName=An+example+of+writing+a+LaTeX+class\&latexEngine=\&texImage=texlive-full%3A2020.1\&mainFile=)

### Alternativ

För att ge viss flexibilitet i klasserna är några extra alternativ mycket användbara. Nästa del i filen `exampleclass.cls` hanterar parametrarna som skickas till kommandot för dokumentklassen. Vi har också flyttat `\LoadClass` till *efter* när alternativen bearbetas, så att alternativ som anges i .tex-filen kan skickas vidare till basklassen.

```latex
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{exampleclass}[2014/08/16 Example LaTeX class]

\newcommand{\headlinecolor}{\normalcolor}
\RequirePackage{xcolor}
\definecolor{slcolor}{HTML}{882B21}

\DeclareOption{onecolumn}{\OptionNotUsed}
\DeclareOption{green}{\renewcommand{\headlinecolor}{\color{green}}}
\DeclareOption{red}{\renewcommand{\headlinecolor}{\color{slcolor}}}
\DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}}
\ProcessOptions\relax
\LoadClass[twocolumn]{article}
```

Det finns fyra huvudkommandon här som hanterar alternativen som skickas till klassen.

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 loggarna, alternativet kommer inte att användas. I det här fallet är dokumentet inställt på två spalter, och om användaren försöker ändra det till en spalt kommer det inte att fungera, alternativet kommer att ignoreras.

Kommandot `\Declareoption*{}` hanterar varje alternativ som inte är uttryckligen definierat. Det tar bara en parameter, koden som ska köras när ett okänt alternativ skickas. I det här fallet körs nästa kommando:

`\PassOptionsToClass{}{}`. Skickar alternativet inom den första klammerparentesparen till dokumentklassen som anges inom den andra klammerparentesparen. I exemplet kommer alla okända alternativ att skickas till **article** dokumentklassen.

`\CurrentOption` lagrar namnet på klassalternativet som hanteras vid ett givet tillfälle.

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

I exemplet, om alternativen `red` eller `green` skickas till dokumentet kommer typsnittet som används för rubriken och avsnitten att sättas till motsvarande färg. Färgen som kallas `slcolor` definierades i [de inledande deklarationerna](#preliminary-declaration) efter att ha importerat `xcolor` paketet.

[Öppna ett exempel på hur man skriver en klass i Overleaf](https://www.overleaf.com/project/new/template/19419?id=65524436\&templateName=An+example+of+writing+a+LaTeX+class\&latexEngine=\&texImage=texlive-full%3A2020.1\&mainFile=)

### Fler deklarationer

I denna del kommer de flesta kommandona att visas. I "exampleclass.cls" anges sidans mått samt teckenstorleken för titeln, brödtexten och avsnitten. Nedan kan du se hela klassfilen.

```latex
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{exampleclass}[2014/08/16 Example LaTeX class]

\newcommand{\headlinecolor}{\normalcolor}
\RequirePackage{xcolor}
\definecolor{slcolor}{HTML}{882B21}

\DeclareOption{onecolumn}{\OptionNotUsed}
\DeclareOption{green}{\renewcommand{\headlinecolor}{\color{green}}}
\DeclareOption{red}{\renewcommand{\headlinecolor}{\color{slcolor}}}
\DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}}
\ProcessOptions\relax
\LoadClass[twocolumn]{article}

\renewcommand{\maketitle}{%
    \twocolumn[%
        \fontsize{50}{60}\fontfamily{phv}\fontseries{b}%
        \fontshape{sl}\selectfont\headlinecolor
        \@title
        \medskip
        ]%
}

\renewcommand{\section}{%
    \@startsection
    {section}{1}{0pt}{-1.5ex plus -1ex minus -.2ex}%
    {1ex plus .2ex}{\large\sffamily\slshape\headlinecolor}%
}

\renewcommand{\normalsize}{\fontsize{9}{10}\selectfont}
\setlength{\textwidth}{17.5cm}
\setlength{\textheight}{22cm}
\setcounter{secnumdepth}{0}
```

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

De sista fyra kommandona i exemplet visar de fyra saker som alla klasser måste innehålla:

* Definitionen av `normalsize`. Ställer in standard- [teckenstorlek](/latex/sv/typsnitt/01-font-sizes-families-and-styles.md).
* Ett standardvärde för [`textwidth`](/latex/sv/formatering/07-page-size-and-margins.md)
* Ett standardvärde för [`textheight`](/latex/sv/formatering/07-page-size-and-margins.md)
* Specifikationerna för [sidnumreringen](/latex/sv/formatering/03-page-numbering.md).

Nedan visas ett dokument som använder klassen *exampleclass.cls*.

```latex
\documentclass[red]{exampleclass}
\usepackage[utf8]{inputenc}
\usepackage[english]{babel}

\usepackage{blindtext}

\title{Exempel som visar hur klasser fungerar}
\author{Teamet Learn ShareLaTeX}
\date{Augusti 2014}

\begin{document}

\maketitle

\noindent
Låt oss börja här med ett enkelt fungerande exempel.

\blindtext

\section{Introduktion}

Monty Hall-problemet...

\section{Samma sak}

Monty...
```

![WrittingClassesEx1.png](/files/d04106169998e4c129fa6fd08b7f0c4179d8aaae)

Observera att det första kommandot här är

```latex
\documentclass[red]{exampleclass}
```

[Öppna ett exempel på hur man skriver en klass i Overleaf](https://www.overleaf.com/project/new/template/19419?id=65524436\&templateName=An+example+of+writing+a+LaTeX+class\&latexEngine=\&texImage=texlive-full%3A2020.1\&mainFile=)

## Felhantering

När det gäller att utveckla nya klasser ä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.

* `\ClassError{*class-name*}{*error-text*}{*help-text*}`. Tar tre parametrar, var och en inom klammerparenteser: klassens namn, feltexten som kommer att visas (kompileringsprocessen kommer att pausas) och hjälptexten som kommer att skrivas ut om användaren trycker på "h" när kompileringen pausas på grund av felet.
* `\ClassWarning{*class-name*}{*warning-text*}`. I detta fall visas texten men kompileringen stoppar inte. Den visar radnumret där varningen uppstod.
* `\ClassWarningNoLine{*class-name*}{*warning-text*}`. Fungerar precis som det föregående kommandot, men det visar inte raden där varningen uppstod.
* `\ClassInfo{*class 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 en klass i Overleaf](https://www.overleaf.com/project/new/template/19419?id=65524436\&templateName=An+example+of+writing+a+LaTeX+class\&latexEngine=\&texImage=texlive-full%3A2020.1\&mainFile=)

## Referensguide

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

* `\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 i stället kommer den att kontrollera om kommandot finns och har den förväntade definitionen; LaTeX kommer att visa en varning om kommandot inte är vad `\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)
* [Skriv ditt eget paket](/latex/sv/klassfiler/03-writing-your-own-package.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 klass- 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/04-writing-your-own-class.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.
