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

# Å skrive din egen klasse

Noen ganger er det beste alternativet for å tilpasse et dokument å skrive en ny klasse fra bunnen av. Denne artikkelen forklarer den viktigste strukturen og kommandoene som trengs i en ny klasse.

## Innledning

Det første man bør gjøre før man koder en ny klasse, er å avgjøre om du virkelig trenger en ny klasse 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 lignende som dokumentklassen 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 klassefiler kan grovt beskrives i de neste fire delene:

* ***Identifikasjon***. Filen erklærer seg selv som en klasse skrevet med LaTeX2ε-syntaksen.
* ***Foreløpige deklarasjoner***. Her importeres de eksterne pakkene og klassene som trengs. Også i denne delen av filen kodes kommandoene og definisjonene som trengs av de deklarerte alternativene.
* ***Alternativer***. Klassen deklarerer og behandler alternativene.
* ***Flere deklarasjoner***. Hoveddelen av klassen. Nesten alt en klasse gjør, defineres her.

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

### Identifikasjon

Det er to enkle kommandoer som alle klasser må ha:

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

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

Kommandoen `ProvidesClass{exampleclass}[...]` identifiserer denne klassen som *exampleclass* 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 klasse 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=)

### Foreløpige deklarasjoner

De fleste klassene bygger videre på og tilpasser eksisterende, og trenger også noen eksterne pakker for å fungere. Nedenfor legges det til noe mer kode i eksempelet med klassen `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}
```

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

Kommandoen `\LoadClass[twocolumn]{article}` laster inn klassen `article` med den ekstra parameteren `twocolumn`. Derfor vil alle kommandoene i standard `article` klassen vil automatisk være tilgjengelige i den **eksempel** klassen, bortsett fra at dokumentet vil bli skrevet ut i et format med to kolonner.

`\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 du skriver nye klasser eller pakker.

[Åpne et eksempel på hvordan man skriver en klasse 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=)

### Alternativer

For å gi litt fleksibilitet i klassene er noen ekstra alternativer veldig nyttige. Den neste delen i filen `exampleclass.cls` behandler parameterne som sendes til dokumentklasse-kommandoen. Vi har også flyttet `\LoadClass` til *etter* alternativene behandles, slik at alternativer som er satt i .tex-filen kan sendes til grunnklassen.

```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 er fire hovedkommandoer her som håndterer alternativene som sendes til klassen.

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 det skrives ut en melding i kompilatoren og i loggene, og alternativet vil ikke bli brukt. I dette tilfellet er dokumentet satt til to kolonner, og hvis brukeren prøver å endre det til én kolonne, vil det ikke fungere; alternativet blir ignorert.

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 kjøre neste kommando:

`\PassOptionsToClass{}{}`. Sender alternativet i den første krøllparentesen videre til dokumentklassen som er satt i den andre krøllparentesen. I eksemplet vil alle ukjente alternativer bli sendt til **article** dokumentklassen.

`\CurrentOption` lagrer navnet på klassealternativet som håndteres til enhver tid.

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 stjernemerket versjon av denne kommandoen som vil kjøre alternativene i nøyaktig den rekkefølgen som er angitt av de kallende kommandoene.

I eksemplet, hvis alternativene `rød` eller `grønn` Når alternativene sendes til dokumentet, vil fonten som brukes til overskriften og seksjonene bli satt til den tilsvarende fargen. Fargen kalt `slcolor` ble definert i [foreløpige deklarasjonene](#preliminary-declaration) etter import av `xcolor` pakken.

[Åpne et eksempel på hvordan man skriver en klasse 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=)

### Flere deklarasjoner

I denne delen vil de fleste kommandoene vises. I "exampleclass.cls" er sidens dimensjoner, skriftstørrelsen for tittelen, brødteksten og seksjonene satt. Nedenfor kan du se hele klassefilen.

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

For å forstå resten av kommandoene, se [referanseguiden](#reference-guide) og lenkene i [delen for videre lesning](#further-reading).

De siste fire kommandoene i eksemplet viser de fire tingene som alle klasser må inneholde:

* Definisjonen av `normalsize`. Setter standard- [fontstørrelse](/latex/no/skrifter/01-font-sizes-families-and-styles.md).
* En standardverdi for [`textwidth`](/latex/no/formatering/07-page-size-and-margins.md)
* En standardverdi for [`textheight`](/latex/no/formatering/07-page-size-and-margins.md)
* Spesifikasjonene for [sidetallsettingen](/latex/no/formatering/03-page-numbering.md).

Nedenfor, et dokument som bruker klassen *exampleclass.cls*.

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

\usepackage{blindtext}

\title{Example to show how classes work}
\author{Team Learn ShareLaTeX}
\date{August 2014}

\begin{document}

\maketitle

\noindent
La oss begynne med et enkelt fungerende eksempel her.

\blindtext

\section{Innledning}

Monty Hall-problemet...

\section{The same thing}

Monty...
```

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

Legg merke til at den første kommandoen her er

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

[Åpne et eksempel på hvordan man skriver en klasse 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=)

## Håndtering av feil

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

* `\ClassError{*class-name*}{*error-text*}{*help-text*}`. Tar tre parametere, hver inni krøllparenteser: klassenavnet, feilteksten som skal vises (kompileringsprosessen vil bli satt på pause), og hjelpeteksten som vil bli skrevet ut hvis brukeren trykker på "h" når kompileringen stanser på grunn av feilen.
* `\ClassWarning{*class-name*}{*warning-text*}`. I dette tilfellet vises teksten, men kompileringsprosessen stopper ikke. Den vil vise linjenummeret der advarselen oppsto.
* `\ClassWarningNoLine{*class-name*}{*warning-text*}`. Fungerer akkurat som forrige kommando, men den vil ikke vise linjen der advarselen oppsto.
* `\ClassInfo{*class 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 klasse 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=)

## Referanseguide

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

* `\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 i stedet vil den sjekke om kommandoen eksisterer og har den forventede definisjonen, vil LaTeX vise en advarsel hvis kommandoen ikke 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 pakke](/latex/no/klassefiler/03-writing-your-own-package.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 forfattere av klasser og pakker](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/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.
