> 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/se-vathos-arthra/10-an-overview-of-technologies-supporting-the-use-of-colour-emoji-fonts-in-latex.md).

# Μια επισκόπηση τεχνολογιών που υποστηρίζουν τη χρήση πολύχρωμων γραμματοσειρών emoji στο LaTeX

## Εισαγωγή

Αυτό το άρθρο παρέχει μια επισκόπηση διαφόρων [θεματικών ενοτήτων υποβάθρου](#which-topics-do-we-cover) σχετικών με τη χρήση OpenType γραμματοσειρών χρώματος για τη στοιχειοθεσία έγχρωμων emoji στο LaTeX. Προσπαθήσαμε να παρέχουμε ένα ευρύ φάσμα υλικού, που να καλύπτει ένα ευρύ φάσμα ενδιαφερόντων και επιπέδων εξειδίκευσης. Για να παραμείνει το άρθρο διαχειρίσιμο, η κάλυψή μας ορισμένων θεμάτων παραλείπει πολλές τεχνικές λεπτομέρειες, αλλά ελπίζουμε ότι υπάρχει επαρκές υλικό για να προσανατολίσει την εξερεύνησή σας στη στοιχειοθεσία έγχρωμων emoji στο LaTeX.

**Ενημέρωση (Ιούλιος 2023)**: Αυτό το άρθρο δημοσιεύθηκε για πρώτη φορά τον Αύγουστο του 2021 και αναθεωρήθηκε τον Ιούλιο του 2023 για να ενημερωθεί η ενότητα σχετικά με [τη χρήση OpenType γραμματοσειρών χρώματος βασισμένων σε SVG με το LuaHBTeX](#using-svg-based-opentype-color-fonts-with-luahbtex).

### Ποια θέματα καλύπτουμε;

Αυτό το άρθρο καλύπτει τα ακόλουθα γενικά θέματα:

* Unicode: το πρότυπο που κωδικοποιεί τα emoji ως χαρακτήρες και καθορίζει την αναμενόμενη συμπεριφορά τους σε εφαρμογές επεξεργασίας κειμένου και στοιχειοθεσίας.
* OpenType γραμματοσειρές χρώματος: εξειδικευμένες γραμματοσειρές που παρέχουν έγχρωμες αναπαραστάσεις των χαρακτήρων emoji που εμφανίζονται στο έγγραφο LaTeX σας.
* Σχηματοποίηση κειμένου: εισαγωγή ενός βασικού συστατικού της στοιχειοθεσίας γλωσσών με σύνθετα συστήματα γραφής και emoji.
* HarfBuzz: το συστατικό του LuaHBTeX που επιτρέπει την προηγμένη πολυγλωσσική στοιχειοθεσία και τη χρήση OpenType γραμματοσειρών χρώματος για τη στοιχειοθεσία emoji στο LaTeX.
* Διαφορετικές μηχανές TeX: διερεύνηση της υποστήριξής τους για OpenType γραμματοσειρές χρώματος και επιλογή της μηχανής TeX που θα χρησιμοποιηθεί.
* Το HarfBuzz API του LuaHBTeX: μια εισαγωγή στη «μαγεία» πίσω από [τη σχηματοποίηση κειμένου](#the-concept-of-text-shaping) στο LuaHBTeX.

### Τρεις τρόποι για να στοιχειοθετήσετε έγχρωμα emoji

Τα έγχρωμα emoji μπορούν να στοιχειοθετηθούν με LaTeX με τρεις βασικές μεθόδους:

1. Χρήση τυπικών εργαλείων γραφικών του LaTeX, όπως TikZ, MetaPost ή Asymptote, για τη σχεδίαση του emoji.
2. Εισαγωγή emoji με τη χρήση προετοιμασμένων γραφικών emoji που είναι αποθηκευμένα σε εξωτερικά αρχεία.
3. Αντιμετώπιση των emoji ως κειμένου κωδικοποιημένου σε Unicode και χρήση [τη σχηματοποίηση κειμένου](#the-concept-of-text-shaping) με [OpenType γραμματοσειρών χρώματος](#opentype-color-fonts) για τη στοιχειοθεσία τους.

Οι πρακτικές επιλογές για την ενσωμάτωση έγχρωμων emoji στο έγγραφο LaTeX σας εξαρτώνται από τη μηχανή TeX που χρησιμοποιείται για τη μεταγλώττιση του εγγράφου: δηλαδή, αν χρησιμοποιείτε:

* pdfLaTeX: μηχανή pdfTeX + LaTeX;
* XeLaTeX: μηχανή XeTeX + LaTeX;
* LuaLaTeX: μηχανή LuaHBTeX (από το TeX Live 2020) + LaTeX.

Και οι τρεις αυτές μηχανές TeX μπορούν να χρησιμοποιήσουν εργαλεία ή πακέτα LaTeX για να σχεδιάσουν emoji ή να χρησιμοποιήσουν `\includegraphics{...}` για να εισαγάγουν emoji που είναι αποθηκευμένα σε εξωτερικά αρχεία γραφικών. Η σχεδίαση ή η εισαγωγή γραφικών είναι ιδανικές τεχνικές για τη στοιχειοθεσία emoji όταν χρειάζεστε μια λύση που δεν εξαρτάται από τη μηχανή TeX που χρησιμοποιείται για τη μεταγλώττιση του εγγράφου LaTeX.

Ωστόσο, αν η ροή εργασίας σας παρέχει την ευελιξία να επιλέξετε μια συγκεκριμένη μηχανή TeX και θα προτιμούσατε να χρησιμοποιήσετε OpenType γραμματοσειρές χρώματος και επεξεργασία κειμένου βασισμένη σε Unicode, τότε αυτό που χρειάζεστε είναι η νεότερη έκδοση του LuaTeX, που ονομάζεται LuaHBTeX. Από το TeX Live 2020 και μετά, το LuaHBTeX χρησιμοποιείται για τη μεταγλώττιση εγγράφων LaTeX βασισμένων στη μορφή LuaLaTeX.

## Υπόβαθρο σχετικά με το Unicode και τους χαρακτήρες emoji

### Κωδικοποιήσεις χαρακτήρων

Οι υπολογιστές αποθηκεύουν, μεταδίδουν και επεξεργάζονται κείμενο χρησιμοποιώντας μια ακολουθία αριθμητικών (ακέραιων) τιμών που αναπαριστούν τα επιμέρους *χαρακτήρια*. Η αξιόπιστη επεξεργασία κειμένου απαιτεί από τους παραγωγούς και τους καταναλωτές του κειμένου να συμφωνούν σχετικά με το ποιες ακέραιες τιμές πρέπει να χρησιμοποιούνται για την αναπαράσταση μεμονωμένων χαρακτήρων μέσα στη ροή κειμένου. Με άλλα λόγια, ποια είναι η *χαρακτήρα* *κωδικοποίηση* Μια κωδικοποίηση είναι το σύνολο των συμφωνημένων ακέραιων τιμών που αποδίδονται για την αναπαράσταση ενός συγκεκριμένου συνόλου χαρακτήρων: κάθε χαρακτήρας αναπαρίσταται από μια ακέραια τιμή μέσα στην κωδικοποίηση που χρησιμοποιείται.

### Εισάγεται το Unicode

Ιστορικά, στην εποχή του κειμένου 8-bit, χρησιμοποιούνταν πολλές διαφορετικές κωδικοποιήσεις χαρακτήρων, εγείροντας πάντα το φάσμα των *αναντιστοιχιών κωδικοποίησης*: οι παραγωγοί και οι καταναλωτές κειμένου να υποθέτουν λανθασμένα διαφορετικές κωδικοποιήσεις, με αποτέλεσμα σφάλματα στην επεξεργασία κειμένου. Όποιος έχει εργαστεί με TeX/LaTeX για μερικά χρόνια πιθανότατα έχει συναντήσει αναντιστοιχίες κωδικοποίησης μεταξύ του κειμένου εισόδου και των γραμματοσειρών που χρησιμοποιούνται για τη στοιχειοθεσία ενός εγγράφου. Αν οι γραμματοσειρές του εγγράφου έχουν ρυθμιστεί να χρησιμοποιούν διαφορετική κωδικοποίηση από εκείνη του κειμένου, αυτό πιθανότατα οδηγεί σε χαρακτήρες που λείπουν ή είναι λανθασμένοι στο στοιχειοθετημένο PDF.

Αυτά τα ιστορικά προβλήματα κωδικοποίησης μπορούν να επιλυθούν με τη χρήση ενός διεθνούς προτύπου που κωδικοποιεί όλους τους χαρακτήρες του κόσμου: το Unicode. Το πρότυπο Unicode δεν είναι στατικό, αλλά ενημερώνεται περιοδικά ώστε να περιλαμβάνει πρόσθετους χαρακτήρες και γραφές (συστήματα γραφής) στο σχήμα κωδικοποίησής του. Υπάρχει μια [τυπική διαδικασία αξιολόγησης για την πρόταση νέων χαρακτήρων](http://www.unicode.org/pending/proposals.html) με ένα συγκεκριμένο [σχήμα για νέους χαρακτήρες emoji](https://www.unicode.org/emoji/proposals.html).

### Πόσοι χαρακτήρες Unicode;

Το Unicode κωδικοποιεί ένα θεωρητικό μέγιστο 1.114.112 χαρακτήρων. Κάθε μία από τις 1.114.112 ακέραιες τιμές ονομάζεται *σημείο κώδικα*: η ακέραια τιμή που αποδίδεται για την ταυτοποίηση κάθε χαρακτήρα. Ωστόσο, για διάφορους τεχνικούς λόγους μόνο [1.112.064 σημεία κώδικα](https://en.wikipedia.org/wiki/Unicode#Architecture_and_terminology) μπορούν να αποδοθούν σε πραγματικούς χαρακτήρες: 2048 σημεία κώδικα δεν μπορούν να αποδοθούν και απαγορεύονται για χρήση εντός κειμένου συμβατού με Unicode.

Τη στιγμή της συγγραφής (η πρώτη έκδοση αυτού του άρθρου), η Έκδοση 13 του προτύπου Unicode είχε αποδώσει συνολικά 143.859 σημεία κώδικα σε πραγματικούς χαρακτήρες, συμπεριλαμβανομένων [3304 χαρακτήρων που πλέον κωδικοποιούνται ως emoji](https://www.unicode.org/L2/L2020/20114r-family-emoji-explor.pdf) (βλ. σελίδα 2 αυτού του εγγράφου). Η αύξηση του αριθμού των χαρακτήρων που κωδικοποιούνται από το Unicode τεκμηριώνεται όμορφα στο άρθρο [Πόσοι χαρακτήρες Unicode υπάρχουν;](https://www.babelstone.co.uk/Unicode/HowMany.html) και σε μια [καταχώριση της Wikipedia](https://en.wikipedia.org/wiki/Unicode#Versions).

### Επίπεδα Unicode

Ολόκληρη η συλλογή των 1.114.112 σημείων κώδικα Unicode ομαδοποιείται σε 17 λεγόμενα Επίπεδα: από το Επίπεδο 0 έως το Επίπεδο 16, το καθένα περιέχει 65536 τιμές σημείων κώδικα, αποδίδοντας συνολικά $$17\times2^{16} = 1,114,112$$ χαρακτήρες. Το Επίπεδο 0, που ονομάζεται [Βασικό Πολυγλωσσικό Επίπεδο](https://en.wikipedia.org/wiki/Plane_\(Unicode\)#Basic_Multilingual_Plane), κωδικοποιεί τους πιο συχνά χρησιμοποιούμενους χαρακτήρες. Τα Επίπεδα 1–16 ονομάζονται [Συμπληρωματικά Επίπεδα](http://unicode.org/glossary/#supplementary_planes).

### Η άνοδος του emoji

Νέοι χαρακτήρες προκύπτουν μέσω μεταβαλλόμενων τρόπων ανθρώπινης επικοινωνίας, και η τεχνολογία των κινητών τηλεφώνων οδήγησε στην εμφάνιση ενός τέτοιου συνόλου χαρακτήρων: τα emoji, που εξελίχθηκαν στην Ιαπωνία στα τέλη της δεκαετίας του 1990. Δεν αποτελεί έκπληξη ότι το [Συχνές Ερωτήσεις του Unicode για τα Emoji](https://unicode.org/faq/emoji_dingbats.html) σημειώνουν

> «Η λέξη emoji προέρχεται από τα ιαπωνικά [絵](http://www.unicode.org/cgi-bin/GetUnihanData.pl?codepoint=%E7%B5%B5) (e ≅ εικόνα) + [文字](http://www.unicode.org/cgi-bin/GetUnihanData.pl?codepoint=%E6%96%87) (moji ≅ γραπτός χαρακτήρας).»

Οι αναγνώστες που ενδιαφέρονται για το υπόβαθρο και την ιστορική εξέλιξη των emoji μπορεί να βρουν ενδιαφέρον σε αυτήν την [εισαγωγή στο Unicode](https://unicode.org/reports/tr51/#Introduction) ή στο άρθρο [Συμφωνώ κι εγώ με αυτό το emoji: Τα πρότυπα, οι δομές και η κοινωνική παραγωγή των emoji](https://firstmonday.org/ojs/index.php/fm/article/view/9381).

Δεν ήταν μέχρι το 2010, με την κυκλοφορία της [έκδοσης 6.0 του προτύπου Unicode](https://www.unicode.org/versions/Unicode6.0.0/), που πολλά emoji αναγνωρίστηκαν επίσημα ως *χαρακτήρια* αυθύπαρκτα. Το Unicode 13.0 κωδικοποίησε [3304 χαρακτήρες ως emoji](https://www.unicode.org/L2/L2020/20114r-family-emoji-explor.pdf) (βλ. σελίδα 2 αυτού του εγγράφου), ενώ το Unicode 13.1 απαριθμεί [3521 emoji](https://unicode.org/emoji/charts/emoji-counts.html).

### Τα emoji ζουν σε ανώτερο επίπεδο

Το Unicode απέδωσε πολλά emoji σε σημεία κώδικα εκτός του Βασικού Πολυγλωσσικού Επιπέδου (BMP), κωδικοποιημένα [στο Επίπεδο 1](https://en.wikibooks.org/wiki/Unicode/Character_reference/1F000-1FFFF) με σημεία κώδικα στο εύρος 1F000–1FFFF—κάτι που έχει σημαντική συνέπεια για όποιον επιθυμεί να *αντιγράψει και να επικολλήσει* χαρακτήρες emoji στους επεξεργαστές του Overleaf (Code Editor ή Visual Editor). Οι επεξεργαστές κειμένου του Overleaf μπορούν προς το παρόν να χειριστούν μόνο χαρακτήρες εντός του Βασικού Πολυγλωσσικού Επιπέδου, αν και ελπίζουμε ότι μελλοντικές αναβαθμίσεις θα εισαγάγουν υποστήριξη για χαρακτήρες εκτός BMP. Σημειώστε ότι αυτός ο περιορισμός επηρεάζει μόνο τους χαρακτήρες εκτός BMP μέσα σε κείμενο που επικολλάται σε αρχεία προορισμένα να επεξεργαστούν μέσω των επεξεργαστών του Overleaf. Υπάρχουν άλλοι τρόποι πρόσβασης σε χαρακτήρες emoji:

* Χρήση των πρωτόγονων εντολών `\char"<σημείο κώδικα>` ή `\Uchar"<σημείο κώδικα>` (βλ. [αυτή την ενότητα](#optional-detail-luatexluahbtex-char-vs-uchar) του άρθρου).
* Χρήση αρχείων κειμένου εισόδου που περιέχουν χαρακτήρες emoji σε μορφή UTF-8.
* Χρήση εντολών LaTeX (μακροεντολών) που εισάγουν χαρακτήρες emoji.

#### Επικόλληση emoji και άλλων χαρακτήρων εκτός BMP στο Overleaf

Αν επικολλήσετε έναν χαρακτήρα emoji, για παράδειγμα, 😀, στον Code Editor του Overleaf, προς το παρόν θα μετατραπεί στους χαρακτήρες ��.

![Σφάλμα λόγω αντιγραφής + επικόλλησης χαρακτήρων εκτός BMP στους επεξεργαστές του Overleaf](/files/812f4e99ac5e33fa24feeff75ea6b565979bcbad)

Ο χαρακτήρας � έχει το σημείο κώδικα Unicode FFFD και η επίσημη ονομασία του είναι REPLACEMENT CHARACTER και χρησιμοποιείται για να «[αντικαταστήσει έναν άγνωστο, μη αναγνωρισμένο ή μη αναπαραστάσιμο χαρακτήρα](https://en.wikipedia.org/wiki/Specials_\(Unicode_block\))”.

### Χρήση σημείων κώδικα Unicode (U+) στο LuaLaTeX

Η τεκμηρίωση του Unicode αναπαριστά τιμές σημείων κώδικα χρησιμοποιώντας τη σημειογραφία `U+<δεκαεξαδική τιμή>`— όπως το `U+1F600`, όπου `1F600` είναι η `<δεκαεξαδική τιμή>` του σημείου κώδικα Unicode για τον χαρακτήρα emoji 😀. Για να χρησιμοποιήσετε αυτές τις τιμές σημείων κώδικα στο LuaLaTeX, διαγράφετε το `U+` και γράφετε `\char"<δεκαεξαδική τιμή>` ή `\Uchar"<δεκαεξαδική τιμή>`. Το `"` ο χαρακτήρας δηλώνει σε μια μηχανή TeX ότι ο παρεχόμενος αριθμός καθορίζεται σε δεκαεξαδική μορφή. Για παράδειγμα, για να χρησιμοποιήσετε το emoji 😀, θα γράφατε `\char"1F600` ή `\Uchar"1F600`—χρησιμοποιώντας μια γραμματοσειρά ικανή να το στοιχειοθετήσει.

Ένα ελάχιστο παράδειγμα LuaLaTeX με χρήση `\char` και `\Uchar` για τη στοιχειοθεσία του emoji 😀 θα μπορούσε να είναι:

```latex
\documentclass{article}
\usepackage{fontspec}
\begin{document}
\newfontfamily\emojifont[Renderer=Harfbuzz]{NotoColorEmoji.ttf}
%Χρησιμοποιήστε τη \emojifont μέσα σε μια ομάδα για να διατηρήσετε τις επιδράσεις της τοπικές
{\emojifont
\Uchar"1F600
\char"1F600}
\end{document}
```

[Ανοίξτε αυτό το παράδειγμα LuaLaTeX στο Overleaf](https://www.overleaf.com/docs?engine=lualatex\&snip_name=Test+using+LuaLaTeX\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%7Bfontspec%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cnewfontfamily%5Cemojifont%5BRenderer%3DHarfbuzz%5D%7BNotoColorEmoji.ttf%7D%0A%25Use+%5Cemojifont+in+a+group+to+keep+its+effects+local%0A%7B%5Cemojifont+%0A%5CUchar%221F600%0A%5Cchar%221F600%7D%0A%5Cend%7Bdocument%7D)

**(προαιρετική λεπτομέρεια) LuaTeX/LuaHBTeX: \char vs \Uchar**

Εκτός από την συμβατική `\char<κωδικός χαρακτήρα>` εντολή για τη στοιχειοθεσία ενός συγκεκριμένου `<κωδικός χαρακτήρα>`, χρησιμοποιώντας την τρέχουσα γραμματοσειρά, οι μηχανές LuaTeX, LuaHBTeX και XeTeX παρέχουν επίσης την `\Uchar<κωδικός χαρακτήρα>` εντολή. Από την οπτική γωνία του χρήστη, το αποτέλεσμα του `\char` και `\Uchar` φαίνεται το ίδιο, αλλά υπάρχει μια λεπτή διαφορά στον τρόπο λειτουργίας αυτών των εντολών, όπως σημειώνουμε παρακάτω.

**Η βασική διαφορά: επέκταση**

`\Uchar` είναι μια λεγόμενη [επεκτάσιμη εντολή](/latex/el/se-vathos-arthra/22-how-does-expandafter-work-the-meaning-of-expansion.md#expansion-a-general-term-for-a-set-of-operations) ενώ η `\char` δεν είναι επεκτάσιμη. Όταν μια `\char<κωδικός χαρακτήρα>` ή `\Uchar<κωδικός χαρακτήρα>` εντολή «εκτελείται»—δηλαδή, η εντολή δεν αποθηκεύεται ως μέρος μιας μακροεντολής ή άλλης λίστας συμβόλων—λαμβάνουν χώρα οι ακόλουθες ενέργειες μέσα στη μηχανή TeX:

* **`\char<κωδικός χαρακτήρα>`** δίνει εντολή στη μηχανή TeX να εισαγάγει αμέσως ένα σύμβολο χαρακτήρα, που αναπαριστά `<κωδικός χαρακτήρα>`, μέσα σε οποιοδήποτε κομμάτι περιεχομένου στοιχειοθετεί αυτή τη στιγμή.
* Αντίθετα, **`\Uchar<κωδικός χαρακτήρα>`** έχει δύο διακριτά στάδια επεξεργασίας:

1. Η `\Uchar<κωδικός χαρακτήρα>` εντολή *επεκταθεί*είναι `<κωδικός χαρακτήρα>` , και το [χαρακτηρικό token](/latex/el/se-vathos-arthra/19-how-does-expandafter-work-an-introduction-to-tex-tokens.md#tex-tokens-101-28and-notions-of-expansion29) μετατρέπεται σε μια προσωρινή λίστα συμβόλων που περιέχει ένα μόνο `<κωδικός χαρακτήρα>`.
2. το οποίο αναπαριστά το *Αυτή η λίστα συμβόλων ενός χαρακτήρα είναι τώρα* διατίθεται στη μηχανή TeX ως η πηγή της επόμενης εισόδου της. Στην πράξη, η μηχανή TeX «μετατοπίζει προσωρινά το βλέμμα της» ώστε να χρησιμοποιήσει αυτή τη λίστα ενός συμβόλου ως τη θέση του επόμενου στοιχείου εισόδου (συμβόλου). Από προεπιλογή, η μηχανή TeX απλώς επιστρέφει για να διαβάσει (ως είσοδο) αυτό το σύμβολο και να στοιχειοθετήσει τον αντίστοιχο χαρακτήρα, αναπαράγοντας τη συμπεριφορά της `\char` εντολή. **Ωστόσο**, επειδή εκείνο το `<κωδικός χαρακτήρα>` δεν στοιχειοθετήθηκε αμέσως, αλλά αποθηκεύτηκε προσωρινά (φυλάχτηκε) ως ένα μόνο σύμβολο, οι πρωτόγονες εντολές TeX ή οι μακροεντολές LaTeX μπορούν να κάνουν χρήση (να απορροφήσουν) εκείνο το σύμβολο—δεν χρειάζεται να στοιχειοθετηθεί αμέσως, αλλά μπορεί να χρησιμοποιηθεί σε περαιτέρω επεξεργασία όπως απαιτείται. *αποθηκεύονται* Στην πράξη,

λέει «στοιχειοθέτησε αυτό το `\char<κωδικός χαρακτήρα>` τώρα», ενώ η `<κωδικός χαρακτήρα>` έχει μια μορφή «καθυστερημένης δράσης» δημιουργώντας ένα αποθηκευμένο σύμβολο χαρακτήρα και καθιστώντας το διαθέσιμο ως το επόμενο στοιχείο εισόδου (ένα σύμβολο). Αυτό το σύμβολο μπορεί είτε να χρησιμοποιηθεί (να απορροφηθεί) από εντολές και μακροεντολές TeX είτε να διαβαστεί ξανά από τη μηχανή TeX και να στοιχειοθετηθεί. `\Uchar<κωδικός χαρακτήρα>` Το Unicode (η κωδικοποίηση) δεν είναι όλη η ιστορία

### Η δυνατότητα χρήσης χαρακτήρων emoji μέσα σε κείμενο κωδικοποιημένο σε Unicode είναι μόνο ένα μέρος της ιστορίας επιτυχίας των emoji. Η αύξηση στη χρήση emoji κατέστη επίσης δυνατή από εξελίξεις στην

τεχνολογία γραμματοσειρών OpenType [—γραμματοσειρές των οποίων τα δεδομένα γλύφων (σχεδιάσεις χαρακτήρων) μπορούν να περιέχουν](https://learn.microsoft.com/en-us/typography/opentype/)δεδομένα χρώματος [: τις λεγόμενες](https://learn.microsoft.com/en-us/typography/opentype/spec/colr)Εκτός από τις κατάλληλες γραμματοσειρές, η χρήση έγχρωμων emoji απαιτεί πρόσθετα στοιχεία λογισμικού των οποίων οι εργασίες περιλαμβάνουν: [OpenType γραμματοσειρών χρώματος](#opentype-color-fonts).

Εκτός από τις κατάλληλες γραμματοσειρές, η χρήση έγχρωμων emoji απαιτεί πρόσθετα στοιχεία λογισμικού των οποίων οι εργασίες περιλαμβάνουν:

* προεπεξεργασία («[σχηματοποίηση](#the-concept-of-text-shaping)») κειμένου κωδικοποιημένου σε Unicode, *προετοιμασία* του για εμφάνιση χρησιμοποιώντας μια συγκεκριμένη γραμματοσειρά·
* *απόδοση και προβολή* των έγχρωμων emoji μιας γραμματοσειράς *γλύφων* στην οθόνη μιας συσκευής.

#### Γλύφος vs. χαρακτήρας: δεν είναι το ίδιο πράγμα;

Οι όροι «γλύφος» και «χαρακτήρας» συχνά χρησιμοποιούνται σαν να ήταν εναλλάξιμοι—αναφερόμενοι στην ίδια βασική έννοια—αλλά υπάρχει μια λεπτή, αν και σημαντική, διαφορά στη σημασία τους.

Το Unicode [ορίζει τον όρο «χαρακτήρας»](http://www.unicode.org/glossary/#character) ως:

> «Το μικρότερο συστατικό της γραπτής γλώσσας που έχει σημασιολογική αξία· αναφέρεται στην αφηρημένη σημασία ή/και μορφή, παρά σε μια συγκεκριμένη μορφή… »

Αντίθετα, ένας «γλύφος» είναι μια *συγκεκριμένη* *σχήμα* (σχεδίαση) για την *οπτική αναπαράσταση* ενός συγκεκριμένου *χαρακτήρα*.

Το ζήτημα χαρακτήρα έναντι γλύφου παρατηρείται εύκολα όταν κείμενο γεμάτο emoji προβάλλεται σε διάφορα συστήματα/πλατφόρμες λογισμικού, όπως όταν διαβάζεται το ίδιο κείμενο στο κινητό σας τηλέφωνο με iOS ή Android ή στον επιτραπέζιο υπολογιστή Windows. Όποια συσκευή ή πλατφόρμα κι αν χρησιμοποιείται, το υποκείμενο κείμενο (ακολουθία χαρακτήρων) θα περιείχε το ίδιο Unicode-κωδικοποιημένο *emoji* *χαρακτήρια*. Οι δυνατότητες που εξαρτώνται από τη συσκευή και εμπλέκονται στην *προεπεξεργασία* αυτού του κειμένου έπειτα *στην απόδοση* και *εμφανιζόμενη* των αποτελεσμάτων, ίσως χρησιμοποιώντας γραμματοσειρές ειδικές για τη συσκευή, παράγουν διαφορετικούς γλύφους (σχεδιάσεις χαρακτήρων) για να αναπαραστήσουν τους ίδιους χαρακτήρες emoji.

Το [Πλήρης λίστα Emoji](https://unicode.org/emoji/charts/full-emoji-list.html) του Unicode παρέχει δείγματα εικόνων που αναπαριστούν κάθε χαρακτήρα emoji Unicode—επιδεικνύοντας διάφορους γλύφους που χρησιμοποιούνται από διαφορετικούς τεχνολογικούς προμηθευτές. Όχι μόνο οι σχεδιαστές γραμματοσειρών υιοθετούν τις δικές τους ιδιαίτερες σχεδιάσεις (γλύφους) για να αναπαριστούν χαρακτήρες emoji, αλλά οι επιμέρους γραμματοσειρές διαφέρουν επίσης ως προς τον αριθμό των χαρακτήρων emoji που υποστηρίζουν (για τους οποίους περιέχουν γλύφους) και μπορεί να περιέχουν ή να μην περιέχουν πιο προχωρημένα χαρακτηριστικά επεξεργασίας κειμένου emoji που περιλαμβάνονται στις προδιαγραφές emoji του Unicode.

Η έννοια και το concept των χαρακτήρων, η σημασιολογία και η κωδικοποίησή τους, αποτελούν τη βάση για τον κόσμο του Unicode: αυτό ασχολείται με χαρακτήρες. Η σχεδίαση και η οπτική αναπαράσταση μεμονωμένων χαρακτήρων, ως γλύφοι, ανήκουν στις τεχνολογίες γραμματοσειρών και στην τέχνη του σχεδιασμού γραμματοσειρών.

#### Unicode emoji: πολύ περισσότερα από κωδικοποίηση κειμένου

Ο κεντρικός ρόλος του Unicode είναι να παρέχει ένα παγκόσμιο πρότυπο κωδικοποίησης που ορίζει ποια ακέραια τιμή, που ονομάζεται *σημείο κώδικα,* θα πρέπει να χρησιμοποιείται για την αναπαράσταση κάθε χαρακτήρα, συμπεριλαμβανομένων των emoji, μέσα σε μια ροή κειμένου κωδικοποιημένου σε Unicode.

Η προδιαγραφή του Unicode για τα emoji ορίζει επίσης *συμπεριφορές επεξεργασίας* για ορισμένες *ακολουθίες* των χαρακτήρων emoji που εμφανίζονται μέσα σε μια ροή κειμένου κωδικοποιημένου σε Unicode. Καθορισμένες ακολουθίες χαρακτήρων emoji μπορούν να «συγχωνευθούν» μέσω μιας διαδικασίας που ονομάζεται [τη σχηματοποίηση κειμένου](#the-concept-of-text-shaping) για να παραχθεί ένας μοναδικός προκύπτων («σύνθετος») γλύφος emoji—αυτός ο μοναδικός γλύφος θα χρησιμοποιούνταν από το λειτουργικό σύστημα της συσκευής για να αναπαραστήσει την αρχική ακολουθία χαρακτήρων που υπάρχει στο κείμενο.

Η Τεχνική Έκθεση του Unicode για τα [Unicode Emoji](https://unicode.org/reports/tr51/) τεκμηριώνει το πλούσιο σύνολο χαρακτηριστικών που είναι διαθέσιμα σε λογισμικό που επιθυμεί να παρέχει επεξεργασία emoji συμβατή με το Unicode. Ως παράδειγμα, το Unicode ορίζει (κωδικοποιεί) χαρακτήρες που ονομάζονται [τροποποιητές emoji](http://www.unicode.org/reports/tr51/#Emoji_Modifiers_Table) που μπορούν να χρησιμοποιηθούν για τη δημιουργία *παραλλαγών* των emoji χαρακτήρων «βάσης», όπως παραλλαγές σε [τόνο δέρματος με βάση την κλίμακα Fitzpatrick](http://www.unicode.org/reports/tr51/#Diversity). Σημειώστε ότι το σύνολο των βασικών χαρακτήρων emoji και οι εφαρμοστέοι τροποποιητές ορίζονται ως μέρος του συνολικού [προτύπου emoji του Unicode](http://www.unicode.org/reports/tr51).

Η σελίδα Unicode [Emoji Sequences](http://unicode.org/emoji/charts/emoji-sequences.html) παρέχει έναν πίνακα με τις ακολουθίες που παρέχονται επί του παρόντος από την προδιαγραφή Unicode. Τοποθετήστε τον δείκτη του ποντικιού πάνω από οποιαδήποτε από τις εικόνες γλύφων emoji για να δείτε ένα μικρό αναδυόμενο tooltip που σας λέει την υποκείμενη ακολουθία χαρακτήρων emoji Unicode που παράγει αυτόν τον γλύφο:

![EmojiSequenceChart.png](/files/4ed68a8d9fd015b3755340d0a9b91204044eb9db)

Για παράδειγμα, ο γλύφος emoji:

![HandMediumSkinTone.png](/files/7f55894741aebd5ba10eb631767cd6e8cef37467)

καταγράφεται στην [ενότητα ακολουθιών τροποποιητών](http://unicode.org/emoji/charts/emoji-sequences.html#modifier_sequences) και παράγεται από τη διπλοχαρακτηρική ακολουθία U+1F44B U+1F3FD. Αυτοί οι επιμέρους χαρακτήρες είναι:

U+1F44B:![UnicodeWavingHandDefault.png](/files/a1a56e38983516bd04a281dadde15a4270c5eed4) (ΚΥΜΑΤΙΣΤΟ ΧΕΡΙ)

U+1F3FD:![FitzPatrick3.png](/files/46731844a666b1135899ff6230a221d106fa25aa) (ΤΡΟΠΟΠΟΙΗΤΗΣ ΕΜΟJI FITZPATRICK ΤΥΠΟΥ-4)

**Χρήση τροποποιητών τόνου δέρματος στο LuaHBTeX**

Το ακόλουθο παράδειγμα χρησιμοποιεί το LuaHBTeX για να δείξει τη χρήση τροποποιητών emoji:

```latex
\documentclass{article}
\usepackage{fontspec}
\begin{document}
\newfontfamily\emojifont[Renderer=HarfBuzz,SizeFeatures={Size=20}]{NotoColorEmoji.ttf}
Απομονωμένο κυματιστό χέρι: {\emojifont\Uchar"1F44B}\par
Απομονωμένος τροποποιητής: {\emojifont\Uchar"1F3FD}\par
Συνδυασμένο αποτέλεσμα: {\emojifont\Uchar"1F44B\Uchar"1F3FD}
\end{document}
```

[Ανοίξτε αυτό το παράδειγμα τροποποιητών emoji LuaLaTeX στο Overleaf](https://www.overleaf.com/docs?engine=lualatex\&snip_name=Emoji+modifiers+using+LuaLaTeX\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%7Bfontspec%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cnewfontfamily%5Cemojifont%5BRenderer%3DHarfBuzz%2CSizeFeatures%3D%7BSize%3D20%7D%5D%7BNotoColorEmoji.ttf%7D%0AIsolated+waving+hand%3A+%7B%5Cemojifont%5CUchar%221F44B%7D%5Cpar%0AIsolated+modifier%3A+%7B%5Cemojifont%5CUchar%221F3FD%7D%5Cpar+%0ACombined+result%3A+%7B%5Cemojifont%5CUchar%221F44B%5CUchar%221F3FD%7D%0A%5Cend%7Bdocument%7D)

Αυτό το παράδειγμα παράγει το ακόλουθο αποτέλεσμα:

![ModifiersInLuaHBTeX.png](/files/ffe181af812833b15fac7172af63734f085f0357)

#### UTF-8: ο ρόλος του στην αποθήκευση κειμένου Unicode

Οποιοδήποτε κείμενο ή κώδικα πληκτρολογείτε ή επικολλάτε στον Code Editor του Overleaf (ή στον Visual Editor) θα αποθηκεύεται σε μορφή UTF-8, οπότε θα αναθεωρήσουμε σύντομα τι σημαίνει πραγματικά το UTF-8. Το UTF σημαίνει Unicode Transformation Format, και ο ρόλος του UTF-8 στην αποθήκευση ή μετάδοση κειμένου κωδικοποιημένου σε Unicode υποδηλώνεται από τη φράση «Transformation *Format*».

Οι τιμές σημείων κώδικα του Unicode κυμαίνονται από 0 έως μέγιστο 1.114.111, επομένως είναι αδύνατο να αναπαρασταθούν όλες οι τιμές χαρακτήρων Unicode χρησιμοποιώντας ένα μόνο οκτάμπιτο byte, το οποίο μπορεί να αποθηκεύσει μόνο έως 256 διαφορετικές τιμές: από 0 έως 255. Ωστόσο, είναι δυνατό να αναπαρασταθεί οποιαδήποτε ακέραια τιμή σημείου κώδικα Unicode χρησιμοποιώντας μια *διαδοχική ακολουθία* τιμών μεγέθους byte—που είναι η αρχή πίσω από το UTF-8.

Το UFT-8 παρέχει μια «συνταγή» για να *μετασχηματίσει* (δηλαδή, να «κωδικοποιήσει» ή να «μετατρέψει») μια ακέραια τιμή σημείου κώδικα Unicode σε μια μοναδική ακολουθία 1 έως 4 διαδοχικών ακεραίων μεγέθους byte: ο αριθμός των διαδοχικών byte που απαιτείται εξαρτάται από την τιμή της ακέραιας τιμής του σημείου κώδικα. Κατά συνέπεια, μπορεί να διαβάσετε ότι το UTF-8 αποθηκεύει χαρακτήρες Unicode ως *ακολουθίες πολλαπλών byte* επειδή ένας μόνο χαρακτήρας Unicode (ακέραιη τιμή σημείου κώδικα) αναπαρίσταται στο UTF-8 ως ακολουθία 1 έως 4 διαδοχικών byte.

Φυσικά, το κείμενο που αποθηκεύεται σε UTF-8 μπορεί να μετατραπεί ξανά στην αρχική του ακολουθία ακέραιων τιμών σημείων κώδικα Unicode — αυτό είναι που πρέπει να κάνουν τα XeTeX ή LuaTeX/LuaHBTeX όταν διαβάζουν ένα αρχείο εισόδου LaTeX αποθηκευμένο σε μορφή UTF-8. Αυτές οι μηχανές TeX χρειάζεται να γνωρίζουν τις τιμές σημείων κώδικα Unicode (χαρακτήρων) εισόδου πριν μπορέσουν να στοιχειοθετήσουν το κείμενο. Σημειώστε ότι το pdfTeX δεν διαθέτει ενσωματωμένη δυνατότητα αποκωδικοποίησης UTF-8, οπότε πρέπει να βασίζεται σε μακροεντολές TeX για να επεξεργάζεται (αποκωδικοποιεί) το κείμενο εισόδου μορφοποιημένο σε UTF-8.

**Μερικά παραδείγματα UTF-8**

* Ο αραβικός χαρακτήρας ش («sheen») έχει σημείο κώδικα Unicode 0634 σε δεκαεξαδική μορφή (βάση 16) ή 1588 σε δεκαδική μορφή (βάση 10). Στο UTF-8 το ش αναπαρίσταται ως 2 (δεκαεξαδικές) τιμές D8 και B4, οπότε ο χαρακτήρας ش θα αποθηκευόταν ως τα δύο διαδοχικά byte D8B4 μέσα σε κείμενο κωδικοποιημένο σε UTF-8.
* Ο χαρακτήρας emoji 😀 έχει σημείο κώδικα Unicode 1F600 σε δεκαεξαδική μορφή (βάση 16) ή 128512 σε δεκαδική μορφή (βάση 10). Στο UTF-8 το 😀 αναπαρίσταται ως 4 (δεκαεξαδικές) τιμές F0, 9F, 98 και 80, οπότε ο χαρακτήρας 😀 θα αποθηκευόταν ως τα 4 διαδοχικά byte F09F9880 μέσα σε ένα αρχείο κειμένου UTF-8.

#### Ειδικοί χαρακτήρες που χρησιμοποιούνται στην επεξεργασία κειμένου emoji βασισμένη στο Unicode

Δεν προορίζεται κάθε χαρακτήρας κωδικοποιημένος στο Unicode για οπτική παρουσίαση μέσω των γλύφων μέσα σε μια γραμματοσειρά: ορισμένοι κωδικοποιημένοι χαρακτήρες ορίζονται ως *χαρακτήρες μη εκτύπωσης* των οποίων ο σκοπός είναι να βοηθούν εξειδικευμένες λειτουργίες επεξεργασίας κειμένου (μέσα σε υποστηρικτικό λογισμικό). Διαφορετικές εφαρμογές λογισμικού παρέχουν διαφορετικά επίπεδα υποστήριξης για τους χαρακτήρες μη εκτύπωσης που κωδικοποιούνται στο Unicode, οπότε το αποτέλεσμα θα εξαρτηθεί από το περιβάλλον λογισμικού—εφαρμογές και γραμματοσειρές—που χρησιμοποιείται.

**Δύο χαρακτήρες μη εκτύπωσης που πρέπει να γνωρίζετε**

* **Συνδετήρας μηδενικού πλάτους (ZWJ)**, σημείο κώδικα 200D (δεκαεξαδικό), είναι, όπως υποδηλώνει το όνομά του, σχεδιασμένος να ενεργοποιεί τη «συμπεριφορά σύνδεσης» των χαρακτήρων εισόδου—αλλά μόνο αν αυτοί οι χαρακτήρες εισόδου *διαθέτουν* μια καθορισμένη συμπεριφορά σύνδεσης.
* **Μη συνδετήρας μηδενικού πλάτους (ZWNJ)**, σημείο κώδικα 200C (δεκαεξαδικό), είναι σχεδιασμένος να *αποτρέψετε* τη «συμπεριφορά σύνδεσης» που διαφορετικά θα μπορούσαν να εμφανίζουν οι χαρακτήρες εισόδου. Για παράδειγμα, μπορείτε να χρησιμοποιήσετε το ZWNJ για να αποτρέψετε τη συμπεριφορά σύνδεσης διαδοχικών αραβικών χαρακτήρων που κανονικά θα επεξεργάζονταν (σχηματοποιούνταν) στις συνδετικές μορφές τους.

Το Unicode έχει δημοσιεύσει μια λίστα με [Συνιστώμενες Ακολουθίες Emoji ZWJ](https://unicode.org/emoji/charts/emoji-zwj-sequences.html) οι οποίες χρησιμοποιούν έναν U+200D ZERO WIDTH JOINER (ZWJ) για να συνδυάσουν ακολουθίες χαρακτήρων emoji σε έναν ενιαίο σύνθετο γλύφο emoji—αν αυτός είναι διαθέσιμος μέσα στις γραμματοσειρές που χρησιμοποιούνται.

**Παράδειγμα χρήσης μη συνδετήρα μηδενικού πλάτους**

Το ακόλουθο ελάχιστο τμήμα κώδικα χρησιμοποιεί τη γραμματοσειρά Scheherazade OpenType, που περιλαμβάνεται στο TeX Live, για να ορίσει μια γραμματοσειρά LaTeX με το όνομα `\arabicfont` που μπορούμε να χρησιμοποιήσουμε για να στοιχειοθετήσουμε λίγα αραβικά. Η γραμμή

```latex
{\arabicfont Μη σύνδεση:\textdir TRT\Uchar"0644\Uchar"200C\Uchar"0627}
```

χρησιμοποιεί έναν χαρακτήρα μη συνδετήρα μηδενικού πλάτους, μέσω `\Uchar"200C`, για να αποτρέψει τη φυσιολογική συμπεριφορά σύνδεσης των δύο αραβικών γραμμάτων ل (lam) και ا (alef). Σημειώστε τη χρήση του `\textdir TRT` για να οριστεί η κατεύθυνση του κειμένου ως από δεξιά προς τα αριστερά:

```latex
\documentclass{article}
\usepackage{fontspec}
\begin{document}
\newfontfamily\arabicfont[Script=Arabic,Renderer=Harfbuzz,SizeFeatures={Size=40}]{Scheherazade}
{\arabicfont Σύνδεση:\textdir TRT\Uchar"0644\Uchar"0627}\par
{\arabicfont Μη σύνδεση:\textdir TRT\Uchar"0644\Uchar"200C\Uchar"0627}
\end{document}
```

[Ανοίξτε αυτό το παράδειγμα LuaLaTeX στο Overleaf](https://www.overleaf.com/docs?engine=lualatex\&snip_name=Zero+width+non-joiner+using+LuaLaTeX\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%7Bfontspec%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cnewfontfamily%5Carabicfont%5BScript%3DArabic%2CRenderer%3DHarfbuzz%2CSizeFeatures%3D%7BSize%3D40%7D%5D%7BScheherazade%7D%0A%7B%5Carabicfont+Joining%3A%5Ctextdir+TRT%5CUchar%220644%5CUchar%220627%7D%5Cpar%0A%7B%5Carabicfont+Non-joining%3A%5Ctextdir+TRT%5CUchar%220644%5CUchar%22200C%5CUchar%220627%7D%0A%5Cend%7Bdocument%7D)

Αυτό το παράδειγμα παράγει το ακόλουθο αποτέλεσμα:

![NonJoiner.png](/files/4cdaa833478da8e137a92b4404ed710e6005b9c5)

## Η έννοια της «σχηματοποίησης κειμένου»

Ας ξεκινήσουμε με ένα οπτικό παράδειγμα χρησιμοποιώντας μια μετάφραση στα ουρντού της λέξης «educational». Το κείμενο της μετάφρασης στα ουρντού μπορεί να πληκτρολογηθεί σε πληκτρολόγιο ή σε συσκευή αφής και θα δημιουργούνταν ως μια απλή γραμμική ακολουθία αραβικών χαρακτήρων Unicode. Ωστόσο, όταν αυτό το κείμενο στοιχειοθετείται ή εμφανίζεται στην οθόνη μιας συσκευής στο [στυλ Nastaliq](https://en.wikipedia.org/wiki/Nastaliq), το αποτέλεσμα είναι μια σύνθετη δισδιάστατη διάταξη γλύφων.

Χρησιμοποιώντας το παράδειγμα του ουρντού, το ακόλουθο γραφικό συγκρίνει τη γραμμική είσοδο του αραβικού Unicode *χαρακτήρια* με την έξοδο στοιχειοθετημένη σε στυλ Nastaliq, αποτελούμενη από μια δισδιάστατη διάταξη *γλύφων* που υπάρχουν στη (δωρεάν) γραμματοσειρά [Awami Nastaliq](https://software.sil.org/awami/download/):

![](/files/bec99c44a8432429cee29b582b545ea33cf60f98)

Η διαδικασία της «μετάφρασης» των χαρακτήρων εισόδου σε ένα σύνολο σωστά τοποθετημένων γλύφων εξόδου ονομάζεται *τη σχηματοποίηση κειμένου*, και αποτελεί ζωτικό συστατικό της επεξεργασίας κειμένου πριν από την εμφάνιση ή τη στοιχειοθεσία του. Το παράδειγμά μας χρησιμοποίησε κείμενο στην ουρντού γλώσσα (αραβική γραφή) επειδή το αποτέλεσμα της σχηματοποίησης είναι σαφώς εμφανές, σε αντίθεση με γλώσσες που χρησιμοποιούν τη λατινική γραφή, όπως τα αγγλικά, όπου η σχηματοποίηση είναι πολύ λιγότερο έντονη—όπως στην παραγωγή απλών συμπλεγμάτων.

Η σχηματοποίηση κειμένου είναι απαραίτητη όταν χρησιμοποιούνται γραφές (συστήματα γραφής) όπως [Αραβικά](https://en.wikipedia.org/wiki/Arabic), [Εβραϊκά](https://en.wikipedia.org/wiki/Hebrew_language), [Ντεβαναγκάρι](https://en.wikipedia.org/wiki/Devanagari) ή [Μαλαγιαλάμ](https://en.wikipedia.org/wiki/Malayalam), μόλις τέσσερα παραδείγματα των λεγόμενων *σύνθετων γραφών*. Για να διασφαλιστεί η σωστή παρουσίαση του κειμένου σε αυτές τις γραφές και στις γλώσσες που τις χρησιμοποιούν, η διαδικασία σχηματοποίησης πρέπει να αντιμετωπίζει προσεκτικά τυχόν κανόνες και αποχρώσεις σχηματοποίησης που υπάρχουν στον συγκεκριμένο συνδυασμό γραφής και γλώσσας. Για παράδειγμα, ορισμένες γλώσσες απαιτούν πολλαπλούς χαρακτήρες εισόδου για τη δημιουργία ενός συγκεκριμένου γλύφου εξόδου, ή μπορεί να υπάρχουν σύνθετες απαιτήσεις για προσεκτική τοποθέτηση διακριτικών σημαδιών, και αναδιατάξεις μεταξύ γλύφων ώστε να διασφαλιστεί ότι οι μεμονωμένοι γλύφοι τοποθετούνται σωστά (σε σχέση μεταξύ τους).

Γενικά, η σχηματοποίηση ενός τμήματος κειμένου απαιτεί αρκετές πληροφορίες:

* Το σύστημα γραφής ή *σύστημα γραφής* στο οποίο είναι γραμμένο το κείμενο.
* Η συγκεκριμένη *γλώσσα* που χρησιμοποιείται. Μεμονωμένες γραφές μπορούν να χρησιμοποιούνται για πολλές γλώσσες, με κάθε συνδυασμό γραφής–γλώσσας να έχει τις δικές του λεπτές αποχρώσεις/ιδιαιτερότητες μορφοποίησης.
* Η γραφή *κατεύθυνση* του κειμένου—όπως από δεξιά προς τα αριστερά ή από αριστερά προς τα δεξιά.
* Ένα *γραμματοσειρά* το οποίο παρέχει τους γλύφους που χρειάζονται για να αναπαραστήσουν το μορφοποιημένο κείμενο και, προαιρετικά, περιέχει επιπλέον «κανόνες μορφοποίησης» που καθοδηγούν τη διαδικασία μορφοποίησης κειμένου.

Οι απαιτήσεις της μορφοποίησης κειμένου, ιδιαίτερα για σύνθετες γραφές και τις συναφείς γλώσσες τους, μπορεί να είναι εξαιρετικά λεπτομερείς και σύνθετες, υποδεικνύοντας την ανάγκη για εξειδικευμένο λογισμικό που μπορεί να εφαρμόσει δυνητικά πολύ σύνθετους «κανόνες» μορφοποίησης κειμένου. Δεν αποτελεί έκπληξη ότι τέτοιο λογισμικό υπάρχει και αναφέρεται ως ένα *μηχανή μορφοποίησης κειμένου*; αυτή που θα συζητήσουμε ονομάζεται [HarfBuzz](https://en.wikipedia.org/wiki/HarfBuzz), του οποίου η τεκμηρίωση αξίζει να διαβαστεί—για παράδειγμα [Γιατί χρειάζομαι μια μηχανή μορφοποίησης;](https://harfbuzz.github.io/why-do-i-need-a-shaping-engine.html).

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

Αυτές οι σύντομες εισαγωγές συνιστώνται ανεπιφύλακτα:

* [Τι είναι η μορφοποίηση κειμένου;](https://harfbuzz.github.io/what-is-harfbuzz.html#what-is-text-shaping)
* [Γιατί χρειάζομαι μια μηχανή μορφοποίησης;](https://harfbuzz.github.io/why-do-i-need-a-shaping-engine.html)

**Τεχνική σημείωση: πολλαπλές τεχνολογίες μορφοποίησης (μοντέλα)**

Η μηχανή μορφοποίησης κειμένου HarfBuzz υποστηρίζει αρκετές «τεχνολογίες μορφοποίησης» που διαφέρουν ως προς τον τρόπο με τον οποίο υλοποιούν τη διαδικασία μορφοποίησης—κάθε υλοποίηση αναφέρεται ως ένας *μορφοποιητής*, συμπεριλαμβανομένης της τεκμηρίωσης του `luaotfload` . Το κύριο επίκεντρο αυτού του άρθρου είναι η μορφοποίηση OpenType, αλλά μια εναλλακτική τεχνολογία, ελεύθερη προς χρήση, είναι η [Graphite](https://scripts.sil.org/cms/scripts/page.php?site_id=projects\&item_id=graphite_aboutOT), που αναπτύχθηκε από την [SIL International](https://www.sil.org/). Ένα άλλο μοντέλο μορφοποίησης που υποστηρίζεται από το HarfBuzz είναι το [Apple Advanced Typography (AAT)](https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6AATIntro.html)—οι γραμματοσειρές που υποστηρίζουν AAT χρησιμοποιούνται γενικά σε τεχνολογικές πλατφόρμες της Apple.

**Παράδειγμα χρήσης του μορφοποιητή Graphite**

Το ακόλουθο παράδειγμα στοιχειοθετεί κάποιο κείμενο στα Ουρντού χρησιμοποιώντας μια γραμματοσειρά με το όνομα [Awami Nastaliq](https://software.sil.org/awami/download/), η οποία υποστηρίζει μορφοποίηση Graphite και είναι διαθέσιμη στο Overleaf. Η Awami Nastaliq δημιουργείται από την [SIL International](https://www.sil.org/), τον οργανισμό που είναι υπεύθυνος για την ανάπτυξη της τεχνολογίας Graphite.

Το ακόλουθο παράδειγμα καταδεικνύει την προηγμένη δυνατότητα μορφοποίησης των γραμματοσειρών βασισμένων στο Graphite—προσέξτε πώς η `luaotfload` δήλωση της γραμματοσειράς επιλέγει μορφοποίηση Graphite χρησιμοποιώντας `shaper=graphite2`.

```latex
\documentclass{article}
\usepackage{luaotfload}
\begin{document}

\font\urdutest={file:AwamiNastaliq-Regular.ttf:mode=harf;shaper=graphite2} at 100bp
% Τεχνολογία
\pardir TRT\textdir TRT \urdutest ٹیکنالوجی

\vskip 75bp

% Εκπαιδευτική
\pardir TRT\textdir TRT \urdutest تعلیمی
\end{document}
```

[Ανοίξτε αυτό το παράδειγμα στο Overleaf.](https://www.overleaf.com/docs?engine=lualatex\&snip_name=Typesetting+Urdu+using+the+Graphite+shaper\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%7Bluaotfload%7D%0A%5Cbegin%7Bdocument%7D%0A%0A%5Cfont%5Curdutest%3D%7Bfile%3AAwamiNastaliq-Regular.ttf%3Amode%3Dharf%3Bshaper%3Dgraphite2%7D+at+100bp%0A%25+Technology%0A%5Cpardir+TRT%5Ctextdir+TRT+%5Curdutest+%D9%B9%DB%8C%DA%A9%D9%86%D8%A7%D9%84%D9%88%D8%AC%DB%8C%0A%0A%5Cvskip+75bp%0A%0A%25+Educational%0A%5Cpardir+TRT%5Ctextdir+TRT+%5Curdutest+%D8%AA%D8%B9%D9%84%DB%8C%D9%85%DB%8C%0A%5Cend%7Bdocument%7D)

Αυτό το παράδειγμα παράγει το ακόλουθο αποτέλεσμα:

![](/files/c7dc295bd77d8c1e284cd184ea04fa513e7ccf51)

#### Emoji και μορφοποίηση κειμένου

Η μορφοποίηση κειμένου παρουσιάστηκε με παραδείγματα από μια γλώσσα με σύνθετη γραφή, τα Ουρντού. Ωστόσο, ίσως προκαλεί έκπληξη το γεγονός ότι η απόδοση των σωστών glyph(s) emoji απαιτεί να εφαρμόζεται μορφοποίηση κειμένου σε Unicode κείμενο που περιέχει ακολουθίες χαρακτήρων emoji—[όπως σημείωσε ο επικεφαλής προγραμματιστής του HarfBuzz](https://github.com/harfbuzz/harfbuzz/issues/2428#issuecomment-639108677):

> ...η μορφοποίηση emoji με το HarfBuzz είναι απολύτως εντός πεδίου και στην πραγματικότητα απαραίτητη για την απόδοση emoji οικογένειας, χρώματος δέρματος κ.λπ.

Θα δούμε παραδείγματα αυτού.

### Κατανομή ευθύνης: μηχανή μορφοποίησης κειμένου + γραμματοσειρές OpenType

Στην πράξη, η μορφοποίηση κειμένου είναι μια «κοινή λειτουργία», ή κατανομή εργασίας, μεταξύ της λογικής και των κανόνων που είναι ενσωματωμένοι στη μηχανή μορφοποίησης κειμένου και των πρόσθετων κανόνων και δεδομένων μορφοποίησης που είναι ενσωματωμένα στις γραμματοσειρές που χρησιμοποιούνται—από εδώ και πέρα καλύπτουμε μορφοποίηση βασισμένη στο OpenType *μόνο*.

Για να πραγματοποιηθεί μορφοποίηση, η μηχανή μορφοποίησης κειμένου συνήθως εφοδιάζεται με κάποιο κείμενο Unicode, μια καθορισμένη γραφή και γλώσσα, ενδεχομένως μια κατεύθυνση γραφής, και, το σημαντικότερο, μια γραμματοσειρά OpenType για χρήση κατά τη διαδικασία μορφοποίησης—η γραμματοσειρά θα παρέχει το αποτέλεσμα: ένα σύνολο γλύφων και δεδομένων τοποθέτησης. Εφόσον ζητηθεί, η μηχανή μορφοποίησης μπορεί να εφαρμόσει πρόσθετους κανόνες ([χαρακτηριστικά OpenType](https://en.wikipedia.org/wiki/List_of_typographic_features#OpenType_typographic_features)) που περιέχονται στη γραμματοσειρά OpenType που χρησιμοποιείται—ποιοι κανόνες θα εφαρμοστούν είναι συνήθως επιλογή του χρήστη από τη λίστα χαρακτηριστικών που υποστηρίζονται από τη γραμματοσειρά.

Το αποτέλεσμα της διαδικασίας μορφοποίησης είναι μια *λίστα γλύφων* που περιέχονται στη γραμματοσειρά OpenType, μαζί με *μεταξύ γλύφων* δεδομένα τοποθέτησης. Αυτά τα δεδομένα τοποθέτησης αφορούν *τη σχετική τοποθέτηση των μορφοποιημένων γλύφων*· δεν αναφέρονται σε απόλυτη τοποθέτηση μέσα στη στοιχειοθετημένη σελίδα ή σε άλλο μέσο/περιεχόμενο, όπως μια ιστοσελίδα, ένα Tweet κ.λπ. Το λογισμικό απόδοσης (μηχανή στοιχειοθεσίας, περιηγητής ιστού κ.λπ.) χρησιμοποιεί τις πληροφορίες τοποθέτησης μεταξύ γλύφων για να διασφαλίσει ότι οι γλύφοι τοποθετούνται σωστά μεταξύ τους αφού συναρμολογηθούν και ενσωματωθούν στο τελικό αποτέλεσμα.

#### Τι είναι μια λίστα γλύφων;

Εσωτερικά, σε κάθε γλύφο μέσα σε μια γραμματοσειρά OpenType εκχωρείται ένα αριθμητικό αναγνωριστικό, μια ακέραια τιμή που ονομάζεται δείκτης γλύφου—επίσης ονομάζεται αναγνωριστικό γλύφου ή GID. Αφού ολοκληρώσει την εργασία μορφοποίησής του, η μηχανή μορφοποίησης κειμένου θα επιστρέψει τα αποτελέσματά της ως μια *λίστα αναγνωριστικών γλύφων* συν *δεδομένα τοποθέτησης* για αυτούς τους γλύφους.

Οι μεμονωμένοι γλύφοι μέσα στις γραμματοσειρές OpenType εκχωρούνται δείκτες (αναγνωριστικά) από τον δημιουργό της γραμματοσειράς, γεγονός που τους καθιστά τιμή πολύ συγκεκριμένη για τη γραμματοσειρά και αυθαίρετη—μπορεί επίσης να διαφέρει μεταξύ εκδόσεων μιας συγκεκριμένης γραμματοσειράς. Δεν πρέπει ποτέ να υποθέτετε ότι η ίδια τιμή GID θα ισχύει για «παρόμοιους» γλύφους σε διαφορετικές γραμματοσειρές· σχεδόν σίγουρα δεν θα ισχύει. Αν έχετε μια λίστα αναγνωριστικών γλύφων που παρέχεται από μια μηχανή μορφοποίησης, μπορείτε να τα χρησιμοποιήσετε μόνο για πρόσβαση σε γλύφους στη γραμματοσειρά από την οποία προέκυψαν.

#### Τι είναι οι γραμματοσειρές OpenType;

Ο ιστός είναι *γεμάτος* με επεξηγήσεις και λεπτομέρειες για τις γραμματοσειρές OpenType, οπότε θα περιοριστούμε σε μια σύντομη περιγραφή. Η [προδιαγραφή OpenType](https://docs.microsoft.com/en-us/typography/opentype/spec/) είναι ένα σύνθετο έγγραφο σχεδιασμένο για προγραμματιστές, αλλά, στην ουσία, ορίζει μια μορφή αρχείου, ή ένα δοχείο, για δεδομένα γραμματοσειράς. Μια γραμματοσειρά OpenType περιέχει δεδομένα που περιγράφουν τα σχήματα των γλύφων, μαζί με πληροφορίες για τις υποστηριζόμενες γραφές και γλώσσες, μεταδεδομένα για τη γραμματοσειρά και διάφορους «πίνακες» που ορίζουν [τυπογραφικά χαρακτηριστικά](https://en.wikipedia.org/wiki/List_of_typographic_features#OpenType_typographic_features) που υποστηρίζονται από τη γραμματοσειρά.

Μια μηχανή μορφοποίησης κειμένου συνήθως μπορεί να ρυθμιστεί ώστε να εφαρμόζει επιλεκτικά τα χαρακτηριστικά μιας γραμματοσειράς κατά τη διαδικασία μορφοποίησης, εφαρμόζοντας συγκεκριμένα τυπογραφικά εφέ («κανόνες») που επιλέγουν το κατάλληλο σύνολο γλύφων που περιέχονται στη γραμματοσειρά. Η επιλεγμένη γραμματοσειρά θα πρέπει να υποστηρίζει, και να παρέχει τους γλύφους για, όσα χαρακτηριστικά ζητηθεί από τη μηχανή μορφοποίησης κειμένου να εφαρμόσει.

#### Κωδικοποιημένοι και μη κωδικοποιημένοι «γλύφοι»

Οι γραμματοσειρές OpenType περιλαμβάνουν έναν πίνακα δεδομένων που ονομάζεται [cmap](https://docs.microsoft.com/en-us/typography/opentype/spec/cmap) (Character to Glyph Index Mapping), ο οποίος αντιστοιχίζει το σύνολο των χαρακτήρων Unicode που υποστηρίζονται από τη γραμματοσειρά στον αντίστοιχο δείκτη γλύφου σε εκείνη τη γραμματοσειρά. Το ακόλουθο βίντεο παρέχει μια σύντομη ματιά στον πίνακα cmap που περιέχεται σε μια γραμματοσειρά με το όνομα `lmmono10-regiular.otf` (περιλαμβάνεται στο TeX Live).

{% embed url="<https://videos.ctfassets.net/nrgyaltdicpt/2537Y9gOUMWgd0t1guqt0X/482c53a9d8112ecae3d622aa7e00eef8/openType_cmap.mp4>" %}

Ωστόσο, οι γραμματοσειρές συνήθως περιέχουν πολλούς γλύφους που δεν αναπαριστούν έναν συγκεκριμένο χαρακτήρα Unicode και δεν περιλαμβάνονται ως μέρος αυτού του πίνακα cmap. Κατά συνέπεια, το σύνολο των γλύφων που υπάρχουν μέσα σε μια γραμματοσειρά OpenType μπορεί να χωριστεί σε δύο βασικά σύνολα:

* κωδικοποιημένοι γλύφοι που αναπαριστούν χαρακτήρες Unicode·
* μη κωδικοποιημένοι γλύφοι που δεν αναπαριστούν χαρακτήρες Unicode.

Οι κωδικοποιημένοι γλύφοι μπορούν να προσπελαστούν με την εισαγωγή του κατάλληλου χαρακτήρα Unicode στο κείμενο—αλλά τι γίνεται με τους μη κωδικοποιημένους γλύφους, πώς χρησιμοποιούνται/προσπελαύνονται; Αυτοί οι γλύφοι συνήθως χρησιμοποιούνται για να παρέχουν το αποτέλεσμα λειτουργιών μορφοποίησης κειμένου, συμπεριλαμβανομένης της εφαρμογής χαρακτηριστικών γραμματοσειράς για την παραγωγή συγκεκριμένων οπτικών/τυπογραφικών εφέ.

### OpenType γραμματοσειρών χρώματος

Αναμένεται ότι οι χαρακτήρες emoji θα εμφανίζονται/αποδίδονται σε πλήρες χρώμα—τα ασπρόμαυρα emoji δεν παρέχουν ακριβώς την «πλήρη εμπειρία emoji». Ωστόσο, την εποχή της αρχικής κωδικοποίησης των emoji από το Unicode, η [προδιαγραφή γραμματοσειρών OpenType](https://docs.microsoft.com/en-us/typography/opentype/spec/) δεν είχε καμία κατάλληλη πρόβλεψη για την ενσωμάτωση *colorful*-δεδομένων γλύφου μέσα σε γραμματοσειρές OpenType. Αυτό το «κενό» στο OpenType ώθησε κορυφαίους προμηθευτές τεχνολογίας/πλατφορμών να αναζητήσουν λύσεις, και η επακόλουθη «κούρσα» οδήγησε σε [διάφορες προτάσεις για την επέκταση του OpenType](https://www.fontlab.com/news/color-font-format-proposals/) ώστε να υποστηρίζει έγχρωμες γραμματοσειρές OpenType—όχι μόνο για την εμφάνιση έγχρωμων χαρακτήρων emoji (γλύφων) αλλά για την απόδοση οποιουδήποτε γλύφου σε χρώμα.

#### Τέσσερις εκδοχές έγχρωμης γραμματοσειράς OpenType

[Η Adobe, η Microsoft, η Google και η Apple υπέβαλαν η καθεμία προτάσεις](https://www.fontlab.com/news/color-font-format-proposals/) για την επέκταση του OpenType ώστε να υποστηρίζει πλήρως έγχρωμες γραμματοσειρές OpenType και, τελικά, υιοθετήθηκαν και συμπεριλήφθηκαν στην επίσημη προδιαγραφή OpenType τέσσερις προτάσεις. Για λόγους ευκολίας, μπορούμε χονδρικά να ομαδοποιήσουμε αυτές τις τέσσερις παραλλαγές σε βασισμένες σε διανύσματα και βασισμένες σε ράστερ—αλλά, όπως φαίνεται σε αυτό το [αποθετήριο GitHub](https://github.com/simoncozens/test-fonts), η προδιαγραφή OpenType είναι αρκετά ευέλικτη ώστε να υποστηρίζει αρχεία έγχρωμων γραμματοσειρών OpenType που συνδυάζουν αυτές τις τέσσερις βασικές τεχνολογίες.

* **Διανυσματικές γραμματοσειρές OpenType:**
* **Η Microsoft**: τα σχήματα των γλύφων περιγράφονται χρησιμοποιώντας μια μορφή πολυεπίπεδων διανυσμάτων χρώματος ([COLR](https://docs.microsoft.com/en-us/typography/opentype/spec/colr) και [CPAL](https://docs.microsoft.com/en-us/typography/opentype/spec/cpal) πίνακες).
* [**Η Adobe και η Mozilla**](https://www.w3.org/2013/10/SVG_in_OpenType/) ([πίνακας SVG](https://docs.microsoft.com/en-us/typography/opentype/spec/svg)): τα σχήματα των γλύφων σχεδιάζονται χρησιμοποιώντας SVG, το οποίο υποστηρίζει γλύφους κατασκευασμένους από διανύσματα *και ραστερικές εικόνες*. Δείτε επίσης [τον οδηγό χρήσης της Adobe για γραμματοσειρές SVG](https://helpx.adobe.com/fonts/user-guide.html/fonts/using/ot-svg-color-fonts.ug.html).
* **Ραστερικές γραμματοσειρές OpenType:**
* **Η Google**: οι γλύφοι αναπαρίστανται από έγχρωμες εικόνες PNG ενσωματωμένες στη γραμματοσειρά ([CBDT](https://docs.microsoft.com/en-us/typography/opentype/spec/cbdt) και [CBLC](https://docs.microsoft.com/en-us/typography/opentype/spec/cblc) πίνακες).
* **Η Apple**: οι γλύφοι επίσης αναπαρίστανται από έγχρωμες εικόνες ενσωματωμένες στη γραμματοσειρά. Εκτός από PNG, ο μηχανισμός της Apple ([πίνακας sbix](https://docs.microsoft.com/en-us/typography/opentype/spec/colr)) υποστηρίζει επίσης JPEG και TIFF.

Κατά συνέπεια, τα λειτουργικά συστήματα και το λογισμικό εφαρμογών που υποστηρίζουν έγχρωμες γραμματοσειρές OpenType πρέπει να αντιμετωπίσουν το σημερινό τοπίο μικτών τεχνολογιών. Επιπλέον, θα πρέπει να γνωρίζετε ότι οι μεμονωμένες έγχρωμες γραμματοσειρές OpenType—και *εκδόσεις* της ίδιας γραμματοσειράς—θα:

* έχουν διαφορετική κάλυψη του πλήρους συνόλου των [χαρακτήρων emoji Unicode](https://unicode.org/emoji/charts/emoji-list.html)—δηλαδή, για πόσους χαρακτήρες emoji παρέχει η γραμματοσειρά γλύφους·
* χρησιμοποιούν διαφορετικά σχέδια γλύφων για την αναπαράσταση μεμονωμένων χαρακτήρων emoji·
* διαφέρουν στα χαρακτηριστικά που παρέχουν για να υποστηρίξουν πιο προχωρημένες χρήσεις των προτύπων Unicode, όπως [τροποποιητές emoji](https://unicode.org/reports/tr51/#Emoji_Modifiers_Table), και άλλες δυνατότητες επεξεργασίας κειμένου emoji που περιγράφονται στο [Unicode Technical Standard #51: Unicode Emoji](https://unicode.org/reports/tr51/).

#### Ο ντόρος γύρω από το HarfBuzz

Έχουμε αναφερθεί στην ανάγκη για ένα *μηχανή μορφοποίησης κειμένου*: λογισμικό που παίρνει κάποιο εισερχόμενο κείμενο Unicode, γραμμένο χρησιμοποιώντας έναν συγκεκριμένο συνδυασμό γραφής και γλώσσας, και, χρησιμοποιώντας μια καθορισμένη γραμματοσειρά, μορφοποιεί αυτό το κείμενο σε μια ακολουθία γλύφων, μαζί με δεδομένα τοποθέτησης, τα οποία μπορούν να χρησιμοποιηθούν για τη στοιχειοθεσία του αρχικού εισερχόμενου κειμένου.

[HarfBuzz](https://harfbuzz.github.io/) είναι μία τέτοια μηχανή μορφοποίησης κειμένου: είναι [μια βιβλιοθήκη ανοικτού κώδικα](https://github.com/harfbuzz/harfbuzz) και το αποτέλεσμα περισσότερων από δέκα ετών έρευνας και ανάπτυξης—και εξακολουθεί να αναπτύσσεται ενεργά και να διατίθεται ως μέρος πολλών προϊόντων λογισμικού. Το ίδιο το HarfBuzz δεν πραγματοποιεί «στοιχειοθεσία» αλλά παρέχει «υπηρεσίες μορφοποίησης κειμένου» σε λογισμικό που επιλέγει να το ενσωματώσει, συμπεριλαμβανομένων των XeTeX, LuaHBTeX, [Adobe PhotoShop και Adobe InDesign](https://en.wikipedia.org/wiki/HarfBuzz).

Ενσωματώνοντας το HarfBuzz, οι μηχανές TeX μπορούν να αξιοποιήσουν τις προηγμένες δυνατότητες μορφοποίησης κειμένου του για να παρέχουν πολύ εξελιγμένη πολύγλωσση στοιχειοθεσία, ιδιαίτερα για σύνθετες γραφές όπως τα αραβικά, τα εβραϊκά, το Devanagari και πολλές άλλες. Σημειώστε επίσης ότι το HarfBuzz χρησιμοποιείται για την επεξεργασία και μορφοποίηση χαρακτήρων κειμένου emoji Unicode, κάτι που θα εξετάσουμε λεπτομερέστερα.

Το ακόλουθο γραφικό συνοψίζει τον ρόλο που παίζει το HarfBuzz όταν ενσωματώνεται με λογισμικό, όπως το XeTeX ή το LuaHBTeX, κατά τη στοιχειοθεσία κειμένου σε μια σύνθετη γραφή, όπως τα αραβικά:

![Επισκόπηση της μορφοποίησης αραβικού κειμένου με το HarfBuzz](/files/0abf63056104c82ee9d81a188b3a8ecf1ea43d83)

**Εξερευνώντας το HarfBuzz**

Όποιος ενδιαφέρεται να μάθει περισσότερα για το HarfBuzz και τις υπηρεσίες μορφοποίησης OpenType που παρέχει στα XeTeX και LuaHBTeX μπορεί να [κατεβάσει μια δυαδική διανομή του HarfBuzz](https://github.com/harfbuzz/harfbuzz/releases) η οποία περιέχει τη βιβλιοθήκη HarfBuzz (για προγραμματιστές) και βοηθητικά προγράμματα γραμμής εντολών `hb-view` και `hb-shape`.

**Παράδειγμα: πώς να χρησιμοποιήσετε το hb-view**

Δημιουργήστε ένα νέο αρχείο στον αγαπημένο σας επεξεργαστή κειμένου με υποστήριξη UTF-8 και αντιγράψτε/επικολλήστε τους ακόλουθους έξι χαρακτήρες emoji 👋👋🏻👋🏼👋🏽👋🏾👋🏿 σε εκείνο το αρχείο κειμένου, στη συνέχεια αποθηκεύστε το σε μορφή UTF-8 σε ένα αρχείο με όνομα, ας πούμε, `emoji.txt`.

Σημειώστε ότι ο επεξεργαστής κειμένου σας μπορεί να εμφανίζει (ως εναλλακτική) ασπρόμαυρες εκδοχές των emoji επειδή δεν είναι σε θέση (ή δεν έχει προγραμματιστεί) να αποδίδει έγχρωμους γλύφους. Αφού αποθηκευτούν αυτά τα 6 emoji, το αρχείο `emoji.txt` θα πρέπει να περιέχει δεδομένα UTF-8 για την ακόλουθη ακολουθία χαρακτήρων emoji Unicode—έχουμε χωρίσει τους τροποποιητές emoji με κόμματα μόνο για *ευκολία ανάγνωσης μόνο*:

* `1F44B` για να παραχθεί 👋
* `1F44B`, `1F3FB` για να παραχθεί 👋🏻
* `1F44B`, `1F3FC` για να παραχθεί 👋🏼
* `1F44B`, `1F3FD` για να παραχθεί 👋🏽
* `1F44B`, `1F3FE` για να παραχθεί 👋🏾
* `1F44B`, `1F3FF` για να παραχθεί 👋🏿

Θα πρέπει να υπάρχουν συνολικά **11** χαρακτήρες Unicode, καθένας από τους οποίους παράγει 4 byte δεδομένων UTF-8, οπότε το τελικό `emoji.txt` αρχείο θα πρέπει να έχει μήκος 44 byte, εξαιρουμένων τυχόν σημειωμάτων τέλους γραμμής που χρησιμοποιούνται στο τέλος της γραμμής που περιέχει τα emoji.

Η `hb-view` το βοηθητικό πρόγραμμα μπορεί να χρησιμοποιήσει το αρχείο `emoji.txt`, μαζί με μια κατάλληλη έγχρωμη γραμματοσειρά OpenType της επιλογής σας, όπως `NotoColorEmoji.ttf`, για να δημιουργήσει ένα αρχείο SVG της μορφοποιημένης εξόδου του HarfBuzz. Το ακόλουθο παράδειγμα γραμμής εντολών, το οποίο πρέπει να **πληκτρολογηθεί σε μία γραμμή** στο τερματικό σας, θα δημιουργήσει το αρχείο SVG `emoji.svg`:

```latex
hb-view --font-size=20 --output-file="emoji.svg"
--output-format=svg --text-file=emoji.txt
--font-file=NotoColorEmoji.ttf
```

Μετά από επιτυχή εκτέλεση, το αρχείο `emoji.svg`, που δημιουργήθηκε από το `hb-view`, μπορεί να ανοίξει από το Inkscape και θα πρέπει να μοιάζει κάπως έτσι:

![Hbvieemoji.png](/files/6cb78452b8c6874356f767a0f5f75c6659fa7598)

`hb-view` μπορεί να χρησιμοποιηθεί για την εξερεύνηση της μορφοποίησης HarfBuzz για οποιοδήποτε κατάλληλο αρχείο κειμένου Unicode και γραμματοσειρά OpenType—σίγουρα δεν περιορίζεται στη χρήση με emoji! Πληκτρολογήστε

```latex
hb-view --help-all
```

για να δείτε τον πλούτο των επιλογών γραμμής εντολών για αυτό το ισχυρό και χρήσιμο βοηθητικό πρόγραμμα. Καλή μορφοποίηση!

## Μορφοποίηση κειμένου και μηχανές TeX

Εδώ, θα εξετάσουμε τις δυνατότητες μορφοποίησης κειμένου των XeTeX και της οικογένειας LuaTeX των μηχανών TeX.

### XeTeX

Το XeTeX αναπτύχθηκε στις αρχές της δεκαετίας του 2000 και πρωτοστάτησε σε αρκετές καινοτομίες στη στοιχειοθεσία βασισμένη στο TeX, κυρίως *ενσωματωμένη* υποστήριξη για:

* ανάγνωση κειμένου Unicode σε μορφή UTF-8·
* χρήση γραμματοσειρών OpenType·
* μορφοποίηση κειμένου για πολύγλωσση στοιχειοθεσία·
* στοιχειοθεσία μαθηματικών βασισμένη στο OpenType.

Η ικανότητα του XeTeX να στοιχειοθετεί εύκολα και άνετα γλώσσες με σύνθετες γραφές οφείλεται στις ενσωματωμένες δυνατότητές του για μορφοποίηση κειμένου—αρχικά βασισμένες στο, πλέον αποσυρμένο, [ICU LayoutEngine](http://userguide.icu-project.org/layoutengine). Χάρη στη δουλειά του Khaled Hosny, το XeTeX πέρασε στη χρήση του HarfBuzz για μορφοποίηση κειμένου, όπως σημειώνεται σε ανακοίνωση από τον [Μάρτιο του 2013](https://tug.org/pipermail/xetex/2013-March/024118.html). Για όποιον θέλει να στοιχειοθετήσει πολύγλωσσο κείμενο, το XeTeX συνήθως αναφέρεται ως η μηχανή TeX της επιλογής—αλλά τώρα υπάρχει μια άλλη επιλογή, το LuaHBTeX, την οποία θα εξερευνήσουμε.

### LuaTeX και LuaHBTeX

Η ανάπτυξη του LuaTeX ξεκίνησε γύρω στο 2005 αλλά ακολούθησε μια φιλοσοφία σχεδίασης αρκετά διαφορετική από το XeTeX, το οποίο ενσωμάτωνε νέες δυνατότητες *απευθείας στο* λογισμικό XeTeX. Σε αντίθεση με το XeTeX, οι προγραμματιστές του LuaTeX επέλεξαν να «...παρέχουν ένα ελάχιστο σύνολο εργαλείων και καμία λύση.» (βλ. [Reference Manual for LuaTeX](https://www.pragma-ade.com/general/manuals/luatex.pdf)). Αντί να παρέχει μια σουίτα πρόσθετων δυνατοτήτων *ενσωματωμένων στο* μηχανές βασισμένες στο LuaTeX, οι εσωτερικοί μηχανισμοί των μηχανών LuaTeX ανοίγονται ώστε οι προγραμματιστές και οι έμπειροι χρήστες να μπορούν να αξιοποιήσουν την ενσωματωμένη γλώσσα σεναρίων Lua για να δημιουργήσουν τις δικές τους λύσεις.

Για παράδειγμα, σε αντίθεση με το XeTeX, η μηχανή LuaTeX δεν μπορεί να *άμεσα* χρησιμοποιήσει γραμματοσειρές OpenType· αντίθετα, οι γραμματοσειρές OpenType πρέπει να φορτωθούν και να «προετοιμαστούν για χρήση» μέσω συναρτήσεων φόρτωσης γραμματοσειρών γραμμένων σε κώδικα Lua. Αυτές οι συναρτήσεις φόρτωσης γραμματοσειρών αναφέρονται ως *callback* συναρτήσεις: κώδικας Lua που το LuaTeX θα καλέσει («εκτελέσει») όταν ζητηθεί η φόρτωση μιας γραμματοσειράς.

Επιπλέον, η μηχανή LuaTeX δεν παρέχει καμία *ενσωματωμένη* δυνατότητα μορφοποίησης κειμένου—και αυτές επίσης πρέπει να παρέχονται από εξωτερικό κώδικα, τον οποίο η μηχανή LuaTeX μπορεί να καλέσει για να της παρέχει υπηρεσίες μορφοποίησης κειμένου. Και εδώ αυτό έρχεται σε αντίθεση με τη μηχανή XeTeX, η οποία ενσωμάτωσε δυνατότητες μορφοποίησης κειμένου στον βασικό κορμό του λογισμικού.

#### luaotfload: απαραίτητο για τη χρήση γραμματοσειρών OpenType στο LuaTeX/LuaHBTeX

Ο μηχανισμός callback του LuaTeX για τη φόρτωση γραμματοσειρών παρέχει μεγάλο βαθμό ευελιξίας, έστω και με το «κόστος» πρόσθετου προγραμματισμού. Ευτυχώς για τους χρήστες του LuaLaTeX, η κοινότητα TeX έχει αναπτύξει ένα πακέτο με το όνομα `luaotfload`luaotfload [της ετήσιας έκδοσης του TeX Live](https://www.tug.org/texlive/) και, φυσικά, είναι διαθέσιμο στους χρήστες του Overleaf.

`luaotfload` είναι [διαθέσιμο στο CTAN](https://ctan.org/pkg/luaotfload?lang=en) και έχει ένα [αποθετήριο ανάπτυξης στο GitHub](https://github.com/latex3/luaotfload) όπου μπορείτε να παρακολουθείτε τις τελευταίες εξελίξεις και [νέες εκδόσεις](https://github.com/latex3/luaotfload/releases).

`luaotfload` μπορούν να φορτωθούν απευθείας στο προοίμιο ενός εγγράφου LaTeX μέσω του

```latex
\usepackage{luaotfload}
```

Σημειώστε ότι `luaotfload` είναι το όνομα ενός LaTeX *πακέτο*, δηλαδή έχει το όνομα αρχείου `luaotfload.sty`. Αν θέλατε να χρησιμοποιήσετε το `luaotfload` με απλό TeX, μπορείτε να το κάνετε προσθέτοντας τη γραμμή

```latex
\input luaotfload.sty
```

στο απλό έγγραφο TeX σας.

Συνήθως, οι χρήστες του LuaLaTeX—δηλαδή εκείνοι που στοιχειοθετούν LaTeX χρησιμοποιώντας LuaTeX/LuaHBTeX—δεν χρειάζεται να ασχοληθούν άμεσα με το `luaotfload` επειδή η [`fontspec` πακέτο](https://ctan.org/pkg/fontspec) θα φορτώσει το `luaotfload` πακέτο για εσάς, φροντίζοντας για πολλές λεπτομέρειες χαμηλού επιπέδου μέσω εντολών επιπέδου χρήστη που παρέχονται από το `fontspec` πακέτο.

### LuaHBTeX: νέες επιλογές για μορφοποίηση κειμένου

`luaotfload` είναι μια ώριμη και ισχυρή βιβλιοθήκη Lua που παρέχει τον χειρισμό γραμματοσειρών OpenType από το LuaTeX—μαζί με την παροχή υπηρεσιών μορφοποίησης κειμένου για μια σειρά γλωσσών και γραφών. Αρχικά, οι συναρτήσεις μορφοποίησης κειμένου του `luaotfload` υλοποιούνταν σε καθαρό κώδικα Lua, αλλά η έκδοση του TeX Live 2020 έφερε μια ακόμη κύρια επιλογή για μορφοποίηση κειμένου—μια νέα μηχανή βασισμένη στο LuaTeX που ονομάζεται LuaHBTeX.

Το «HB» στο LuaHBTeX σημαίνει HarfBuzz—ουσιαστικά, το LuaHBTeX είναι η αρχική μηχανή LuaTeX *συν* με μια ενσωματωμένη μηχανή μορφοποίησης κειμένου HarfBuzz. Σε συμφωνία με τη φιλοσοφία σχεδίασης του LuaTeX, η διαθεσιμότητα του HarfBuzz δεν *αυτόματα* εξασφαλίζει ότι το κείμενο θα μορφοποιηθεί από το LuaHBTeX: το HarfBuzz είναι ένα ακόμη εργαλείο που μπορεί να χρησιμοποιηθεί για τη δημιουργία λύσεων μορφοποίησης κειμένου.

Η ενσωμάτωση του HarfBuzz στο LuaHBTeX είναι [προγραμματίσιμη μέσω κώδικα Lua](#introduction-to-the-luahbtex-harfbuzz-api), κάτι που επέτρεψε `luaotfload`στους προγραμματιστές του luaotfload να προσθέσουν λύσεις μορφοποίησης κειμένου βασισμένες στο HarfBuzz. Κατά συνέπεια, [ξεκινώντας με την έκδοση 3.1, που κυκλοφόρησε στις 5 Νοεμβρίου 2019](https://github.com/latex3/luaotfload/releases/tag/v3.1), `luaotfload` ενισχύθηκε ώστε να αξιοποιεί το HarfBuzz—κάνοντας τις δυνατότητες μορφοποίησης κειμένου του HarfBuzz εύκολα προσβάσιμες για τον απλό χρήστη.

Οι αναγνώστες που ενδιαφέρονται για τις τεχνικές λεπτομέρειες της ενσωμάτωσης του HarfBuzz με το LuaTeX μπορούν να διαβάσουν αυτήν τη [εργασία του Khaled Hosny](https://www.tug.org/TUGboat/tb40-1/tb124hosny-harfbuzz.pdf).

### luaotfload: δύο επιλογές για μορφοποίηση κειμένου (πότε να χρησιμοποιήσετε το HarfBuzz?)

Οι χρήστες του LuaLaTeX έχουν πλέον δύο επιλογές για μορφοποίηση κειμένου:

* `luaotfload`την αρχική (βασισμένη σε κόμβους) υλοποίηση μορφοποίησης κειμένου του, γραμμένη εξ ολοκλήρου σε Lua·
* `luaotfload`τη βασισμένη στο HarfBuzz μορφοποίησή του—προσπελάσιμη μέσω κώδικα Lua που καλεί τις συναρτήσεις μορφοποίησης κειμένου του HarfBuzz.

`luaotfload` παρέχει πρόσβαση σε αυτά τα δύο συστήματα μορφοποίησης μέσω της παραμέτρου «`mode`»—αν και οι περισσότεροι χρήστες θα χρησιμοποιήσουν την ισοδύναμη επιλογή `fontspec` “`Renderer`» αντί να χρησιμοποιήσουν απευθείας συναρτήσεις χαμηλότερου επιπέδου του `luaotfload`.

Καθεμία από τις `luaotfload`λύσεις μορφοποίησης κειμένου του έχει τα δυνατά της σημεία και τις (τρέχουσες) αδυναμίες της, αλλά ποια πρέπει να χρησιμοποιήσετε και πότε; Ακολουθούν ορισμένα σημεία που πρέπει να ληφθούν υπόψη:

* `luaotfload`Η εγγενής επεξεργασία βασισμένη σε κόμβους του μπορεί να είναι απαιτητική σε μνήμη, ιδιαίτερα για μεγάλες γραμματοσειρές OpenType CJK. Η χρήση του HarfBuzz για μορφοποίηση κειμένου CJK μπορεί να επιφέρει βελτιώσεις στην ταχύτητα και μειώσεις στη χρήση μνήμης.
* Χρησιμοποιήστε το HarfBuzz για σύνθετες γραφές επειδή «...βελτιώνει σημαντικά την απόδοση των ινδικών και αραβικών γραφών και συνιστάται ιδιαίτερα για τέτοιες γραφές.» (βλ. `luaotfload` εγχειρίδιο).
* Η ενσωμάτωση του HarfBuzz στο `luaotfload` είναι ακόμα σχετικά νέα και βρίσκεται υπό περαιτέρω ανάπτυξη. Τη στιγμή της συγγραφής (Ιούλιος 2021), συνιστάται να χρησιμοποιείτε την ενσωματωμένη μορφοποίηση του luaotfload (ορίζοντας `mode=node`) για τις κύριες γραμματοσειρές του εγγράφου σας, ιδιαίτερα αν το έγγραφό σας χρησιμοποιεί τη λατινική γραφή. Δείτε αυτό το [issue στο GitHub](https://github.com/latex3/luaotfload/issues/175#issue-801120377), το οποίο συνοψίζει τα ζητήματα και τις συζητήσεις. Αν θέλετε να πειραματιστείτε, μπορείτε να χρησιμοποιήσετε το `luaotfload` για να φορτώσετε ένα αρχείο γραμματοσειράς και να δημιουργήσετε δύο γραμματοσειρές LaTeX: μία που χρησιμοποιεί μορφοποίηση βασισμένη στο HarfBuzz και η άλλη που χρησιμοποιεί μορφοποίηση βασισμένη στη Lua. Το Overleaf δημιούργησε ένα [παράδειγμα έργου](#sample-project-arabic-shaping), το οποίο το αποδεικνύει.
* Μην χρησιμοποιείτε το HarfBuzz για τον χειρισμό μαθηματικών γραμματοσειρών. Όπως συζητήθηκε από προγραμματιστές στο tex.stackexchange, το HarfBuzz [δεν έχει σχεδιαστεί για να χειρίζεται γραμματοσειρές για μαθηματική στοιχειοθεσία](https://tex.stackexchange.com/questions/544881/does-luahbtex-with-harfbuzz-renderer-completely-supports-math-formating) οπότε μην το χρησιμοποιείτε για αυτόν τον σκοπό.

**Παράδειγμα έργου: μορφοποίηση αραβικών**

Εδώ είναι ένα έργο του Overleaf που χρησιμοποιεί αρκετές υψηλής ποιότητας αραβικές γραμματοσειρές για να συγκρίνει `luaotfload`τις βασισμένες σε κόμβους υπηρεσίες μορφοποίησης κειμένου του`mode=node`() με εκείνες του HarfBuzz (`mode=harf`):

* <https://www.overleaf.com/latex/examples/complex-script-shaping-using-luaotfload-and-harfbuzz/gfssprnhfddn>

Αυτό το έργο περιλαμβάνει έξοδο που φαίνεται στην ακόλουθη εικόνα:

![Στοιχειοθεσία αραβικών](/files/ec4d48f32a657ea8407859fc0dc90fcb45d14aab)

### Επιλογή του «Renderer» στο fontspec

Όπως σημειώνεται στο [τεκμηρίωση](https://mirror.ox.ac.uk/sites/ctan.org/macros/unicodetex/latex/fontspec/fontspec.pdf), `fontspec` «...επιτρέπει στους χρήστες είτε του XeTeX είτε του LuaTeX να φορτώνουν γραμματοσειρές OpenType σε ένα έγγραφο LaTeX». Αν χρησιμοποιείτε τις μηχανές LuaTeX ή LuaHBTeX, `fontspec` θα φορτώσει το `luaotfload` βιβλιοθήκη για εσάς και, επιπλέον, παρέχει μια σειρά από βολικές εντολές επιπέδου χρήστη που μειώνουν την ανάγκη να ασχοληθείτε με τις `luaotfload`λειτουργίες χαμηλού επιπέδου του.

Άρα πώς επιλέγετε μεταξύ της μορφοποίησης του HarfBuzz ή της ενσωματωμένης μορφοποίησης που παρέχει το `luaotfload`; Η απάντηση περιέχεται στο εξαιρετικό [`fontspec` τεκμηρίωση](https://mirror.ox.ac.uk/sites/ctan.org/macros/unicodetex/latex/fontspec/fontspec.pdf), συγκεκριμένα στο Μέρος VI: χαρακτηριστικά γραμματοσειράς μόνο για LuaTeX. `fontspec` παρέχει μια ρύθμιση με το όνομα `Renderer` η οποία μπορεί να οριστεί όταν η γραμματοσειρά ορίζεται μέσω του `fontspec`. `Renderer` ελέγχει την επεξεργασία χαμηλού επιπέδου της γραμματοσειράς. Οι δύο επιλογές που μας ενδιαφέρουν είναι

* `Renderer = Node`: η προεπιλεγμένη «λειτουργία» για τη στοιχειοθεσία γραμματοσειρών OpenType—αυτή χρησιμοποιεί `luaotfload`τις συναρτήσεις μορφοποίησης κειμένου του, υλοποιημένες εξ ολοκλήρου σε Lua.
* `Renderer = Harfbuzz`: αυτή η «λειτουργία» ορίζει/φορτώνει τη γραμματοσειρά για χρήση με τη μηχανή μορφοποίησης κειμένου HarfBuzz. `luaotfload` χρησιμοποιεί το API του LuaHBTeX για να καλέσει συναρτήσεις στο HarfBuzz.

Για περισσότερες πληροφορίες δείτε το [`fontspec` τεκμηρίωση](https://mirror.ox.ac.uk/sites/ctan.org/macros/unicodetex/latex/fontspec/fontspec.pdf).

## Μηχανές TeX, HarfBuzz και έγχρωμα emoji

Αν και τόσο το XeTeX όσο και το LuaHBTeX ενσωματώνουν το HarfBuzz, παρέχουν διαφορετικά επίπεδα υποστήριξης για ορισμένες από τις πιο προχωρημένες δυνατότητες του HarfBuzz—ιδίως τη φόρτωση και χρήση έγχρωμων γραμματοσειρών OpenType.

### XeTeX και έγχρωμες γραμματοσειρές OpenType

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

#### XeTeX και ραστερικές έγχρωμες γραμματοσειρές OpenType

Ο XeTeX δεν μπορεί να φορτώσει γραμματοσειρές OpenType έγχρωμες βασισμένες σε raster—όπως της Google [Noto Color Emoji](https://www.google.com/get/noto/help/emoji/) που περιλαμβάνεται στο TeX Live 2020. Για παράδειγμα, αν προσπαθήσετε να φορτώσετε το Noto Color Emoji (NotoColorEmoji.ttf), το XeLaTeX θα αποτύχει με ένα δυνητικά παραπλανητικό σφάλμα που ισχυρίζεται ότι το Noto Color Emoji «δεν μπορεί να βρεθεί». Ο ακόλουθος κώδικας LaTeX, στοιχειοθετημένος με το XeLaTeX, *δεν λειτουργεί*:

```latex
\documentclass{article}
\usepackage{fontspec}
\begin{document}
\newfontfamily\emojifont{NotoColorEmoji.ttf}
\newcommand{\smiley}{{\emojifont\char"1F600}}
\smiley
\end{document}
```

[Ανοίξτε αυτόν τον κώδικα XeLaTeX στο Overleaf (λειτουργεί ***δεν*** ).](https://www.overleaf.com/docs?engine=xelatex\&snip_name=XeTeX+failure\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%7Bfontspec%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cnewfontfamily%5Cemojifont%7BNotoColorEmoji.ttf%7D%0A%5Cnewcommand%7B%5Csmiley%7D%7B%7B%5Cemojifont%5Cchar%221F600%7D%7D%0A%5Csmiley%0A%5Cend%7Bdocument%7D)

Αποτυγχάνει με το σφάλμα:

```
! Package fontspec Error: The font "NotoColorEmoji" cannot be found.
```

Παρομοίως, ένα απλό παράδειγμα Plain TeX που επεξεργάζεται το XeTeX επίσης αποτυγχάνει

```latex
\font\emojifont="[NotoColorEmoji.ttf]" at 12pt
\emojifont \char"1F600
\bye
```

[Ανοίξτε αυτό το παράδειγμα Plain TeX (XeTeX) στο Overleaf (λειτουργεί ***δεν*** ).](https://www.overleaf.com/docs?engine=latex_dvipdf\&snip_name\[]=main.tex\&snip\[]=%25%5Ctitle%7Bdummy+title%7D%0A%5Cfont%5Cemojifont%3D%22%5BNotoColorEmoji.ttf%5D%22+at+12pt%0A%5Cemojifont+%5Cchar%221F600%0A%5Cbye\&snip_name\[]=readme\&snip\[]=This+project+uses+a+latexmkrc+file+to+run+xetex+not+xelatex\&snip_name\[]=latexmkrc\&snip\[]=%24latex+%3D+%27xetex%25O+%25S%27%3B+%23+to+use+the+xetex+engine\&main_document=main.tex)

Το παράδειγμα Plain TeX αναφέρει ένα παρόμοιο, αλλά διαφορετικό, μήνυμα σφάλματος:

```
! Font \emojifont=[NotoColorEmoji.ttf] at 12.0pt not loadable: Metric (TFM) fil
e or installed font not found.
l.1 \font\emojifont="[NotoColorEmoji.ttf]" at 12pt

Δεν μπόρεσα να διαβάσω τα δεδομένα μεγέθους για αυτή τη γραμματοσειρά,
οπότε θα αγνοήσω την προδιαγραφή της γραμματοσειράς.
[Οι μάγοι μπορούν να διορθώσουν αρχεία TFM χρησιμοποιώντας TFtoPL/PLtoTF.]
Ίσως δοκιμάσετε να εισαγάγετε μια διαφορετική προδιαγραφή γραμματοσειράς·
π.χ., πληκτρολογήστε `I\font<same font id>=<substitute font name>'.
```

**Παράδειγμα Plain LuaHBTeX**

Για σύγκριση, ιδού ένα ελάχιστο παράδειγμα Plain TeX μεταγλωττισμένο με LuaHBTeX

```latex
\input luaotfload.sty
\font\emojifont=NotoColorEmoji.ttf:mode=harf at 12pt
\emojifont \Uchar"1F600
\bye
```

[Ανοίξτε αυτό το παράδειγμα Plain TeX (LuaHBTeX) στο Overleaf (μεταγλωττίζεται επιτυχώς).](https://www.overleaf.com/docs?engine=latex_dvipdf\&snip_name\[]=main.tex\&snip\[]=%25%5Ctitle%7BPlain+TeX+with+LuaHBTeX%7D%0A%5Cinput+luaotfload.sty%0A%5Cfont%5Cemojifont%3DNotoColorEmoji.ttf%3Amode%3Dharf+at+12pt%0A%5Cemojifont+%5CUchar%221F600%0A%5Cbye\&snip_name\[]=readme\&snip\[]=This+project+uses+a+latexmkrc+file+to+run+luahbtex+not+lualatex\&snip_name\[]=latexmkrc\&snip\[]=%24latex+%3D+%27luahbtex+%25O+%25S%27%3B+%23+to+use+the+luahbtex+engine\&main_document=main.tex)

#### Η πραγματική αιτία της αποτυχίας του XeTeX

Τα μηνύματα σφάλματος που παρέχει το XeTeX συσκοτίζουν εν μέρει την πραγματική αιτία του προβλήματος: οι έγχρωμες γραμματοσειρές OpenType, ιδίως οι παραλλαγές βασισμένες σε raster, *όχι* υποστηρίζονται από το XeTeX. Στην πραγματικότητα, το XeTeX (Kpathsea) μπορεί να *βρει* τη γραμματοσειρά Noto Color Emoji, αλλά το XeTeX δεν μπορεί να *φορτώσει* πλήρως αυτή τη γραμματοσειρά και δεν είναι σε θέση να αρχικοποιήσει τους εσωτερικούς πίνακες δεδομένων γραμματοσειράς που απαιτούνται για να χρησιμοποιηθεί η γραμματοσειρά αυτή για στοιχειοθεσία. Εσωτερικά, το XeTeX *ξεκινά* τη διαδικασία φόρτωσης της γραμματοσειράς και τη δοκιμάζει ως προς την «κλιμακωσιμότητα» (χρησιμοποιώντας τον ορισμό της FreeType για την «κλιμακωσιμότητα»), αλλά αυτή η δοκιμή αποτυγχάνει, και το XeTeX εμφανίζει ένα τυπικό, ενδεχομένως παραπλανητικό, μήνυμα σφάλματος της μηχανής TeX.

**ΤεXνική σημείωση**

Η επεξεργασία του NotoColorEmoji.ttf από το XeTeX διερευνήθηκε με τη μεταγλώττιση μιας έκδοσης αποσφαλμάτωσης του εκτελέσιμου XeTeX. Χρησιμοποιήθηκε το Eclipse IDE για να οριστεί ένα σημείο διακοπής στη συνάρτηση XeTeX `creatFontFromFile(filename, index, pointsize)`, και στη συνέχεια έγινε βήμα-βήμα εκτέλεση του κώδικα για να παρατηρηθεί η επακόλουθη επεξεργασία.

#### XeTeX και OpenType έγχρωμες γραμματοσειρές βασισμένες σε διανύσματα

Ο XeTeX μπορεί να *φορτώσει* χρησιμοποιήσει OpenType έγχρωμες γραμματοσειρές βασισμένες σε διανύσματα, αλλά δεν θα παράγει έγχρωμα emoji στο τελικό PDF—αν ο XeTeX παράγει κάποιο καθόλου. Σε αντίθεση με τους LuaTeX, LuaHBTeX και pdfTeX, ο XeTeX δεν *άμεσα* εξάγει στοιχειοθετημένα έγγραφα σε μορφή PDF. Αντίθετα, ο XeTeX εξάγει ένα ενδιάμεσο `.xdv` (ε**x**πεκταμένο **dv**i) αρχείο, το οποίο μετατρέπεται σε PDF από ένα βοηθητικό πρόγραμμα που ονομάζεται `xdvipdfmx`. Τη στιγμή της συγγραφής, `xdvipdfmx` δεν είναι σε θέση να ενσωματώσει τα κατάλληλα δεδομένα έγχρωμων emoji glyph στο PDF, οπότε, στην καλύτερη περίπτωση, θα δείτε ασπρόμαυρα emoji—το αποτέλεσμα «εφεδρείας»—στο PDF, ή ίσως και τίποτα καθόλου, ανάλογα με τη γραμματοσειρά που χρησιμοποιείται.

Ιδού ένα παράδειγμα XeLaTeX που χρησιμοποιεί την έγχρωμη γραμματοσειρά OpenType [TwemojiMozilla.ttf](https://ctan.org/tex-archive/fonts/twemoji-colr), διαθέσιμη στο TeX Live. Η TwemojiMozilla.ttf χρησιμοποιεί τη διανυσματική μορφή COLR/CPAL της Microsoft για την αποθήκευση έγχρωμων glyphs και περιλαμβάνεται στο TeX Live 2020. Σε αυτό το παράδειγμα, το XeTeX μπορεί να φορτώσει τη γραμματοσειρά, να δημιουργήσει ένα `.xdv` και αρχείο PDF, αλλά το glyph του emoji δεν υπάρχει στο στοιχειοθετημένο PDF:

```latex
\documentclass{article}
\usepackage{fontspec}
\begin{document}
\newfontfamily\emojifont{TwemojiMozilla.ttf}
\newcommand{\smiley}{{\emojifont\char"1F600}}
Ιδού ένα χαμογελάκι: \smiley
\end{document}
```

[Ανοίξτε αυτόν τον κώδικα XeLaTeX στο Overleaf (ΔΕΝ λειτουργεί).](https://www.overleaf.com/docs?engine=xelatex\&snip_name=XeTeX+failure\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%7Bfontspec%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cnewfontfamily%5Cemojifont%7BTwemojiMozilla.ttf%7D%0A%5Cnewcommand%7B%5Csmiley%7D%7B%7B%5Cemojifont%5Cchar%221F600%7D%7D%0AHere+is+a+smiley%3A+%5Csmiley%0A%5Cend%7Bdocument%7D)

Αντίθετα, ο παραπάνω κώδικας λειτουργεί με το LuaLaTeX αν ορίσετε `\emojifont` χρησιμοποιώντας το `fontspec` τη ρύθμιση `[Renderer=HarfBuzz]`:

```latex
\documentclass{article}
\usepackage{fontspec}
\begin{document}
\newfontfamily\emojifont{TwemojiMozilla.ttf}[Renderer=HarfBuzz]
\newcommand{\smiley}{{\emojifont\char"1F600}}
Ιδού ένα χαμογελάκι: \smiley
\end{document}
```

[Ανοίξτε αυτόν τον κώδικα LuaLaTeX στο Overleaf (λειτουργεί).](https://www.overleaf.com/docs?engine=lualatex\&snip_name=LuaLaTeX+emoji+example\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%7Bfontspec%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cnewfontfamily%5Cemojifont%7BTwemojiMozilla.ttf%7D%5BRenderer%3DHarfBuzz%5D%0A%5Cnewcommand%7B%5Csmiley%7D%7B%7B%5Cemojifont%5Cchar%221F600%7D%7D%0AHere+is+a+smiley%3A+%5Csmiley%0A%5Cend%7Bdocument%7D)

### LuaHBTeX και έγχρωμες γραμματοσειρές OpenType

Μέσω της ενσωματωμένης μηχανής διαμόρφωσης HarfBuzz και της `luaoftload` βιβλιοθήκης, το LuaHBTeX παρέχει υποστήριξη για και τις τέσσερις ποικιλίες έγχρωμης γραμματοσειράς OpenType. Οι χρήστες του LuaLaTeX μπορούν να αξιοποιήσουν πλήρως την επεξεργασία κειμένου που βασίζεται σε Unicode, το οποίο περιέχει χαρακτήρες emoji, ή απλώς να στολίσουν τα έγγραφά τους με πολύχρωμο κείμενο χρησιμοποιώντας έγχρωμες γραμματοσειρές OpenType.

Όπως σημειώθηκε νωρίτερα, οι τέσσερις παραλλαγές έγχρωμης γραμματοσειράς OpenType μπορούν να ταξινομηθούν σε δύο ομάδες:

* εκείνες που περιέχουν glyphs σε μορφές εικόνας raster, όπως PNG·
* άλλες που χρησιμοποιούν μορφές SVG βασισμένες σε διανύσματα ή τον μηχανισμό COLR/CPAL της Microsoft.

Οι μορφές glyph βασισμένες σε διανύσματα έχουν το πλεονέκτημα της κλιμακωσιμότητας: παράγουν ευκρινή γραφικά glyph σε οποιοδήποτε μέγεθος σημείου.

**Χρήση έγχρωμων γραμματοσειρών Microsoft COLR/CPAL με το LuaHBTeX**

Αν θέλετε να χρησιμοποιήσετε μια διανυσματική μορφή για τις έγχρωμες γραμματοσειρές emoji OpenType, ρίξτε μια ματιά στη γραμματοσειρά [TwemojiMozilla.ttf](https://ctan.org/tex-archive/fonts/twemoji-colr?lang=en), η οποία βασίζεται στη μορφή COLR/CPAL της Microsoft. Η TwemojiMozilla.ttf περιλαμβάνεται στο TeX Live, αλλά μπορείτε να αποκτήσετε την πιο πρόσφατη έκδοση από το [αποθετήριο GitHub](https://github.com/mozilla/twemoji-colr/releases) και να την ανεβάσετε στο έργο σας στο Overleaf.

Ιδού ένα μικρό, `fontspec`βασισμένο σε `Renderer=Harfbuzz`, παράδειγμα, το οποίο στοιχειοθετεί μια μεγάλη (διανυσματική) πάπια emoji:

```latex
\documentclass{article}
\usepackage{fontspec}
\title{Duck demo}
\begin{document}
\newfontfamily\emojifont[Renderer=Harfbuzz,SizeFeatures={Size=400}]{TwemojiMozilla.ttf}
\emojifont\Uchar"1F986
\end{document}
```

[Ανοίξτε αυτό το παράδειγμα LuaLaTeX για να στοιχειοθετήσετε μια διανυσματική πάπια.](https://www.overleaf.com/docs?engine=lualatex\&snip_name=Typesetting+an+emoji+duck\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%7Bfontspec%7D%0A%5Ctitle%7BDuck+demo%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cnewfontfamily%5Cemojifont%5BRenderer%3DHarfbuzz%2CSizeFeatures%3D%7BSize%3D400%7D%5D%7BTwemojiMozilla.ttf%7D%0A%5Cemojifont%5CUchar%221F986%0A%5Cend%7Bdocument%7D)

Ιδού η (διανυσματική) πάπια που παρήγαγε το παραπάνω παράδειγμα:

![](/files/9e385130099ad0e78b58f5a40866cbb71f4f8f5a)

#### τη χρήση OpenType γραμματοσειρών χρώματος βασισμένων σε SVG με το LuaHBTeX

Τη στιγμή της ενημέρωσης αυτού του άρθρου (Ιούλιος 2023), υπάρχει ελάχιστη επίσημη τεκμηρίωση για τη χρήση έγχρωμων γραμματοσειρών OpenType με γεύση SVG με το LuaLaTeX. Ορισμένα [σχόλια που έγιναν σε διαδικτυακές συζητήσεις](https://github.com/latex3/luaotfload/issues/96) προτείνουν τη χρήση του `fontspec`του `RawFeature`, όπως φαίνεται στον ψευδοκώδικα παρακάτω. Αντικαταστήστε `*το όνομα του αρχείου της γραμματοσειράς SVG εδώ*` με το όνομα ενός αρχείου γραμματοσειράς βασισμένου σε SVG που είναι προσβάσιμο στον κώδικα LaTeX σας:

```latex
\documentclass{article}
\usepackage{fontspec}
\begin{document}
\newfontfamily\emoji[RawFeature={+svg},SizeFeatures={Size=20}]{το όνομα του αρχείου της γραμματοσειράς SVG εδώ}
\emoji το emoji σας εδώ...
\end{document}
```

Αν παραλείψετε `fontspec` και φορτώσετε `luaotfload` απευθείας, ίσως χρειαστεί να δηλώσετε και να καθορίσετε μια γραμματοσειρά με τον ακόλουθο τρόπο—τα πειράματά μας υποδεικνύουν ότι πρέπει να παραλείψετε την `mode=harf` επιλογή για να λειτουργήσει αυτό:

```latex
\font\emoji=[το όνομα του αρχείου της γραμματοσειράς SVG εδώ]:+svg;
```

**Μερικές προειδοποιητικές σημειώσεις**

Οι αναγνώστες που ενδιαφέρονται να χρησιμοποιήσουν έγχρωμες γραμματοσειρές OpenType με γεύση SVG θα πρέπει να σημειώσουν:

* Οι γραμματοσειρές OpenType με γεύση SVG που περιέχουν μεγάλο αριθμό glyphs μπορεί να είναι [υπολογιστικά δαπανηρές για το LuaLaTeX](#processing-svg-glyph-data) ως προς την επεξεργασία, με πιθανό αποτέλεσμα [χρονικά όρια του Overleaf](/latex/el/basi-gnoseon/038-fixing-and-preventing-compile-timeouts.md).
* η υποστήριξη του LuaLaTeX για αυτές τις γραμματοσειρές θα μπορούσε να [θεωρηθεί πειραματική](https://github.com/latex3/luaotfload/issues/96#issuecomment-530317399): τα αποτελέσματα μπορεί να διαφέρουν ανάλογα με την έκδοση TeX Live που χρησιμοποιεί το έργο σας· συνεπώς, συνιστάται να πειραματιστείτε και να προχωρήσετε με προσοχή.

**Επεξεργασία δεδομένων SVG glyph**

Το SVG επιτρέπει στους σχεδιαστές να παράγουν σύνθετα και πολύχρωμα σχέδια που αναπαριστούν τα glyphs μιας γραμματοσειράς—υπόκειται σε ορισμένους περιορισμούς SVG [που τεκμηριώνονται στην προδιαγραφή OpenType](https://docs.microsoft.com/en-us/typography/opentype/spec/svg). Ωστόσο, οι μηχανές TeX, συμπεριλαμβανομένου του LuaHBTeX, δεν μπορούν να εισαγάγουν άμεσα (να χρησιμοποιήσουν) αρχεία ή δεδομένα SVG—όπως τα δεδομένα SVG που χρησιμοποιούνται για να περιγράψουν τα σχήματα των glyphs μέσα σε έγχρωμες γραμματοσειρές OpenType με γεύση SVG. Τα δεδομένα SVG ενός glyph πρέπει να μετατραπούν σε μορφή PDF, επειδή το LuaHBTeX μπορεί να τη χρησιμοποιήσει για να στοιχειοθετήσει το glyph και να παράγει το τελικό έγγραφο PDF. Αυτή η μετατροπή SVG σε PDF γίνεται από κώδικα Lua μέσα στο `luaoftload`: τα δεδομένα SVG κάθε glyph εξάγονται από το αρχείο της γραμματοσειράς, αποθηκεύονται σε ένα προσωρινό `.svg` αρχείο και μετατρέπονται σε PDF χρησιμοποιώντας το Inkscape μέσω της γραμμής εντολών του. Η εξαγωγή των δεδομένων SVG και η μετατροπή τους σε PDF επιφέρει κάποιο επιπλέον κόστος επεξεργασίας, με αποτέλεσμα ενδεχομένως μεγάλους χρόνους μεταγλώττισης εγγράφων—ιδίως για έγγραφα που χρησιμοποιούν μεγάλες γραμματοσειρές SVG που περιέχουν χιλιάδες glyph emoji.

#### Έγχρωμες γραμματοσειρές OpenType βασισμένες σε raster

**Χρήση της μορφής έγχρωμης γραμματοσειράς OpenType CBDT/CBLC της Google με το LuaHBTeX**

[Noto Color Emoji](https://fonts.google.com/noto/specimen/Noto+Color+Emoji) είναι μια έγχρωμη γραμματοσειρά OpenType που περιλαμβάνεται στο TeX Live, καθιστώντας την εύκολη στη χρήση σε ένα έργο Overleaf. Επειδή το Noto Color Emoji χρησιμοποιεί γραφικά σε μορφή PNG για να αναπαραστήσει glyphs emoji, μπορούμε να το χρησιμοποιήσουμε για να στοιχειοθετήσουμε ένα μεγάλο emoji πάπιας (raster)—όπως δείχνει το ακόλουθο παράδειγμα. Σημειώστε και πάλι ότι η `fontspec` δήλωση της γραμματοσειράς (`\emojifont`) χρησιμοποιεί `Renderer=Harfbuzz`.

```latex
\documentclass{article}
\usepackage{fontspec}
\title{Duck demo}
\begin{document}
\newfontfamily\emojifont[Renderer=Harfbuzz,SizeFeatures={Size=400}]{NotoColorEmoji.ttf}
\emojifont\Uchar"1F986
\end{document}
```

[Ανοίξτε αυτό το παράδειγμα LuaLaTeX για να στοιχειοθετήσετε μια πάπια raster.](https://www.overleaf.com/docs?engine=lualatex\&snip_name=Typesetting+a+large+raster+duck\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%7Bfontspec%7D%0A%5Ctitle%7BDuck+demo%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cnewfontfamily%5Cemojifont%5BRenderer%3DHarfbuzz%2CSizeFeatures%3D%7BSize%3D400%7D%5D%7BNotoColorEmoji.ttf%7D%0A%5Cemojifont%5CUchar%221F986%0A%5Cend%7Bdocument%7D)

Ιδού η πάπια raster που παρήγαγε το παραπάνω παράδειγμα:

![Μια πάπια emoji raster στοιχειοθετημένη από το LaTeX](/files/21780cbef5fab0fe2adf6d0cef28d5b6366d24e3)

Αν προσπαθήσετε να χρησιμοποιήσετε `NotoColorEmoji.ttf` αλλά παραλείψετε `[Renderer=Harfbuzz]` από το `fontspec` τη δήλωση, το LuaHBTeX θα αποτύχει και θα εμφανίσει ένα μήνυμα σφάλματος όταν προσπαθήσει να γράψει το αρχείο PDF:

```latex
! error:  (file /usr/local/texlive/2020/texmf-dist/fonts/truetype/google/noto-em
oji/NotoColorEmoji.ttf) (ttf): loca table not found
```

Ο λόγος για αυτό το σφάλμα στον [πίνακα loca](https://docs.microsoft.com/en-us/typography/opentype/spec/loca) είναι [εξηγείται στο GitHub](https://github.com/latex3/luaotfload/issues/98#issuecomment-531610153).

**Χρήση της έγχρωμης γραμματοσειράς OpenType sbix της Apple με το LuaHBTeX**

Δοκιμές εκτός σύνδεσης δείχνουν ότι το LuaHBTeX υποστηρίζει την `sbix` παραλλαγή έγχρωμης γραμματοσειράς OpenType, αλλά, τη στιγμή της συγγραφής αυτού του άρθρου, δεν έχουμε καταφέρει να εντοπίσουμε μια κατάλληλα αδειοδοτημένη `sbix`-παραλλαγή έγχρωμης γραμματοσειράς emoji για να δείξουμε τη στοιχειοθεσία μιας πάπιας. Παρακαλούμε [επικοινωνήσετε μαζί μας](https://www.overleaf.com/contact) αν γνωρίζετε μία, και θα ενημερώσουμε πάραυτα αυτό το άρθρο για να τη χρησιμοποιήσει.

## Εισαγωγή στο LuaHBTeX HarfBuzz API

![Db.gif](/files/3003b44d1254162bdfe134acb8502abf88e035d4) ![Db.gif](/files/3003b44d1254162bdfe134acb8502abf88e035d4)

Η διαμόρφωση κειμένου, ιδιαίτερα για γλώσσες με σύνθετα γραφικά συστήματα, και ακόμη και για emoji, είναι εγγενώς δύσκολη εργασία, οπότε, όπως είναι αναμενόμενο, το HarfBuzz είναι μια εξελιγμένη βιβλιοθήκη με την οποία μπορεί να είναι δύσκολο να δουλέψει κανείς—εκτός αν είστε ήδη εξοικειωμένοι με λειτουργίες διαμόρφωσης κειμένου. Σε αυτή την τελευταία ενότητα, εξετάζουμε την ενσωμάτωση του HarfBuzz στο LuaHBTeX και πώς να την προσπελάσετε μέσω κώδικα Lua μέσα στο `\directlua`.

Το παράδειγμά μας χρησιμοποιεί αρκετά βασικό κώδικα για να δείξει το LuaHBTeX HarfBuzz API. Είναι κάπως τεχνητό, όχι ποιότητας παραγωγής, ούτε ιδιαίτερα πρακτικό, επειδή ο μοναδικός του σκοπός είναι να εισαγάγει ορισμένες βασικές ιδέες. Έχουμε χωρίσει τον κώδικα Lua σε δύο `\directlua` τμήματα: το πρώτο φορτώνει τη `luaharfbuzz` βιβλιοθήκη και δημιουργεί κάποιες καθολικές μεταβλητές που θα χρησιμοποιήσουμε στο δεύτερο `\directlua` τμήμα, όπου ορίζουμε μια μακροεντολή που ονομάζεται `\codestoemoji`.

Μου φαίνεται κατάλληλο να αναπαραγάγουμε τη χρήση από τον Knuth των διπλών επικίνδυνων σημείων κάμψης (εικόνα ευγενική παραχώρηση του [αυτού του ιστότοπου](http://www.truetex.com/db.htm)) επειδή το περιεχόμενο είναι κάπως χαμηλού επιπέδου και «κοιτάζει κάτω από το καπό»—αν και ελπίζουμε ότι μπορεί να ενδιαφέρει τον πιο τολμηρό αναγνώστη. Η ενσωμάτωση του HarfBuzz στο LuaHBTeX προέρχεται από το [πρότζεκτ luaharfbuzz στο GitHub](https://github.com/ufyTeX/luaharfbuzz/wiki#projects-using-luaharfbuzz) όπου μπορείτε να βρείτε μια [εισαγωγή στο πρότζεκτ](https://github.com/ufyTeX/luaharfbuzz/wiki) μαζί με έναν [κατάλογο του API luaharfbuzz](http://ufytex.github.io/luaharfbuzz/).

### Πρώτα βήματα: φορτώστε τη βιβλιοθήκη luaharfbuzz και βρείτε μια γραμματοσειρά

Για να χρησιμοποιήσουμε το HarfBuzz API του LuaHBTeX, πρέπει πρώτα να φορτώσουμε τη βιβλιοθήκη (module) που ονομάζεται `luaharfbuzz`, ενσωματωμένη στο LuaHBTeX, και να αποθηκεύσουμε τον πίνακα που επιστρέφεται σε μια (καθολική) μεταβλητή που θα ονομάσουμε `hblib`:

```latex
hblib=require("luaharfbuzz")
```

Στη συνέχεια, πρέπει να εντοπίσουμε μια κατάλληλη έγχρωμη γραμματοσειρά emoji OpenType: θα χρησιμοποιήσουμε το Noto Color Emoji—σημειώστε ότι είμαστε πολύ τεμπέληδες και δεν κάνουμε κανέναν έλεγχο σφαλμάτων σε περίπτωση που δεν το βρούμε! Για να το βρούμε, θα χρησιμοποιήσουμε τη βιβλιοθήκη `kpse` (Kpathsea), η οποία είναι επίσης μέρος του LuaTeX/LuaHBTeX:

```latex
pathtofontfile=kpse.find_file("NotoColorEmoji.ttf","truetype fonts")
```

Τώρα που έχουμε πρόσβαση στη βιβλιοθήκη HarfBuzz, μέσω της μεταβλητής μας `hblib`, και στη διαδρομή προς μια κατάλληλη γραμματοσειρά (`pathtofontfile`), μπορούμε να αρχίσουμε να τη χρησιμοποιούμε `hblib`. Αρχικά, θα δημιουργήσουμε μια HarfBuzz face και μια HarfBuzz font για χρήση στο δεύτερο `\directlua` τμήμα κώδικα όπου ορίζουμε τη μακροεντολή μας.

```latex
%Δημιουργία HarfBuzz face και HarfBuzz font από το Noto Color Emoji
hbface = hblib.Face.new(pathtofontfile)
hbfont = hblib.Font.new(hbface)
```

#### HarfBuzz font και HarfBuzz face: τι είναι;

Ένα [Το αντικείμενο HarfBuzz face](https://harfbuzz.github.io/fonts-and-faces.html) αντιπροσωπεύει ένα σχέδιο γραμματοσειράς φορτωμένο από αρχείο γραμματοσειράς, αλλά χωρίς να έχουν οριστεί συγκεκριμένες παράμετροι (όπως το μέγεθος). Ένα [αντικείμενο HarfBuzz font](https://harfbuzz.github.io/fonts-and-faces.html) αντιπροσωπεύει μια *συγκεκριμένη περίπτωση* ενός HarfBuzz face· κατά συνέπεια, διαφορετικά αντικείμενα HarfBuzz font μπορούν να παραχθούν από ένα μόνο HarfBuzz face: κάθε HarfBuzz font μπορεί να έχει τις ιδιότητές του, όπως το μέγεθος, ορισμένες σε διαφορετικές τιμές. Ένα HarfBuzz face είναι υψηλότερο επίπεδο αφαίρεσης από ένα HarfBuzz font.

### Χρήση glyphs γραμματοσειράς για τη δημιουργία αρχείων PNG

Το τελικό μέρος του πρώτου μας `\directlua` τμήματος `είναι μια συνάρτηση που ονομάζεται` writePNGglyph(hbfontobject, glyphID)

την οποία χρησιμοποιούμε για να δείξουμε ότι ορισμένες έγχρωμες γραμματοσειρές OpenType, όπως το Noto Color Emoji, χρησιμοποιούν γραφικά PNG για να αναπαραστήσουν τα glyphs emoji που περιέχουν. `.png` με όνομα `Graphics<glyphID>.png`. Το όνομα αυτού του `.png` αρχείου επιστρέφεται για χρήση από `\includegraphics` για να ενσωματώσουμε εικόνες PNG glyph στο στοιχειοθετημένο μας PDF.

Με το `είναι μια συνάρτηση που ονομάζεται` σε ισχύ, το πρώτο μας `\directlua` τμήμα κώδικα μοιάζει ως εξής:

```latex
\directlua{

% Φορτώστε τη βιβλιοθήκη luaharfbuzz από το LuaHBTeX
hblib=require("luaharfbuzz")

% Εντοπίστε τη γραμματοσειρά Noto Color Emoji στον διακομιστή του Overleaf
pathtofontfile=kpse.find_file("NotoColorEmoji.ttf","truetype fonts")

% Δημιουργήστε HarfBuzz face και HarfBuzz font από το Noto Color Emoji
hbface = hblib.Face.new(pathtofontfile)
hbfont = hblib.Font.new(hbface)

% Αυτή η συνάρτηση δέχεται μια γραμματοσειρά και ένα αναγνωριστικό glyph:
% εξάγει τα δεδομένα PNG των glyphs και τα γράφει
% σε ένα αρχείο .png

function writePNGglyph(hbfontobject, glyphID)

    % Λήψη δεδομένων PNG του glyph
    local pngblob=hbfontobject:ot_color_glyph_get_png(glyphID)
    local pngdata=pngblob:get_data()

    % Κατασκευή ονόματος αρχείου για το αρχείο .png μας
    local fname="Glyph"..glyphID..".png"

    % Γράψτε το αρχείο .png και επιστρέψτε το όνομα του αρχείου
    local output = assert(io.open(fname, "wb"))
    output:write(pngdata)
    output:close()

    % Επιστρέψτε το όνομα του αρχείου για χρήση από το \includegraphics
    return fname
end
}
```

### Δεύτερο τμήμα \directlua: δημιουργήστε τη μακροεντολή \codestoemoji

Ο στόχος είναι να ορίσουμε μια μακροεντολή `\codestoemoji` την οποία μπορούμε να καλέσουμε με ένα κομμάτι κειμένου που περιέχει κώδικες χαρακτήρων emoji που θέλουμε το HarfBuzz να διαμορφώσει. Συγκεκριμένα, θα χρησιμοποιήσουμε `\Uchar<κωδικός χαρακτήρα>` για να αναπαραστήσουμε κάθε χαρακτήρα emoji· για παράδειγμα:

```latex
\codestoemoji{\Uchar"1F3F4\Uchar"E0067\Uchar"E0062\Uchar"E0065\Uchar"E006E\Uchar"E0067\Uchar"E007F}
```

Πολλά συμβαίνουν μέσα στον ορισμό της `\codestoemoji` τα οποία θα εξηγήσουμε παρακάτω, αλλά ο ορισμός μοιάζει ως εξής:

```latex
\newcommand{\codestoemoji}[1]{%
\directlua{

local str="#1"
local hbbuffer = hblib.Buffer.new()
hbbuffer:add_utf8(str)

hbbuffer:set_direction(hblib.Direction.new("ltr"))
local res = hblib.shape_full(hbfont, hbbuffer, {},{})

if (res) then
    local hbglyphs=hbbuffer:get_glyphs()
    % Ο πίνακας glyphs, hbglyphs, είναι 1-based
    local i = 1
    while hbglyphs[i] \noexpand~= nil do
        local glyph = hbglyphs[i]
        i = i + 1
        local fname=writePNGglyph(hbfont, glyph.codepoint)
        % Μειώστε το μέγεθος των εισαγόμενων εικόνων PNG μας
        local s = 0.75
        local scal="[scale="..tostring(s).."]"
        tex.print([[\noexpand\includegraphics]]..scal..[[{]]..fname..[[}]])
     end
end
}}
```

#### Κατανόηση του ορισμού της μακροεντολής \codestoemoji

Η `\codestoemoji` η μακροεντολή είναι κυρίως κώδικας Lua που περιέχεται μέσα στο `\directlua`, οπότε αν θέλετε να μάθετε περισσότερα για το πώς *πώς* `\directlua` λειτουργεί, ρίξτε μια ματιά στο άρθρο του Overleaf [Κατανόηση `\directlua`](/latex/el/se-vathos-arthra/09-an-introduction-to-luatex-part-2-understanding-directlua.md). Εξηγεί πώς οι LuaTeX και LuaHBTeX επεξεργάζονται `\directlua` όταν εντολές TeX/LaTeX περιλαμβάνονται στον κώδικα Lua και, ειδικότερα, την ανάγκη χρήσης `\noexpand` και `\unexpanded`.

**Αντιμετώπιση της παραμέτρου της μακροεντολής: "#1"**

Η μακροεντολή ξεκινά με αυτές τις τρεις γραμμές:

```latex
local str="#1"
local hbbuffer = hblib.Buffer.new()
hbbuffer:add_utf8(str)
```

που εκτελούν τις ακόλουθες εργασίες:

* `local str="#1"`: αυτό δημιουργεί μια συμβολοσειρά Lua από την είσοδο που μεταβιβάζεται από τη μακροεντολή·
* `local hbbuffer = hblib.Buffer.new()`: αυτό χρησιμοποιεί το HarfBuzz API για να δημιουργήσει έναν buffer που θα περιέχει το κείμενο που θέλουμε να διαμορφώσει το HarfBuzz·
* `hbbuffer:add_utf8(str)`: αυτό προσθέτει μια συμβολοσειρά μορφής UTF-8, δημιουργημένη από την είσοδο της μακροεντολής μας, στον buffer του HarfBuzz.

Η πρώτη γραμμή κώδικα

```latex
local str="#1"
```

φαίνεται αρκετά απλή αλλά η λειτουργία της περιλαμβάνει αρκετή πολυπλοκότητα, η οποία αξίζει να εξερευνηθεί λίγο πιο λεπτομερώς.

Αν εξετάσουμε την τρίτη γραμμή κώδικα

```latex
hbbuffer:add_utf8(str)
```

βλέπουμε ότι χρησιμοποιεί τη `str` μεταβλητή μας για να παρέχει στον buffer του HarfBuzz μια Unicode συμβολοσειρά μορφοποιημένη σε UTF-8. Για να λειτουργήσει αυτό, η μεταβλητή `str` πρέπει η ίδια να περιέχει Unicode κείμενο μορφοποιημένο ως UTF-8· έτσι γεννάται το ερώτημα: *πώς* μετέτρεψε το LuaHBTeX το όρισμα της μακροεντολής `"#1"`, που περιέχει `\Uchar` εντολές, στη μεταβλητή συμβολοσειράς Lua `str` που περιέχει κείμενο UTF-8 για το HarfBuzz;

Αν κοιτάξουμε την προβλεπόμενη χρήση της `\codestoemoji` μακροεντολής:

```latex
\codestoemoji{\Uchar"1F3F4\Uchar"E0067\Uchar"E0062\Uchar"E0065\Uchar"E006E\Uchar"E0067\Uchar"E007F}
```

η είσοδος, όπως `\Uchar"1F3F4\Uchar"E0067\Uchar"E0062\Uchar"E0065...`, δεν μοιάζει καθόλου με ακολουθία χαρακτήρων emoji κωδικοποιημένων σε UTF-8. Επιπλέον, το HarfBuzz δεν γνωρίζει τίποτα για εντολές TeX. Κάπως, η ακατέργαστη είσοδος TeX που αποτελείται από `\Uchar` εντολές μετασχηματίζεται σε Unicode χαρακτήρες κωδικοποιημένους σε UTF-8 που μπορεί να χρησιμοποιήσει το HarfBuzz, αλλά *πώς*?

Η απάντηση βρίσκεται στη συμπεριφορά της `\Uchar` εντολής: η προσπάθεια κλήσης της `\codestoemoji` χρησιμοποιώντας `\char` αντί για `\Uchar` θα αποτύχει, αλλά *γιατί*?

**\Uchar: επέκταση στο \directlua**

Όταν καλείται η `\codestoemoji` μακροεντολή, η `\directlua` εντολή, αποθηκευμένη μέσα στον ορισμό της μακροεντολής, πρέπει να προετοιμάσει κώδικα Lua για αποστολή στον ενσωματωμένο διερμηνέα Lua του LuaHBTeX. Μέρος αυτής της διαδικασίας προετοιμασίας κώδικα είναι η επέκταση οποιωνδήποτε εντολών TeX/LaTeX υπάρχουν στον αρχικό κώδικα Lua στον ορισμό της μακροεντολής, μαζί με την επέκταση τυχόν ορισμάτων μακροεντολής που παρέχει ο χρήστης. Αυτή η διαδικασία επέκτασης αποδίδει μια λίστα tokens η οποία στη συνέχεια μετατρέπεται ξανά σε κείμενο, παράγοντας τον κώδικα Lua για μεταβίβαση στον διερμηνέα Lua. Για ευκολία, αναπαράγουμε ένα διάγραμμα από το άρθρο του Overleaf [Κατανόηση `\directlua`](/latex/el/se-vathos-arthra/09-an-introduction-to-luatex-part-2-understanding-directlua.md):

![Οι μηχανισμοί της \directlua](/files/6e8a7b7c4949edd7d2435be6fcf8a3ee182cf75c)

Η μακροεντολή `\codestoemoji` προορίζεται να καλείται χρησιμοποιώντας `\Uchar` εντολές και, [όπως σημειώθηκε νωρίτερα στο άρθρο](#the-key-difference-expansion), `\Uchar` είναι μια επεκτάσιμη εντολή της οποίας η επέκταση δημιουργεί ένα token χαρακτήρα. Μέσα στις δραστηριότητες επεξεργασίας της `\directlua`, το LuaHBTeX επεκτείνει κάθε `\Uchar<κωδικός χαρακτήρα>` εντολή όπου *αφαιρεί* κάθε `\Uchar<κωδικός χαρακτήρα>` αφαιρείται από την είσοδο και *την αντικαθιστά* τη με το αντίστοιχο τιμή επέκτασης: ένα token χαρακτήρα που αναπαριστά το `<κωδικός χαρακτήρα>`.

Στο τελικό στάδιο της επεξεργασίας, η αρχική λίστα tokens που δημιουργήθηκε από τη `\directlua` μετατρέπεται *ξανά σε κείμενο* για να γίνει ο κώδικας Lua που προορίζεται για τον διερμηνέα Lua (βλ. διάγραμμα παραπάνω). Όλα τα tokens χαρακτήρων που παράγονται από την επέκταση της `\Uchar` επίσης *μετατρέπονται ξανά σε κείμενο*: αυτή η μετατροπή tokens χαρακτήρων σε κείμενο παράγει τις αναπαραστάσεις UTF-8 των αρχικών `<κωδικός χαρακτήρα>` τιμών.

Στο παράδειγμά μας, τη στιγμή που παράγεται ο κώδικας Lua και είναι έτοιμος για τον διερμηνέα Lua, η είσοδος της μακροεντολής για το "#1" έχει μετατραπεί σε μια ακολουθία κειμένου UTF-8: η `str` μεταβλητή είναι τώρα μια συμβολοσειρά κειμένου UTF-8 που μπορεί με ασφάλεια να προστεθεί στον buffer του HarfBuzz.

**Γιατί δεν λειτουργεί η \char;**

Η ευθεία απάντηση είναι επειδή `\char` είναι *όχι* μια επεκτάσιμη εντολή. Σε αντίθεση με `\Uchar` τις εντολές, `\char` εντολές *δεν αφαιρούνται* από την είσοδο κατά την `\directlua`αρχική επεξεργασία του για τη δημιουργία μιας λίστας διακριτικών, αλλά «περνούν μέσα» ώστε να ενσωματωθούν στη λίστα διακριτικών που κατασκευάζεται από το `\directlua`. Για παράδειγμα, αν το όρισμα του `\codestoemoji` περιείχε `\char"1F3F4` το LuaHBTeX θα το μετέτρεπε σε μια ακολουθία διακριτικών και θα τα αποθήκευε ως μέρος της συνολικής λίστας διακριτικών που δημιουργείται.

Στο επόμενο στάδιο επεξεργασίας, κατά τη μετατροπή των διακριτικών πίσω σε κείμενο, ο παραγόμενος κώδικας Lua θα περιείχε το *κυριολεκτική συμβολοσειρά* `\char"1F3F4` μέσα στο κείμενο που χρησιμοποιείται για να ορίσει τη μεταβλητή μας `str`. Όταν το περιεχόμενο του `str` προστίθεται στο buffer του HarfBuzz, δεν θα περιέχει μια ακολουθία κωδικοποιημένη σε UTF-8 που να αναπαριστά τον χαρακτήρα emoji "1F3F4, θα περιέχει την κυριολεκτική συμβολοσειρά `\char"1F3F4`, την οποία ο HarfBuzz θα προσπαθήσει να διαμορφώσει και, για τους σκοπούς μας, δεν θα παρήγαγε ένα γλυφό emoji. Παρεμπιπτόντως, η συμβολοσειρά `\char"1F3F4` θα δημιουργούσε επίσης συντακτικά σφάλματα Lua, εκτός αν είχε δημιουργηθεί ως «συμβολοσειρά με μακριές αγκύλες»—βλ. [Τι είναι οι ακολουθίες διαφυγής Lua](/latex/el/se-vathos-arthra/09-an-introduction-to-luatex-part-2-understanding-directlua.md#what-are-e2809clua-escape-sequencese2809d3f) για το υπόβαθρο αυτού του ζητήματος.

Αν προσπαθήσουμε να χρησιμοποιήσουμε την `\codestoemoji` με ένα `\char` εντολή, όπως εδώ:

```latex
\codestoemoji{\char"1F3F4\Uchar"E0067\Uchar"E0062\Uchar"E0065\Uchar"E006E\Uchar"E0067\Uchar"E007F}
```

το LuaHBTeX θα αποτύχει και θα αναφέρει ένα συντακτικό σφάλμα κάπως έτσι:

```latex
[\directlua]:1: μη έγκυρη ακολουθία διαφυγής κοντά στο '"\c'.
\codestoemoji ...ing \includegraphics }.}]]) end }

l.75 ...r"E0065\Uchar"E006E\Uchar"E0067\Uchar"E007F}

Ο διερμηνευτής lua συνάντησε ένα πρόβλημα, επομένως το
υπόλοιπο αυτού του τμήματος lua θα αγνοηθεί.
```

#### Κλήση της συνάρτησης διαμόρφωσης του HarfBuzz

**Ορισμός παραμέτρων του buffer**

Ο HarfBuzz μερικές φορές απαιτεί πρόσθετες πληροφορίες σχετικά με το κείμενο που του ζητείται να διαμορφώσει. Μπορείτε να παράσχετε αυτές τις πληροφορίες ρυθμίζοντας το `<buffer variable>` χρησιμοποιώντας *μεθόδους του buffer*, όπως:

* `<buffer variable>:set_direction(*HarfBuzz direction*)`;
* `<buffer variable>:set_language(*HarfBuzz language*)`;
* `<buffer variable>:set_script(*HarfBuzz script*)`.

Για παράδειγμα, πρέπει να ενημερώσουμε τον HarfBuzz ότι η κατεύθυνση του κειμένου emoji μας θα είναι από αριστερά προς τα δεξιά. Για να το κάνουμε αυτό, χρησιμοποιούμε τη `set_direction()` μέθοδο στο `<buffer variable>` (που ονομάζεται `hbbuffer`) γράφοντας:

```latex
hbbuffer:set_direction(hblib.Direction.new("ltr"))
```

όπου `hblib.Direction.new("ltr")` δημιουργεί ένα «αντικείμενο κατεύθυνσης» κατάλληλο για να περαστεί στη μηχανή HarfBuzz μέσω Lua.

**Εκτέλεση διαμόρφωσης**

Αφού ο buffer αρχικοποιηθεί κατάλληλα, μπορούμε να ζητήσουμε από τον HarfBuzz να κάνει την πραγματική διαμόρφωση μέσω της συνάρτησης `shape_full()`. Στο παράδειγμά μας γράφουμε:

```latex
local res = hblib.shape_full(hbfont, hbbuffer, {},{})
```

Οι 3η και 4η παράμετροι της `shape_full()` συνάρτησης πρέπει να είναι πίνακες Lua—έχουμε χρησιμοποιήσει κενά σύνολα «`{}`» και για τις δύο παραμέτρους. Η γενική μορφή της `shape_full()` είναι:

```latex
shape_full(Harfbuzz font, Harfbuzz buffer, {font features}, {"shaper"}
```

* **`{"shaper"}`**: Συνήθως δεν χρειάζεται να οριστεί, αλλά οι επιλογές είναι `{"ot"}` ή `{"graphite2"}`. Περισσότερες πληροφορίες για την έννοια ενός «shaper» μπορείτε να βρείτε στην [τεκμηρίωση του HarfBuzz](https://harfbuzz.github.io/shaping-and-shape-plans.html)—σημειώστε ότι αυτή τεκμηριώνει το χαμηλού επιπέδου C API, όχι την βασισμένη στη Lua `luaharfbuzz` δέσμευση (υλοποίηση).
* **`{font features}`**: Αυτός είναι ένας πίνακας που απαριθμεί τα [χαρακτηριστικά OpenType](https://docs.microsoft.com/en-us/typography/opentype/spec/featurelist)—υποστηριζόμενα από τη γραμματοσειρά— που θέλετε να εφαρμόσει ο HarfBuzz κατά τη διαμόρφωση.

Κάθε χαρακτηριστικό γραμματοσειράς που θέλετε να χρησιμοποιήσετε πρέπει να δημιουργηθεί με μια `luaharfbuzz` συνάρτηση της βιβλιοθήκης

```latex
library_instance.Feature.new(feature_string)
```

όπου

* `το library_instance` είναι η `luaharfbuzz` μεταβλητή παρουσίας της βιβλιοθήκης σας (`hblib` στο παράδειγμά μας);
* `feature_string` χρησιμοποιεί μια [σύνταξη για τον ορισμό χαρακτηριστικών](https://github.com/ufytex/luaharfbuzz/wiki/Feature-Strings). Παραδείγματα αυτού είναι τα `+smcp` για την ενεργοποίηση μικρών κεφαλαίων ή `-kern` για την απενεργοποίηση του kerning.

Για παράδειγμα:

```latex
local dosmcp = hblib.Feature.new("+smcp")
local nokern = hblib.Feature.new("-kern")
% Χρησιμοποιήστε τα χαρακτηριστικά της γραμματοσειράς σας έτσι
local res = hblib.shape_full(hbfont, hbbuffer, {dosmcp,nokern},{})
```

#### Πρόσβαση στο αποτέλεσμα: λήψη των γλυφών

Και τέλος, αν η λειτουργία διαμόρφωσης είναι επιτυχής, οι διαμορφωμένοι γλύφοι επιστρέφονται στη μεταβλητή buffer `hbbuffer` που δημιουργήσαμε νωρίτερα στον κώδικα.

Προσπελαύνουμε τους γλύφους μέσω της μεθόδου του buffer `get_glyphs()` και χρησιμοποιούμε έναν βρόχο για να πάρουμε κάθε μεμονωμένο γλύφο. Σημειώστε ότι ο πίνακας Lua που κρατά τους γλύφους, `hbglyphs` στο παράδειγμά μας, έχει ευρετηρίαση που ξεκινά από το 1, όχι από το 0.

Το *αναγνωριστικό γλύφου* (παραπλανητικά αποκαλούμενο `codepoint`), και η γραμματοσειρά HarfBuzz (`hbfont`), περνά στη `writePNGglyph()` συνάρτηση που δημιουργεί ένα αρχείο PNG χρησιμοποιώντας την αναπαράσταση raster της γραμματοσειράς για εκείνον τον γλύφο.

`writePNGglyph()` γράφει ένα αρχείο PNG και επιστρέφει το όνομα του αρχείου PNG, το οποίο χρησιμοποιείται για να εισαχθεί το (με κλίμακα) αρχείο PNG στο έγγραφο LaTeX μας μέσω της `\includegraphics[scale=0.75]{<fname>}`. Παρατηρήστε πώς μπορούμε να χρησιμοποιήσουμε το `\includegraphics` απευθείας μέσα στον κώδικα Lua.

```latex
if (res) then
    local hbglyphs=hbbuffer:get_glyphs()
    % Ο πίνακας glyphs, hbglyphs, είναι 1-based
    local i = 1
    while hbglyphs[i] \noexpand~= nil do
        local glyph = hbglyphs[i]
        i = i + 1
        local fname=writePNGglyph(hbfont, glyph.codepoint)
        % Μειώστε το μέγεθος των εισαγόμενων εικόνων PNG μας
        local s = 0.75
        local scal="[scale="..tostring(s).."]"
        tex.print([[\noexpand\includegraphics]]..scal..[[{]]..fname..[[}]])
     end
end
```

### Ο πλήρης κώδικας που μπορείτε να ανοίξετε στο Overleaf

```latex
\documentclass{article}
\usepackage{graphicx}
\begin{document}
\directlua{

% Φορτώστε τη βιβλιοθήκη luaharfbuzz από το LuaHBTeX
hblib=require("luaharfbuzz")

% Εντοπίστε τη γραμματοσειρά Noto Color Emoji στον διακομιστή του Overleaf
pathtofontfile=kpse.find_file("NotoColorEmoji.ttf","truetype fonts")

% Δημιουργήστε HarfBuzz face και HarfBuzz font από το Noto Color Emoji
hbface = hblib.Face.new(pathtofontfile)
hbfont = hblib.Font.new(hbface)

% Αυτή η συνάρτηση δέχεται μια γραμματοσειρά και ένα αναγνωριστικό glyph:
% εξάγει τα δεδομένα PNG των γλύφων και γράφει
% σε ένα αρχείο .png

function writePNGglyph(hbfontobject, glyphID)

    % Λήψη δεδομένων PNG του glyph
    local pngblob=hbfontobject:ot_color_glyph_get_png(glyphID)
    local pngdata=pngblob:get_data()

    % Κατασκευή ονόματος αρχείου για το αρχείο .png μας
    local fname="Glyph"..glyphID..".png"

    % Γράψτε το αρχείο .png και επιστρέψτε το όνομα του αρχείου
    local output = assert(io.open(fname, "wb"))
    output:write(pngdata)
    output:close()

    % Επιστρέψτε το όνομα του αρχείου για χρήση από το \includegraphics
    return fname
end
}

\newcommand{\codestoemoji}[1]{%
\directlua{

local str="#1"
local hbbuffer = hblib.Buffer.new()
hbbuffer:add_utf8(str)

hbbuffer:set_direction(hblib.Direction.new("ltr"))
local res = hblib.shape_full(hbfont, hbbuffer, {},{})

if (res) then
    local hbglyphs=hbbuffer:get_glyphs()
    % Ο πίνακας γλύφων, hbglyphs, είναι 1-based.
    local i = 1
    while hbglyphs[i] \noexpand~= nil do
        local glyph = hbglyphs[i]
        i = i + 1
        local fname=writePNGglyph(hbfont, glyph.codepoint)
        % Μειώστε το μέγεθος των εισαγόμενων εικόνων PNG μας
        local s = 0.75
        local scal="[scale="..tostring(s).."]"
        tex.print([[\noexpand\includegraphics]]..scal..[[{]]..fname..[[}]])
     end
end
}}

Μια πάπια: \codestoemoji{\Uchar"1F986}

Μια σημαία: \codestoemoji{\Uchar"1F3F4\Uchar"E0067\Uchar"E0062\Uchar"E0065\Uchar"E006E\Uchar"E0067\Uchar"E007F}
\end{document}
```

[Ανοίξτε αυτό το παράδειγμα API luaharfbuzz στο Overleaf.](/latex/el/se-vathos-arthra/10-an-overview-of-technologies-supporting-the-use-of-colour-emoji-fonts-in-latex.md)

Αυτό το παράδειγμα παράγει το ακόλουθο αποτέλεσμα:

![Harfbuzzexample.png](/files/efed08b5f0456467d1369de0324af3d8b3db4464)

## Ενότητα μπόνους: Διασκέδαση με μαθηματικά emoji

Για να κλείσουμε με μια ανάλαφρη νότα, ένα μέλος της ομάδας του Overleaf χρησιμοποίησε το [`emoji` πακέτο LaTeX](https://ctan.org/pkg/emoji?lang=en) για να δημιουργήσει ένα διασκεδαστικό παράδειγμα:

```latex
\documentclass{article}
\usepackage{emoji}
\usepackage{unicode-math,fontspec}
\setmainfont{STIX}
\setmathfont{STIX Two Math}
\begin{document}
\newcommand{\emomath}[1]{\text{\emoji{#1}}}
\[
e^{\emomath{droplet} \ln\emomath{smile}}=\emomath{sweat-smile}
\]
\[
e^{\emomath{eye}\emomath{pie}}=-1
\]
\end{document}
```

[Ανοίξτε αυτό το διασκεδαστικό παράδειγμα στο Overleaf](https://www.overleaf.com/docs?engine=lualatex\&snip_name=Fun+with+emoji+math\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%7Bemoji%7D%0A%5Cusepackage%7Bunicode-math%2Cfontspec%7D%0A%5Csetmainfont%7BSTIX%7D%0A%5Csetmathfont%7BSTIX+Two+Math%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cnewcommand%7B%5Cemomath%7D%5B1%5D%7B%5Ctext%7B%5Cemoji%7B%231%7D%7D%7D%0A%5C%5B%0Ae%5E%7B%5Cemomath%7Bdroplet%7D+%5Cln%5Cemomath%7Bsmile%7D%7D%3D%5Cemomath%7Bsweat-smile%7D%0A%5C%5D%0A%5C%5B%0Ae%5E%7B%5Cemomath%7Beye%7D%5Cemomath%7Bpie%7D%7D%3D-1%0A%5C%5D%0A%5Cend%7Bdocument%7D)

Αυτό το παράδειγμα παράγει το ακόλουθο αποτέλεσμα:

![Emojimath2.png](/files/c29c9658e326368e19ef4417cbca800941010b33)


---

# 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/se-vathos-arthra/10-an-overview-of-technologies-supporting-the-use-of-colour-emoji-fonts-in-latex.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.
