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

# Psaní vlastní třídy

Někdy je nejlepší možností, jak přizpůsobit dokument, napsat novou třídu od začátku. Tento článek vysvětluje hlavní strukturu a příkazy potřebné v nové třídě.

## Úvod

První věc, kterou je třeba před napsáním nové třídy udělat, je určit, zda novou třídu skutečně potřebujete, nebo ne. Doporučuje se [vyhledat na CTAN (Comprehensive TeX Archive Network)](http://www.ctan.org/ctan-portal/search/) a podívat se, zda už někdo nevytvořil něco podobného třídě dokumentu, kterou potřebujete.

Další důležitá věc, kterou je třeba mít na paměti, je [rozdíl mezi balíčky a třídami](/latex/cs/tridni-soubory/01-understanding-packages-and-class-files.md). Nesprávná volba může ovlivnit flexibilitu výsledného produktu.

## Obecná struktura

Strukturu všech souborů tříd lze přibližně popsat v následujících čtyřech částech:

* ***Identifikace***. Soubor se deklaruje jako třída napsaná syntaxí LaTeX2ε.
* ***Předběžná deklarace***. Zde se importují potřebné externí balíčky a třídy. Také v této části souboru jsou zakódovány příkazy a definice potřebné pro deklarované volby.
* ***Volby***. Třída deklaruje a zpracovává volby.
* ***Další deklarace***. Hlavní část třídy. Téměř vše, co třída dělá, je definováno zde.

V následujících pododdílech bude předložen podrobnější popis struktury a funkční příklad, *exampleclass.cls*, bude představen.

### Identifikace

Existují dva jednoduché příkazy, které musí mít všechny třídy:

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

Příkaz `\NeedsTeXFormat{LaTeX2e}` nastavuje verzi LaTeXu, s níž má třída fungovat. Navíc lze do hranatých závorek přidat datum, které určí požadované minimální datum vydání.

Příkaz `ProvidesClass{exampleclass}[...]` označuje tuto třídu jako *exampleclass* a v hranatých závorkách je uvedeno datum vydání a nějaké doplňující informace. Datum by mělo být ve formátu YYYY/MM/DD

[Otevřete příklad, jak napsat třídu v Overleafu](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=)

### Předběžná deklarace

Většina tříd rozšiřuje a přizpůsobuje existující třídy a také potřebuje k fungování některé externí balíčky. Níže je do ukázkové třídy přidán další kód `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}
```

Příkazy v této části buď inicializují některé parametry, které budou později použity ke správě voleb, nebo importují externí soubory.

Příkaz `\LoadClass[twocolumn]{article}` načítá třídu `article` s dodatečným parametrem `twocolumn`. Proto budou všechny příkazy ve standardní `article` třídě automaticky dostupné v **příklad** třídě, jen s tím rozdílem, že dokument bude vysázen ve dvousloupcovém formátu.

`\RequirePackage` je velmi podobný známému `\usepackage`, přidání volitelných parametrů v hranatých závorkách bude také fungovat. Jediný rozdíl je v tom, že `\usepackage` nelze použít před `\documentclass` příkazem. Důrazně se doporučuje používat `\RequirePackage` při psaní nových tříd nebo balíčků.

[Otevřete příklad, jak napsat třídu v Overleafu](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=)

### Volby

Aby byly třídy trochu flexibilnější, je několik dodatečných voleb velmi užitečných. Další část v souboru `exampleclass.cls` zpracovává parametry předané příkazu \documentclass. Také jsme přesunuli `\LoadClass` na *za* zpracování voleb, aby bylo možné volby nastavené v souboru .tex předat základní třídě.

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

Zde jsou čtyři hlavní příkazy, které zpracovávají volby předané třídě.

Příkaz `\DeclareOption{}{}` zpracovává zadanou volbu. Bere dva parametry: prvním je název volby a druhým kód, který se má vykonat, pokud je volba předána.

Příkaz `\OptionNotUsed` vypíše zprávu v kompilátoru a v protokolech, volba se nepoužije. V tomto případě je dokument nastaven na dvousloupcový režim a pokud se uživatel pokusí změnit jej na jeden sloupec, nebude to fungovat; volba bude ignorována.

Příkaz `\Declareoption*{}` zpracovává každou volbu, která není výslovně definována. Přijímá pouze jeden parametr, tedy kód, který se má provést, když je předána neznámá volba. V tomto případě spustí následující příkaz:

`\PassOptionsToClass{}{}`. Předá volbu uvnitř první dvojice složených závorek třídě dokumentu uvedené uvnitř druhé dvojice složených závorek. V příkladu budou všechny neznámé volby předány **article** třídě dokumentu.

`\CurrentOption` ukládá název volby třídy, která je v daném okamžiku zpracovávána.

Příkaz `\ProcessOptions\relax` spouští kód pro každou volbu a musí být vložen až po zadání všech příkazů pro zpracování voleb. Existuje hvězdičková verze tohoto příkazu, která provede volby přesně v pořadí určeném volajícími příkazy.

V příkladu, pokud jsou volby `red` nebo `green` jsou předány dokumentu, písmo použité pro nadpis a sekce bude nastaveno na odpovídající barvu. Barva s názvem `slcolor` byla definována v [předběžných deklaracích](#preliminary-declaration) po importu `xcolor` balíček.

[Otevřete příklad, jak napsat třídu v Overleafu](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=)

### Další deklarace

V této části se objeví většina příkazů. V „exampleclass.cls“ jsou nastaveny rozměry stránky a velikosti písma pro titul, hlavní text a sekce. Níže můžete vidět celý soubor třídy.

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

Pro pochopení zbylých příkazů se podívejte na [referenční příručku](#reference-guide) a odkazy v [sekci další četby](#further-reading).

Poslední čtyři příkazy v příkladu ukazují čtyři věci, které musí obsahovat všechny třídy:

* Definice `normalsize`. Nastavuje výchozí [velikost písma](/latex/cs/pisma/01-font-sizes-families-and-styles.md).
* Výchozí hodnota pro [`textwidth`](/latex/cs/formatovani/07-page-size-and-margins.md)
* Výchozí hodnota pro [`textheight`](/latex/cs/formatovani/07-page-size-and-margins.md)
* Specifikace pro [číslování stránek](/latex/cs/formatovani/03-page-numbering.md).

Níže je dokument, který používá třídu *exampleclass.cls*.

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

\usepackage{blindtext}

\title{Příklad ukazující, jak třídy fungují}
\author{Tým Learn ShareLaTeX}
\date{srpen 2014}

\begin{document}

\maketitle

\noindent
Začněme zde jednoduchým funkčním příkladem.

\blindtext

\section{Úvod}

Problém Montyho Halla...

\section{To samé}

Monty...
```

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

Všimněte si, že prvním příkazem zde je

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

[Otevřete příklad, jak napsat třídu v Overleafu](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=)

## Zpracování chyb

Při vývoji nových tříd je důležité zpracovávat možné chyby a dát uživateli najevo, že se něco pokazilo. K hlášení chyb při kompilaci existují čtyři hlavní příkazy.

* `\ClassError{*class-name*}{*error-text*}{*help-text*}`. Bere tři parametry, každý uvnitř složených závorek: název třídy, text chyby, který se zobrazí (proces kompilace bude pozastaven), a pomocný text, který se vypíše, pokud uživatel stiskne „h“, když se kompilace kvůli chybě pozastaví.
* `\ClassWarning{*class-name*}{*warning-text*}`. V tomto případě se text zobrazí, ale proces kompilace se nezastaví. Ukáže číslo řádku, kde došlo k varování.
* `\ClassWarningNoLine{*class-name*}{*warning-text*}`. Funguje stejně jako předchozí příkaz, ale nezobrazí řádek, na kterém došlo k varování.
* `\ClassInfo{*class name*}{*info-text*}`. V tomto případě budou informace v druhém parametru vytištěny pouze do souboru protokolu, včetně čísla řádku.

[Otevřete příklad, jak napsat třídu v Overleafu](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=)

## Referenční příručka

**Seznam příkazů běžně používaných ve třídách a balíčcích**

* `\newcommand{*name*}{*definition*}`. Definuje [nový příkaz](/latex/cs/prikazy/01-commands.md#defining-a-new-command), prvním parametrem je název nového příkazu a druhým parametrem je to, co příkaz bude dělat.
* `\renewcommand{}{}`. Stejné jako `\newcommand` ale přepíše stávající příkaz.
* `\providecommand{}{}`. Funguje stejně jako `\newcommand` ale pokud je příkaz již definován, tento bude tiše ignorován.
* `\CheckCommand{}{}`. Syntaxe je stejná jako `\newcommand`, ale místo toho zkontroluje, zda příkaz existuje a má očekávanou definici, LaTeX zobrazí varování, pokud příkaz není tím, co `\CheckCommand` očekáváno.
* `\setlength{}{}`. Nastaví délku prvku předaného jako první parametr na hodnotu zapsanou jako druhý parametr.
* `\mbox{}`. Vytvoří rámeček, který obsahuje prvky zapsané ve složených závorkách.
* `\fbox{}`. Stejné jako `\mbox`, ale kolem obsahu se skutečně vykreslí rámeček.

## Další čtení

Další informace najdete v

* [Porozumění balíčkům a souborům tříd](/latex/cs/tridni-soubory/01-understanding-packages-and-class-files.md)
* [Psaní vlastního balíčku](/latex/cs/tridni-soubory/03-writing-your-own-package.md)
* [Příkazy](/latex/cs/prikazy/01-commands.md) a [Prostředí](/latex/cs/prikazy/02-environments.md)
* [Délky v LaTeXu](/latex/cs/formatovani/01-lengths-in-latex.md)
* [Používání barev v LaTeXu](/latex/cs/formatovani/13-using-colors-in-latex.md)
* [Správa ve velkém projektu](/latex/cs/struktura-dokumentu/07-management-in-a-large-project.md)
* [LaTeX2ε pro autory tříd a balíčků](http://www.latex-project.org/guides/clsguide.pdf)
* [Poznámky k programování v TeXu](http://pgfplots.sourceforge.net/TeX-programming-notes.pdf)
* [Minuty za méně než hodiny: Používání zdrojů LaTeXu](https://tug.org/pracjourn/2005-4/hefferon/hefferon.pdf)
* [Průvodce LaTeXem. Druhé vydání](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/cs/tridni-soubory/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.
