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

# Skrivning af din egen klasse

Nogle gange er den bedste mulighed for at tilpasse et dokument at skrive en ny klasse fra bunden. Denne artikel forklarer den vigtigste struktur og de kommandoer, der er nødvendige i en ny klasse.

## Introduktion

Det første, man skal gøre, før man koder en ny klasse, er at afgøre, om du virkelig har brug for en ny klasse 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 oprettet noget lignende den dokumentklasse, 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 klassefiler kan groft beskrives i de næste fire dele:

* ***Identifikation***. Filen erklærer sig selv som en klasse skrevet med LaTeX2ε-syntaksen.
* ***Foreløbige deklarationer***. Her importeres de eksterne pakker og klasser, der er nødvendige. Også i denne del af filen kodes de kommandoer og definitioner, som de angivne muligheder kræver.
* ***Valgmuligheder***. Klassen erklærer og behandler valgmulighederne.
* ***Flere deklarationer***. Klassens hoveddel. Næsten alt, hvad en klasse gør, defineres her.

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

### Identifikation

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

```latex
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{exampleclass}[2014/08/16 Eksempel på en LaTeX-klasse]
```

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

Kommandoen `ProvidesClass{exampleclass}[...]` identificerer denne klasse som *exampleclass* og inde i klammerne er udgivelsesdatoen og nogle yderligere oplysninger inkluderet. Datoen skal være i formatet ÅÅÅÅ/MM/DD

[Åbn 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øbige deklarationer

De fleste klasser udvider og tilpasser eksisterende klasser og har også brug for nogle eksterne pakker for at fungere. Nedenfor tilføjes der lidt mere kode til eksemplet på klassen `exampleclass.cls`.

```latex
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{exampleclass}[2014/08/16 Eksempel på en LaTeX-klasse]

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

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

Kommandoen `\LoadClass[twocolumn]{article}` indlæser klassen `article` med den ekstra parameter `twocolumn`. Derfor vil alle kommandoerne i standard- `article` klassen automatisk være tilgængelige i **eksempel** -klassen, bortset fra at dokumentet vil blive udskrevet i et format med to kolonner.

`\RequirePackage` er meget lig den velkendte `\usepackage`, vil det også fungere at tilføje valgfrie parametre i klammer. Den eneste forskel er, at `\usepackage` kan ikke bruges før `\documentclass` kommandoen. Det anbefales stærkt at bruge `\RequirePackage` når der skrives nye klasser eller pakker.

[Åbn 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=)

### Valgmuligheder

For at give lidt fleksibilitet i klasserne er et par ekstra valgmuligheder meget nyttige. Den næste del i filen `exampleclass.cls` håndterer de parametre, der sendes til kommandoen for dokumentklassen. Vi har også flyttet `\LoadClass` til *efter* at valgmulighederne er behandlet, så valgmuligheder, der er angivet i .tex-filen, kan sendes videre til grundklassen.

```latex
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{exampleclass}[2014/08/16 Eksempel på en LaTeX-klasse]

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

Der er fire hovedkommandoer her, som håndterer de valgmuligheder, der sendes til klassen.

Kommandoen `\DeclareOption{}{}` håndterer en given valgmulighed. Den tager to parametre: det første er navnet på valgmuligheden, og det andet er den kode, der skal udføres, hvis valgmuligheden sendes.

Kommandoen `\OptionNotUsed` vil udskrive en besked i kompileren og i logfilerne; valgmuligheden vil ikke blive brugt. I dette tilfælde er dokumentet indstillet til to kolonner, og hvis brugeren forsøger at ændre det til én kolonne, vil det ikke virke; valgmuligheden vil blive ignoreret.

Kommandoen `\Declareoption*{}` håndterer enhver valgmulighed, der ikke er eksplicit defineret. Den tager kun én parameter, den kode der skal udføres, når en ukendt valgmulighed sendes. I dette tilfælde vil den køre den næste kommando:

`\PassOptionsToClass{}{}`. Sender valgmuligheden inden for den første gruppe krøllede parenteser til dokumentklassen angivet i den anden gruppe krøllede parenteser. I eksemplet vil alle ukendte valgmuligheder blive sendt til **article** dokumentklassen.

`\CurrentOption` gemmer navnet på den klassevalgmulighed, der behandles på et givet tidspunkt.

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

I eksemplet, hvis valgmulighederne `red` eller `green` sendes til dokumentet, vil skrifttypen, der bruges til overskriften og afsnittene, blive sat til den tilsvarende farve. Farven kaldet `slcolor` blev defineret i [de foreløbige deklarationer](#preliminary-declaration) efter import af `xcolor` pakken.

[Åbn 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 deklarationer

I denne del vil de fleste kommandoer fremkomme. I "exampleclass.cls" er sidens dimensioner samt skriftstørrelsen for titel, brødtekst og afsnit angivet. Nedenfor kan du se hele klassefilen.

```latex
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{exampleclass}[2014/08/16 Eksempel på en LaTeX-klasse]

\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 at forstå de øvrige kommandoer, se [referenceguiden](#reference-guide) og linkene i afsnittet [yderligere læsning](#further-reading).

De sidste fire kommandoer i eksemplet viser de fire ting, som alle klasser skal indeholde:

* Definitionen af `normalsize`. Sætter standard- [skriftstørrelse](/latex/da/skrifttyper/01-font-sizes-families-and-styles.md).
* En standardværdi for [`textwidth`](/latex/da/formatering/07-page-size-and-margins.md)
* En standardværdi for [`textheight`](/latex/da/formatering/07-page-size-and-margins.md)
* Specifikationerne for [sidetal](/latex/da/formatering/03-page-numbering.md).

Nedenfor ses et dokument, der bruger klassen *exampleclass.cls*.

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

\usepackage{blindtext}

\title{Eksempel på at vise, hvordan klasser fungerer}
\author{Team Learn ShareLaTeX}
\date{August 2014}

\begin{document}

\maketitle

\noindent
Lad os begynde med et simpelt fungerende eksempel her.

\blindtext

\section{Introduktion}

Monty Hall-problemet...

\section{Det samme}

Monty...
```

![WrittingClassesEx1.png](/files/442cd006dbb8acac579c051ac4cfc74722f5ca96)

Bemærk, at den første kommando her er

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

[Åbn 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 af fejl

Når det gælder udvikling af nye klasser, 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 kompileren.

* `\ClassError{*class-name*}{*error-text*}{*help-text*}`. Tager tre parametre, hver især inde i krøllede parenteser: klassenavnet, 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.
* `\ClassWarning{*class-name*}{*warning-text*}`. I dette tilfælde vises teksten, men kompileringsprocessen stopper ikke. Den vil vise linjenummeret, hvor advarslen opstod.
* `\ClassWarningNoLine{*class-name*}{*warning-text*}`. Fungerer ligesom den forrige kommando, men den viser ikke linjen, hvor advarslen opstod.
* `\ClassInfo{*class name*}{*info-text*}`. I dette tilfælde vil oplysningerne i den anden parameter kun blive udskrevet i transkriptfilen, inklusive linjenummeret.

[Åbn 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=)

## Referenceguide

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

* `\newcommand{*name*}{*definition*}`. Definerer en [ny kommando](/latex/da/kommandoer/01-commands.md#defining-a-new-command), den første parameter er navnet på den nye kommando, den anden parameter er det, kommandoen skal 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 blot blive ignoreret uden varsel.
* `\CheckCommand{}{}`. Syntaksen er den samme som `\newcommand`, men i stedet vil den kontrollere, om kommandoen findes og har den forventede definition. LaTeX vil vise en advarsel, hvis kommandoen ikke er det, som `\CheckCommand` forventer.
* `\setlength{}{}`. Sætter længden af det element, der gives som første parameter, til værdien skrevet som anden parameter.
* `\mbox{}`. Opretter en boks, der indeholder de elementer, der er skrevet inde i krøllede parenteser.
* `\fbox{}`. Det samme som `\mbox`, men der udskrives faktisk en boks rundt om indholdet.

## Yderligere læsning

For mere information se

* [Forståelse af pakker og klassefiler](/latex/da/klassefiler/01-understanding-packages-and-class-files.md)
* [Skrivning af din egen pakke](/latex/da/klassefiler/03-writing-your-own-package.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ε for forfattere af klasser og pakker](http://www.latex-project.org/guides/clsguide.pdf)
* [Noter om programmering i tex](http://pgfplots.sourceforge.net/TeX-programming-notes.pdf)
* [Minutter er mindre end 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/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.
