> For the complete documentation index, see [llms.txt](https://ayakaleaf-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://ayakaleaf-pro.ayaka.space/latex/uk/faili-klasiv/04-writing-your-own-class.md).

# Створення власного класу

Іноді найкращий варіант налаштувати документ — це написати новий клас з нуля. У цій статті пояснюється основна структура та команди, потрібні в новому класі.

## Вступ

Перш ніж кодувати новий клас, насамперед слід визначити, чи справді вам потрібен новий клас. Рекомендується [пошукати на CTAN (Comprehensive TeX Archive Network)](http://www.ctan.org/ctan-portal/search/) і перевірити, чи хтось уже створив щось подібне до потрібного вам класу документа.

Ще одна важлива річ, про яку слід пам’ятати, — це [різниця між пакетами та класами](/latex/uk/faili-klasiv/01-understanding-packages-and-class-files.md). Неправильний вибір може вплинути на гнучкість кінцевого продукту.

## Загальна структура

Структуру всіх файлів класів можна приблизно описати в наступних чотирьох частинах:

* ***Ідентифікація***. Файл оголошує себе класом, написаним із використанням синтаксису LaTeX2ε.
* ***Попередні оголошення***. Тут імпортуються зовнішні пакети та класи, які потрібні. Також у цій частині файлу кодуються команди та означення, потрібні для оголошених параметрів.
* ***Параметри***. Клас оголошує та обробляє параметри.
* ***Додаткові оголошення***. Основна частина класу. Майже все, що робить клас, визначено тут.

У наступних підрозділах буде наведено докладніший опис структури та робочий приклад, *exampleclass.cls*, буде наведено.

### Ідентифікація

Є дві прості команди, які мають бути в усіх класах:

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

Команда `\NeedsTeXFormat{LaTeX2e}` встановлює версію LaTeX, з якою працюватиме клас. Крім того, у дужках можна додати дату, щоб вказати мінімально потрібну дату випуску.

Команда `ProvidesClass{exampleclass}[...]` ідентифікує цей клас як *exampleclass* а всередині дужок містяться дата випуску та деяка додаткова інформація. Дата має бути у форматі РРРР/ММ/ДД

[Відкрити приклад написання класу в 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=)

### Попередні оголошення

Більшість класів розширюють і налаштовують наявні, а також потребують для роботи деяких зовнішніх пакетів. Нижче до зразка класу додається ще трохи коду `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}
```

Команди в цій частині або ініціалізують деякі параметри, які згодом використовуватимуться для керування параметрами, або імпортують зовнішні файли.

Команда `\LoadClass[twocolumn]{article}` завантажує клас `article` з додатковим параметром `twocolumn`. Отже, усі команди зі стандартного `article` класу будуть автоматично доступні в **прикладу** класі, за винятком того, що документ буде надруковано у двоколонному форматі.

`\RequirePackage` дуже схожа на добре відому `\usepackage`, додавання необов’язкових параметрів у дужках також працюватиме. Єдина відмінність полягає в тому, що `\usepackage` не можна використовувати перед `\documentclass` командою. Настійно рекомендується використовувати `\RequirePackage` під час написання нових класів або пакетів.

[Відкрити приклад написання класу в 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=)

### Параметри

Щоб надати класам певну гнучкість, кілька додаткових параметрів дуже корисні. Наступна частина файлу `exampleclass.cls` обробляє параметри, передані команді класу документа. Ми також перенесли `\LoadClass` на *після* параметри обробляються, щоб параметри, задані у файлі .tex, можна було передати базовому класу.

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

Тут є чотири основні команди, які обробляють параметри, передані класу.

Команда `\DeclareOption{}{}` обробляє вказаний параметр. Вона приймає два параметри: перший — це назва параметра, а другий — код, який слід виконати, якщо параметр передано.

Команда `\OptionNotUsed` виведе повідомлення у компіляторі та в журналах, параметр не буде використано. У цьому випадку документ налаштовано на двоколонний режим, і якщо користувач спробує змінити його на одну колонку, це не спрацює, параметр буде проігноровано.

Команда `\Declareoption*{}` обробляє кожен параметр, не визначений явно. Вона приймає лише один параметр — код, який слід виконати, коли передано невідомий параметр. У цьому випадку буде виконано наступну команду:

`\PassOptionsToClass{}{}`. Передає параметр всередині першої пари фігурних дужок до класу документа, вказаного всередині другої пари фігурних дужок. У прикладі всі невідомі параметри буде передано до **article** класу документа.

`\CurrentOption` зберігає назву параметра класу, який обробляється в певний момент.

Команда `\ProcessOptions\relax` виконує код для кожного параметра і має бути вставлена після того, як було введено всі команди обробки параметрів. Існує зіркова версія цієї команди, яка виконає параметри в точному порядку, заданому командами виклику.

У прикладі, якщо параметри `red` або `green` передаються до документа, шрифт, що використовується для заголовка та розділів, буде встановлено у відповідний колір. Колір із назвою `slcolor` було визначено в [попередніх оголошеннях](#preliminary-declaration) після імпортування `xcolor` пакет.

[Відкрити приклад написання класу в 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=)

### Додаткові оголошення

У цій частині з’явиться більшість команд. У «exampleclass.cls» задано розміри сторінки, розмір шрифту для заголовка, основного тексту та розділів. Нижче ви можете побачити повний файл класу.

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

Щоб зрозуміти решту команд, дивіться [довідковий посібник](#reference-guide) і посилання в [розділі додаткового читання](#further-reading).

Останні чотири команди в прикладі показують чотири речі, які мають містити всі класи:

* Визначення `normalsize`. Встановлює значення за замовчуванням для [розмір шрифту](/latex/uk/shrifti/01-font-sizes-families-and-styles.md).
* Значення за замовчуванням для [`textwidth`](/latex/uk/formatuvannya/07-page-size-and-margins.md)
* Значення за замовчуванням для [`textheight`](/latex/uk/formatuvannya/07-page-size-and-margins.md)
* Специфікації для [нумерації сторінок](/latex/uk/formatuvannya/03-page-numbering.md).

Нижче — документ, який використовує клас *exampleclass.cls*.

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

\usepackage{blindtext}

\title{Приклад, що показує, як працюють класи}
\author{Команда Learn ShareLaTeX}
\date{Серпень 2014}

\begin{document}

\maketitle

\noindent
Почнімо тут із простого працюючого прикладу.

\blindtext

\section{Вступ}

Проблема Монті Голла...

\section{Те саме}

Монті...
```

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

Зверніть увагу, що перша команда тут — це

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

[Відкрити приклад написання класу в 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=)

## Обробка помилок

Коли йдеться про розробку нових класів, важливо обробляти можливі помилки, щоб повідомити користувачеві, що щось пішло не так. Є чотири основні команди для повідомлення про помилки в компіляторі.

* `\ClassError{*class-name*}{*error-text*}{*help-text*}`. Приймає три параметри, кожен у фігурних дужках: назву класу, текст помилки, який буде відображено (процес компіляції буде призупинено), та текст довідки, який буде надруковано, якщо користувач натисне «h», коли компіляція зупиниться через помилку.
* `\ClassWarning{*class-name*}{*warning-text*}`. У цьому випадку текст буде показано, але процес компіляції не зупиниться. Буде показано номер рядка, де виникло попередження.
* `\ClassWarningNoLine{*class-name*}{*warning-text*}`. Працює так само, як попередня команда, але не покаже рядок, у якому виникло попередження.
* `\ClassInfo{*class name*}{*info-text*}`. У цьому випадку інформація у другому параметрі буде надрукована лише у файлі транскрипту, включно з номером рядка.

[Відкрити приклад написання класу в 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=)

## Довідковий посібник

**Список команд, які зазвичай використовуються в класах і пакетах**

* `\newcommand{*name*}{*definition*}`. Визначає [нову команду](/latex/uk/komandi/01-commands.md#defining-a-new-command), перший параметр — це назва нової команди, а другий параметр — те, що робитиме команда.
* `\renewcommand{}{}`. Те саме, що й `\newcommand` але перезаписує наявну команду.
* `\providecommand{}{}`. Працює так само, як `\newcommand` але якщо команда вже визначена, цю буде мовчки проігноровано.
* `\CheckCommand{}{}`. Синтаксис такий самий, як у `\newcommand`, але замість цього він перевірить, чи існує команда і чи має вона очікуване визначення; LaTeX покаже попередження, якщо команда не є тим, чим `\CheckCommand` очікувалося.
* `\setlength{}{}`. Встановлює довжину елемента, переданого як перший параметр, у значення, записане як другий параметр.
* `\mbox{}`. Створює коробку, яка містить елементи, записані всередині фігурних дужок.
* `\fbox{}`. Те саме, що й `\mbox`, але навколо вмісту фактично друкується рамка.

## Додаткове читання

Для отримання додаткової інформації див.

* [Розуміння пакетів і файлів класів](/latex/uk/faili-klasiv/01-understanding-packages-and-class-files.md)
* [Створення власного пакета](/latex/uk/faili-klasiv/03-writing-your-own-package.md)
* [Команди](/latex/uk/komandi/01-commands.md) та [Середовища](/latex/uk/komandi/02-environments.md)
* [Довжини в LaTeX](/latex/uk/formatuvannya/01-lengths-in-latex.md)
* [Використання кольорів у LaTeX](/latex/uk/formatuvannya/13-using-colors-in-latex.md)
* [Керування у великому проєкті](/latex/uk/struktura-dokumenta/07-management-in-a-large-project.md)
* [LaTeX2ε для авторів класів і пакетів](http://www.latex-project.org/guides/clsguide.pdf)
* [Нотатки про програмування в TeX](http://pgfplots.sourceforge.net/TeX-programming-notes.pdf)
* [Хвилини замість годин: використання ресурсів LaTeX](https://tug.org/pracjourn/2005-4/hefferon/hefferon.pdf)
* [The LaTeX Companion. Друге видання](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://ayakaleaf-pro.ayaka.space/latex/uk/faili-klasiv/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.
