> 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/03-writing-your-own-package.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ε.
* ***Προκαταρκτικές δηλώσεις***. Εδώ εισάγονται τα εξωτερικά πακέτα που χρειάζονται. Επίσης, σε αυτό το μέρος του αρχείου κωδικοποιούνται οι εντολές και οι ορισμοί που απαιτούνται από τις δηλωμένες επιλογές.
* ***Επιλογές***. Το πακέτο δηλώνει και επεξεργάζεται τις επιλογές.
* ***Περισσότερες δηλώσεις***. Το κύριο σώμα του πακέτου. Σχεδόν όλα όσα κάνει ένα πακέτο ορίζονται εδώ.

Στις επόμενες υποενότητες θα παρουσιαστεί μια πιο λεπτομερής περιγραφή της δομής και ένα λειτουργικό παράδειγμα, *examplepackage.sty*, θα παρουσιαστούν.

### Ταυτοποίηση

Υπάρχουν δύο απλές εντολές που πρέπει να έχουν όλα τα πακέτα:

```latex
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{examplepackage}[2014/08/24 Παράδειγμα πακέτου LaTeX]
```

Η εντολή `\NeedsTeXFormat{LaTeX2e}` ορίζει την έκδοση LaTeX στην οποία θα λειτουργεί το πακέτο. Επιπλέον, μπορεί να προστεθεί μια ημερομηνία μέσα σε αγκύλες για να καθοριστεί η ελάχιστη απαιτούμενη ημερομηνία έκδοσης.

Η εντολή `ProvidesPackage{examplepackage}[...]` αναγνωρίζει αυτό το πακέτο ως *examplepackage* και, μέσα στις αγκύλες, περιλαμβάνονται η ημερομηνία έκδοσης και ορισμένες πρόσθετες πληροφορίες. Η ημερομηνία πρέπει να έχει τη μορφή YYYY/MM/DD

[Ανοίξτε ένα παράδειγμα για το πώς να γράψετε ένα πακέτο στο Overleaf](https://www.sharelatex.com/project/new/template?zipUrl=/project/53f11ec1eceb82a67658cb02/download/zip\&templateName=PackageExample\&compiler=pdflatex)

### Προκαταρκτικές δηλώσεις

Τα περισσότερα πακέτα επεκτείνουν και προσαρμόζουν υπάρχοντα, και χρειάζονται επίσης ορισμένα εξωτερικά πακέτα για να λειτουργήσουν. Παρακάτω προστίθεται λίγο ακόμη κώδικας στο δείγμα πακέτου "examplepackage.sty".

```latex
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{examplepackage}[2014/08/21 Παράδειγμα πακέτου]

\RequirePackage{imakeidx}
\RequirePackage{xstring}
\RequirePackage{xcolor}
\definecolor{greycolour}{HTML}{525252}
\definecolor{sharelatexcolour}{HTML}{882B21}
\definecolor{mybluecolour}{HTML}{394773}
\newcommand{\wordcolour}{greycolour}
```

Οι εντολές σε αυτό το μέρος είτε αρχικοποιούν ορισμένες παραμέτρους που αργότερα θα χρησιμοποιηθούν για τη διαχείριση των επιλογών, είτε εισάγουν εξωτερικά αρχεία.

Η εντολή `\RequirePackage` είναι πολύ παρόμοια με τη γνωστή `\usepackage`, η προσθήκη προαιρετικών παραμέτρων μέσα σε αγκύλες θα λειτουργήσει επίσης. Η μόνη διαφορά είναι ότι η `\usepackage` δεν μπορεί να χρησιμοποιηθεί πριν από την εντολή `\documentclass` Εντολή. Συνιστάται ανεπιφύλακτα να χρησιμοποιείτε `\RequirePackage` όταν γράφετε νέα πακέτα ή κλάσεις.

[Ανοίξτε ένα παράδειγμα για το πώς να γράψετε ένα πακέτο στο Overleaf](https://www.sharelatex.com/project/new/template?zipUrl=/project/53f11ec1eceb82a67658cb02/download/zip\&templateName=PackageExample\&compiler=pdflatex)

### Επιλογές

Για να δοθεί κάποια ευελιξία στα πακέτα, μερικές πρόσθετες επιλογές είναι πολύ χρήσιμες. Το επόμενο μέρος στο αρχείο "examplepackage.sty" χειρίζεται τις παραμέτρους που περνούν στη δήλωση εισαγωγής του πακέτου.

```latex
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{examplepackage}[2014/08/21 Παράδειγμα πακέτου]

\RequirePackage{imakeidx}
\RequirePackage{xstring}
\RequirePackage{xcolor}
\definecolor{greycolour}{HTML}{525252}
\definecolor{sharelatexcolour}{HTML}{882B21}
\definecolor{mybluecolour}{HTML}{394773}
\newcommand{\wordcolour}{greycolour}

\DeclareOption{red}{\renewcommand{\wordcolour}{sharelatexcolour}}
\DeclareOption{blue}{\renewcommand{\wordcolour}{mybluecolour}}
\DeclareOption*{\PackageWarning{examplepackage}{Άγνωστη ‘\CurrentOption’}}
\ProcessOptions\relax
```

Παρακάτω ακολουθεί περιγραφή των κύριων εντολών που μπορούν να χειριστούν τις επιλογές που περνούν στο πακέτο.

Η εντολή `\DeclareOption{}{}` χειρίζεται μια δεδομένη επιλογή. Παίρνει δύο παραμέτρους, η πρώτη είναι το όνομα της επιλογής και η δεύτερη είναι ο κώδικας που θα εκτελεστεί αν δοθεί η επιλογή.

Η εντολή `\OptionNotUsed` θα εμφανίσει ένα μήνυμα στον μεταγλωττιστή και στα αρχεία καταγραφής, η επιλογή δεν θα χρησιμοποιηθεί.

Η εντολή `\Declareoption*{}` χειρίζεται κάθε επιλογή που δεν έχει οριστεί ρητά. Παίρνει μόνο μία παράμετρο, τον κώδικα που θα εκτελεστεί όταν δοθεί μια άγνωστη επιλογή. Σε αυτή την περίπτωση θα εμφανίσει μια προειδοποίηση μέσω της επόμενης εντολής:

`\PackageWarning{}{}`. Δείτε [χειρισμός σφαλμάτων](#handling-errors) για μια περιγραφή του τι κάνει αυτή η εντολή.

`\CurrentOption` αποθηκεύει το όνομα της επιλογής του πακέτου που χειρίζεται σε μια δεδομένη στιγμή.

Η εντολή `\ProcessOptions\relax` εκτελεί τον κώδικα για κάθε επιλογή και πρέπει να εισάγεται αφού πληκτρολογηθούν όλες οι εντολές χειρισμού επιλογών. Υπάρχει και μια αστερισμένη έκδοση αυτής της εντολής που θα εκτελέσει τις επιλογές με την ακριβή σειρά που καθορίζεται από τις κλήσεις των εντολών.

Στο παράδειγμα, αν οι επιλογές *red* ή *μπλε* δοθούν στην `\usepackage` εντολή μέσα στο έγγραφο, η εντολή `\wordcolor` επαναορίζεται. Τόσο τα χρώματα όσο και το προεπιλεγμένο γκρι χρώμα ορίστηκαν στις [προκαταρκτικές δηλώσεις](#preliminary-declaration) μετά την εισαγωγή του *xcolor* πακέτο.

[Ανοίξτε ένα παράδειγμα για το πώς να γράψετε ένα πακέτο στο Overleaf](https://www.sharelatex.com/project/new/template?zipUrl=/project/53f11ec1eceb82a67658cb02/download/zip\&templateName=PackageExample\&compiler=pdflatex)

### Περισσότερες δηλώσεις

Σε αυτό το μέρος θα εμφανιστούν οι περισσότερες εντολές. Στο "examplepackage.sty". Παρακάτω μπορείτε να δείτε ολόκληρο το αρχείο πακέτου.

```latex
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{examplepackage}[2014/08/21 Παράδειγμα πακέτου]

\RequirePackage{imakeidx}
\RequirePackage{xstring}
\RequirePackage{xcolor}
\definecolor{greycolour}{HTML}{525252}
\definecolor{sharelatexcolour}{HTML}{882B21}
\definecolor{mybluecolour}{HTML}{394773}
\newcommand{\wordcolour}{greycolour}

\DeclareOption{red}{\renewcommand{\wordcolour}{sharelatexcolour}}
\DeclareOption{blue}{\renewcommand{\wordcolour}{mybluecolour}}
\DeclareOption*{\PackageWarning{examplepackage}{Άγνωστη ‘\CurrentOption’}}
\ProcessOptions\relax

%%Αριθμημένο περιβάλλον
\newcounter{example}[section]
\newenvironment{example}[1][]{\refstepcounter{example}\par\medskip
\noindent \textbf{My~environment~\theexample. #1} \rmfamily}{\medskip}

%%Σημαντικές λέξεις προστίθενται στο ευρετήριο και εκτυπώνονται με διαφορετικό χρώμα
\newcommand{\important}[1]
{\IfSubStr{#1}{!}
    {\textcolor{\wordcolour}{\textbf{\StrBefore{#1}{!}~\StrBehind{#1}{!}}}\index{#1}}
    {\textcolor{\wordcolour}{\textbf{#1}}\index{#1}\kern-1pt}
}
```

Αυτό το πακέτο ορίζει το νέο περιβάλλον `παράδειγμα`, και μια νέα εντολή `\important`, που εκτυπώνει τις λέξεις με ένα ειδικό χρώμα και τις προσθέτει στο ευρετήριο.

Για να κατανοήσετε πλήρως κάθε εντολή, δείτε το [οδηγό αναφοράς](#reference-guide) και τους συνδέσμους στην [ενότητα περαιτέρω ανάγνωσης](#further-reading).

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

```latex
\documentclass{article}
\usepackage[utf8]{inputenc}

\usepackage[red]{examplepackage}

\makeindex

\title{Παράδειγμα πακέτου}
\author{Ομάδα Learn ShareLaTeX}
\date{ }

\begin{document}

\maketitle

\section{Εισαγωγή}
Σε αυτό το έγγραφο δοκιμάζεται ένα νέο πακέτο. Αυτό το πακέτο επιτρέπει ειδικά αριθμημένα
περιβάλλοντα

\begin{example}
Αυτό το κείμενο βρίσκεται μέσα σε ένα ειδικό περιβάλλον, εκτυπώνεται κάποιο κείμενο με έντονη γραφή
στην αρχή και ορίζεται μια νέα εσοχή.
\end{example}

Επίσης, υπάρχει μια ειδική εντολή για \important{σημαντικές!λέξεις} που θα
εκτυπώνεται με ένα ειδικό \important{χρώμα} ανάλογα με την παράμετρο που χρησιμοποιείται στη
\important{πακέτου} δήλωση εισαγωγής. Επειδή είναι \important{σημαντικό}.

\printindex

\end{document}
```

![WrittingPackagesEx1.png](/files/e32afe61c7fe36a19488c57aeda8b822d98c3086)

Παρατηρήστε την εντολή

```latex
\usepackage[red]{examplepackage}
```

[Ανοίξτε ένα παράδειγμα για το πώς να γράψετε ένα πακέτο στο Overleaf](https://www.sharelatex.com/project/new/template?zipUrl=/project/53f11ec1eceb82a67658cb02/download/zip\&templateName=PackageExample\&compiler=pdflatex)

## Χειρισμός σφαλμάτων

Όταν πρόκειται για ανάπτυξη νέων πακέτων, είναι σημαντικό να χειρίζεστε πιθανά σφάλματα ώστε να ενημερώνεται ο χρήστης ότι κάτι πήγε στραβά. Υπάρχουν τέσσερις κύριες εντολές για την αναφορά σφαλμάτων στον μεταγλωττιστή.

* `\PackageError{*package-name*}{*error-text*}{*help-text*}`. Παίρνει τρεις παραμέτρους, καθεμία μέσα σε άγκιστρα: το όνομα του πακέτου, το κείμενο του σφάλματος που θα εμφανιστεί (η διαδικασία μεταγλώττισης θα παγώσει) και το κείμενο βοήθειας που θα εκτυπωθεί αν ο χρήστης πατήσει "h" όταν η μεταγλώττιση σταματήσει λόγω του σφάλματος.
* `\PackageWarning{*package-name*}{*warning-text*}`. Σε αυτή την περίπτωση το κείμενο εμφανίζεται, αλλά η διαδικασία μεταγλώττισης δεν θα σταματήσει. Θα εμφανίσει τον αριθμό της γραμμής όπου εμφανίστηκε η προειδοποίηση.
* `\PackageWarningNoLine{*package-name*}{*warning-text*}`. Λειτουργεί ακριβώς όπως η προηγούμενη εντολή, αλλά δεν θα εμφανίσει τη γραμμή όπου εμφανίστηκε η προειδοποίηση.
* `\PackageInfo{*package-name*}{*info-text*}`. Σε αυτή την περίπτωση οι πληροφορίες της δεύτερης παραμέτρου θα εκτυπωθούν μόνο στο αρχείο καταγραφής, μαζί με τον αριθμό της γραμμής.

[Ανοίξτε ένα παράδειγμα για το πώς να γράψετε ένα πακέτο στο Overleaf](https://www.sharelatex.com/project/new/template?zipUrl=/project/53f11ec1eceb82a67658cb02/download/zip\&templateName=PackageExample\&compiler=pdflatex)

## Οδηγός αναφοράς

**Λίστα εντολών που χρησιμοποιούνται συνήθως σε πακέτα και κλάσεις**

* `\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/04-writing-your-own-class.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/03-writing-your-own-package.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.
