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

# Γράφοντας τη δική σας κλάση

Μερικές φορές η καλύτερη επιλογή για να προσαρμόσετε ένα έγγραφο είναι να γράψετε μια νέα κλάση από το μηδέν. Αυτό το άρθρο εξηγεί την κύρια δομή και τις εντολές που χρειάζονται σε μια νέα κλάση.

## Εισαγωγή

Το πρώτο πράγμα που πρέπει να γίνει πριν από την κωδικοποίηση μιας νέας κλάσης είναι να καθοριστεί αν πραγματικά χρειάζεστε μια νέα κλάση ή όχι. Συνιστάται να [αναζητήσετε στο CTAN (Comprehensive TeX Archive Network)](http://www.ctan.org/ctan-portal/search/) και να δείτε αν κάποιος έχει ήδη δημιουργήσει κάτι παρόμοιο με την κλάση εγγράφου που χρειάζεστε.

Ένα άλλο σημαντικό πράγμα που πρέπει να έχετε κατά νου είναι [η διαφορά μεταξύ πακέτων και κλάσεων](/latex/el/arxeia-klasis/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* και, μέσα στις αγκύλες, περιλαμβάνονται η ημερομηνία έκδοσης και ορισμένες πρόσθετες πληροφορίες. Η ημερομηνία πρέπει να έχει τη μορφή YYYY/MM/DD

[Ανοίξτε ένα παράδειγμα για το πώς να γράψετε μια κλάση στο 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` ή `πράσινο` μεταβιβάζονται στο έγγραφο η γραμματοσειρά που χρησιμοποιείται για την επικεφαλίδα και οι ενότητες θα οριστούν στο αντίστοιχο χρώμα. Το χρώμα με την ονομασία `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).

Οι τελευταίες τέσσερις εντολές στο παράδειγμα δείχνουν τα τέσσερα πράγματα που πρέπει να περιέχουν όλες οι κλάσεις:

* Ο ορισμός του `κανονικό μέγεθος`. Ορίζει το προεπιλεγμένο [μέγεθος γραμματοσειράς](/latex/el/grammatoseires/01-font-sizes-families-and-styles.md).
* Μια προεπιλεγμένη τιμή για [`textwidth`](/latex/el/morfopoiisi/07-page-size-and-margins.md)
* Μια προεπιλεγμένη τιμή για [`textheight`](/latex/el/morfopoiisi/07-page-size-and-margins.md)
* Οι προδιαγραφές για την [αρίθμηση σελίδων](/latex/el/morfopoiisi/03-page-numbering.md).

Παρακάτω, ένα έγγραφο που χρησιμοποιεί την κλάση *exampleclass.cls*.

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

\usepackage{blindtext}

\title{Example to show how classes work}
\author{Ομάδα Learn ShareLaTeX}
\date{August 2014}

\begin{document}

\maketitle

\noindent
Ας ξεκινήσουμε εδώ με ένα απλό λειτουργικό παράδειγμα.

\blindtext

\section{Εισαγωγή}

Το πρόβλημα του Μόντι Χολ...

\section{The same thing}

Το Μόντι...
```

![WrittingClassesEx1.png](/files/6948a27f27b0863aab7a54ba91c9905a74b3b035)

Παρατηρήστε ότι η πρώτη εντολή εδώ είναι

```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/el/entoles/01-commands.md#defining-a-new-command), η πρώτη παράμετρος είναι το όνομα της νέας εντολής, η δεύτερη παράμετρος είναι αυτό που θα κάνει η εντολή.
* `\renewcommand{}{}`. Το ίδιο με το `\newcommand` αλλά θα αντικαταστήσει μια υπάρχουσα εντολή.
* `\providecommand{}{}`. Λειτουργεί ακριβώς όπως το `\newcommand` αλλά αν η εντολή είναι ήδη ορισμένη, αυτή θα αγνοηθεί σιωπηρά.
* `\CheckCommand{}{}`. Η σύνταξη είναι η ίδια με το `\newcommand`, αλλά αντί αυτού θα ελέγξει αν η εντολή υπάρχει και έχει τον αναμενόμενο ορισμό, το LaTeX θα εμφανίσει μια προειδοποίηση αν η εντολή δεν είναι αυτό που `\CheckCommand` αναμένεται.
* `\setlength{}{}`. Ορίζει το μήκος του στοιχείου που δίνεται ως πρώτη παράμετρος στην τιμή που γράφεται ως δεύτερη παράμετρος.
* `\mbox{}`. Δημιουργεί ένα πλαίσιο που περιέχει τα στοιχεία που γράφονται μέσα στις αγκύλες.
* `\fbox{}`. Το ίδιο με το `\mbox`, αλλά στην πραγματικότητα εκτυπώνεται ένα πλαίσιο γύρω από το περιεχόμενο.

## Περαιτέρω ανάγνωση

Για περισσότερες πληροφορίες δείτε

* [Κατανόηση πακέτων και αρχείων κλάσης](/latex/el/arxeia-klasis/01-understanding-packages-and-class-files.md)
* [Γράφοντας το δικό σας πακέτο](/latex/el/arxeia-klasis/03-writing-your-own-package.md)
* [Εντολές](/latex/el/entoles/01-commands.md) και [Περιβάλλοντα](/latex/el/entoles/02-environments.md)
* [Μήκη στο LaTeX](/latex/el/morfopoiisi/01-lengths-in-latex.md)
* [Χρήση χρωμάτων στο LaTeX](/latex/el/morfopoiisi/13-using-colors-in-latex.md)
* [Διαχείριση σε ένα μεγάλο έργο](/latex/el/domi-eggrafoy/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)
* [Το 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://overleaf-pro.ayaka.space/latex/el/arxeia-klasis/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.
