> For the complete documentation index, see [llms.txt](https://ayakaleaf-pro.ayaka.space/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://ayakaleaf-pro.ayaka.space/latex/tr/derinlemesine-makaleler/10-an-overview-of-technologies-supporting-the-use-of-colour-emoji-fonts-in-latex.md).

# LaTeX'te renkli emoji yazı tiplerinin kullanımını destekleyen teknolojilere genel bakış

## Giriş

Bu makale çeşitli [arka plan konularına](#which-topics-do-we-cover) LaTeX’te renkli emoji dizgisi için OpenType renk yazı tiplerini kullanmayla ilgili genel bir bakış sunar. Çok çeşitli ilgi alanlarına ve uzmanlık düzeylerine hitap eden geniş bir materyal yelpazesi sunmaya çalıştık. Makaleyi yönetilebilir tutmak için, bazı konulardaki kapsamımız teknik ayrıntıların çoğunu atlıyor; ancak LaTeX’te renkli emoji dizgisine ilişkin keşfinize yön vermek için yeterli malzeme olduğunu umuyoruz.

**Güncelleme (Temmuz 2023)**: Bu makale ilk olarak Ağustos 2021’de yayımlandı ve Temmuz 2023’te şu bölüm güncellenerek revize edildi: [LuaHBTeX ile SVG tabanlı OpenType renk yazı tiplerini kullanma](#using-svg-based-opentype-color-fonts-with-luahbtex).

### Hangi konuları ele alıyoruz?

Bu makale aşağıdaki genel konuları ele almaktadır:

* Unicode: emojiyi karakterler olarak kodlayan ve metin işleme ile dizgi uygulamalarındaki beklenen davranışlarını tanımlayan standart.
* OpenType renk yazı tipleri: LaTeX belgenizde görüntülenen emoji karakterlerinin renkli temsillerini sağlayan özel yazı tipleri.
* Metin şekillendirme: karmaşık yazılı dillerin ve emojilerin dizgisindeki önemli bir bileşeni tanıtmak.
* HarfBuzz: LuaHBTeX’in, gelişmiş çok dilli dizgiyi ve LaTeX’te emoji dizmek için OpenType renk yazı tiplerinin kullanımını mümkün kılan bileşeni.
* Farklı TeX motorları: OpenType renk yazı tipleri için desteklerini incelemek ve hangi TeX motorunun kullanılacağını seçmek.
* LuaHBTeX’in HarfBuzz API’si: arkasındaki “sihir”e giriş [metin şekillendirme](#the-concept-of-text-shaping) LuaHBTeX’te.

### Renkli emojiyi dizmenin üç yolu

Renkli emoji, LaTeX kullanılarak üç ana yöntemle dizilebilir:

1. Emoji çizmek için TikZ, MetaPost veya Asymptote gibi standart LaTeX grafik araçlarını kullanma.
2. Harici dosyalarda saklanan önceden hazırlanmış emoji grafiklerini ekleme.
3. Emojiyi Unicode ile kodlanmış metin olarak ele alıp [metin şekillendirme](#the-concept-of-text-shaping) ile [OpenType renk yazı tiplerini](#opentype-color-fonts) onları dizmek için kullanma.

LaTeX belgenize renkli emoji eklemeye yönelik pratik seçenekler, o belgeyi derlemek için kullanılan TeX motoruna bağlıdır; yani şunları kullanıp kullanmadığınıza bağlıdır:

* pdfLaTeX: pdfTeX motoru + LaTeX;
* XeLaTeX: XeTeX motoru + LaTeX;
* LuaLaTeX: LuaHBTeX motoru (TeX Live 2020’den başlayarak) + LaTeX.

Bu üç TeX motorunun hepsi, emoji çizmek veya `\includegraphics{...}` i kullanarak harici grafik dosyalarında saklanan emojileri eklemek için LaTeX araçlarını veya paketlerini kullanabilir. Grafik çizmek veya içe aktarmak, LaTeX belgesini derlemek için kullanılan TeX motoruna bağlı olmayan bir çözüme ihtiyaç duyduğunuzda emojiyi dizmek için ideal tekniklerdir.

Ancak iş akışınız belirli bir TeX motorunu seçme esnekliği sağlıyorsa ve OpenType renk yazı tiplerini ile Unicode tabanlı metin işlemeyi tercih ediyorsanız, LuaTeX’in en yeni sürümü olan LuaHBTeX’e ihtiyacınız var. TeX Live 2020’den başlayarak LuaHBTeX, LuaLaTeX biçimine dayalı LaTeX belgelerini derlemek için kullanılır.

## Unicode ve emoji karakterleri hakkında arka plan

### Karakter kodlamaları

Bilgisayarlar metni, metnin bileşen *karakterlerini* temsil eden sayısal (tam sayı) değerlerden oluşan bir dizi kullanarak saklar, iletir ve işler. Güvenilir metin işleme, metin akışı içindeki tek tek karakterleri temsil etmek için hangi tam sayı değerlerinin kullanılacağı konusunda metnin üreticileri ve tüketicilerinin anlaşmasını gerektirir. Başka bir deyişle, o metnin *karakteri* *kodlaması* nedir?

### Unicode’a giriş

Tarihsel olarak, 8 bitlik metin çağında, birçok farklı karakter kodlaması kullanılmış ve bu durum her zaman *kodlama uyuşmazlıkları* hayaleti yaratmıştır: metin üreticileri ve tüketicilerinin yanlışlıkla farklı kodlamalar varsayması, sonuçta metin işleme hatalarına yol açması. Birkaç yıldır TeX/LaTeX ile çalışan herkesin, giriş metni ile bir belgenin dizgisinde kullanılan yazı tipleri arasında kodlama uyuşmazlıklarıyla karşılaşmış olma olasılığı yüksektir. Belge yazı tipleri, metininkinden farklı bir kodlama kullanacak şekilde yapılandırılırsa, büyük olasılıkla dizilmiş PDF’de eksik ya da hatalı karakterler ortaya çıkar.

Bu tarihsel kodlama sorunları, dünyanın tüm karakterlerini kodlayan uluslararası bir standart kullanılarak çözülebilir: Unicode. Unicode standardı statik değildir; kodlama şemasına ek karakterler ve alfabeler (yazı sistemleri) dahil etmek üzere periyodik olarak güncellenir. Yeni karakterler önermek için bir [resmî inceleme süreci](http://www.unicode.org/pending/proposals.html) ve yeni emoji karakterleri için belirli bir [şema](https://www.unicode.org/emoji/proposals.html).

### Kaç Unicode karakteri var?

Unicode, teorik olarak en fazla 1.114.112 karakteri kodlar. 1.114.112 tam sayı değerinin her birine *kod noktası* denir: her karakteri tanımlamak için atanan tam sayı değeri. Ancak çeşitli teknik nedenlerle yalnızca [1.112.064 kod noktası](https://en.wikipedia.org/wiki/Unicode#Architecture_and_terminology) gerçek karakterlere atanabilir: 2048 kod noktası atanamaz ve Unicode uyumlu metin içinde kullanımı yasaktır.

Bu makalenin ilk sürümünün yazıldığı sırada, Unicode standardının 13. Sürümü, gerçek karakterler için toplam 143.859 kod noktasını ayırmıştı; buna [artık emoji olarak kodlanan 3304 karakter de dâhildir](https://www.unicode.org/L2/L2020/20114r-family-emoji-explor.pdf) (bkz. o belgenin 2. sayfası). Unicode tarafından kodlanan karakter sayısındaki artış güzel bir şekilde şu makalede belgelenmiştir: [Kaç Unicode karakteri var?](https://www.babelstone.co.uk/Unicode/HowMany.html) ve bir [Vikipedi maddesinde](https://en.wikipedia.org/wiki/Unicode#Versions).

### Unicode düzlemleri

1.114.112 Unicode kod noktasının tamamı 17 sözde Düzleme ayrılır: Düzlem 0’dan Düzlem 16’ya kadar; her biri 65536 kod noktası değeri içerir ve toplamda $$17\times2^{16} = 1,114,112$$ karaktere ulaşılır. Temel Çok Dilli Düzlem [Basic Multilingual Plane](https://en.wikipedia.org/wiki/Plane_\(Unicode\)#Basic_Multilingual_Plane)olarak adlandırılan Düzlem 0, en yaygın kullanılan karakterleri kodlar. 1–16 arasındaki Düzlemlere [Tamamlayıcı Düzlemler](http://unicode.org/glossary/#supplementary_planes).

### Emojinin yükselişi

İnsan iletişiminin değişen biçimleriyle yeni karakterler ortaya çıkar ve mobil telefon teknolojisi böyle bir karakter kümesinin doğmasına yol açtı: 1990’ların sonlarında Japonya’da gelişen emoji. Bu nedenle [Unicode Emoji SSS](https://unicode.org/faq/emoji_dingbats.html) şunu belirtmesi şaşırtıcı değildir

> “Emoji sözcüğü Japonca [絵](http://www.unicode.org/cgi-bin/GetUnihanData.pl?codepoint=%E7%B5%B5) (e ≅ resim) + [文字](http://www.unicode.org/cgi-bin/GetUnihanData.pl?codepoint=%E6%96%87) (moji ≅ yazılı karakter) sözcüklerinden gelir.”

Emojinin arka planı ve tarihsel gelişimiyle ilgilenen okuyucular bu [Unicode girişinde](https://unicode.org/reports/tr51/#Introduction) veya şu makalede ilgi bulabilir: [Buna ben de katılıyorum emoji: Emoji’nin standartları, yapıları ve toplumsal üretimi](https://firstmonday.org/ojs/index.php/fm/article/view/9381).

Bunun 2010’a, yani [Unicode Standardı’nın 6.0 sürümünün](https://www.unicode.org/versions/Unicode6.0.0/)yayımlanmasına kadar, pek çok emoji resmî olarak *karakterlerini* kendi başına [varlıklar olarak tanınmamıştı. Unicode 13.0,](https://www.unicode.org/L2/L2020/20114r-family-emoji-explor.pdf) 3304 karakteri emoji olarak kodladı [Unicode 13.1 ise 3521 emojiyi listeliyor](https://unicode.org/emoji/charts/emoji-counts.html).

### Emoji daha yüksek bir düzlemde yaşar

Unicode, birçok emoji karakterini Temel Çok Dilli Düzlem (BMP) dışındaki kod noktalarına atadı, [Düzlem 1’de kodlanmış](https://en.wikibooks.org/wiki/Unicode/Character_reference/1F000-1FFFF) ve 1F000–1FFFF aralığındaki kod noktalarıyla—bu da *kopyalayıp yapıştırmak*  isteyen herkes için önemli bir sonuç doğurur: emoji karakterlerini Overleaf editörlerine (Kod Editörü veya Görsel Editör) yapıştırmak. Overleaf’in metin editörleri yalnızca Temel Çok Dilli Düzlem içindeki karakterleri işleyebilir; ancak gelecekteki yükseltmelerin BMP dışı karakterler desteği getirmesini umuyoruz. Bu sınırlamanın yalnızca Overleaf editörleri aracılığıyla düzenlenecek dosyalara yapıştırılan metin içindeki BMP dışı karakterleri etkilediğini unutmayın. Emoji karakterlerine erişmenin başka yolları da vardır:

* İlkel komutları kullanma `\char"<kod noktası>` ya da `\Uchar"<kod noktası>` (bkz. [makalenin bu bölümü](#optional-detail-luatexluahbtex-char-vs-uchar) ).
* UTF-8 biçiminde emoji karakterleri içeren giriş metin dosyalarını kullanma.
* Emoji karakterleri ekleyen LaTeX komutlarını (makroları) kullanma.

#### Emoji ve diğer BMP dışı karakterleri Overleaf’e yapıştırma

Örneğin bir emoji karakterini, 😀, Overleaf Kod Editörü’ne yapıştırırsanız, şu anda �� karakterlerine dönüştürülür.

![Overleaf editörlerine BMP dışı karakterleri kopyalayıp yapıştırma nedeniyle oluşan hata](/files/cae635b177ea6507f63b3e22165066abdf729d05)

� karakterinin Unicode kod noktası FFFD’dir ve resmî adı REPLACEMENT CHARACTER’dır; “[bilinmeyen, tanınmayan veya temsil edilemeyen bir karakteri değiştirmek](https://en.wikipedia.org/wiki/Specials_\(Unicode_block\))”.

### LuaLaTeX’te Unicode kod noktaları (U+) kullanma

Unicode belgeleri kod noktası değerlerini şu gösterimle temsil eder: `U+<onaltılık değer>`—örneğin `U+1F600`, burada `1F600` şudur `<onaltılık değer>` 😀 emoji karakteri için Unicode kod noktasının değeri. Bu kod noktası değerlerini LuaLaTeX’te kullanmak için `U+` kaldırır ve `\char"<onaltılık değer>` ya da `\Uchar"<onaltılık değer>`. The `"` karakteri, TeX motoruna verilen sayının onaltılık olarak belirtildiğini söyler. Örneğin, 😀 emoji’sini kullanmak için şöyle yazarsınız: `\char"1F600` ya da `\Uchar"1F600`—onu dizmeye uygun bir yazı tipi kullanarak.

Kullanan minimal bir LuaLaTeX örneği `\char` ve `\Uchar` kullanarak 😀 emoji karakterini dizmek için şöyle olabilir:

```latex
\documentclass{article}
\usepackage{fontspec}
\begin{document}
\newfontfamily\emojifont[Renderer=Harfbuzz,SizeFeatures={Size=20}]{NotoColorEmoji.ttf}
%Etkilerini yerel tutmak için \emojifont’u bir grup içinde kullanın
{\emojifont
\Uchar"1F600
\char"1F600}
\end{document}
```

[Bu LuaLaTeX örneğini Overleaf’te açın](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)

**(isteğe bağlı ayrıntı) LuaTeX/LuaHBTeX: \char vs \Uchar**

Geleneksel `\char<karakter kodu>` komutuna ek olarak, belirli bir `<karakter kodunu>`dizmek için, mevcut yazı tipini kullanarak, LuaTeX, LuaHBTeX ve XeTeX motorları ayrıca `\Uchar<karakter kodu>` Kullanıcı açısından, sonuç `\char` ve `\Uchar` aynı görünür, ancak bu komutların nasıl çalıştığında aşağıda belirttiğimiz ince bir fark vardır.

**Temel fark: genişleme**

`\Uchar` sözde bir [genişletilebilir komuttur](/latex/tr/derinlemesine-makaleler/22-how-does-expandafter-work-the-meaning-of-expansion.md#expansion-a-general-term-for-a-set-of-operations) oysa `\char` genişletilebilir değildir. Bir `\char<karakter kodu>` ya da `\Uchar<karakter kodu>` komut “çalıştırılırken”—yani komut bir makronun veya başka bir belirteç listesinin parçası olarak saklanmıyorken—TeX motorunun içinde aşağıdaki eylemler gerçekleşir:

* **`\char<karakter kodu>`** TeX motoruna, şu anda dizmekte olduğu içerikte `<karakter kodunu>`yi temsil eden bir karakter belirtecini hemen eklemesini söyler.
* Buna karşılık, **`\Uchar<karakter kodu>`** iki ayrı işleme adımına sahiptir:

1. Bu `\Uchar<karakter kodu>` komutu *genişletilmiş*dır ve `<karakter kodunu>` tek bir [karakter belirteci](/latex/tr/derinlemesine-makaleler/19-how-does-expandafter-work-an-introduction-to-tex-tokens.md#tex-tokens-101-28and-notions-of-expansion29) içeren geçici bir belirteç listesine dönüştürülür `<karakter kodunu>`.
2. bu da *Şimdi bu tek karakterli belirteç listesi* TeX motoruna bir sonraki girişinin kaynağı olarak sunulur. Etkide TeX motoru, bu tek belirteç listesini bir sonraki giriş öğesinin (belirtecin) bulunduğu yer olarak kullanmak üzere “bakışını geçici olarak oraya çevirir”. Varsayılan olarak TeX motoru, o belirteci okumaya (girdi olarak almaya) geri döner ve karşılık gelen karakteri dizerek `\char` komutunu. **Bununla birlikte**, çünkü o `<karakter kodunu>` hemen dizilmedi, ancak geçici olarak *saklanır* (kaydedildi) tek bir belirteç olarak; ilkel TeX komutları veya LaTeX makroları bu belirteci kullanabilir (soğurabilir)—hemen dizilmesi gerekmez, ancak gerektiğinde sonraki işlemelerde kullanılabilir.

Etkide, `\char<karakter kodu>` şunu `<karakter kodunu>` şimdi diz” derken, `\Uchar<karakter kodu>` bir saklanmış karakter belirteci oluşturarak ve onu sonraki giriş öğesi (bir belirteç) olarak kullanılabilir kılarak bir tür “gecikmeli eylem”e sahiptir. Bu belirteç, TeX komutları ve makroları tarafından kullanılabilir (soğurulabilir) ya da TeX motoru tarafından yeniden okunup dizilebilir.

### Unicode (kodlama) tüm hikâye değildir

Emoji karakterlerini Unicode kodlu metin içinde kullanabilme yeteneği, emoji başarısının yalnızca bir parçasıdır. Emoji kullanımındaki artış aynı zamanda [OpenType yazı tipi teknolojisindeki](https://learn.microsoft.com/en-us/typography/opentype/)gelişmeler tarafından da mümkün kılındı — glif verileri (karakter tasarımları) [renk verileri](https://learn.microsoft.com/en-us/typography/opentype/spec/colr)içerebilen yazı tipleri: [OpenType renk yazı tiplerini](#opentype-color-fonts).

Uygun yazı tiplerinin yanı sıra, renkli emoji kullanımı aşağıdakileri içeren ek yazılım bileşenleri gerektirir:

* ön işleme (“[şekillendirme](#the-concept-of-text-shaping)”) Unicode kodlu metni, *hazırlama* onu belirli bir yazı tipi kullanarak görüntülemeye;
* *bir yazı tipinin renkli emoji* gliflerinin *görüntülenmesi ve sunulması* bir cihazın ekranına.

#### Glif ve karakter: aynı şey değil mi?

“Glif” ve “karakter” terimleri çoğu zaman birbirinin yerine kullanılabilirmiş gibi—aynı temel kavramı ifade ediyormuş gibi—kullanılır; ancak anlamları arasında ince ama önemli bir fark vardır.

Unicode [“karakter” terimini](http://www.unicode.org/glossary/#character) şu şekilde tanımlar:

> “Anlamsal değeri olan yazılı dilin en küçük bileşeni; belirli bir şekilden ziyade soyut anlamı ve/veya biçimi ifade eder…”

Buna karşılık, bir “glif” *belirli bir* *biçim* (tasarım)dır *görsel temsil* için *karakteri*.

Karakter ve glif meselesi, emoji yüklü metin çeşitli yazılım sistemlerinde/platformlarda görüntülendiğinde kolayca gözlemlenebilir; örneğin aynı metni iOS- ya da Android tabanlı cep telefonunuzda veya Windows masaüstü bilgisayarınızda okurken. Hangi cihaz veya platform kullanılırsa kullanılsın, alttaki metin (karakter dizisi) aynı Unicode kodlu *emoji* *karakterlerini*yi içerir. Söz konusu metnin *ön işleme* ve ardından *görüntülenmesi* ve *gösterim* nde yer alan, belki de cihaza özgü yazı tiplerini kullanan cihaz-özel yetenekler, aynı emoji karakterlerini temsil etmek için farklı glifler (karakter tasarımları) üretir.

Unicode’un [Tam Emoji Listesi](https://unicode.org/emoji/charts/full-emoji-list.html) her Unicode emoji karakterini temsil eden örnek görüntüler sağlar—farklı teknoloji sağlayıcılarının kullandığı çeşitli glifleri gösterir. Yazı tipi tasarımcıları yalnızca emoji karakterlerini temsil etmek için kendi özgün tasarımlarını (gliflerini) benimsemekle kalmaz, tek tek yazı tipleri de destekledikleri emoji karakterlerinin sayısında farklılık gösterir (için glif içerirler) ve Unicode emoji belirtimlerinde yer alan daha gelişmiş emoji-metin işleme özelliklerini içerebilir veya içermeyebilir.

Karakterlerin kavramı ve nosyonu, semantiği ve kodlaması, Unicode dünyasının temelini oluşturur: Unicode karakterlerle ilgilenir. Tek tek karakterlerin glifler olarak tasarımı ve görsel temsili, yazı tipi teknolojilerine ve yazı tipi tasarımı zanaatına aittir.

#### Unicode emojisi: metin kodlamasından çok daha fazlası

Unicode’un temel rolü, her karakteri—emoji dâhil—Unicode kodlu bir metin akışı içinde temsil etmek için hangi tam sayı değerinin, yani bir *kod noktasının,* kullanılması gerektiğini tanımlayan küresel bir kodlama standardı sağlamaktır.

Unicode’un emoji için belirtimi ayrıca *işleme davranışlarını* belirli *dizileri* emoji karakterleri için tanımlar, bu karakterler Unicode kodlu bir metin akışı içinde görünür. Tanımlı emoji karakteri dizileri, şu adlı bir süreçle “birleştirilebilir”: [metin şekillendirme](#the-concept-of-text-shaping) tek bir sonuç (“bileşik”) emoji glifi üretmek için—bu tek glif, cihazın işletim sistemi tarafından metinde bulunan özgün karakter dizisini temsil etmek için kullanılır.

Unicode Emoji üzerine Unicode’un Teknik Raporu [Unicode Emoji](https://unicode.org/reports/tr51/) emoji karakterlerinin Unicode uyumlu işlenmesini sağlamak isteyen yazılımlar için mevcut olan zengin özellikler kümesini belgelendirir. Örneğin, Unicode şu adı verilen karakterleri tanımlar (kodlar): [emoji değiştiricileri](http://www.unicode.org/reports/tr51/#Emoji_Modifiers_Table) oluşturmak için kullanılabilen *çeşitlemeler* gibi “temel” emoji karakterlerinin [Fitzpatrick ölçeğine dayalı cilt tonu](http://www.unicode.org/reports/tr51/#Diversity). Temel emoji karakterleri kümesinin ve uygulanabilir değiştiricilerin genel [Unicode emoji standardının](http://www.unicode.org/reports/tr51).

bir parçası olarak tanımlandığını unutmayın [Emoji Dizileri](http://unicode.org/emoji/charts/emoji-sequences.html) sayfası, Unicode belirtiminin şu anda sağladığı dizilerin bir tablosunu sunar. Hangi emoji glif görüntüsünün üzerine olursa olsun fare işaretçisini getirin; o glifi üreten alttaki Unicode emoji karakter dizisini size söyleyen küçük bir açılır ipucu göreceksiniz:

![EmojiSequenceChart.png](/files/456466c804b5f3ff9780d1eca76cd37cf6fb925d)

Örneğin, şu emoji glifi:

![HandMediumSkinTone.png](/files/6375fa8b52f897a391b231001ead6da3e8e959e8)

listesinde yer alır [değiştirici dizileri bölümünde](http://unicode.org/emoji/charts/emoji-sequences.html#modifier_sequences) ve U+1F44B U+1F3FD iki karakterli dizisiyle üretilir. Bu bileşen karakterler şunlardır:

U+1F44B:![UnicodeWavingHandDefault.png](/files/7f5a8e96400d956605ab87ce6d51df28971a3fc9) (EL SALLAMA)

U+1F3FD:![FitzPatrick3.png](/files/b253989109a69bb0cd0e35ec247efca81cbe17da) (EMOJI DEĞİŞTİRİCİ FITZPATRICK TİP-4)

**LuaHBTeX’te cilt tonu değiştiricilerini kullanma**

Aşağıdaki örnek, emoji değiştiricilerinin kullanımını göstermek için LuaHBTeX kullanır:

```latex
\documentclass{article}
\usepackage{fontspec}
\begin{document}
\newfontfamily\emojifont[Renderer=HarfBuzz,SizeFeatures={Size=20}]{NotoColorEmoji.ttf}
Ayrı dalgalanan el: {\emojifont\Uchar"1F44B}\par
Ayrı değiştirici: {\emojifont\Uchar"1F3FD}\par
Birleşik sonuç: {\emojifont\Uchar"1F44B\Uchar"1F3FD}
\end{document}
```

[Bu LuaLaTeX emoji değiştiricileri örneğini Overleaf’te açın](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)

Bu örnek aşağıdaki çıktıyı üretir:

![ModifiersInLuaHBTeX.png](/files/70b1d7013a302790ac9f404ad67a8d24d36aff6d)

#### UTF-8: Unicode metnini saklamadaki rolü

Overleaf’in Kod Editörü’ne (veya Görsel Editör’e) yazdığınız ya da yapıştırdığınız her metin veya kod UTF-8 biçiminde saklanır; bu yüzden UTF-8’in gerçekte ne anlama geldiğini kısaca gözden geçirelim. UTF, Unicode Transformation Format anlamına gelir ve UTF-8’in Unicode kodlu metni saklama veya iletmedeki rolü, “Transformation *Format*” ifadesiyle belirtilir.

Unicode’un kod noktası değerleri 0’dan 1.114.111’lik bir maksimuma kadar uzanır; bu nedenle tüm Unicode karakter değerlerini tek bir 8 bitlik baytla temsil etmek imkânsızdır, çünkü bu yalnızca 256 farklı değer saklayabilir: 0’dan 255’e kadar. Ancak herhangi bir Unicode kod noktası tam sayısını, bir *ardışık dizi* bayt boyutunda değerlerden oluşan bir diziyle temsil etmek mümkündür—UTF-8’in arkasındaki ilke budur.

UTF-8, bir Unicode tam sayı kod noktası değerini 1 ila 4 ardışık bayt boyutlu tam sayıdan oluşan benzersiz bir diziye *dönüştürmek* (yani “kodlamak” veya “çevirmek”) için bir “tarif” sağlar; gereken ardışık bayt sayısı kod noktası tam sayısının değerine bağlıdır. Sonuç olarak, UTF-8’in Unicode karakterleri *çok baytlı diziler* olarak sakladığını okuyabilirsiniz; çünkü tek bir Unicode karakteri (kod noktası tam sayısı) UTF-8’de 1 ila 4 ardışık bayttan oluşan bir dizi olarak temsil edilir.

Doğal olarak, UTF-8’de saklanan metin, orijinal tam sayı Unicode kod noktası değerleri dizisine geri dönüştürülebilir—UTF-8 biçiminde saklanan bir LaTeX giriş dosyasını okurken XeTeX veya LuaTeX/LuaHBTeX’in yapması gereken de budur. Bu TeX motorlarının metni dizmeden önce giriş Unicode kod noktası (karakter) değerlerini bilmeleri gerekir. pdfTeX’in yerleşik bir UTF-8 çözme yeteneği olmadığını, bu yüzden UTF-8 biçiminde kodlanmış giriş metnini işlemek (çözmek) için TeX makrolarına dayanması gerektiğini unutmayın.

**Bazı UTF-8 örnekleri**

* Arap harfi ش (“şin”), onaltılık (taban 16) gösterimde Unicode kod noktası 0634’e ya da ondalık (taban 10) gösterimde 1588’e sahiptir. UTF-8’de ش, D8 ve B4 olmak üzere 2 (onaltılık) değerle temsil edilir; dolayısıyla ش karakteri UTF-8 kodlu metin içinde ardışık iki bayt olarak D8B4 biçiminde saklanır.
* Emoji karakteri 😀, onaltılık (taban 16) gösterimde Unicode kod noktası 1F600’e ya da ondalık (taban 10) gösterimde 128512’ye sahiptir. UTF-8’de 😀, F0, 9F, 98 ve 80 olmak üzere 4 (onaltılık) değerle temsil edilir; dolayısıyla 😀 karakteri bir UTF-8 metin dosyasında ardışık 4 bayt olarak F09F9880 biçiminde saklanır.

#### Unicode tabanlı emoji metin işlemede kullanılan özel karakterler

Unicode içinde kodlanan her karakter, bir yazı tipi içindeki glifler aracılığıyla görsel sunum için tasarlanmamıştır: bazı kodlu karakterler *yazdırılamayan karakterler* olarak belirlenmiştir; bunların amacı, destekleyen yazılım içinde özel metin işleme işlevlerine yardımcı olmaktır. Farklı yazılım uygulamaları, Unicode’a kodlanmış yazdırılamayan karakterler için farklı düzeylerde destek sağlar; bu nedenle sonuç, kullanılan yazılım ortamına—uygulamalara ve yazı tiplerine—bağlı olacaktır.

**Bilinmesi gereken iki yazdırılamayan karakter**

* **Sıfır genişlikli birleştirici (ZWJ)**, 200D kod noktası (onaltılık), adı da ima ettiği gibi, girdi karakterlerinin “birleşme davranışını” tetiklemek için tasarlanmıştır—ama yalnızca bu girdi karakterleri *sahipse* tanımlı bir birleşme davranışı.
* **Sıfır genişlikli ayırıcı (ZWNJ)**, 200C kod noktası (onaltılık), girdi karakterlerinin aksi halde sergileyebileceği “birleşme davranışını” *engellemek* engellemek için tasarlanmıştır. Örneğin, ZWNJ’yi normalde birleşen biçimlerine dönüştürülecek ardışık Arapça harflerin birleşme davranışını engellemek için kullanabilirsiniz.

Unicode, şu adlı bir liste yayımlamıştır: [Tavsiye Edilen Emoji ZWJ Dizileri](https://unicode.org/emoji/charts/emoji-zwj-sequences.html) U+200D SIFIR GENİŞLİKLİ BİRLEŞTİRİCİ (ZWJ) kullanarak emoji karakter dizilerini tek bir bileşik emoji glifine dönüştüren—eğer kullanılan yazı tipi/yazı tipleri içinde mevcutsa.

**Sıfır genişlikli ayırıcı kullanımına örnek**

Aşağıdaki minimal kod parçası, TeX Live’a dâhil olan Scheherazade OpenType yazı tipini kullanarak, LaTeX’te `\arabicfont` adlı bir yazı tipi tanımlar; bunu bazı Arapça metinleri dizmek için kullanabiliriz. Şu satır

```latex
{\arabicfont Non-joining:\textdir TRT\Uchar"0644\Uchar"200C\Uchar"0627}
```

bir sıfır genişlikli ayırıcı karakterini, yani `\Uchar"200C` kullanarak ل (lam) ve ا (elif) adlı iki Arap harfinin normal birleşme davranışını engeller. Metin yönünü sağdan sola olarak ayarlamak için `\textdir TRT` kullanımına dikkat edin:

```latex
\documentclass{article}
\usepackage{fontspec}
\begin{document}
\newfontfamily\arabicfont[Script=Arabic,Renderer=Harfbuzz,SizeFeatures={Size=40}]{Scheherazade}
{\arabicfont Joining:\textdir TRT\Uchar"0644\Uchar"0627}\par
{\arabicfont Non-joining:\textdir TRT\Uchar"0644\Uchar"200C\Uchar"0627}
\end{document}
```

[Bu LuaLaTeX örneğini Overleaf’te açın](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)

Bu örnek aşağıdaki çıktıyı üretir:

![NonJoiner.png](/files/66bc57a8bb1a1b1a13cb448045baf7a3101d7bec)

## “Metin şekillendirme” kavramı

Önce “educational” sözcüğünün Urduca çevirisini kullanan görsel bir örnekle başlayalım. Urduca çevirinin metni bir klavye ya da dokunmatik cihazda yazılabilir ve Unicode Arapça karakterlerinden oluşan basit, doğrusal bir dizi olarak oluşturulurdu. Ancak bu metin dizildiğinde veya bir cihaz ekranında [Nastalik tarzında](https://en.wikipedia.org/wiki/Nastaliq), sonuç gliflerin karmaşık iki boyutlu bir düzenlemesi olur.

Urduca örneğimizi kullanarak, aşağıdaki grafik Unicode Arapçasının doğrusal girişini *karakterlerini* Nastalik tarzında dizilmiş çıktıyla karşılaştırır; bu çıktı, *görüntülenmesi ve sunulması* içinde bulunan iki boyutlu bir düzenlemeyi içerir [Awami Nastaliq](https://software.sil.org/awami/download/):

![](/files/b452472473bfdd2d4a51dad0227cd11d93f0b2e7)

Girdi karakterlerini doğru konumlandırılmış çıkış glifleri kümesine “çevirme” sürecine *metin şekillendirme*şekillendirme

Metin şekillendirme, gibi yazı sistemleri kullanılırken gereklidir [Arapça](https://en.wikipedia.org/wiki/Arabic), [İbranice](https://en.wikipedia.org/wiki/Hebrew_language), [Devanagari](https://en.wikipedia.org/wiki/Devanagari) ya da [Malayalam](https://en.wikipedia.org/wiki/Malayalam)gibi *karmaşık yazı sistemleri*. Bu yazı sistemlerinde ve bunları kullanan dillerde metnin doğru sunumunu sağlamak için şekillendirme sürecinin, söz konusu yazı sistemi ve dil birleşiminde bulunan tüm şekillendirme kurallarını ve inceliklerini dikkatle ele alması gerekir. Örneğin bazı diller, belirli bir çıkış glifi üretmek için birden çok girdi karakteri gerektirir ya da ayırt edici işaretlerin dikkatli konumlandırılması ve tek tek gliflerin birbirlerine göre doğru konumlandırıldığından emin olmak için glifler arası yeniden düzenlemelere yönelik karmaşık gereksinimler olabilir.

Genel olarak, bir metin parçasını şekillendirmek birkaç bilgi parçası gerektirir:

* Yazı sistemi veya *alfabesi* metnin yazıldığı alfabe.
* Belirli *dili* kullanılan. Tek tek yazı sistemleri birden fazla dil için kullanılabilir; her yazı sistemi–dil birleşiminin kendine özgü biçimlendirme incelikleri/nüansları vardır.
* Yazı *yönü* metnin—sağdan sola veya soldan sağa gibi.
* Bir *yazı tipi* ki bu, biçimlendirilmiş metni temsil etmek için gereken glifleri sağlar ve isteğe bağlı olarak metin biçimlendirme sürecine rehberlik eden ek “biçimlendirme kuralları” içerir.

Metin biçimlendirme gereksinimleri, özellikle karmaşık yazı sistemleri ve bunların ilişkili dilleri için, son derece ayrıntılı ve nüanslı olabilir; bu da potansiyel olarak çok karmaşık metin biçimlendirme “kuralları” uygulayabilen özel yazılımlara ihtiyaç olduğunu gösterir. Şaşırtıcı olmayan biçimde, böyle bir yazılım vardır ve buna *metin biçimlendirme motoru*; üzerinde duracağımızın adı [Harfbuzz](https://en.wikipedia.org/wiki/HarfBuzz), belgeleri okunmaya değerdir—örneğin [Neden bir biçimlendirme motoruna ihtiyacım var?](https://harfbuzz.github.io/why-do-i-need-a-shaping-engine.html).

**Metin biçimlendirme hakkında daha fazla okuma**

Şu kısa girişler şiddetle tavsiye edilir:

* [Metin biçimlendirme nedir?](https://harfbuzz.github.io/what-is-harfbuzz.html#what-is-text-shaping)
* [Neden bir biçimlendirme motoruna ihtiyacım var?](https://harfbuzz.github.io/why-do-i-need-a-shaping-engine.html)

**Teknik not: birden çok biçimlendirme teknolojisi (model)**

HarfBuzz metin biçimlendirme motoru, biçimlendirme sürecini uygulama biçimleri farklı olan birkaç "biçimlendirme teknolojisini" destekler—her bir uygulamaya *biçimlendirici*, şunun içinde de: `luaotfload` belgelerinde. Bu makalenin ana odağı OpenType biçimlendirmedir ancak alternatif, ücretsiz kullanılabilen bir teknoloji [Graphite](https://scripts.sil.org/cms/scripts/page.php?site_id=projects\&item_id=graphite_aboutOT), tarafından geliştirilmiştir [SIL International](https://www.sil.org/). HarfBuzz tarafından desteklenen bir başka biçimlendirme modeli ise [Apple Advanced Typography (AAT)](https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6AATIntro.html)—AAT'yi destekleyen yazı tipleri genellikle Apple teknoloji platformlarında kullanılır.

**Graphite biçimlendiricisini kullanan örnek**

Aşağıdaki örnek, adı verilen bir yazı tipi kullanarak bazı Urduca metinleri dizgiler [Awami Nastaliq](https://software.sil.org/awami/download/), Graphite biçimlendirmeyi destekler ve Overleaf'te mevcuttur. Awami Nastaliq şu kuruluş tarafından oluşturulmuştur: [SIL International](https://www.sil.org/), Graphite teknolojisini geliştirmekten sorumlu kuruluş.

Aşağıdaki örnek, Graphite tabanlı yazı tiplerinin gelişmiş biçimlendirme yeteneğini gösterir— `luaotfload` yazı tipi bildirimi, Graphite biçimlendirmeyi şu şekilde seçer: `shaper=graphite2`.

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

\font\urdutest={file:AwamiNastaliq-Regular.ttf:mode=harf;shaper=graphite2} at 100bp
% Teknoloji
\pardir TRT\textdir TRT \urdutest ٹیکنالوجی

\vskip 75bp

% Eğitim
\pardir TRT\textdir TRT \urdutest تعلیمی
\end{document}
```

[Bu örneği Overleaf'te açın.](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)

Bu örnek aşağıdaki çıktıyı üretir:

![](/files/4d2d65c1050702330d5bca05b70bf4b7defb290c)

#### Emoji ve metin biçimlendirme

Metin biçimlendirme, karmaşık yazı sistemine sahip bir dil olan Urduca'dan örneklerle tanıtıldı. Ancak, doğru emoji glif(ler)inin oluşturulmasının, emoji karakter dizileri içeren Unicode metne metin biçimlendirme uygulanmasını gerektirdiğini öğrenmek şaşırtıcı olabilir—[HarfBuzz'ın baş geliştiricisinin belirttiği gibi](https://github.com/harfbuzz/harfbuzz/issues/2428#issuecomment-639108677):

> ...HarfBuzz ile emojileri biçimlendirmek tamamen kapsam dâhilindedir ve aile emojileri, ten rengi vb. elde etmek için gerçekten gereklidir.

Bunun örneklerine bakacağız.

### Sorumluluğun paylaşımı: metin biçimlendirme motoru + OpenType yazı tipleri

Uygulamada metin biçimlendirme, metin biçimlendirme motoruna yerleştirilmiş mantık ve kurallar ile kullanılan yazı tip(ler)ine yerleştirilmiş ek biçimlendirme kuralları ve veriler arasında bir “ortak çalışma” ya da iş bölümü şeklindedir—buradan itibaren yalnızca OpenType tabanlı biçimlendirmeyi ele alıyoruz *yalnızca*.

Metin biçimlendirmeyi gerçekleştirmek için, metin biçimlendirme motoruna genellikle bazı Unicode metin, belirtilen bir yazı sistemi ve dil, muhtemelen bir yazı yönü ve en önemlisi biçimlendirme sürecinde kullanılacak bir OpenType yazı tipi sağlanır—yazı tipi çıktıyı sağlar: bir glif kümesi ve konumlandırma verisi. İstenirse, biçimlendirme motoru ek kurallar da uygulayabilir ([OpenType özellikleri](https://en.wikipedia.org/wiki/List_of_typographic_features#OpenType_typographic_features)) kullanılan OpenType yazı tipinde bulunur—hangi kuralların uygulanacağı genellikle yazı tipinin desteklediği özellikler listesinden kullanıcı tarafından seçilebilir.

Biçimlendirme sürecinin sonucu bir *glif listesi* olur; OpenType yazı tipinde bulunan, şu bilgilerle birlikte: *glifler arası* konumlandırma verisi. Bu konumlandırma verisi, *biçimlendirilmiş gliflerin birbirine göre yerleşimiyle*; dizilmiş sayfa içinde veya bir web sayfası, Tweet vb. gibi diğer ortam/içeriklerdeki mutlak konumlandırmaya atıfta bulunmaz. Oluşturma yazılımı (dizgi motoru, web tarayıcısı vb.), glifler bir araya getirilip nihai çıktıya dâhil edildikten sonra birbirlerine göre doğru konumlandırılmalarını sağlamak için glifler arası konumlandırma bilgisini kullanır.

#### Glif listesi nedir?

Bir OpenType yazı tipinin içinde her bir glife, glif indeksi adı verilen bir tamsayı değer olan sayısal bir tanımlayıcı atanır; buna glif tanımlayıcısı ya da GID de denir. Metin biçimlendirme motoru biçimlendirme görevini tamamladıktan sonra sonuçlarını bir *glif tanımlayıcıları listesi* artı *konumlandırma verisi* olarak döndürür.

OpenType yazı tiplerindeki tek tek gliflere, yazı tipinin yaratıcısı tarafından indeksler (tanımlayıcılar) atanır; bu da onu son derece yazı tipine özgü ve keyfi bir değer yapar—ayrıca belirli bir yazı tipinin sürümleri arasında da değişebilir. Farklı yazı tiplerindeki “benzer” glifler için aynı GID değerinin geçerli olacağını asla varsaymamalısınız; neredeyse kesinlikle geçerli olmayacaktır. Bir biçimlendirme motoru tarafından sağlanan glif tanımlayıcıları listeniz varsa, bunları yalnızca elde edildikleri yazı tipindeki gliflere erişmek için kullanabilirsiniz.

#### OpenType yazı tipleri nedir?

Web, *dolu* OpenType yazı tiplerinin açıklamaları ve ayrıntılarıyla dolu olduğundan, kendimizi kısa bir tanımla sınırlayacağız.  [OpenType belirtimi](https://docs.microsoft.com/en-us/typography/opentype/spec/) geliştiriciler için tasarlanmış karmaşık bir belgedir, ancak özünde yazı tipi verileri için bir dosya biçimi ya da kapsayıcı tanımlar. Bir OpenType yazı tipi, glif şekillerini açıklayan verilerle birlikte desteklenen yazı sistemi(leri) ve dil(ler)e ilişkin bilgiler, yazı tipi hakkında üstveri ve yazı tipi tarafından desteklenen [tipografik özellikleri](https://en.wikipedia.org/wiki/List_of_typographic_features#OpenType_typographic_features) tanımlayan çeşitli “tablolar” içerir.

Bir metin biçimlendirme motoruna, genellikle bir yazı tipinin özelliklerini biçimlendirme süreci sırasında seçici olarak uygulaması (kullanması) söylenebilir; böylece yazı tipinde bulunan uygun glif kümesini seçen belirli tipografik etkiler (“kurallar”) uygulanır. Seçilen yazı tipinin, metin biçimlendirme motorundan uygulanması istenen herhangi bir özelliği desteklemesi ve bunlar için glifler sağlaması gerekir.

#### Kodlanmış ve kodlanmamış “glifler”

OpenType yazı tipleri, adı verilen bir veri tablosu içerir: [cmap](https://docs.microsoft.com/en-us/typography/opentype/spec/cmap) (Character to Glyph Index Mapping); bu tablo, yazı tipi tarafından desteklenen Unicode karakter kümesini o yazı tipindeki karşılık gelen glif indeksine eşler. Aşağıdaki video, adı verilen bir yazı tipinde bulunan cmap tablosuna kısa bir bakış sunuyor: `lmmono10-regiular.otf` (TeX Live'e dâhildir).

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

Ancak yazı tipleri genellikle belirli bir Unicode karakterini temsil etmeyen ve o cmap tablosunun bir parçası olarak yer almayan birçok glif içerir. Sonuç olarak, bir OpenType yazı tipinde bulunan glif kümesi iki ana kümeye ayrılabilir:

* Unicode karakterlerini temsil eden kodlanmış glifler;
* Unicode karakterlerini temsil etmeyen kodlanmamış glifler.

Kodlanmış gliflere, uygun Unicode karakteri metne eklenerek erişilebilir—peki ya kodlanmamış glifler, onlar nasıl kullanılır/erişilir? Bu glifler genellikle, belirli görsel/tipografik etkiler üretmek için yazı tipi özelliklerinin uygulanması da dâhil olmak üzere metin biçimlendirme işlemlerinin çıktısını sağlamak için kullanılır.

### OpenType renk yazı tiplerini

Emoji karakterlerinin tam renkli olarak görüntülenmesi/oluşturulması beklenir—siyah beyaz emojiler “tam emoji deneyimini” tam olarak sunmaz. Ancak Unicode’un emojiyi ilk kez kodladığı sırada, [OpenType yazı tipi belirtimi](https://docs.microsoft.com/en-us/typography/opentype/spec/) gömme için uygun herhangi bir düzenleme içermiyordu *colorful*-glif verisini OpenType yazı tipleri içinde barındırmak için. OpenType’taki bu “boşluk”, önde gelen teknoloji/platform sağlayıcılarını çözümler aramaya yöneltti ve ardından gelen “yarış” şu sonucu doğurdu: [OpenType’ı genişletmeye yönelik çeşitli öneriler](https://www.fontlab.com/news/color-font-format-proposals/) OpenType renkli yazı tiplerini desteklemek için—yalnızca renkli emoji karakterlerini (gliflerini) göstermek için değil, herhangi bir glifi renkli olarak oluşturmak için de.

#### OpenType renkli yazı tiplerinin dört çeşidi

[Adobe, Microsoft, Google ve Apple ayrı ayrı öneriler sundular](https://www.fontlab.com/news/color-font-format-proposals/) OpenType’ı tam renkli OpenType yazı tiplerini destekleyecek şekilde genişletmek için ve sonunda dört öneri kabul edilip resmi OpenType belirtimine dâhil edildi. Kolaylık olması için, bu dört varyantı kabaca vektör tabanlı ve raster tabanlı olarak gruplayabiliriz—ancak bu [GitHub deposu](https://github.com/simoncozens/test-fonts), görüldüğü gibi, OpenType belirtimi bu dört temel teknolojiyi birleştiren OpenType renkli yazı tipi dosyalarını destekleyecek kadar esnektir.

* **Vektör tabanlı OpenType yazı tipleri:**
* **Microsoft**: glif şekilleri, katmanlı renk vektörlerinin bir biçimi kullanılarak tanımlanır ([COLR](https://docs.microsoft.com/en-us/typography/opentype/spec/colr) ve [CPAL](https://docs.microsoft.com/en-us/typography/opentype/spec/cpal) tabloları).
* [**Adobe ve Mozilla**](https://www.w3.org/2013/10/SVG_in_OpenType/) ([SVG tablosu](https://docs.microsoft.com/en-us/typography/opentype/spec/svg)): glif şekilleri, vektörlerden oluşturulan glifleri destekleyen SVG kullanılarak çizilir *ve raster görüntüler*. Ayrıca bkz. [Adobe’nin SVG yazı tipleri için kullanıcı kılavuzu](https://helpx.adobe.com/fonts/user-guide.html/fonts/using/ot-svg-color-fonts.ug.html).
* **Raster tabanlı OpenType yazı tipleri:**
* **Google**: glifler, yazı tipine gömülü renkli PNG görüntüleriyle temsil edilir ([CBDT](https://docs.microsoft.com/en-us/typography/opentype/spec/cbdt) ve [CBLC](https://docs.microsoft.com/en-us/typography/opentype/spec/cblc) tabloları).
* **Apple**: glifler ayrıca yazı tipine gömülü renkli görüntülerle temsil edilir. PNG’ye ek olarak Apple’ın mekanizması ([sbix tablosu](https://docs.microsoft.com/en-us/typography/opentype/spec/colr)) JPEG ve TIFF’i de destekler.

Sonuç olarak, OpenType renkli yazı tiplerini destekleyen işletim sistemleri ve uygulama yazılımları günümüzdeki karma teknoloji ortamıyla başa çıkmak zorundadır. Ayrıca, tek tek OpenType renkli yazı tiplerinin—ve *sürümleri* aynı yazı tipinin—şu özelliklere sahip olacağını bilmelisiniz:

* tam kümesinin farklı kapsamına sahip olacaktır [Unicode emoji karakterlerinin](https://unicode.org/emoji/charts/emoji-list.html)—yani yazı tipinin kaç emoji karakteri için glif sağladığına;
* tek tek emoji karakterlerini temsil etmek için farklı glif tasarımları kullanacaktır;
* Unicode standartlarının daha gelişmiş kullanımlarını desteklemek için sağladıkları özelliklerde değişecektir, örneğin [emoji değiştiricileri](https://unicode.org/reports/tr51/#Emoji_Modifiers_Table)ve Unicode Teknik Standardı #51'de açıklanan diğer emoji metin işleme yetenekleri gibi [Unicode Teknik Standardı #51: Unicode Emoji](https://unicode.org/reports/tr51/).

#### HarfBuzz etrafındaki ilgi

Bir *metin biçimlendirme motoru*belirli bir yazı sistemi ve dil birleşimi kullanılarak yazılmış, giriş olarak alınan bazı Unicode metni, belirlenmiş bir yazı tipi kullanarak gliflerden oluşan bir diziye ve orijinal giriş metnini dizmek için kullanılabilecek konumlandırma verisine dönüştüren yazılıma duyulan ihtiyaca değindik:

[HarfBuzz](https://harfbuzz.github.io/) HarfBuzz bu tür bir metin biçimlendirme motorlarından biridir: o [açık kaynaklı bir kod kitaplığıdır](https://github.com/harfbuzz/harfbuzz) ve on yılı aşkın araştırma ve geliştirmenin ürünüdür—ayrıca XeTeX, LuaHBTeX, [Adobe PhotoShop ve Adobe InDesign](https://en.wikipedia.org/wiki/HarfBuzz).

HarfBuzz’ı dâhil ederek, TeX motorları onun gelişmiş metin biçimlendirme yeteneklerinden yararlanıp özellikle Arapça, İbranice, Devanagari ve daha birçok karmaşık yazı sistemi için son derece gelişmiş çok dilli dizgi sağlayabilir. Ayrıca HarfBuzz’ın, daha ayrıntılı inceleyeceğimiz Unicode emoji metin karakterlerini işlemek ve biçimlendirmek için kullanıldığını da not edin.

Aşağıdaki grafik, Arapça gibi karmaşık bir yazı sistemiyle metin dizgilenirken HarfBuzz’ın, XeTeX veya LuaHBTeX gibi yazılımlarla birlikte entegre edildiğinde oynadığı rolü özetler:

![HarfBuzz ile Arapça metin biçimlendirmeye genel bakış](/files/cd1e2341db0b5a9fb47d278976d582207a17e1bd)

**HarfBuzz’ı keşfetmek**

HarfBuzz ve XeTeX ile LuaHBTeX’e sağladığı OpenType biçimlendirme hizmetleri hakkında daha fazla bilgi edinmek isteyen herkes [HarfBuzz’ın ikili dağıtımını indirebilir](https://github.com/harfbuzz/harfbuzz/releases) ki bu, HarfBuzz kitaplığını (programcılar için) ve komut satırı yardımcı programlarını içerir `hb-view` ve `hb-shape`.

**hb-view nasıl kullanılır: örnek**

Tercih ettiğiniz UTF-8 destekli metin düzenleyicide yeni bir dosya oluşturun ve aşağıdaki altı emoji karakterini 👋👋🏻👋🏼👋🏽👋🏾👋🏿 bu metin dosyasına kopyalayıp yapıştırın, ardından UTF-8 biçiminde, örneğin adı verilen bir dosyaya kaydedin, `emoji.txt`.

Metin düzenleyicinizin, renkli glifleri oluşturamadığı için emojilerin siyah-beyaz sürümlerini yedek olarak gösterebileceğini unutmayın. Bu 6 emoji kaydedildikten sonra, dosya `emoji.txt` aşağıdaki Unicode emoji karakteri dizisi için UTF-8 verisi içermelidir—emoji değiştiricilerini yalnızca *okuma kolaylığı için*:

* `1F44B` şunu oluşturmak için: 👋
* `1F44B`, `1F3FB` şunu oluşturmak için: 👋🏻
* `1F44B`, `1F3FC` şunu oluşturmak için: 👋🏼
* `1F44B`, `1F3FD` şunu oluşturmak için: 👋🏽
* `1F44B`, `1F3FE` şunu oluşturmak için: 👋🏾
* `1F44B`, `1F3FF` şunu oluşturmak için: 👋🏿

Toplam **11** Unicode karakteri olmalıdır; her biri 4 bayt UTF-8 verisi oluşturur, dolayısıyla ortaya çıkan `emoji.txt` dosya, satırın sonundaki emoji içeren satır sonu işaretleri hariç olmak üzere 44 bayt uzunluğunda olmalıdır.

Bu `hb-view` yardımcı programı `emoji.txt`, uygun bir OpenType renkli yazı tipi ile birlikte, örneğin `NotoColorEmoji.ttf`, HarfBuzz’ın biçimlendirilmiş çıktısının bir SVG dosyasını oluşturmak için kullanılabilir. Aşağıdaki komut satırı örneği,  **tek satıra yazılmalıdır** terminalinizde, şu SVG dosyasını oluşturacaktır: `emoji.svg`:

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

Başarılı çalıştırma sonucunda, dosya `emoji.svg`, tarafından oluşturulan `hb-view`, Inkscape ile açılabilir ve aşağıdakine benzer görünmelidir:

![Hbvieemoji.png](/files/7b018770c40e812b3e9fff8cf16bc414de412667)

`hb-view` uygun herhangi bir Unicode metin dosyası ve OpenType yazı tipi için HarfBuzz biçimlendirmesini keşfetmek için kullanılabilir—kesinlikle yalnızca emojilerle kullanım için sınırlı değildir! Şunu yazın:

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

bu güçlü ve kullanışlı yardımcı programın komut satırı seçeneklerinin zenginliğini görmek için. Keyifli Biçimlendirmeler!

## Metin biçimlendirme ve TeX motorları

Burada, XeTeX ve LuaTeX ailesindeki TeX motorlarının metin biçimlendirme yeteneklerini gözden geçireceğiz.

### XeTeX

XeTeX 2000'lerin başında geliştirildi ve TeX tabanlı dizgide çeşitli yeniliklere öncülük etti; en dikkat çekeni *yerleşik* şunlar için destekti:

* Unicode metni UTF-8 biçiminde okumak;
* OpenType yazı tiplerini kullanmak;
* çok dilli dizgi için metin biçimlendirme;
* OpenType tabanlı matematik dizgisi.

XeTeX'in karmaşık yazı sistemine sahip dilleri kolayca ve rahatça dizme yeteneği, yerleşik metin biçimlendirme özelliklerinden kaynaklanır—başlangıçta artık kullanım dışı olan [ICU LayoutEngine](http://userguide.icu-project.org/layoutengine). Khaled Hosny'nin çalışmaları sayesinde XeTeX, Mart 2013'teki bir duyuruda belirtildiği gibi, metin biçimlendirme için HarfBuzz kullanmaya geçti [Mart 2013](https://tug.org/pipermail/xetex/2013-March/024118.html). Çok dilli metin dizmek isteyen herkes için XeTeX genellikle tercih edilen TeX motoru olarak anılır—ancak şimdi başka bir seçenek daha var: LuaHBTeX; bunu inceleyeceğiz.

### LuaTeX ve LuaHBTeX

LuaTeX'in geliştirilmesi yaklaşık 2005'te başladı, ancak XeTeX'den oldukça farklı bir tasarım felsefesini izledi; XeTeX yeni özellikleri *doğrudan* XeTeX yazılımının içine kattı. XeTeX'in aksine, LuaTeX geliştiricileri “...asgari bir araç kümesi ve çözüm yok” sunmayı tercih ettiler. (bkz. [LuaTeX için Başvuru Kılavuzu](https://www.pragma-ade.com/general/manuals/luatex.pdf)). LuaTeX tabanlı motorlara doğrudan yerleşik ek özellikler sağlamak yerine *yerleşik* LuaTeX motorlarının iç mekanizmaları geliştiricilerin ve yetkin kullanıcıların kendi çözümlerini oluşturabilmesi için açılmıştır; bunu entegre Lua betik dilinden yararlanarak yapabilirler.

Örneğin, XeTeX'in aksine LuaTeX motoru *doğrudan* OpenType yazı tiplerini kullanamaz; bunun yerine OpenType yazı tipleri, Lua kodu ile yazılmış yazı tipi yükleme işlevleri aracılığıyla yüklenip “kullanıma hazırlanmak” zorundadır. Bu yazı tipi yükleme işlevlerine *callback* fonksiyonları denir: bir yazı tipi yükleme isteği yapıldığında LuaTeX'in çağıracağı (“çalıştıracağı”) Lua kodu.

Ayrıca, LuaTeX motoru herhangi bir *yerleşik* metin biçimlendirme yeteneği sağlamaz—bunlar da LuaTeX motorunun kendisine metin biçimlendirme hizmetleri sağlamak için çağırabileceği dış kod tarafından sağlanmak zorundadır. Bu da, metin biçimlendirme yeteneklerini çekirdek yazılıma dâhil eden XeTeX motorundan farklıdır.

#### luaotfload: LuaTeX/LuaHBTeX'te OpenType yazı tiplerini kullanmak için gerekli

LuaTeX'in yazı tipi yükleme için callback mekanizması, ek programlama pahasına da olsa, büyük bir esneklik sağlar. Neyse ki LuaLaTeX kullanıcıları için TeX topluluğu şu adlı bir paket geliştirdi: `luaotfload`luaotfload [TeX Live'ın yıllık sürümünün](https://www.tug.org/texlive/) bir parçasını oluşturur ve elbette Overleaf kullanıcıları için de mevcuttur.

`luaotfload` şudur [CTAN'da mevcuttur](https://ctan.org/pkg/luaotfload?lang=en) ve bir [GitHub’daki geliştirme deposu](https://github.com/latex3/luaotfload) buradan en son gelişmeleri takip edebilir ve [yeni sürümler](https://github.com/latex3/luaotfload/releases).

`luaotfload` doğrudan bir LaTeX belgesinin önsözüne şu şekilde yüklenebilir:

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

Şuna dikkat edin: `luaotfload` bir LaTeX *paketini*paketinin adıdır, yani dosya adı `luaotfload.sty`olur. Eğer `luaotfload` dosyasını düz TeX ile kullanmak isteseydiniz, şu satırı ekleyerek bunu yapabilirsiniz:

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

düz TeX belgenize.

Normalde, LuaLaTeX kullanıcıları—yani LaTeX'i LuaTeX/LuaHBTeX kullanarak dizenler—doğrudan `luaotfload` çünkü [`fontspec` paketini](https://ctan.org/pkg/fontspec) ile uğraşmak zorunda değildir `luaotfload` sizin için paketi yükler ve kullanıcı düzeyindeki komutlar aracılığıyla birçok düşük düzey ayrıntıyı halleder `fontspec` paketi.

### LuaHBTeX: metin biçimlendirme için yeni seçenekler

`luaotfload` olgun ve güçlü bir Lua kitaplığıdır; LuaTeX'in OpenType yazı tiplerini işlemesini—ayrıca çeşitli diller ve yazı sistemleri için metin biçimlendirme hizmetleri sunmasını—sağlar. Başlangıçta,  `luaotfload` metin biçimlendirme işlevleri saf Lua koduyla uygulanıyordu, ancak TeX Live 2020 sürümünün yayımlanması metin biçimlendirme için başka bir ana akım seçenek getirdi: LuaHBTeX adlı yeni bir LuaTeX tabanlı motor.

LuaHBTeX'teki “HB”, HarfBuzz anlamına gelir—özü itibarıyla LuaHBTeX, orijinal LuaTeX motorudur *artı* entegre bir HarfBuzz metin biçimlendirme motoruna sahip. *otomatik olarak* metnin LuaHBTeX tarafından biçimlendirileceğini garanti etmez: HarfBuzz, metin biçimlendirme çözümleri oluşturmak için kullanılabilecek başka bir araçtır.

LuaHBTeX'in HarfBuzz entegrasyonu [Lua kodu aracılığıyla programlanabilir](#introduction-to-the-luahbtex-harfbuzz-api), bu da `luaotfload`geliştiricilerinin HarfBuzz tabanlı metin biçimlendirme çözümleri eklemesini sağlamıştır. Sonuç olarak, [3.1 sürümünden itibaren, 5 Kasım 2019'da yayımlanan](https://github.com/latex3/luaotfload/releases/tag/v3.1), `luaotfload` HarfBuzz'ın avantajlarından yararlanacak şekilde geliştirildi—bu da HarfBuzz'ın metin biçimlendirme yeteneklerini genel kullanıcı için kolayca erişilebilir hale getirdi.

HarfBuzz'ın LuaTeX ile entegrasyonunun teknik ayrıntılarıyla ilgilenen okuyucular bu [Khaled Hosny'nin makalesini](https://www.tug.org/TUGboat/tb40-1/tb124hosny-harfbuzz.pdf).

### luaotfload: metin biçimlendirme için iki seçenek (HarfBuzz ne zaman kullanılmalı?)

LuaLaTeX kullanıcılarının artık metin biçimlendirme için iki seçeneği var:

* `luaotfload`kendi orijinal (düğüm tabanlı) metin biçimlendirme uygulaması; tamamen Lua ile yazılmıştır;
* `luaotfload`HarfBuzz tabanlı biçimlendirmesi—HarfBuzz'ın metin biçimlendirme işlevlerini çağıran Lua kodu aracılığıyla erişilir.

`luaotfload` bu iki biçimlendirme sistemine “`mod`” parametresi aracılığıyla erişim sağlar—ancak çoğu kullanıcı bunun eşdeğeri olan `fontspec` “`Renderer`” seçeneğini kullanacak, doğrudan `luaotfload`.

Her bir `luaotfload`metin biçimlendirme çözümünün kendi güçlü yönleri ve (mevcut) zayıflıkları vardır; peki hangisini ne zaman kullanmalısınız? İşte dikkate alınması gereken bazı noktalar:

* `luaotfload`yerel düğüm tabanlı işleme, özellikle büyük CJK OpenType yazı tipleri için bellek yoğun olabilir. CJK metni biçimlendirmede HarfBuzz kullanmak hız artışı ve bellek kullanımında azalma sağlayabilir.
* Karmaşık yazı sistemleri için HarfBuzz kullanın; çünkü o “...Hint ve Arap yazı sistemlerinin oluşturulmasını büyük ölçüde iyileştirir ve bu tür yazı sistemleri için şiddetle tavsiye edilir.” (bkz. `luaotfload` kılavuz).
* HarfBuzz'ın `luaotfload` ile entegrasyonu hâlâ nispeten yenidir ve daha fazla geliştirme sürecindedir. Bu yazının yazıldığı tarihte (Temmuz 2021), ana belge yazı tipleriniz için luaotfload’un yerleşik biçimlendirmesini kullanmanız önerilir (şunu ayarlayarak `mode=node`), özellikle belgeniz Latin yazı sistemini kullanıyorsa. Şu [GitHub sorusuna](https://github.com/latex3/luaotfload/issues/175#issue-801120377)bakın; sorunları ve tartışmaları özetler. Denemek istiyorsanız, bir yazı tipi dosyasını yüklemek ve iki LaTeX yazı tipi oluşturmak için `luaotfload` kullanabilirsiniz: biri HarfBuzz tabanlı biçimlendirme kullanan, diğeri Lua tabanlı biçimlendirme kullanan. Overleaf bunun için bir [örnek proje](#sample-project-arabic-shaping)oluşturdu; bu projeyi gösterir.
* Matematiksel yazı tiplerini işlemek için HarfBuzz kullanmayın. tex.stackexchange'deki geliştiricilerin belirttiği gibi, HarfBuzz [matematiksel dizgi için yazı tiplerini işlemek üzere tasarlanmamıştır](https://tex.stackexchange.com/questions/544881/does-luahbtex-with-harfbuzz-renderer-completely-supports-math-formating) bu nedenle bu amaçla kullanmayın.

**Örnek proje: Arapça biçimlendirme**

İşte birkaç yüksek kaliteli Arapça yazı tipini kullanarak `luaotfload`’nin düğüm tabanlı metin biçimlendirme hizmetlerini (`mode=node`) HarfBuzz'unkilerle karşılaştıran (`mode=harf`):

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

Bu proje aşağıdaki görüntüde gösterilen çıktıyı içerir:

![Arapça dizgi](/files/687a6b2b48243d6c824a6441caac207a8adb8c9d)

### fontspec içindeki “Renderer”ın seçimi

belirtildiği gibi [belgelere](https://mirror.ox.ac.uk/sites/ctan.org/macros/unicodetex/latex/fontspec/fontspec.pdf), `fontspec` “...kullanıcıların XeTeX ya da LuaTeX kullanarak bir LaTeX belgesine OpenType yazı tipleri yüklemesine olanak tanır”. LuaTeX veya LuaHBTeX motorlarını kullanıyorsanız, `fontspec` ile uğraşmak zorunda değildir `luaotfload` kitaplığı sizin için ve ayrıca `luaotfload`’nin düşük düzey işlevselliğiyle uğraşma ihtiyacını azaltan kullanışlı kullanıcı düzeyi komutlar sunar.

Peki HarfBuzz biçimlendirmesi ile `luaotfload`tarafından sağlanan yerleşik biçimlendirme arasında nasıl seçim yaparsınız? Cevap, mükemmel [`fontspec` belgelere](https://mirror.ox.ac.uk/sites/ctan.org/macros/unicodetex/latex/fontspec/fontspec.pdf)içindedir, özellikle Bölüm VI: Yalnızca LuaTeX yazı tipi özellikleri. `fontspec` şu adlı bir ayar sağlar: `Renderer` şu `fontspec`. `Renderer` olarak yazı tipi tanımlandığında ayarlanabilir; yazı tipinin düşük düzeyde işlenmesini denetler. İlgilenilen iki seçenek şunlardır:

* `Renderer = Node`: OpenType yazı tiplerini dizmek için varsayılan “mod”—bu, `luaotfload`’nin tamamen Lua ile uygulanmış metin biçimlendirme işlevlerini kullanır.
* `Renderer = Harfbuzz`: bu “mod”, yazı tipini HarfBuzz metin biçimlendirme motoruyla kullanılmak üzere tanımlar/yükler. `luaotfload` LuaHBTeX'in API’sini kullanarak HarfBuzz’daki işlevleri çağırır.

Daha fazla bilgi için bkz. [`fontspec` belgelere](https://mirror.ox.ac.uk/sites/ctan.org/macros/unicodetex/latex/fontspec/fontspec.pdf).

## TeX motorları, HarfBuzz ve renkli emoji

XeTeX ve LuaHBTeX her ikisi de HarfBuzz’ı entegre etse de, HarfBuzz’ın daha gelişmiş özelliklerinden bazıları için farklı destek düzeyleri sağlarlar—en önemlisi OpenType renkli yazı tiplerini yükleme ve kullanma.

### XeTeX ve OpenType renkli yazı tipleri

Belirtildiği gibi, yazı tipi gliflerini depolamak için kullanılan veri biçimine dayanan iki OpenType renkli yazı tipi kategorisi vardır: vektör tabanlı ve raster tabanlı.

#### XeTeX ve raster tabanlı OpenType renkli yazı tipleri

XeTeX, Google’ınki gibi raster tabanlı OpenType renkli yazı tiplerini yükleyemez— [Noto Color Emoji](https://www.google.com/get/noto/help/emoji/) TeX Live 2020 ile birlikte gelir. Örneğin, Noto Color Emoji (NotoColorEmoji.ttf) yüklemeye çalışırsanız, XeLaTeX, Noto Color Emoji’nin “bulunamadığını” iddia eden ve potansiyel olarak yanıltıcı bir hata ile başarısız olur. Aşağıdaki LaTeX kodu, XeLaTeX kullanılarak dizildiğinde, *çalışmaz*:

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

[Bu XeLaTeX kodunu Overleaf’te açın ( ***sonlanmıyor;*** çalışmaz).](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)

Şu hata ile başarısız olur:

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

Benzer şekilde, XeTeX tarafından işlenen basit bir Plain TeX örneği de başarısız olur

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

[Bu Plain TeX (XeTeX) örneğini Overleaf’te açın ( ***sonlanmıyor;*** çalışmaz).](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 örneği benzer, ancak farklı bir hata mesajı verir:

```
! Font \emojifont=[NotoColorEmoji.ttf] at 12.0pt not loadable: Metric (TFM) fil
e veya kurulu yazı tipi bulunamadı.
l.1 \font\emojifont="[NotoColorEmoji.ttf]" at 12pt

Bu yazı tipi için boyut verilerini okuyamadım,
bu yüzden yazı tipi belirtimini yok sayacağım.
[Ustalar TFM dosyalarını TFtoPL/PLtoTF kullanarak düzeltebilir.]
Farklı bir yazı tipi belirtimi eklemeyi deneyebilirsiniz;
örn. `I\font<aynı yazı tipi kimliği>=<yerine kullanılacak yazı tipi adı>'.
```

**Plain LuaHBTeX örneği**

Karşılaştırma için, LuaHBTeX ile derlenen minimal bir Plain TeX örneği burada

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

[Bu Plain TeX (LuaHBTeX) örneğini Overleaf’te açın (başarıyla derlenir).](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’in başarısızlığının asıl nedeni

XeTeX tarafından verilen hata mesajları, sorunun gerçek nedenini kısmen gizler: raster tabanlı çeşitler özellikle olmak üzere OpenType renkli yazı tipleri *yapmaz* XeTeX tarafından desteklenir. Gerçekte, XeTeX (Kpathsea) *bulabilir* Noto Color Emoji yazı tipini, ancak XeTeX bu yazı tipini tam olarak *yükleyemez* ve bu yazı tipini dizgide kullanmak için gerekli dahili yazı tipi-veri tablolarını başlatamaz. Dahili olarak, XeTeX *başladığında* yazı tipini yükleme sürecini işler ve yazı tipinin dizgi için kullanılabilmesi için “ölçeklenebilirlik” (FreeType’ın “ölçeklenebilirlik” “tanımı” kullanılarak) test eder, ancak bu test başarısız olur ve XeTeX standart, tartışmalı biçimde yanıltıcı bir TeX motoru hata mesajı verir.

**Teknik not**

NotoColorEmoji.ttf dosyasının XeTeX tarafından işlenmesi, XeTeX yürütülebilir dosyasının hata ayıklamalı bir sürümü derlenerek incelendi. Eclipse IDE, XeTeX işlevi üzerinde bir kesme noktası ayarlamak için kullanıldı `creatFontFromFile(filename, index, pointsize)`, ardından sonraki işleme adımlarını gözlemlemek için kodda adım adım ilerlenildi.

#### XeTeX ve vektör tabanlı OpenType renkli yazı tipleri

XeTeX *yükleyemez* vektör tabanlı OpenType renkli yazı tiplerini kullanabilir, ancak ortaya çıkan PDF’de renkli emoji üretmez—eğer XeTeX bir PDF üretirse. LuaTeX, LuaHBTeX ve pdfTeX’in aksine, XeTeX dizilmiş belgeleri PDF biçiminde çıktılama *doğrudan*  yapmaz. Bunun yerine, XeTeX ara bir `.xdv` (u**x**zatılmış **dv**i) dosya biçimi üretir; bu biçim `xdvipdfmx` adlı bir yardımcı program tarafından PDF’ye dönüştürülür. Yazının kaleme alındığı tarihte, `xdvipdfmx` uygun renkli emoji glifi verisini PDF’ye gömme işlemini gerçekleştiremez; bu yüzden en iyi ihtimalle PDF’de tek renkli emoji—“yedek” sonuç—görürsünüz ya da kullanılan yazı tipine bağlı olarak hiçbir şey göremeyebilirsiniz.

İşte OpenType renkli yazı tipi [TwemojiMozilla.ttf](https://ctan.org/tex-archive/fonts/twemoji-colr) kullanan bir XeLaTeX örneği; bu yazı tipi TeX Live’da mevcuttur. TwemojiMozilla.ttf, renkli glifleri depolamak için Microsoft’un COLR/CPAL vektör biçimini kullanır ve TeX Live 2020 ile birlikte gelir. Bu örnekte, XeTeX yazı tipini yükleyebilir, bir `.xdv` ve PDF dosyası oluşturabilir, ancak emoji glifi dizilmiş PDF’de bulunmaz:

```latex
\documentclass{article}
\usepackage{fontspec}
\begin{document}
\newfontfamily\emojifont{TwemojiMozilla.ttf}
\newcommand{\smiley}{{\emojifont\char"1F600}}
İşte bir gülümseme: \smiley
\end{document}
```

[Bu XeLaTeX kodunu Overleaf’te açın (ÇALIŞMAZ).](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)

Buna karşılık, yukarıdaki kod, LuaLaTeX ile birlikte şu şekilde tanımlarsanız çalışır `\emojifont` kullanarak `fontspec` ayarını `[Renderer=HarfBuzz]`:

```latex
\documentclass{article}
\usepackage{fontspec}
\begin{document}
\newfontfamily\emojifont{TwemojiMozilla.ttf}[Renderer=HarfBuzz]
\newcommand{\smiley}{{\emojifont\char"1F600}}
İşte bir gülümseme: \smiley
\end{document}
```

[Bu LuaLaTeX kodunu Overleaf’te açın (çalışır).](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 ve OpenType renkli yazı tipleri

Dahili HarfBuzz biçimlendirme motoru ve `luaoftload` kütüphanesi sayesinde LuaHBTeX, OpenType renkli yazı tipinin dört çeşidinin tümünü destekler. LuaLaTeX kullanıcıları, emoji karakterleri içeren metinlerin Unicode tabanlı işlenmesinin tüm avantajlarından yararlanabilir veya OpenType renkli yazı tipleri kullanarak belgelerini sadece son derece renkli metinlerle süsleyebilir.

Daha önce belirtildiği gibi, OpenType renkli yazı tipinin dört çeşidi iki gruba ayrılabilir:

* PNG gibi raster görüntü biçimlerindeki glifleri içerenler;
* SVG ya da Microsoft’un COLR/CPAL mekanizmasını kullanan vektör tabanlı biçimler.

Vektör tabanlı glif biçimlerinin avantajı ölçeklenebilir olmalarıdır: her punto boyutunda keskin glif grafikleri üretirler.

**LuaHBTeX ile Microsoft COLR/CPAL renkli yazı tiplerini kullanma**

OpenType renkli emoji yazı tipleriniz için bir vektör biçimi kullanmak istiyorsanız, [TwemojiMozilla.ttf](https://ctan.org/tex-archive/fonts/twemoji-colr?lang=en) yazı tipine göz atın; bu yazı tipi Microsoft’un COLR/CPAL biçimine dayanır. TwemojiMozilla.ttf, TeX Live ile birlikte gelir, ancak en son sürümü onun [GitHub deposu](https://github.com/mozilla/twemoji-colr/releases) adresinden edinebilir ve Overleaf projenize yükleyebilirsiniz.

İşte küçük bir, `fontspec`-tabanlı, bir örnek `Renderer=Harfbuzz` kullanarak, büyük (vektör) bir emoji ördeği dizen:

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

[Vektör bir ördeği dizmek için bu LuaLaTeX örneğini açın.](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)

İşte yukarıdaki örneğin ürettiği (vektör) ördek:

![](/files/8c81ab472e12163dd4f930c383fea8949eb2b6d4)

#### LuaHBTeX ile SVG tabanlı OpenType renk yazı tiplerini kullanma

Bu makale güncellemesinin yazıldığı tarihte (Temmuz 2023), SVG çeşidi OpenType renkli yazı tiplerini LuaLaTeX ile kullanmaya dair çok az resmi belge vardır. Çevrimiçi tartışmalarda yapılan bazı [yorumlar](https://github.com/latex3/luaotfload/issues/96) şunu önermektedir `fontspec`’nin `RawFeature`, aşağıdaki sözde kodda gösterildiği gibi. Değiştirin `*SVG yazı tipi dosya adınız buraya*` LaTeX kodunuzun erişebildiği bir SVG tabanlı yazı tipi dosyasının adıyla:

```latex
\documentclass{article}
\usepackage{fontspec}
\begin{document}
\newfontfamily\emoji[RawFeature={+svg},SizeFeatures={Size=20}]{SVG yazı tipi dosya adınız buraya}
\emoji Emoji’niz burada...
\end{document}
```

Eğer `fontspec` ögesini atlar ve `luaotfload` doğrudan yüklerseniz, aşağıdaki şekilde bir yazı tipi tanımlayıp belirtmeniz gerekebilir—deneylerimiz bunun çalışması için `mode=harf` seçeneğini atlamanız gerektiğini gösteriyor:

```latex
\font\emoji=[SVG yazı tipi dosya adınız buraya]:+svg;
```

**Bazı dikkat notları**

SVG çeşidi OpenType renkli yazı tiplerini kullanmak isteyen okuyucular şunlara dikkat etmelidir:

* çok sayıda glif içeren SVG çeşidi OpenType yazı tipleri [LuaLaTeX için hesaplama açısından pahalı olabilir](#processing-svg-glyph-data) ve bu durum potansiyel olarak [Overleaf zaman aşımı](/latex/tr/bilgi-bankasi/038-fixing-and-preventing-compile-timeouts.md).
* LuaLaTeX’in bu yazı tiplerine desteği [deneysel olarak değerlendirilebilir](https://github.com/latex3/luaotfload/issues/96#issuecomment-530317399): sonuçlar, projenizin kullandığı TeX Live sürümüne göre değişebilir; bu nedenle denemek ve dikkatli ilerlemek tavsiye edilir.

**SVG glif verisinin işlenmesi**

SVG, tasarımcıların bir yazı tipinin gliflerini temsil eden karmaşık ve renkli tasarımlar üretmesini sağlar—OpenType belirtiminde [belgelenmiş bazı SVG kısıtlamalarına tabi olarak](https://docs.microsoft.com/en-us/typography/opentype/spec/svg). Ancak LuaHBTeX dâhil TeX motorları, SVG dosyalarını ya da verilerini doğrudan içe aktaramaz (kullanamaz)—SVG çeşidi OpenType renkli yazı tipleri içindeki glif şekillerini tanımlamak için kullanılan SVG verisi gibi. Bir glifin SVG verisi PDF biçimine dönüştürülmelidir; çünkü LuaHBTeX bunu glifi dizmek ve son PDF belgesini üretmek için kullanabilir. Bu SVG’den PDF’ye dönüştürme işlemi, Lua kodu tarafından `luaoftload`: her glifin SVG verisi yazı tipi dosyasından çıkarılır, geçici bir `.svg` dosyasına kaydedilir ve komut satırı üzerinden Inkscape kullanılarak PDF’ye dönüştürülür. SVG verisini çıkarmak ve PDF’ye dönüştürmek bir miktar işlem yükü getirir; bu da özellikle binlerce emoji glifi içeren büyük SVG yazı tiplerini kullanan belgelerde uzun derleme sürelerine yol açabilir.

#### Raster tabanlı OpenType renkli yazı tipleri

**LuaHBTeX ile Google’ın CBDT/CBLC OpenType renkli yazı tipi biçimini kullanma**

[Noto Color Emoji](https://fonts.google.com/noto/specimen/Noto+Color+Emoji) TeX Live’a dâhil edilen bir OpenType renkli yazı tipidir ve bir Overleaf projesinde kullanmayı kolaylaştırır. Noto Color Emoji, emoji gliflerini temsil etmek için PNG biçiminde grafikler kullandığından, aşağıdaki örnekte gösterildiği gibi büyük (raster) bir ördek emojisini dizmek için kullanabiliriz. Yine dikkat edin ki `fontspec` yazı tipi bildirimi (`\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}
```

[Raster bir ördek dizmek için bu LuaLaTeX örneğini açın.](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)

İşte yukarıdaki örneğin ürettiği raster ördek:

![LaTeX tarafından dizilmiş raster bir ördek emojisi](/files/5047a6def97b542077c9aefa447886179a2724ea)

Eğer `NotoColorEmoji.ttf` kullanmayı deneyip `[Renderer=Harfbuzz]` şu paketten: `fontspec` bildirimini atlarsanız, LuaHBTeX başarısız olur ve PDF dosyasını yazmaya çalıştığında bir hata mesajı verir:

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

Bu hatanın nedeni [loca tablosunda](https://docs.microsoft.com/en-us/typography/opentype/spec/loca) şudur [GitHub’da açıklanmıştır](https://github.com/latex3/luaotfload/issues/98#issuecomment-531610153).

**LuaHBTeX ile Apple’ın sbix OpenType renkli yazı tipi biçimini kullanma**

Çevrimdışı testler, LuaHBTeX’in OpenType renkli yazı tipinin `sbix` çeşidini desteklediğini gösterir; ancak bu makalenin yazıldığı tarihte, bir ördeği dizmek için kullanılabilecek uygun lisanslı bir `sbix`-çeşidi renkli emoji yazı tipi bulamadık. Lütfen [bize ulaşın](https://www.overleaf.com/contact) böyle bir yazı tipi biliyorsanız bize bildirin; biz de bu makaleyi hızla ona göre güncelleyelim.

## LuaHBTeX HarfBuzz API’sine giriş

![Db.gif](/files/35915fca63b8a8e8f243f5dfdae05e8eb19d6a24) ![Db.gif](/files/35915fca63b8a8e8f243f5dfdae05e8eb19d6a24)

Metin biçimlendirme, özellikle karmaşık betikli diller ve hatta emoji için, doğası gereği zor bir iştir; bu nedenle HarfBuzz, metin biçimlendirme işlemlerine zaten aşina değilseniz çalışması zor olabilen gelişmiş bir kütüphanedir—. Bu son bölümde, LuaHBTeX’in HarfBuzz entegrasyonuna ve Lua kodu aracılığıyla buna nasıl erişileceğine bakıyoruz `\directlua`.

Örneğimiz, LuaHBTeX HarfBuzz API’sini göstermek için oldukça temel kod kullanır. Biraz yapaydır, üretim seviyesi kaliteye sahip değildir ve çok pratik de değildir; çünkü tek amacı bazı temel fikirleri tanıtmaktır. Lua kodunu iki `\directlua` parçaya ayırdık: ilki `luaharfbuzz` kütüphanesini yükler ve ikinci `\directlua` parçamızda kullanacağımız bazı genel değişkenler oluşturur; bu ikinci parçada `\codestoemoji`.

Knuth’un çift tehlikeli kıvrım işaretlerini kullanmasını yeniden üretmek uygun görünüyor (görselin izniyle [bu site](http://www.truetex.com/db.htm)) çünkü içerik biraz düşük seviyeli ve “kaputu kaldırıp içeri bakıyor”—gerçi daha maceracı okur için ilginç olacağını umuyoruz. LuaHBTeX’in HarfBuzz entegrasyonu şu projeden türetilmiştir [GitHub’daki luaharfbuzz projesinden](https://github.com/ufyTeX/luaharfbuzz/wiki#projects-using-luaharfbuzz) burada bir [projeye giriş](https://github.com/ufyTeX/luaharfbuzz/wiki) ve [luaharfbuzz API listesini](http://ufytex.github.io/luaharfbuzz/).

### İlk adımlar: luaharfbuzz kütüphanesini yükleyin ve bir yazı tipi bulun

LuaHBTeX’in HarfBuzz API’sini kullanmak için önce LuaHBTeX’in içine yerleşik `luaharfbuzz` adlı kütüphaneyi (modülü) yüklememiz ve dönen tabloyu bir (global) değişkende saklamamız gerekir; buna `hblib`:

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

Sonra, uygun bir emoji OpenType renkli yazı tipi bulmamız gerekir: Noto Color Emoji’yi kullanacağız—bulamazsak herhangi bir hata denetimi yapmadan tembel davrandığımızı not edin! Onu bulmak için `kpse` (Kpathsea) kütüphanesini kullanacağız; bu da LuaTeX/LuaHBTeX’in bir parçasıdır:

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

Artık HarfBuzz kütüphanesine değişkenimiz aracılığıyla erişebildiğimize göre `hblib`, ve uygun bir yazı tipinin yoluna (`pathtofontfile`), `hblib` kullanmaya başlayabiliriz. Başlangıç olarak, makromuzu tanımlayacağımız ikinci `\directlua` kod parçasında kullanılmak üzere bir HarfBuzz yazı tipi ve HarfBuzz yüzü oluşturacağız.

```latex
% Noto Color Emoji’den HarfBuzz yüzü ve HarfBuzz yazı tipi oluştur
hbface = hblib.Face.new(pathtofontfile)
hbfont = hblib.Font.new(hbface)
```

#### HarfBuzz yazı tipi ve HarfBuzz yüzü: bunlar nedir?

Bir [HarfBuzz yüz nesnesi](https://harfbuzz.github.io/fonts-and-faces.html) bir yazı tipi dosyasından yüklenen bir fontu temsil eder, ancak belirli parametreler (örneğin boyut) ayarlanmamıştır. Bir [HarfBuzz yazı tipi nesnesi](https://harfbuzz.github.io/fonts-and-faces.html) bir *belirli örneği* temsil eder; dolayısıyla tek bir HarfBuzz yüzünden farklı HarfBuzz yazı tipi nesneleri türetilebilir: her HarfBuzz yazı tipi, boyut gibi özellikleri farklı değerlerde ayarlanmış olabilir. HarfBuzz yüzü, HarfBuzz yazı tipinden daha üst düzey bir soyutlamadır.

### Yazı tipi gliflerini kullanarak PNG dosyaları oluşturma

İlk `\directlua` parçamızın son bölümü `writePNGglyph(hbfontobject, glyphID)` adlı bir işlevdir; bunu, Noto Color Emoji gibi bazı OpenType renkli yazı tiplerinin içerdikleri emoji gliflerini temsil etmek için PNG grafikler kullandığını göstermek için kullanıyoruz.

Bu işlev, LuaHBTeX’in HarfBuzz API’sini kullanarak gliflerden PNG verisini çıkarır ve bu veriyi bir `.png` adı verilen `Graphics<glyphID>.png`. dosyasına yazar. Bu `.png` dosyanın adı `\includegraphics` dizilmiş PDF’mize PNG glif görüntülerini gömmek için

tarafından döndürülür. `writePNGglyph(hbfontobject, glyphID)` yerine, ilk `\directlua` kod parçamız şöyle görünür:

```latex
\directlua{

% luaharfbuzz kütüphanesini LuaHBTeX’ten yükle
hblib=require("luaharfbuzz")

% Noto Color Emoji yazı tipini Overleaf’in sunucusunda bul
pathtofontfile=kpse.find_file("NotoColorEmoji.ttf","truetype fonts")

% Noto Color Emoji’den HarfBuzz yüzü ve HarfBuzz yazı tipi oluştur
hbface = hblib.Face.new(pathtofontfile)
hbfont = hblib.Font.new(hbface)

% Bu işlev bir yazı tipi ve bir glif kimliği kabul eder:
% gliflerin PNG verisini çıkarır ve
% bunu bir .png dosyasına yazar

function writePNGglyph(hbfontobject, glyphID)

    % Glif PNG verisini al
    local pngblob=hbfontobject:ot_color_glyph_get_png(glyphID)
    local pngdata=pngblob:get_data()

    % .png dosyamız için bir dosya adı oluştur
    local fname="Glyph"..glyphID..".png"

    % .png dosyasını yaz ve dosya adını döndür
    local output = assert(io.open(fname, "wb"))
    output:write(pngdata)
    output:close()

    % \includegraphics’in kullanması için dosya adını döndür
    return fname
end
}
```

### İkinci \directlua parçası: \codestoemoji makrosunu oluştur

Amaç, bir makro tanımlamaktır `\codestoemoji` ve bunu HarfBuzz’ın biçimlendirmesini istediğimiz emoji karakter kodlarını içeren bir metin parçasıyla çağırabiliriz. Özellikle, her emoji karakterini temsil etmek için `\Uchar<karakter kodu>` kullanacağız; örneğin:

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

Tanımında çok şey oluyor `\codestoemoji` ve bunu aşağıda açıklayacağız, ancak tanım şöyle görünür:

```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()
    % glifler tablosu, hbglyphs, 1 tabanlıdır
    local i = 1
    while hbglyphs[i] \noexpand~= nil do
        local glyph = hbglyphs[i]
        i = i + 1
        local fname=writePNGglyph(hbfont, glyph.codepoint)
        % İçe aktarılan PNG görüntülerimizin boyutunu küçült
        local s = 0.75
        local scal="[scale="..tostring(s).."]"
        tex.print([[\noexpand\includegraphics]]..scal..[[{]]..fname..[[}]])
     end
end
}}
```

#### \codestoemoji makrosunun tanımını anlamak

Bu `\codestoemoji` makro çoğunlukla `\directlua`içinde yer alan Lua kodudur, bu yüzden *nasıl* `\directlua` nasıl çalıştığı hakkında daha fazla şey öğrenmek istiyorsanız, Overleaf makalesine göz atın [Understanding `\directlua`](/latex/tr/derinlemesine-makaleler/09-an-introduction-to-luatex-part-2-understanding-directlua.md). LuaTeX ve LuaHBTeX’in `\directlua` nasıl işlediğini açıklar; özellikle, Lua koduna TeX/LaTeX komutları dâhil edildiğinde `\noexpand` ve `\unexpanded`.

**Makro parametresiyle uğraşma: "#1"**

Makro şu üç satırla başlar:

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

ve bunlar şu görevleri yerine getirir:

* `local str="#1"`: bu, makro tarafından geçirilen girdiden bir Lua dizesi oluşturur;
* `local hbbuffer = hblib.Buffer.new()`: bu, HarfBuzz’ın biçimlendirmesini istediğimiz metni tutmak için bir tampon oluşturmak üzere HarfBuzz API’sini kullanır;
* `hbbuffer:add_utf8(str)`: bu, makromuzun girdisinden oluşturulan UTF-8 biçimli bir dizeyi HarfBuzz tamponuna ekler.

Kodun ilk satırı

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

oldukça basit görünür, ancak çalışması epey karmaşıktır; bunu biraz daha ayrıntılı incelemeye değer.

Kodun üçüncü satırını ele alırsak

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

şunu kullandığını görürüz `str` değişkenimizi HarfBuzz tamponuna UTF-8 biçiminde bir Unicode dizesi sağlamak için kullanır. Bunun çalışması için, değişken `str` kendisi de UTF-8 biçiminde biçimlendirilmiş Unicode metin içermelidir; dolayısıyla şu soru ortaya çıkar: *nasıl* LuaHBTeX, makro argümanı `"#1"`, içeren `\Uchar` komutlarını, Lua dize değişkenine `str` HarfBuzz için UTF-8 metni içeren bir Lua dizesine “dönüştürdü” mü?

\codestoemoji makrosunun amaçlanan kullanımına bakarsak `\codestoemoji` makro:

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

girdi, örneğin `\Uchar"1F3F4\Uchar"E0067\Uchar"E0062\Uchar"E0065...`UTF-8 olarak kodlanmış emoji karakterlerinden oluşan bir dizgeye hiç benzemiyor. Ayrıca HarfBuzz, TeX komutları hakkında hiçbir şey bilmez. Bir şekilde, `\Uchar` komutlarını içeren ham TeX girdisi, HarfBuzz’ın kullanabileceği UTF-8 kodlu Unicode karakterlerine dönüştürülür, ancak *nasıl*?

Cevap `\Uchar` komutunun davranışında yatar: `\codestoemoji` şunu kullanarak `\char` yerine `\Uchar` çağrılmaya çalışmak başarısız olur, ancak *neden*?

**\Uchar: expansion in \directlua**

Bu `\codestoemoji` makro çağrıldığında, makro tanımının içinde saklanan `\directlua` komutu, LuaHBTeX’in yerleşik Lua yorumlayıcısına gönderilecek Lua kodunu hazırlamak zorundadır. Bu kod hazırlama sürecinin bir parçası, makro tanımındaki özgün Lua kodunda bulunan tüm TeX/LaTeX komutlarının ve kullanıcı tarafından sağlanan tüm makro argümanlarının genişletilmesidir. Bu genişletme süreci, daha sonra yeniden metne dönüştürülen ve Lua yorumlayıcısına iletilecek Lua kodunu üreten bir belirteç listesi verir. Kolaylık olsun diye, Overleaf makalesinden bir diyagramı burada yeniden veriyoruz [Understanding `\directlua`](/latex/tr/derinlemesine-makaleler/09-an-introduction-to-luatex-part-2-understanding-directlua.md):

![\directlua’nın işleyişi](/files/7a673731473d22c7acdf4eb554516b504d996c08)

Makro `\codestoemoji` şu şekilde çağrılmak üzere tasarlanmıştır `\Uchar` komutları ve, [makalenin daha önce belirtildiği gibi](#the-key-difference-expansion), `\Uchar` genişletilebilir bir komuttur ve genişletmesi bir karakter belirteci üretir. İçindeki işleme faaliyetleri sırasında `\directlua`， LuaHBTeX her `\Uchar<karakter kodu>` komutunu genişletir; burada *kaldırdığı* her `\Uchar<karakter kodu>` girdiden kaldırılır ve *değiştirdiği* onu karşılık gelen genişletme değeriyle değiştirir: `<karakter kodunu>`.

Son işleme aşamasında, `\directlua` tarafından üretilen başlangıç belirteç listesi *yeniden metne dönüştürülür* ve Lua yorumlayıcısına gidecek Lua kodu haline gelir (yukarıdaki diyagramı görün). Genişletilmesiyle üretilen tüm karakter belirteçleri `\Uchar` ayrıca *yeniden metne dönüştürülür*: karakter belirteçlerinin metne dönüştürülmesi, orijinal `<karakter kodunu>` değerlerinin UTF-8 temsillerini üretir.

Örneğimizde, Lua kodu oluşturulup Lua yorumlayıcısı için hazır olduğunda, "#1" için makro girdisi UTF-8 metin dizisine dönüştürülmüş olur: `str` değişkeni artık HarfBuzz tamponuna güvenle eklenebilecek bir UTF-8 metin dizesidir.

**\char neden çalışmıyor?**

Doğrudan cevap şudur çünkü `\char` şudur *yapmaz* genişletilebilir bir komut. Aksine `\Uchar` komutlar, `\char` komutlar *kaldırılmaz* girdiden işlenirken `\directlua`’nin bir simgeler listesi oluşturmak için yapılan ilk işlenmesi sırasında, onlar “geçip gider” ve tarafından oluşturulmakta olan simgeler listesine dahil edilirler `\directlua`. Örneğin, eğer `\codestoemoji` içeriyorsa `\char"1F3F4` LuaHBTeX bunu bir simge dizisine dönüştürür ve bunları oluşturulmakta olan toplam simgeler listesinin bir parçası olarak saklar.

İşlemenin sonraki aşamasında, simgeler tekrar metne dönüştürülürken, ortaya çıkan Lua kodu *sabit dizeyi* `\char"1F3F4` değişkenimizi tanımlamak için kullanılan metnin içinde `str`. Ne zaman `str` HarfBuzz tamponuna eklendiğinde, "1F3F4 emoji karakterini temsil eden UTF-8 kodlu bir diziyi içermeyecek, sabit dizeyi içerecektir `\char"1F3F4`, bunu HarfBuzz şekillendirmeye çalışacak ve bizim amaçlarımız açısından bir emoji glifi üretmeyecektir. Bu arada, dize `\char"1F3F4` aynı zamanda Lua sözdizimi hataları da üretirdi; ancak bir “uzun köşeli parantez dizisi” olarak oluşturulmadıkça—bkz. [Lua kaçış dizileri nedir](/latex/tr/derinlemesine-makaleler/09-an-introduction-to-luatex-part-2-understanding-directlua.md#what-are-e2809clua-escape-sequencese2809d3f) bu konu hakkında arka plan bilgisi için.

Eğer kullanmaya çalışırsak `\codestoemoji` bir `\char` komutunu, şöyle:

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

LuaHBTeX başarısız olacak ve buna benzer bir sözdizimi hatası bildirecektir:

```latex
[\directlua]:1: invalid escape sequence near '"\c'.
\codestoemoji ...ing \includegraphics }.}]]) end }

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

Lua yorumlayıcısı bir sorunla karşılaştı, bu yüzden
bu lua parçasının geri kalanı yok sayılacaktır.
```

#### HarfBuzz şekillendirme işlevini çağırma

**Tampon parametrelerini ayarlama**

HarfBuzz bazen şekillendirmesi istenen metin hakkında ek bilgi gerektirir. Bu bilgiyi, `<buffer variable>` şunu kullanarak *tampon yöntemleri*gibi yapılandırarak sağlayabilirsiniz:

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

Örneğin, HarfBuzz'a emoji metnimizin yönünün soldan sağa olacağını bildirmemiz gerekir. Bunu yapmak için `set_direction()` yöntemini bizim `<buffer variable>` (adı `hbbuffer`) üzerine yazarak:

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

burada `hblib.Direction.new("ltr")` Lua aracılığıyla HarfBuzz motoruna iletmek için uygun bir “yön nesnesi” oluşturur.

**Şekillendirme yap**

Tampon uygun şekilde başlatıldıktan sonra, HarfBuzz'tan gerçek şekillendirmeyi işlev aracılığıyla yapmasını isteyebiliriz `shape_full()`. Örneğimizde şöyle yazarız:

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

işlevinin 3. ve 4. parametreleri `shape_full()` Lua tabloları olmaları gerekir—we have used empty tables “`{}`” for both parameters. Genel biçimi `shape_full()` şudur:

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

* **`{"shaper"}`**: Genellikle ayarlanması gerekmez, ancak seçenekler `{"ot"}` ya da `{"graphite2"}`. Bir “şekillendirici” kavramı hakkında daha fazla bilgi [HarfBuzz belgelerinde](https://harfbuzz.github.io/shaping-and-shape-plans.html)—burada belgelenenin Lua tabanlı değil, düşük seviyeli C API olduğu unutulmamalıdır `luaharfbuzz` bağlama (uygulama).
* **`{font features}`**: Bu, listelenen bir tablodur [OpenType özellikleri](https://docs.microsoft.com/en-us/typography/opentype/spec/featurelist)—yazı tipi tarafından desteklenen—ve şekillendirme sırasında HarfBuzz'ın uygulamasını istediğiniz özellikler.

Kullanmak istediğiniz herhangi bir yazı tipi özelliği, bir `luaharfbuzz` kitaplık işlevi

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

burada

* `library_instance` senin `luaharfbuzz` kitaplık örneği değişkenin (`hblib` örneğimizde);
* `feature_string` bir [özellikleri tanımlamak için sözdizimi](https://github.com/ufytex/luaharfbuzz/wiki/Feature-Strings). Buna örnekler `+smcp` küçük büyük harfleri etkinleştirmek için veya `-kern` kerning'i devre dışı bırakmak için.

Örneğin:

```latex
local dosmcp = hblib.Feature.new("+smcp")
local nokern = hblib.Feature.new("-kern")
% Yazı tipi özelliklerinizi şöyle kullanın
local res = hblib.shape_full(hbfont, hbbuffer, {dosmcp,nokern},{})
```

#### Sonuca erişim: glifleri alma

Ve son olarak, şekillendirme işlemi başarılı olursa, şekillendirilmiş glifler daha önce kodda oluşturduğumuz buffer değişkeninde döndürülür. `hbbuffer` kodda daha önce oluşturduğumuz.

Gliflere tampon yöntemi aracılığıyla erişiriz `get_glyphs()` ve her bir glifi almak için bir döngü kullanırız. Glifleri tutan Lua tablosunun, `hbglyphs` örneğimizde, 0'dan değil 1'den başlayarak indekslendiğine dikkat edin.

Her glifin *glif tanımlayıcısı* (şaşırtıcı biçimde adı verilen `kod noktası`), ve HarfBuzz yazı tipi (`hbfont`), şu işleve iletilir: `writePNGglyph()` işlevi, o glifin yazı tipinin raster görüntü temsilini kullanarak bir PNG dosyası oluşturur.

`writePNGglyph()` bir PNG dosyası yazar ve PNG dosya adını döndürür; bu ad, (ölçeklendirilmiş) PNG dosyasını LaTeX belgemize şu yolla içe aktarmak için kullanılır `\includegraphics[scale=0.75]{<fname>}`. Şuna dikkat edin, `\includegraphics` doğrudan Lua kodunun içinde kullanabiliriz.

```latex
if (res) then
    local hbglyphs=hbbuffer:get_glyphs()
    % glifler tablosu, hbglyphs, 1 tabanlıdır
    local i = 1
    while hbglyphs[i] \noexpand~= nil do
        local glyph = hbglyphs[i]
        i = i + 1
        local fname=writePNGglyph(hbfont, glyph.codepoint)
        % İçe aktarılan PNG görüntülerimizin boyutunu küçült
        local s = 0.75
        local scal="[scale="..tostring(s).."]"
        tex.print([[\noexpand\includegraphics]]..scal..[[{]]..fname..[[}]])
     end
end
```

### Overleaf'te açabileceğiniz tam kod

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

% luaharfbuzz kütüphanesini LuaHBTeX’ten yükle
hblib=require("luaharfbuzz")

% Noto Color Emoji yazı tipini Overleaf'in sunucusunda bulun
pathtofontfile=kpse.find_file("NotoColorEmoji.ttf","truetype fonts")

% Noto Color Emoji’den HarfBuzz yüzü ve HarfBuzz yazı tipi oluştur
hbface = hblib.Face.new(pathtofontfile)
hbfont = hblib.Font.new(hbface)

% Bu işlev bir yazı tipi ve bir glif kimliği kabul eder:
% gliflerin PNG verisini çıkarır ve yazar
% bunu bir .png dosyasına yazar

function writePNGglyph(hbfontobject, glyphID)

    % Glif PNG verisini al
    local pngblob=hbfontobject:ot_color_glyph_get_png(glyphID)
    local pngdata=pngblob:get_data()

    % .png dosyamız için bir dosya adı oluştur
    local fname="Glyph"..glyphID..".png"

    % .png dosyasını yaz ve dosya adını döndür
    local output = assert(io.open(fname, "wb"))
    output:write(pngdata)
    output:close()

    % \includegraphics’in kullanması için dosya adını döndür
    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()
    % Glifler tablosu, hbglyphs, 1 tabanlıdır.
    local i = 1
    while hbglyphs[i] \noexpand~= nil do
        local glyph = hbglyphs[i]
        i = i + 1
        local fname=writePNGglyph(hbfont, glyph.codepoint)
        % İçe aktarılan PNG görüntülerimizin boyutunu küçült
        local s = 0.75
        local scal="[scale="..tostring(s).."]"
        tex.print([[\noexpand\includegraphics]]..scal..[[{]]..fname..[[}]])
     end
end
}}

Bir ördek: \codestoemoji{\Uchar"1F986}

Bir bayrak: \codestoemoji{\Uchar"1F3F4\Uchar"E0067\Uchar"E0062\Uchar"E0065\Uchar"E006E\Uchar"E0067\Uchar"E007F}
\end{document}
```

[Bu luaharfbuzz API örneğini Overleaf'te açın.](/latex/tr/derinlemesine-makaleler/10-an-overview-of-technologies-supporting-the-use-of-colour-emoji-fonts-in-latex.md)

Bu örnek aşağıdaki çıktıyı üretir:

![Harfbuzzexample.png](/files/87f3e9fe1a30a41126f6b73b7b24219dcdb56e25)

## Bonus bölümü: Emoji matematiğiyle eğlence

Neşeli bir notla bitirmek için, Overleaf ekibinden bir üye [`emoji` LaTeX paketi](https://ctan.org/pkg/emoji?lang=en) eğlenceli bir örnek oluşturmak için kullandı:

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

[Bu eğlenceli örneği Overleaf'te açın](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)

Bu örnek aşağıdaki çıktıyı üretir:

![Emojimath2.png](/files/6636e01a83cd1aec5f366385c22ea8954599a467)


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://ayakaleaf-pro.ayaka.space/latex/tr/derinlemesine-makaleler/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.
