> 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/id/artikel-mendalam/07-an-introduction-to-luatex-part-1-what-is-it-and-what-makes-it-so-different.md).

# Pengantar LuaTeX (Bagian 1): Apa itu—dan apa yang membuatnya begitu berbeda?

LuaTeX adalah sebuah *kumpulan alat*—di dalamnya terdapat perangkat lunak dan komponen canggih yang dengan mereka Anda dapat menyusun (menata huruf) berbagai macam dokumen. Subjudul artikel ini juga mengajukan dua pertanyaan tentang LuaTeX: Apa itu—dan apa yang membuatnya begitu berbeda? Jawaban untuk “Apa itu?” mungkin tampak jelas: “Ini adalah mesin penataan huruf TeX!” Memang benar demikian, tetapi pandangan yang lebih luas, dan yang dianut penulis ini, adalah bahwa LuaTeX merupakan sistem berbasis TeX yang sangat serbaguna untuk *konstruksi dan rekayasa dokumen*.

### Menjelaskan LuaTeX: Dari mana harus mulai?

Tujuan artikel pertama tentang LuaTeX ini adalah menawarkan konteks untuk memahami apa yang disediakan mesin TeX ini dan mengapa/bagaimana desainnya memungkinkan pengguna membangun/merancang/menciptakan berbagai solusi untuk masalah penataan huruf dan desain yang kompleks—mungkin juga menawarkan tingkat “ketahanan masa depan” tertentu, seiring pengguna semakin membutuhkan perangkat lunak berbasis TeX yang mampu beradaptasi dengan ekosistem teknis yang terus berubah. Menurut penulis ini, mencantumkan dan mendeskripsikan fitur/kemampuannya bukanlah tempat terbaik untuk memulai ketika membangun pemahaman tentang kapabilitas dan potensi LuaTeX. Pendekatan semacam itu tidak akan terlalu membantu bagi pembaca yang tidak akrab dengan mesin TeX lain dan bagi mereka perbandingan berbasis fitur kemungkinan tidak akan terlalu bermakna.

Dengan risiko menguras kesabaran pembaca (“Langsung ke intinya saja!”) saya akan mengambil pendekatan yang lebih “holistik”, dengan harapan memberikan latar belakang yang berguna, tetapi dengan konsekuensi beberapa bacaan tambahan—dan menyelami beberapa topik pemrograman untuk membantu pemahaman. Dalam [Bagian 2](/latex/id/artikel-mendalam/09-an-introduction-to-luatex-part-2-understanding-directlua.md) kita mengeksplorasi penggunaan `\directlua` tetapi, untuk saat ini, kita berupaya meletakkan fondasi dasar untuk memahami LuaTeX.

Artikel ini sangat mencerminkan “perjalanan” pribadi penulis dalam mengembangkan pemahaman dan apresiasi terhadap LuaTeX: bahwa dengan terlebih dahulu mengetahui sesuatu tentang filosofi di balik pengembangan LuaTeX, dan melihatnya sebagai wadah alat perangkat lunak, Anda akan lebih menghargai ranah solusi yang luas yang dibuka oleh perangkat lunak menakjubkan ini.

## LuaTeX: Bukan hanya untuk akademisi, atau matematika!

Kekayaan fitur dan fungsionalitas yang dibangun ke dalam LuaTeX tidak hanya menghasilkan penataan huruf berkualitas sangat tinggi melalui LaTeX tradisional, tetapi juga menawarkan ruang yang luar biasa besar untuk mengembangkan solusi khusus, non-LaTeX, bagi masalah produksi dan rekayasa dokumen yang kompleks. LuaTeX menyematkan bahasa skrip Lua yang sangat kuat di dalamnya, yang berarti, misalnya, Anda dapat menggunakan Lua untuk memuat “plugin” (pustaka perangkat lunak eksternal) ke dalam LuaTeX; ini semakin memungkinkan tingkat otomasi yang tinggi, integrasi ke dalam sistem atau alur kerja perangkat lunak yang sudah ada, serta pemanfaatan perangkat lunak khusus untuk pemrosesan data, teks, atau grafik.

Secara historis, TeX dikaitkan dengan penulisan/penerbitan ilmiah, terutama dalam matematika, tetapi LuaTeX, khususnya, memiliki potensi signifikan untuk penerapan di banyak domain lain—termasuk produksi dokumen PDF komersial. Salah satu contohnya adalah [speedata publisher](https://speedata.github.io/publisher/) yang menggunakan LuaTeX murni sebagai mesin pembuatan PDF di dalam alur kerja berbasis XML-nya—ia sama sekali tidak menggunakan LaTeX. Memang, speedata publisher pada dasarnya tidak mengandung kode TeX apa pun—saya bertanya kepada [Patrick Gundlach](https://twitter.com/patrickgundlach), pengembang speedata publisher, yang mengonfirmasi bahwa secara total ia menggunakan sekitar tiga baris kode TeX. Kemampuan penataan hurufnya yang kuat dirancang dan diimplementasikan dalam kode Lua, menggunakan Lua API milik LuaTeX (topik yang akan kita bahas nanti dalam artikel ini).

## Sebuah kisah pribadi singkat: Bagaimana saya pertama kali menemukan LuaTeX

Saya pertama kali mengetahui LuaTeX pada akhir 2009/awal 2010 ketika ia masih berada di tahap rilis beta tengah (versi 0.50). Saat itu saya sedang mencari perangkat lunak berbasis TeX untuk menata catatan tulisan tangan yang dihasilkan dari upaya saya belajar bahasa Arab. Pencarian Google menampilkan kumpulan video dari konferensi TUG 2009 ([sekarang di YouTube](https://www.youtube.com/playlist?list=PL2D4DD50DC9C0BA0E)) yang mencakup demonstrasi penataan huruf Arab berkualitas sangat tinggi (melalui paket [ConTeXt](http://wiki.contextgarden.net/Main_Page)milik Hans Hagen). Video-video itu juga mencakup sebuah presentasi berjudul [Proyek LuaTeX: setengah jalan menuju versi 1](https://youtu.be/AKv4po9PGW0).

Mesin TeX yang digunakan untuk menghasilkan penataan huruf Arab yang indah itu adalah sesuatu yang disebut “LuaTeX”. Saat itu saya bekerja di bidang penerbitan ilmiah (fisika) tetapi meskipun sepenuhnya menyadari keberadaan TeX/LaTeX saya belum pernah mendengar tentang LuaTeX: saya tertarik dan ingin mempelajari lebih lanjut tentang mesin TeX baru ini. Karena LuaTeX masih berada pada tahap pengembangan beta, dan sedang berkembang pesat, saya ingin tetap mengikuti pembaruan terbaru sehingga pilihan terbaik (bagi saya) adalah jalur do-it-yourself dengan membangun (mengompilasi) file eksekutabel LuaTeX dari kode sumbernya. Selain program eksekutabel LuaTeX, Anda juga memerlukan sebuah “instalasi TeX” untuk menyediakan lingkungan tempat menjalankan LuaTeX (misalnya, texmf.cnf, paket makro, font, dll.). Alih-alih mengunduh dan memasang [TeX Live](https://www.tug.org/texlive/) distribusi besar itu, saya memilih untuk membuat instalasi TeX kustom yang benar-benar minimal untuk menjelajahi LuaTeX (sebuah latihan “menarik” yang saya [dokumentasikan di blog pribadi saya](http://www.readytext.co.uk/?cat=30)). Setiap rilis baru LuaTeX disertai dengan Manual Referensinya (misalnya, untuk[versi 1.0.4](https://www.tug.org/svn/texlive/tags/texlive-2017.1/Master/texmf-dist/doc/luatex/base/luatex.pdf?revision=44591\&view=co)) yang mendokumentasikan fitur dan fungsionalitas terbaru dari perangkat lunak ini. Namun, itu adalah sebuah *manual referensi* dan (tentu saja) agak minim penjelasan yang cocok bagi pemula yang ingin memulai dengan mesin TeX yang luar biasa ini—sejumlah keakraban dengan konsep TeX tingkat rendah diasumsikan. Mengingat saya menemukan LuaTeX pada tahap yang relatif awal dalam pengembangannya, materi pengantar yang baik pada saat itu relatif sulit ditemukan sehingga butuh sedikit eksplorasi, eksperimen (dan sedikit frustrasi…) sebelum kepingan-kepingannya mulai menyatu. Tak perlu dikatakan lagi, studi bahasa Arab saya terhenti tiba-tiba ketika saya menjadi terpesona oleh perangkat lunak menakjubkan ini dan akhirnya beralih ke penulisan [plugin LuaTeX untuk penataan huruf Arab](http://www.readytext.co.uk/?p=3143) sebagai gantinya!

“Perjalanan LuaTeX” saya sendiri tentu saja sangat tidak linear, tetapi sepanjang jalan itu memberi kesempatan untuk belajar tentang (Lua)TeX (dan instalasi TeX) “dari dasar”: blog saya menampung kumpulan yang eklektik dari [artikel-artikel](http://www.readytext.co.uk/?cat=3) berdasarkan berbagai topik yang saya eksplorasi dan kerjakan selama masa itu. Semoga artikel ini memanfaatkan waktu dan pengalaman itu dengan tepat, membantu orang lain menjadi tertarik untuk mulai menjelajahi kapabilitas LuaTeX. LuaTeX terus dikembangkan dan, pada saat penulisan, telah mencapai versi 1.0.4 yang dirilis bersama TeX Live 2017. Para pengembang sangat aktif dan setiap bug yang ditemukan biasanya segera diperbaiki setelah dilaporkan—misalnya, melalui [milis dev-luatex](https://mailman.ntg.nl/mailman/listinfo/dev-luatex) atau melalui [pelacak bug LuaTeX daring](http://tracker.luatex.org/my_view_page.php). Jauh sebelum mencapai versi 1.0 LuaTeX sudah mampu dipakai untuk produksi—meskipun, tentu saja, Anda harus menerima bahwa fitur-fitur terus berkembang dan, pada kesempatan tertentu, perubahan dapat merusak kode TeX Anda yang sudah ada. Saat ini, LuaTeX tentu saja didukung oleh platform Overleaf dan ShareLaTeX (sebagai LuaLaTeX).

## TeX dalam dunia yang berubah: Teknologi dan alur kerja baru

Jelas bahwa mesin TeX tidak beroperasi dalam dunia yang statis secara teknologi dan, sesekali, muncul inovasi yang segera dan jelas menjadi kandidat untuk dimasukkan ke dalam mesin TeX—salah satu inovasi tersebut adalah font variabel OpenType, yang akan kita bahas singkat di bawah. Meskipun tidak ada keraguan bahwa perangkat lunak penataan huruf berbasis TeX sangat serbaguna, mesin TeX kini beroperasi dalam ekosistem perangkat lunak yang berubah cepat dan sangat beragam—alur kerja baru menekankan kebutuhan akan integrasi dan fleksibilitas untuk menerapkan berbagai solusi dokumen/penataan huruf, di mana TeX mungkin hanya salah satu komponennya.

TeX tidak hanya harus tetap relevan bagi pengguna saat ini, tetapi juga menarik pengguna baru dengan memungkinkan solusi pembuatan konten yang tetap berguna bagi generasi yang akan datang—orang-orang yang mungkin tidak ingin menggunakan TeX sebagai alat mandiri, melainkan, mungkin, sebagai bagian dari alur kerja keseluruhan melalui platform kolaboratif daring seperti Overleaf.

Bahkan sekilas melihat [tex.stackexchange](https://tex.stackexchange.com/) menunjukkan keragaman dokumen dan solusi yang sangat besar yang diproduksi dan diimplementasikan dengan perangkat lunak berbasis TeX—sering kali menampilkan kecerdikan luar biasa ketika orang menemukan semakin banyak kasus penggunaan dan jenis konten yang ingin mereka hasilkan. Selain itu, kebutuhan akan alur kerja yang dapat memproses markup/konten berbasis TeX untuk menghasilkan keluaran non-PDF (dan non-DVI) tidak pernah sebesar ini—seperti MathML/XML dan HTML. Misalnya, “mengonversi” TeX ke dalam [JATS XML](https://jats.nlm.nih.gov/) format (yang telah lama digunakan dalam penerbitan jurnal ilmiah) tetapi juga, belakangan ini, munculnya epub yang digunakan dalam penerbitan buku elektronik.

### Teknologi Font Variabel—Waktunya Mereka Sedang Berubah

Pada 14 September 2016, Microsoft, [Google](https://opensource.googleblog.com/2016/09/introducing-opentype-font-variations.html), [Adobe](https://blog.typekit.com/2016/09/14/variable-fonts-a-new-kind-of-font-for-flexible-design/) dan Apple mengumumkan teknologi font baru: [font variabel OpenType](https://medium.com/@tiro/https-medium-com-tiro-introducing-opentype-variable-fonts-12ba6cd2369). Kita tidak akan membahas teknologi ini secara rinci, tetapi cukup dikatakan bahwa para ahli font yang sangat dihormati seperti [Thomas Phinney](https://twitter.com/ThomasPhinney) dan [John Hudson](https://twitter.com/TiroTypeworks) telah mengamati ([di Twitter](https://twitter.com/ThomasPhinney/status/917087509342851072)) bahwa teknologi font variabel diadopsi jauh lebih cepat daripada banyak inovasi font sebelumnya—kemungkinan besar didorong oleh kebutuhan desainer web yang memerlukan desain responsif yang menyesuaikan diri dengan beragam ukuran/resolusi layar yang ada pada perangkat seluler.

Jelas bahwa font variabel OpenType adalah perkembangan yang menarik dan menggembirakan dalam teknologi font, yang pasti bisa dimanfaatkan oleh pengguna TeX—memang, pertanyaan ini tak pelak lagi telah [muncul di tex.stackexchange](https://tex.stackexchange.com/questions/355104/tex-luatex-xetex-fontspec-support-for-opentype-variable-fonts) dengan dukungan LuaTeX yang dibahas di milis LuaTeX [milis](https://www.tug.org/pipermail/luatex/2016-September/006204.html).

Sebagai catatan, teknologi font yang didasarkan pada pembuatan font “parametrik” bukanlah gagasan yang sepenuhnya baru: METAFONT karya Knuth dan teknologi Multiple Master Adobe, dalam beberapa hal, merupakan pendahulu awal, meskipun detail implementasinya agak berbeda.

### Font variabel: Kapan kita menginginkannya—sekarang?

Setiap standar/spesifikasi teknologi baru dan berguna membutuhkan waktu untuk “meresap” ke dalam ekosistem target para pengembang dan pelaksana—termasuk waktu untuk merapikan setiap ambiguitas atau penafsiran atas rumusan dalam spesifikasi itu sendiri. Para pengembang harus membaca, dan memahami, dokumentasi lalu mengubahnya menjadi perangkat lunak nyata yang bekerja—yang, di sini, mencakup pembuatan font dan teknologi untuk menggunakannya: peramban yang kompatibel dan mesin penataan huruf. Para pengembang TeX jelas akan membutuhkan akses ke font variabel berkualitas tinggi yang dapat digunakan sebagai “tolok ukur” yang andal untuk menerapkan (memprogram) dukungan bagi teknologi font variabel.

Menerapkan teknologi baru apa pun dalam TeX, seperti font variabel, memunculkan *potensi* kebutuhan untuk memodifikasi bagian internal mesin TeX—tentu saja, kebutuhan untuk melakukan itu bergantung pada sifat teknologi tersebut dan, yang penting, aspek perilaku TeX mana yang sedang diubah. Tidak selalu perlu memodifikasi mesin TeX itu sendiri, mungkin hanya memerlukan perubahan pada perangkat lunak pendukung/sekunder, termasuk “komponen” apa pun (pustaka kode pihak ketiga) yang digunakan dalam program-program tersebut. Secara internal, mesin TeX sangat *rumit sekali* —mengembangkan pemahaman terhadap kode sumber TeX yang cukup untuk membuat modifikasi yang andal membutuhkan keahlian yang besar, dan sangat khusus, yang jumlahnya sangat terbatas. Juga penting bahwa modifikasi apa pun tidak berdampak buruk pada stabilitas/kompatibilitas jangka panjang mesin TeX—yang vital bagi komunitas TeX dan bagi mereka yang kemudian memproses berkas (La)TeX seorang penulis: terutama penerbit akademik dan layanan berbasis awan seperti Overleaf dan ShareLaTeX.

Banyak pengguna TeX kemungkinan tertarik untuk memanfaatkan font variabel; misalnya, menerapkan kemungkinan desain baru atau menemukan solusi untuk masalah penataan huruf yang sulit. Jadi, dalam beberapa hal, ada dilema: pengguna TeX menginginkan akses ke teknologi baru tetapi implementasinya bergantung pada sumber daya yang sangat terbatas: jumlah pengembang yang memenuhi syarat dan mampu mewujudkannya. Modifikasi terhadap bagian internal TeX itu sulit, dan secara umum sebaiknya dihindari sebisa mungkin, jadi apakah ada cara lain untuk menambahkan fitur/kapabilitas baru (jenis tertentu) ke TeX? Ya! dan LuaTeX telah menempuh jalan itu.

#### Eksperimen awal: font variabel OpenType dan LuaTeX

Desain LuaTeX memungkinkan eksperimen cepat dengan teknologi font variabel. Bahkan, pada April 2017, format TeX ConTeXt, yang menggunakan LuaTeX, telah memiliki sebuah [versi beta](https://mailman.ntg.nl/pipermail/ntg-context/2017/088343.html) yang mengimplementasikan font variabel OpenType. Ini dimungkinkan karena dukungan font ConTeXt dibangun dalam kode Lua (dan ConTeXt memiliki fontloader sendiri yang ditulis dalam Lua).

## LuaTeX: Latar belakang dan sejarah

LuaTeX, dalam istilah TeX, adalah “pendatang baru” meskipun telah berada dalam pengembangan aktif selama lebih dari 10 tahun. Situs web LuaTeX [mendokumentasikan](http://www.luatex.org/roadmap.html) bahwa LuaTeX mulai ada pada tahun 2005 dengan (saya yakin) pengembangan aktif dan berkelanjutan dimulai pada 2006. Karena kompleksitas bawaannya, dan ketekunan para pembangunnya, LuaTeX benar-benar membutuhkan 10 tahun pengembangan untuk mencapai versi 1.0, yang [diumumkan oleh para pengembangnya](https://mailman.ntg.nl/pipermail/dev-luatex/2016-September/005882.html) (Hans Hagen, Hartmut Henkel, Taco Hoekwater, Luigi Scarso) pada 27 September 2016.

Di dalam pengumuman rilis itu terdapat pernyataan prinsip yang penting:

> “Tujuan utama kami adalah menyediakan varian TeX yang memungkinkan ekstensi oleh pengguna tanpa perlu menyesuaikan cara kerja internalnya.”

Rumusan ini secara sempurna merangkum filosofi di balik pengembangan LuaTeX dan menunjukkan jalan yang dapat ditempuh perangkat lunak berbasis TeX untuk menjawab tantangan yang telah kita sebutkan: mengadopsi teknologi baru dan tetap relevan bagi generasi pengguna baru.

Sekarang saatnya membahas pertanyaan kedua yang terdapat dalam subjudul artikel ini: “apa yang membuatnya begitu berbeda”. Dengan mengeksplorasi makna “...memungkinkan ekstensi oleh pengguna tanpa perlu menyesuaikan cara kerja internalnya” kita dapat lebih memahami esensi dari apa yang dibawa LuaTeX ke meja.

## LuaTeX: Membuka “kotak hitam” TeX

Program TeX asli karya Knuth adalah leluhur bersama dari semua mesin TeX modern yang digunakan saat ini dan LuaTeX, pada dasarnya, adalah langkah evolusi terbaru: diturunkan dari program pdfTeX tetapi dengan penambahan beberapa komponen perangkat lunak yang kuat yang menghadirkan banyak fungsionalitas ekstra. Ketika Knuth menulis versi asli perangkat lunak TeX ia juga menyediakan bahasa TeX sebagai cara untuk mengendalikan dan memprogram perilaku penataan hurufnya: sekitar 320 perintah tingkat rendah (primitif) disediakan bagi pengguna dan pengembang paket makro TeX. Perintah-perintah itu menawarkan berbagai tingkat kendali atau pengaruh atas aspek-aspek tertentu dari perilaku penataan huruf TeX tetapi sebagian besar fungsionalitas internal TeX, algoritma, proses pengambilan keputusan, data, dan struktur data disembunyikan dari pengguna. Bisa dibilang, program TeX Knuth bukanlah “kotak hitam” sepenuhnya tetapi jelas merupakan warna abu-abu yang sangat gelap—memang, kode sumbernya tersedia tetapi, bagi sebagian besar orang, itu juga merupakan kotak hitam yang tak dapat dipahami.

Kita menyebut proses internal di dalam TeX sebagai semacam “kotak hitam”; namun, LuaTeX membuka bagian internal berbasis TeX-nya untuk memberi pengguna/pengembang akses dan kendali yang jauh lebih besar terhadap banyak proses yang sebelumnya tersembunyi jauh di dalam mesin TeX. LuaTeX juga menambahkan banyak perintah primitif baru yang menyediakan kendali atas fitur-fitur baru tersebut.

### LuaTeX: Diturunkan dari pdfTeX tetapi tidak menggunakan kode pdfTeX

Demi ketepatan, penting untuk dicatat bahwa meskipun kami menggambarkan LuaTeX sebagai turunan dari pdfTeX, LuaTeX tidak secara langsung menggunakan kode program asli pdfTeX. Salah satu pengembang LuaTeX (Taco Hoekwater) melakukan tugas yang benar-benar *Herculean* yaitu menulis ulang mesin TeX inti LuaTeX dalam kode C modern yang bersih (CWEB).

#### Catatan sejarah

Sebagian karena usia kode sumber TeX asli karya Knuth—dari mana keturunannya yang modern diturunkan—memodifikasinya untuk menyesuaikan atau menciptakan mesin penataan huruf berbasis TeX baru adalah proses yang kompleks dan berliku. Sebagian dari proses itu memerlukan konversi kode Pascal ke kode C—yang tidak tanpa [tingkat kompleksitas tertentu](http://www.readytext.co.uk/?p=2529). Kode C yang dihasilkan mesin itu sangat bertele-tele dan sangat sulit dibaca atau dipahami. Jelas bahwa penulisan ulang kode LuaTeX secara menyeluruh menghindari seluruh proses konversi Pascal-ke-C.

## Blok penyusun LuaTeX

Dalam pendahuluan kita menyebut LuaTeX sebagai sebuah “toolkit” dan mendeskripsikannya sebagai “sistem konstruksi dan rekayasa dokumen”. Kita telah melihat bahwa dalam pengumuman LuaTeX 1.0 para pengembang menyatakan:

> “Tujuan utama kami adalah menyediakan varian TeX yang memungkinkan ekstensi oleh pengguna tanpa perlu menyesuaikan cara kerja internalnya.”

Sekarang saatnya menyatukan benang-benang ini dan ide-ide untuk memusatkan perhatian pada detail tentang apa sebenarnya semua ini *artinya* dalam praktik.

### Jigsaw LuaTeX

Jika Anda melihat “di balik kap mesin” Anda akan melihat bahwa perangkat lunak LuaTeX, yaitu program eksekutabel yang sebenarnya, dibangun dari kumpulan komponen perangkat lunak yang digabungkan bersama untuk menyediakan fungsionalitas keseluruhan LuaTeX. Tentu saja, ini bukan hal baru dan sebagian besar perangkat lunak dibangun seperti itu. Namun, yang membuat LuaTeX berbeda dari mesin TeX lain adalah bahwa komponen-komponen ini digabungkan sedemikian rupa sehingga pengguna diberi akses yang jauh lebih besar ke banyak aspek fungsionalitas internal TeX: algoritma penataan huruf TeX, proses pengambilan keputusan, data dan struktur data. Pembukaan bagian internal TeX ini memungkinkan pengguna membangun solusi penataan huruf baru tanpa perlu memodifikasi mesin TeX itu sendiri.

### Lua dalam LuaTeX: Kunci menuju “kotak hitam”

Lua adalah bahasa skrip yang sangat kuat namun mudah dipelajari, yang [berasal dari Brasil](https://www.lua.org/about.html)—ia dibuat pada tahun 1993 dan masih terus dikembangkan secara aktif. Salah satu kekuatan Lua adalah penggunaannya sebagai bahasa pemrograman untuk “merekatkan” komponen perangkat lunak yang berbeda, memungkinkan Anda menggunakannya melalui bahasa skrip yang sederhana namun serbaguna. Lua memainkan peran sentral dalam membuka cara kerja internal mesin TeX LuaTeX, tetapi untuk lebih memahami bagaimana hal ini dicapai, ada baiknya melakukan sedikit penyimpangan untuk membahas secara sangat singkat dua konsep pemrograman:

* Antarmuka Pemrograman Aplikasi (API);
* pengikatan bahasa pemrograman.

Silakan lewati bagian ini jika Anda sudah nyaman dengan konsep-konsep tersebut. Kedua topik tidak akan dibahas secara rinci—kami tidak bertujuan pada ketelitian teknis yang ketat, melainkan hanya memberikan latar belakang yang cukup untuk menyadari konsep-konsep ini: makna dan relevansinya bagi LuaTeX.

### Antarmuka Pemrograman Aplikasi (API)

Bayangkan Anda seorang programmer yang telah menulis kode yang mungkin berguna bagi pengguna (programmer lain), tetapi kode Anda kompleks dan Anda tidak ingin pengguna kode Anda perlu memusingkan detail tingkat rendah itu. Perhatikan bahwa para programmer/pengembang itu bekerja dengan bahasa pemrograman yang sama yang Anda gunakan untuk menulis kode Anda. Selain itu, misalkan Anda memiliki rencana untuk menulis ulang beberapa bagian kode Anda—misalnya, agar lebih cepat, membutuhkan lebih sedikit memori, dan sebagainya. Pengguna kode Anda yang sudah ada tidak seharusnya perlu khawatir tentang hal itu: setiap perubahan yang Anda rencanakan tidak boleh merusak program mereka. Jadi, apa solusinya?

Jawabannya terletak pada sesuatu yang disebut API: sebuah *Antarmuka Pemrograman Aplikasi*. Alih-alih mengharuskan pengguna (programmer lain) mengakses detail tingkat rendah dari kode Anda—yang mungkin berubah—Anda menyediakan satu set *fungsi* yang dapat digunakan oleh programmer lain. Fungsi-fungsi itu adalah sebuah *antarmuka* ke kode Anda, melalui mana pengembang lain dapat membangun *aplikasi* tanpa perlu mengetahui secara mendalam cara kerja internal program Anda. Dalam beberapa hal Anda dapat menganggap ini sebagai lapisan tambahan yang mengelilingi kode Anda dan “menginsulasi” pengguna dari detail tingkat rendah yang berantakan.

Selama Anda tidak mengubah fungsi-fungsi itu (antarmuka), Anda bebas memodifikasi dan memperbarui detail tingkat rendah dari perangkat lunak Anda tanpa memengaruhi (merusak) pekerjaan mereka yang mengandalkan kode Anda untuk membangun aplikasi mereka: karenanya istilah Antarmuka Pemrograman Aplikasi.

#### API: Analogi paket LaTeX

Saat Anda menggunakan perintah yang disediakan oleh sebuah paket LaTeX, Anda dapat menganggap perintah-perintah paket itu sebagai bentuk API. Sebagai pengguna, Anda tidak harus memikirkan keajaiban TeX dan LaTeX di balik perintah-perintah itu (yaitu, di dalam kode paket): yang Anda inginkan hanyalah memanfaatkan fungsionalitas yang mereka sediakan.

### Pengikatan bahasa pemrograman

Kita telah melihat bahwa programmer yang menulis/mempublikasikan sekumpulan kode yang berguna (disebut sebuah *pustaka*) dapat menyediakan apa yang disebut Antarmuka Pemrograman Aplikasi (seperangkat fungsi) yang melaluinya programmer lain, yang menggunakan *bahasa pemrograman yang sama* dapat memanfaatkan pustaka tersebut (kumpulan kode). Ini baik-baik saja ketika kedua pihak (pengembang pustaka dan penggunanya) menggunakan *bahasa pemrograman yang sama* bahasa pemrograman *yang berbeda* juga ingin memanfaatkan pustaka itu? Misalnya, Anda mungkin menulis skrip menggunakan bahasa Lua tetapi ingin memanfaatkan pustaka yang ditulis dalam, misalnya, bahasa pemrograman seperti C/C++. Entah bagaimana, dua bahasa pemrograman yang berbeda (Lua dan C/C++) perlu memiliki kemampuan untuk “berkomunikasi” satu sama lain. Salah satu solusi untuk masalah ini adalah apa yang disebut [pengikatan bahasa](https://en.wikipedia.org/wiki/Language_binding).

Membahas secara teknis detail pengikatan bahasa berada di luar cakupan artikel ini sehingga kita akan memberikan ringkasan singkat tentang prinsip umumnya. Pada intinya, dengan menambahkan “lapisan” kode tambahan yang sesuai ke pustaka asli, pustaka itu dapat “berkomunikasi” dengan bahasa pemrograman lain (seperti Lua): lapisan kode itu disebut sebuah *binding*. Ini memungkinkan dua bahasa saling beroperasi melalui sebuah API, yang melaluinya programmer dalam bahasa kedua (seperti Lua) dapat mengakses fitur/layanan yang disediakan oleh pustaka tersebut.

![Diagram skematis untuk menunjukkan konsep pengikatan bahasa.](/files/ad2caacdf864b0008d7a462aaeeb1748c1593b3c)

**Gambar 1**: Diagram skematis untuk menunjukkan konsep pengikatan bahasa: memungkinkan program yang ditulis dalam Lua menggunakan pustaka eksternal yang ditulis dalam bahasa pemrograman lain. Melalui penggunaan binding Lua, komponen internal LuaTeX, dan dengan demikian banyak fungsi penataan huruf internal LuaTeX, disediakan bagi pengguna untuk mengembangkan solusi bagi masalah penataan huruf yang kompleks.

## LuaTeX: Dua opsi untuk pemrograman—TeX dan Lua

Pada dasarnya, LuaTeX adalah mesin TeX yang mendukung dua bahasa pemrograman: bahasa tradisional berbasis TeX dan bahasa skrip Lua. Tentu saja, Anda dapat menggunakan kedua bahasa dalam dokumen TeX yang sama atau, jika Anda lebih suka, tetap menata huruf melalui jalur hanya-TeX: misalnya, melalui paket makro LaTeX (LuaLaTeX). TeX (atau LaTeX) bukanlah bahasa pemrograman yang mudah digunakan atau dipelajari, dan relatif sedikit orang yang benar-benar menguasai banyak keanehan TeX—konsep TeX tentang [token](https://www.overleaf.com/blog/522-what-is-a-tex-token) dan ekspansi cukup asing bagi sebagian besar ekspektasi dan pengalaman orang terhadap sebuah bahasa pemrograman.

Penambahan Lua membuka kemampuan untuk menggunakan penataan huruf berbasis TeX melalui bahasa pemrograman yang jauh lebih mudah diakses dan lebih konvensional—seperti dicatat di awal artikel ini, dengan menggunakan Lua API Anda dapat melakukan [penataan huruf canggih dengan hampir tanpa kode TeX](http://wiki.luatex.org/index.php/TeX_without_TeX).

### LuaTeX menambahkan banyak primitif baru

Setiap mesin TeX menyediakan ratusan yang disebut perintah primitif: blok penyusun fundamental dari bahasa berbasis TeX yang didukung oleh masing-masing mesin penataan huruf. Versi asli TeX yang dirilis Donald Knuth menyediakan sekitar 320 perintah tetapi mesin TeX yang lebih baru (pdfTeX, XeTeX, dan LuaTeX) masing-masing telah menambahkan banyak primitif baru untuk memberi pengguna akses ke fitur dan fungsionalitas tambahan dari setiap mesin. Sejumlah besar primitif baru milik LuaTeX didokumentasikan dalam [Manual Referensi](https://www.tug.org/svn/texlive/tags/texlive-2017.1/Master/texmf-dist/doc/luatex/base/luatex.pdf?revision=44591\&view=co).

Di antara banyak primitif baru yang diperkenalkan oleh LuaTeX, ada satu yang disebut `\directlua{...}` yang merupakan gerbang untuk menggunakan kode Lua: mengakses bagian internal mesin LuaTeX untuk membangun alat dan solusi penataan huruf yang canggih.

### \directlua{...}: Gerbang menuju pemrograman Lua

Seperti telah dibahas, bahasa skrip Lua dapat dilihat sebagai menyediakan sebuah “lapisan” yang melaluinya dimungkinkan untuk memperoleh akses ke mesin penataan huruf berbasis TeX milik LuaTeX dan fungsionalitas yang disediakan oleh banyak komponen penyusun LuaTeX. Bahasa Lua juga merupakan mekanisme yang memungkinkan keterluasan LuaTeX—melalui kemampuan Lua untuk memuat pustaka perangkat lunak/kode eksternal khusus.

Secara kolektif, antarmuka Lua (sekumpulan fungsi berbasis Lua) yang disediakan oleh LuaTeX disebut sebagai *Lua API*: ia adalah “jalur komunikasi” antara mesin/komponen internal LuaTeX dan dokumen pengguna.

### Contoh sederhana \directlua{...}

Berikut ini *sangat sederhana* contoh ini bahkan belum mulai menggores permukaan dari puncak gunung es kemungkinan yang ada. Namun, contoh ini berfungsi untuk menunjukkan gagasan dasar interaksi antara “cara TeX” dan “cara Lua” dalam mengakses parameter TeX.

Perhatikan bahwa:

* `\hsize` adalah sebuah primitif TeX (perintah) yang menetapkan nilai parameter internal yang menentukan lebar baris hasil penataan huruf—misalnya, biasanya Anda menetapkannya ke nilai yang sesuai dalam sebuah `\vbox{...}`. `\hsize` hanyalah salah satu dari *banyak* parameter TeX yang dapat Anda akses dan/atau ubah melalui kode Lua.
* Mengakses parameter TeX hanyalah satu *kecil* aspek dari Lua API LuaTeX: masih banyak lagi!

```latex

\documentclass{article}
\begin{document}
\let\\\relax % mendefinisikan ulang makna \\ untuk menghindari masalah ekspansi
Berikut adalah nilai saat ini dari {\ttfamily\string\hsize} (melalui \LaTeX):
\the\hsize\par
\directlua{
% Dapatkan nilai saat ini dari \hsize menggunakan Lua API
local hs=tex.hsize
% Gunakan fungsi Lua API untuk mencetak beberapa
% kode LaTeX dan nilai dari \hsize
tex.print("Berikut adalah nilai dari {\\ttfamily\\string\hsize}
yang dilaporkan dari kode Lua (dalam scaled points): ")
tex.print(hs.."\\par")
% Tetapkan nilai baru untuk \hsize menggunakan Lua aPI
tex.hsize="400pt" % atau gunakan tex.hsize=400*65536 (dalam scaled points)
}%
% Setelah \directlua selesai, minta LaTeX
% untuk memberi tahu kita nilai baru dari \hsize
Berikut adalah nilai {\ttfamily\string\hsize} yang dilaporkan
oleh \LaTeX{} setelah {\tt\string\directlua} selesai:
\the\hsize\par
\end{document}
```

Berikut adalah gambar yang menunjukkan hasil penataan huruf LuaTeX atas kode LaTeX (di atas):

![Hasil menjalankan LuaTeX](/files/daf1e8710b648e3157112a62c66eb4e77358f957)

Perhatikan bahwa “trik” TeX berupa `\let\\\relax` adalah untuk menghindari masalah yang disebabkan oleh “ekspansi” kode Lua oleh LuaTeX: sebuah topik yang akan kita sebut secara singkat di bawah.

### Menggunakan kode Lua

Ada dua opsi utama untuk menggunakan kode Lua dalam dokumen TeX/LaTeX Anda:

1. **Sebaris**: Menulis kode Lua secara langsung di dalam `.tex` dokumen Anda (seperti pada contoh di atas);
2. **Eksternal**: Menyimpan kode Lua dalam berkas `.lua` eksternal dan menggunakan fasilitas Lua untuk memuat dan menjalankannya.

Opsi (1) paling cocok untuk fragmen kode Lua yang lebih pendek. Opsi (2) digunakan untuk program yang lebih besar atau pustaka kode Lua. Ini memiliki keunggulan tersendiri yaitu Anda dapat menghindari masalah rumit yang melibatkan apa yang disebut TeX sebagai `\catcode` nilai (yang bisa “cukup membuat frustrasi”). Alasan dari `\catcode` masalah ini adalah “ekspansi” kode Lua sebelum dimasukkan ke interpreter Lua bawaan LuaTeX. Ekspansi ini bisa sulit dipahami sehingga akan kita jelajahi lebih lanjut dalam artikel berikutnya.

Tentu saja ada paket LaTeX untuk membantu penggunaan kode Lua di berkas .tex Anda—misalnya, Anda dapat menggunakan [paket luacode](https://ctan.org/pkg/luacode?lang=en).

## Ringkasan dan pengenalan Bagian 2 dari artikel ini

Komponen perangkat lunak dari mana LuaTeX dibangun, bersama dengan bahasa skrip Lua yang tertanam, menyediakan kombinasi yang kuat untuk membangun solusi yang mampu menyelesaikan berbagai jenis masalah penataan huruf yang kompleks—dan merekayasa alur kerja produksi dokumen yang dapat memperoleh manfaat dari integrasi erat dengan mesin penataan huruf berbasis TeX. Dalam [Bagian 2 dari artikel ini](/latex/id/artikel-mendalam/09-an-introduction-to-luatex-part-2-understanding-directlua.md) kami meninjau secara mendalam perintah paling kuat yang disediakan oleh LuaTeX: `\directlua`.

Sampai saat itu, selamat LuaTeXing!

## Ucapan terima kasih

Penulis sangat berterima kasih kepada [Luigi Scarso](https://twitter.com/luigi_scarso), salah satu pengembang LuaTeX, karena telah meluangkan waktu untuk membaca draf artikel ini dan memberikan sejumlah komentar dan saran yang sangat membantu. Segala kesalahan fakta, atau kekeliruan karena kelalaian, tentu saja merupakan tanggung jawab penulis. Selain itu, saya ingin berterima kasih kepada [Patrick Gundlach](https://twitter.com/patrickgundlach), pengembang [speedata publisher](https://speedata.github.io/publisher/), atas waktunya untuk menjawab pertanyaan-pertanyaan saya.


---

# 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/id/artikel-mendalam/07-an-introduction-to-luatex-part-1-what-is-it-and-what-makes-it-so-different.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.
