> 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/36-pandora-s-hbox-using-luatex-to-lift-the-lid-of-tex-boxes.md).

# Pandora’s \\\hbox: Menggunakan LuaTeX untuk membuka tabir kotak TeX

## Pendahuluan

Kotak dan glue adalah dua konsep kunci yang menjadi fondasi model dan kapabilitas penataan huruf TeX. Sebagai kelanjutan dari materi pengantar dalam posting sebelumnya, [Kotak dan Glue: Pengantar Singkat, tetapi Visual, Menggunakan LuaTeX](/latex/id/artikel-mendalam/11-boxes-and-glue-a-brief-but-visual-introduction-using-luatex.md), artikel yang banyak diilustrasikan ini membahas kotak dan glue lebih detail. Kami juga memperkenalkan sebuah [proyek Overleaf](https://www.overleaf.com/latex/examples/exploring-the-structure-of-tex-boxes-with-luatex/pwdrypmtdbgs) baru berbasis LuaTeX yang memungkinkan Anda menjelajahi struktur internal mendalam dari kotak TeX—memberikan wawasan yang akan membantu Anda benar-benar memahami perilakunya. Pembuatan proyek Overleaf ini sangat terbantu oleh karya Patrick Gundlach, jadi kami menyampaikan [ucapan terima kasih kami kepadanya](#credits-thanks-patrick).

## Mengapa memilih LuaTeX?

Pertama-tama, ada baiknya menegaskan kembali perbedaan antara LuaTeX dan LuaLaTeX:

* LuaTeX adalah nama dari mesin penataan huruf berbasis TeX yang dapat dieksekusi;
* LuaLaTeX merujuk pada penggunaan paket makro LaTeX dengan mesin LuaTeX.

Perbedaan ini sangat penting karena, dalam artikel ini, kami memanfaatkan kapabilitas bawaan dari mesin LuaTeX itu sendiri, bukan sekadar memanfaatkan fitur/fungsionalitas dari perintah yang disediakan oleh paket makro LaTeX.

Pembaca yang belum yakin akan perbedaan antara mesin TeX dan paket makro LaTeX mungkin ingin membaca salah satu artikel kami yang telah diterbitkan sebelumnya, [What's in a Name: Panduan untuk Beragam Varian TeX](/latex/id/artikel-mendalam/55-what-s-in-a-name-a-guide-to-the-many-flavours-of-tex.md), yang menjelaskan perbedaan-perbedaan tersebut cukup rinci. Artikel yang sama juga membahas “TeX” sebagai bahasa pemrograman dan bahwa mesin penataan huruf berbasis TeX (mis., pdfTeX, XeTeX, dan LuaTeX) tidak hanya berbeda dalam fitur dan fungsionalitasnya, tetapi juga memiliki variasi dalam “variasi” bahasa TeX yang mereka dukung. Ini membawa kita pada pilihan LuaTeX. Selain mendukung bahasa pemrograman berbasis TeX, LuaTeX juga menyematkan bahasa skrip Lua di dalamnya—memberikan akses ke bahasa pemrograman konvensional yang sederhana, tetapi sangat kuat. Melalui Lua, dan fungsionalitas bawaan LuaTeX, Anda dapat menjelajahi dan mengendalikan aktivitas penataan huruf LuaTeX dengan cara yang tidak disediakan oleh mesin TeX lain mana pun—termasuk kemampuan untuk menyelidiki struktur internal kotak TeX; karena itu LuaTeX adalah pilihan ideal (satu-satunya) untuk artikel ini dan proyek Overleaf pendampingnya.

### pdfTeX/XeTeX vs LuaTeX: dalam gambar

Berikut ini *diagram skematik* dimaksudkan untuk menyoroti perbandingan penting antara desain pdfTeX/XeTeX dan LuaTeX. Tentu saja, pdfTeX dan XeTeX sama-sama memungkinkan pengguna menulis kode TeX yang dapat memengaruhi perilaku penataan huruf; namun, struktur internal yang lebih dalam yang terkandung dalam mesin TeX tersebut, serta data tingkat rendah yang dibangun selama proses penataan huruf, sebagian besar tidak dapat diakses oleh perintah dan makro pengguna. Dalam pengertian itu, mereka adalah *relatif* sistem tertutup jika dibandingkan dengan LuaTeX.

#### pdfTeX/XeTeX

![{{{alt}}}](/files/64d638fc6dee64826f0b18cd127ddc3396f442e8)

#### LuaTeX

LuaTeX memperkenalkan perintah primitif baru yang disebut `\directlua{...}` yang dengannya Anda dapat menulis kode yang tidak hanya memberi akses penuh ke bahasa Lua, tetapi juga memungkinkan Anda memperluas kapabilitas LuaTeX dengan menulis plug-in menggunakan bahasa seperti C dan C++. Di Windows, plug-in semacam itu disebut *Pustaka Tautan Dinamis* (.DLL); di Linux dikenal sebagai *Pustaka Objek Bersama* (.so). Namun, kekuatan nyata LuaTeX berasal dari sekumpulan besar fungsi Lua bawaan yang memberikan akses ke internals LuaTeX—memungkinkan kontrol dan pemrograman yang sangat canggih atas penataan huruf berbasis TeX. Sekumpulan fungsi seperti itu dikenal sebagai API (Application Programming Interface) dan melalui API LuaTeX-lah Anda menggunakan program Lua untuk berkomunikasi dengan mesin penataan huruf dan struktur data berbasis TeX miliknya.

![{{{alt}}}](/files/47c18f0a4855c544a6d66ebf2387dae54c0b1a1c)

Dengan `\directlua{...}` Anda, misalnya, dapat mengakses struktur data internal TeX tingkat rendah yang tersembunyi dari pandangan di mesin TeX lain. Selain itu, Anda dapat menggunakan skrip Lua untuk melakukan berbagai macam perhitungan pemrograman, manipulasi string, dan sebagainya, lalu mengembalikan hasilnya ke TeX: kemungkinannya hampir tak terbatas. Namun, artikel ini tidak dimaksudkan sebagai paparan rinci atau tutorial tentang LuaTeX—meskipun tergoda untuk memberi contoh-contoh yang menyampaikan fleksibilitas luar biasa dari mesin TeX yang menakjubkan ini.

## Kotak dan glue: pengingat singkat

Seperti diperkenalkan dalam artikel [Kotak dan Glue: Pengantar Singkat, tetapi Visual, Menggunakan LuaTeX](https://www.overleaf.com/blog/511-boxes-and-glue-a-brief-but-visual-introduction-using-luatex) kotak dan glue adalah dua konsep kunci yang menjadi dasar kapabilitas penataan huruf TeX. Diagram berikut disajikan sebagai pengingat sangat singkat mengenai perilaku jenis kotak horizontal dan vertikal TeX. Catatan: kotak horizontal tentu saja dapat memuat teks yang ditata dalam bahasa dari kanan ke kiri, seperti Arab atau Ibrani, yang berarti arah pertumbuhan kotak dapat berlawanan dengan yang ditunjukkan untuk kotak horizontal pada diagram di bawah.

![{{{alt}}}](/files/d825ccb474bb0dda335a43754ec6db31ead6567b)

### Primitif TeX untuk pembuatan kotak

Saat ini, kebanyakan orang menyiapkan dokumen TeX mereka menggunakan paket makro LaTeX yang dirancang untuk menyediakan perintah-perintah yang melindungi pengguna dari sebagian besar bahasa tingkat rendah TeX—yang disebut *primitif*—perintah inti yang dibangun di dalam mesin TeX (lihat artikel [What's in a Name: Panduan untuk Beragam Varian TeX](/latex/id/artikel-mendalam/55-what-s-in-a-name-a-guide-to-the-many-flavours-of-tex.md) untuk pembahasan tentang primitif TeX). Kumpulan makro LaTeX menyediakan berbagai makro untuk pembuatan dan penyimpanan (penyimpanan sementara) kotak, tetapi jika Anda menghapus semua kode makro, Anda akan menemukan bahwa hanya ada 4 perintah primitif tingkat rendah untuk konstruksi kotak:

Untuk membuat daftar horizontal:

* \hbox{...}

Untuk membuat dan menumpuk daftar vertikal:

* \vbox{...}
* \vtop{...}
* \vcenter{...}

Kami tidak akan menjelaskan cara menggunakan semua perintah kotak ini karena ada banyak contoh dan tutorial di tempat lain di web atau di buku TeX/LaTeX—tetapi kami akan melihat bagaimana kotak direpresentasikan dan disimpan di dalam struktur data TeX.

### Glue: spasi fleksibel

Glue, pada praktiknya, adalah suatu bentuk spasi yang digunakan TeX untuk memberi jarak/memposisikan item secara horizontal atau vertikal. Sebagai pengguna TeX, kita dapat memerintahkan TeX untuk menyisipkan glue berukuran tetap atau kita dapat menggunakan glue yang fleksibel—memiliki fleksibilitas sebesar yang kita perlukan, baik untuk meregang maupun menyusut sesuai kebutuhan. Salah satu perintah TeX untuk membuat glue bagi spasi horizontal disebut `\hskip` yang berbentuk

`**\hskip** <lebar natural> **plus** <jumlah peregangan> **minus** <jumlah penyusutan>`

`**plus**` dan `**minus**` adalah kata kunci TeX, tetapi Anda tidak perlu menggunakannya untuk setiap glue. Jika `**plus**` atau `**minus**` tidak ada maka `<jumlah peregangan>` atau `<jumlah penyusutan>` yang bersesuaian diasumsikan bernilai nol. Misalnya, `\hskip 3pt` menyisipkan glue berlebar tetap tanpa komponen peregangan atau penyusutan.

Untuk saat ini, anggaplah `<jumlah peregangan>` dan `<jumlah penyusutan>` sebagai *rekomendasi* kita kepada TeX karena jumlah peregangan atau penyusutan yang tepat akan dihitung oleh TeX.

Untuk membantu memahami ide-ide ini, berikut diagram yang merepresentasikan glue sebagai pegas.  `<lebar natural>` adalah panjang pegas ketika tidak ada tegangan (peregangan) atau kompresi (penyusutan). `<jumlah peregangan>` dan `<jumlah penyusutan>` ditunjukkan relatif terhadap panjang natural pegas.

![{{{alt}}}](/files/1ac671a38e44b372bc99c9293b781173c11c6475)

#### Contoh \hbox

Misalkan kita ingin membuat sebuah `\hbox{...}` yang hanya berisi huruf A, B, C, dan D dan kita memerlukan kotak ini lebarnya 100pt (100 poin TeX). Selain itu, aman untuk mengasumsikan bahwa lebar total keempat karakter tersebut jauh lebih kecil dari 100pt, yang menunjukkan bahwa TeX memerlukan suatu cara untuk mengisi ruang yang tersisa di dalam kotak: kita akan menggunakan glue untuk itu. Namun, karena kita tidak mengetahui jumlah glue yang tepat yang diperlukan untuk mengisi kotak, disarankan untuk menambahkan beberapa glue fleksibel dan membiarkan TeX menangani perhitungan jumlah ruang yang perlu ditempati glue tersebut. Dalam cuplikan kode berikut, perhatikan penggunaan “%” untuk menekan spasi antar-kata yang timbul dari karakter akhir-baris.

```
\hbox to100pt{%
A\hskip4pt plus3pt minus 2pt B%
\hskip 0pt plus 2fil C%
\hskip 0pt plus 2fill D%
\hskip 0pt plus 3fill}
```

Kotak yang dihasilkan terlihat seperti ini (diperbesar untuk kejelasan):

![{{{alt}}}](/files/f55847f23033d7086ada7861109c3f51a3840b9c)

Ini `\hbox` ditumpangi kotak-kotak garis putus-putus (berwarna merah) untuk menunjukkan lebar karakter (sebagaimana dilihat oleh TeX). Untuk tujuan penataan huruf, karakter dianggap sebagai kotak kecil dan jumlah glue yang diperlukan untuk mengisi `\hbox`ini ditentukan (dihitung) dengan mempertimbangkan lebar masing-masing karakter.

Ternyata TeX tidak meregangkan atau menyusutkan glue antara A dan B (diatur menjadi 4pt) dan tidak ada glue antara B dan C (diatur menjadi 0pt). Namun, glue antara C dan D dan glue antara D dan akhir kotak keduanya telah meregang cukup besar karena glue tersebut memiliki komponen peregangan paling fleksibel—pada dasarnya, glue itu menyerap seluruh peregangan yang diperlukan untuk mengisi kotak.

## Kembali ke LuateX

Sejauh ini kita telah menjelajahi kotak dan glue dan melihat bahwa LuaTeX memungkinkan akses ke struktur internal TeX yang tersembunyi dari pandangan dengan pdfTeX dan XeTeX. Sekarang waktunya sebuah contoh untuk membuat hal ini lebih eksplisit, tetapi pertama-tama kita perlu secara singkat mengenal cara TeX menyimpan kotak di memorinya—kita akan mulai dengan sebuah analogi.

### Bagaimana TeX menyimpan kotak di memori: sebuah analogi

Misalkan, karena suatu alasan, Anda perlu membuat model data yang menggambarkan sebuah kotak fisik. Data apa yang akan Anda pilih untuk memberikan deskripsi seperti itu? Salah satu pendekatan yang dapat Anda ambil adalah memisahkan informasi menjadi dua bagian: data tentang kotak fisiknya sendiri dan data yang menyediakan daftar isi kotak. Jadi, model sederhana kita mungkin terlihat seperti ini:

1. Data tentang kotak fisik (“metadata”):

* width
* tinggi
* kedalaman
* berat
* warna
* jenis (kayu, plastik, karton)

3. Data tentang isi kotak: suatu bentuk daftar yang mendeskripsikan item yang dikandungnya—mungkin dicantumkan tanpa urutan khusus.

Dan ada analogi yang sangat dekat dengan cara TeX menyimpan kotak.

### Bagaimana TeX menyimpan kotak di memori: hlists dan vlists

Secara internal, TeX membuat “wadah” yang disebut *hlists* (daftar horizontal) dan *vlists* (daftar vertikal) yang masing-masing merepresentasikan hbox dan vbox. Objek hlist/vlist ini menyediakan kumpulan “metadata” tentang kotak, serta akses ke daftar objek yang benar-benar terkandung di dalam kotak itu—daftar tersebut disebut *daftar node*. Tidak seperti kotak fisik, di mana Anda dapat menempatkan objek di dalamnya dalam urutan apa pun, bagi TeX urutan isi kotak sangatlah penting—karena itu adalah item yang akan ditata huruf. Jika Anda memiliki latar belakang pemrograman atau ilmu komputer, Anda tidak akan terkejut mengetahui bahwa objek-objek di dalam kotak TeX disimpan, dan urutan penciptaannya dipertahankan, menggunakan apa yang disebut [daftar berantai ganda](https://en.wikipedia.org/wiki/Doubly_linked_list). Kami tidak akan membahas daftar berantai lebih jauh karena web penuh dengan tutorial, contoh, dan penjelasan.

Konsep node dan daftar node adalah aspek fundamental dari cara kerja TeX, tetapi untuk tujuan artikel ini kami hanya akan memberikan garis besar singkat. Node pada dasarnya adalah semacam “wadah mini” dan (per LuaTeX 1.04) ada sekitar 50 jenis node yang berbeda: mencerminkan tipe data internal dan komponen yang digunakan LuaTeX untuk penataan huruf. Misalnya, ada node untuk merepresentasikan: glyph (yang berasal dari “karakter”), glue, rule horizontal/vertikal, penalty, “whatsit”, kern, dan seterusnya. Semua materi yang ditata huruf pada akhirnya akan menjadi bagian dari daftar node yang sangat besar dan LuaTeX memberi Anda akses langsung ke struktur data internal tersebut. LuaTeX juga memungkinkan Anda menambah, mengedit, mengubah, atau membuat daftar node sehingga, misalnya, Anda dapat membuat kotak langsung di dalam kode Lua tanpa harus menggunakan kode TeX sama sekali. Namun, pembahasan itu untuk hari lain.

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

Contoh berikut membuat sebuah `\hbox` dan menyimpannya dalam register kotak 0. Kemudian kami melaporkan lebar kotak menggunakan kode TeX tradisional dan memperoleh informasi yang sama menggunakan metode kedua melalui `\directlua{}`. Di sini, kami menjalankan skrip Lua kecil yang mengakses area penyimpanan kotak internal TeX untuk memperoleh lebar kotak—tentu saja, kedua nilai tersebut identik: 2412092sp (sp=scaled point: 65536sp = 1 poin TeX). Pada akhirnya, dalam contoh yang sangat sederhana ini, kode TeX dan kode Lua sama-sama memeriksa struktur data internal yang sama untuk memperoleh lebar kotak, tetapi melalui jalur akses langsung inilah LuaTeX membuka pintu ke kekayaan informasi dan kontrol yang tidak tersedia pada mesin lain.

![{{{alt}}}](/files/a20d73a4a9827d30c9afdffa3a708858d6ef17ce)

```latex
\documentclass{article}
\begin{document}
\setbox0=\hbox{A\hskip 5pt B\hskip 10pt C}
\fontsize{18}{22}\selectfont
\noindent Dengan kode \TeX{}, kotak 0 memiliki lebar \number\wd0\relax \space sp\par
\noindent Kita juga dapat menggunakan Lua dan memanggil salah satu fungsi Lua\TeX untuk mendapatkan
informasi yang sama.\vskip10mm
\noindent Dari kode Lua, kotak 0 memiliki lebar
\directlua{
local boxwidth = tex.box[0].width
tex.print(boxwidth.." sp")
} yang, tentu saja, identik dengan nilai yang diperoleh dari kode \TeX{}.
\end{document}
```

## Menggabungkan semuanya: sebuah proyek Overleaf

Kami telah mencatat bahwa, secara internal, TeX merepresentasikan kotak sebagai “wadah” yang disebut hlists/vlists yang menyimpan “metadata” tentang kotak dan memberikan akses ke daftar komponen penyusun kotak tersebut. Dengan LuaTeX Anda dapat mengakses “metadata” kotak dan daftar item yang terkandung dalam kotak TeX: glyph, glue, penalty, kotak lain, dan sebagainya. Dengan menggunakan skrip Lua, dimungkinkan untuk memeriksa sebuah kotak yang berada dalam memori TeX dan menggambar representasi rinci dari isi kotak tersebut. Representasi yang sesuai dari sebuah kotak TeX dan isinya dicapai menggunakan *graf node* dan kami telah menyiapkan sebuah [proyek Overleaf](https://www.overleaf.com/latex/examples/exploring-the-structure-of-tex-boxes-with-luatex/pwdrypmtdbgs) yang melakukannya dengan memanfaatkan skrip Lua luar biasa yang ditulis oleh Patrick Gundlach (lihat kredit). Kami tidak akan menjelaskan proses rinci yang diperlukan untuk memeriksa kotak dan menghasilkan graf node—kecuali mencatat bahwa setiap program/skrip yang memproses kotak TeX harus *rekursif* karena kotak dapat saling bersarang: yaitu, Anda dapat memiliki hbox di dalam vbox, di dalam hbox… menggabungkan semua jenis kotak hingga tingkat nesting yang sangat dalam.

![{{{alt}}}](/files/6b77bd88b39c838092970d2b8f6274bdbf574d56)

### Apa yang disediakan proyek ini?

Proyek ini mengimplementasikan hanya 1 perintah yang disebut `\dobox{perintah kotak}`, misalnya:

```latex
\dobox{\hbox to100pt{%
A\hskip4pt plus3pt minus 2pt
B\hskip 0pt plus 2fil
C\hskip 0pt plus 2fill
D\hskip 0pt plus 3fill}}
```

Fitur `\dobox{...}` perintah melakukan sejumlah tugas:

1. di dalam dokumen Anda, ia menata huruf kode TeX apa adanya untuk kotak Anda;
2. ia menghasilkan grafik SVG dari kotak TeX—Anda dapat menyematkannya ke halaman web (seperti yang telah kami lakukan dalam posting blog ini);
3. ia menghasilkan grafik SVG dari daftar node—yang juga dapat Anda sematkan ke halaman web (seperti yang telah kami lakukan dalam posting blog ini);
4. ia mengeluarkan grafik PDF dari daftar node yang kemudian diimpor ke dokumen PDF utama yang dihasilkan oleh proyek.

Graf node dapat dengan sangat cepat menjadi sangat besar karena banyaknya data yang perlu disimpan LuaTeX untuk merepresentasikan kotak TeX yang kompleks—seperti halaman yang sedang dibangun, atau matematika yang ditata huruf. Untuk daftar node yang lebih besar, grafik PDF yang diimpor mungkin terpotong oleh batas halaman dokumen Anda—jika Anda ingin melihat graf node yang besar, Anda dapat mengunduh file ZIP dari proyek dan mengekstrak grafik PDF yang Anda minati. Saat mengunduh file ZIP proyek, pastikan untuk memilih “Input and Output Files” dari daftar opsi dropdown:

![{{{alt}}}](/files/091666e5b4e3adf5dc69fdb1745de6a340666820)

### Grafik dari proyek Overleaf: deskripsi singkat

Sebelum kami menunjukkan beberapa contoh, ada baiknya membuat beberapa pengamatan tentang grafik yang dihasilkan oleh proyek Overleaf—kami akan menggunakan contoh yang sama yang disebutkan lebih awal dalam artikel. Berikut ini dikemas dalam `\hbox` proyek `\dobox{...}` perintah:

```latex
\dobox{\hbox to100pt{%
A\hskip4pt plus3pt minus 2pt
B\hskip 0pt plus 2fil
C\hskip 0pt plus 2fill
D\hskip 0pt plus 3fill}}
```

Berikut adalah `\hbox` yang dihasilkan oleh TeX—demi kejelasan, kotak diperbesar tetapi batasnya disertakan dalam grafik yang dihasilkan oleh proyek Overleaf.

![{{{alt}}}](/files/e2cf8ce292c7e0dc5adbab25d373c50575d1f121)

Berikut ini sebuah *beranotasi* diagram SVG dari daftar node yang merepresentasikan kotak di atas—anotasi ditambahkan untuk menyoroti “metadata” kotak dan daftar objek yang dikandungnya: anotasi tersebut tidak ada dalam grafik yang dihasilkan oleh proyek Overleaf.

[![{{{alt}}}](/files/2d14b6d196441700100ac173306c32dd4a15c1c6)](https://www.filepicker.io/api/file/ZSwIylUR66eFYPMo0suX)

Jika Anda melihat bagian “metadata” Anda mungkin mengamati beberapa parameter yang tidak familiar:

* `glue_set`
* `glue_sign`
* `glue_order`

Parameter-parameter ini adalah pengaturan yang digunakan TeX untuk menghitung seberapa banyak glue harus meregang atau menyusut di dalam kotak ini dan hanya satu contoh data yang dapat Anda peroleh dengan mudah melalui LuaTeX tetapi tidak dengan mesin TeX lainnya. Perhatikan bahwa node glue yang terkandung dalam komponen kotak *mempertahankan* nilai glue asli yang kita ketik untuk membuat kotak. Ini penting karena TeX menyediakan perintah `\unhbox`, `\unvbox`, `\unhcopy`, `\unvcopy` yang “membuka kotak” isi kotak dan melepaskannya kembali ke aliran masukan untuk sekali lagi ikut serta dalam operasi penataan huruf. Hanya ketika TeX akhirnya mengeluarkan (mengirim keluar) kotak ke file PDF atau DVI, maka `glue_set`, `glue_sign` dan `glue_order` diterapkan pada semua glue yang terkandung dalam kotak—untuk menghitung jumlah peregangan atau penyusutan aktual yang diperlukan guna memposisikan komponen di dalam kotak dan kemudian menghasilkan data PDF atau opcode DVI yang sesuai.

Parameter lain yang tercantum dalam “metadata” adalah `shift`: ini adalah nilai pergeseran kotak yang dihasilkan dari penerapan perintah TeX:

* `\raise`, `\lower` (diterapkan pada sebuah `\hbox`);
* `\moveleft`, `\moveright` (diterapkan pada sebuah `\vbox`).

Dalam contoh kita, `shift` bernilai 0pt karena kita tidak menggeser `\hbox` dari posisi alaminya.

Fitur [proyek Overleaf](https://www.overleaf.com/latex/examples/exploring-the-structure-of-tex-boxes-with-luatex/pwdrypmtdbgs) juga menghasilkan diagram graf node dalam format PDF: berikut tautan untuk mengunduh sebuah [versi berkas PDF](https://www.filepicker.io/api/file/bezigXESC2FSasvjoh8A) dari graf node di atas.

### Bagaimana proyek Overleaf membuat grafik-grafik itu?

Proyek Overleaf memanfaatkan kemampuan untuk menjalankan alat perangkat lunak dan utilitas yang terpasang di server Overleaf—lihat [posting blog ini](/latex/id/artikel-mendalam/52-using-luatex-to-run-tools-and-utilities-installed-on-overleaf-s-servers.md) untuk detail lebih lanjut dan contoh proyek. Untuk menghasilkan grafik SVG yang merepresentasikan sebuah kotak TeX, kode TeX kotak ditulis ke berkas kecil yang kemudian ditata huruf dengan pdfTeX untuk menghasilkan berkas DVI—perhatikan bahwa program pdfTeX dijalankan oleh LuaTeX melalui beberapa baris skrip Lua. Berkas DVI tersebut dikonversi secara langsung ke SVG menggunakan `dvisvgm` utilitas—yang disertakan dengan distribusi TeX Live yang terpasang di server Overleaf. `dvisvgm` dijalankan dengan opsi baris perintah `-n` untuk memastikan bahwa teks apa pun yang ditata huruf diubah menjadi garis/kurva sehingga rendering file SVG yang benar tidak bergantung pada font TeX yang terpasang.

Untuk membuat graf node, kami menggunakan skrip Lua yang disebut `hiviznodelist.lua` yang didasarkan pada karya Patrick Gundlach. Skrip itu menulis apa yang disebut sebuah `.gv` (Graphviz) yang merupakan berkas teks berisi graf node yang dideskripsikan dalam bahasa `dot` . Berkas `.gv` diproses oleh program utilitas yang disebut `dot` yang menghasilkan diagram node dalam format berkas PDF dan SVG.

### Contoh proyek

Berikut beberapa contoh tambahan dengan grafik SVG yang dihasilkan menggunakan proyek Overleaf. Kotak yang berisi banyak teks (misalnya, di dalam \vbox), atau matematika yang kompleks, akan menghasilkan graf node yang sangat besar—jika Anda menjelajahi proyek Overleaf, disarankan untuk tidak menggunakan kotak yang terlalu kompleks untuk menunjukkan fitur yang Anda minati.

#### \vbox to 25pt{A}

Contoh ini menunjukkan efek meletakkan teks langsung ke dalam sebuah `\vbox`: perhatikan bahwa struktur node cukup kompleks, bahkan untuk kotak sesederhana ini. Alasan di balik kompleksitas ini adalah bahwa teks yang ditempatkan langsung ke dalam sebuah `\vbox` menyebabkan TeX melakukan pematahan baris. Anda dapat melihat bahwa `\vbox` berlebar 345pt: nilai dari `\hsize` pada saat kotak ini dibuat. Perhatikan juga bahwa karakter “A” terkandung dalam sebuah `hlist` yang juga berlebar 345 poin, dan perhatikan penalty besar (10000) bersama dengan `\parfillskip` dan `\rightskip` glue di akhir isi kotak. Penalty itu dan dua item glue disisipkan oleh aktivitas pematahan baris TeX. Jika Anda melihat nilai untuk baris paragraf ( `glue_set` ) yang berisi huruf “A”, Anda akan melihat bahwa nilainya sangat besar (322.500000): mengapa begitu? Karena baris paragraf tersebut berlebar 345pt tetapi hanya berisi sebuah`hlist`nilai `\parindent` dan huruf “A”: ruang yang tersisa harus diisi oleh `\parfillskip` glue yang harus meregang cukup jauh untuk mengisi ruang yang tersisa pada baris.

![{{{alt}}}](/files/daa0e60781fb58f7db08fe6718c35d287e637502)

[![{{{alt}}}](/files/5f3a34a30806e4e649ed3430e43c23efbd10b7c7)](https://www.filepicker.io/api/file/pVtHsNGSQ4m09vBZuOpQ)

[Unduh berkas PDF](https://www.filepicker.io/api/file/nBS0uDs2QjqKCKljAm7r)

#### \vbox to 25pt{\hbox{A}}

Sangat instruktif untuk membandingkan contoh ini dengan yang sebelumnya. Di sini, tidak hanya graf node yang jauh lebih kecil, tetapi lebar `\vbox` hanya 7.50002pt: sama lebarnya dengan karakter “A”. Alasannya adalah bahwa “A” telah dibungkus dalam sebuah `\hbox` yang mencegah `\vbox` memicu TeX untuk melakukan pematahan baris—sebuah karakteristik penting dari kotak yang dibuat dengan `\vbox`.

![{{{alt}}}](/files/5002744bc6047026d048407ad4e002a703841165)

[![{{{alt}}}](/files/43d67266d256c7a79ae165e42c9278595869f2ad)](https://www.filepicker.io/api/file/LHepknjnRGOVEdghW4qH)

[Unduh berkas PDF](https://www.filepicker.io/api/file/Yk3uCCQR5ao8Yd3TJCdE)

#### Matematika sederhana: \hbox{$$\displaystyle \int f(x) dx$$}, kotak kompleks!

Contoh ini menunjukkan bahwa bahkan matematika yang ditata huruf sangat sederhana sekalipun menghasilkan struktur kotak yang rinci: penataan huruf matematika menghasilkan *sangat* struktur data kompleks di dalam TeX!

![{{{alt}}}](/files/f2a7220b2143239d33920c6237864d712ed64098)

[![{{{alt}}}](/files/fb5c6c975878b24543bc7a81c3aace71681b5ffe)](https://www.filepicker.io/api/file/oVFNNvCqT0eZP0qS2odk)

[Unduh berkas PDF](https://www.filepicker.io/api/file/D5TepsdaSdeYZvkuSEJt)

## Kredit: terima kasih Patrick!

Terima kasih kepada [Patrick Gundlach](https://twitter.com/patrickgundlach) yang telah memberi izin kepada Overleaf untuk menggunakan dan mendistribusikan versi modifikasi dari skrip Luanya, `viznodelist.lua`, yang memproses kotak TeX dan menghasilkan sebuah berkas (dalam bahasa `dot` ) yang dapat diproses untuk menggambar graf node. Proyek Overleaf berisi skrip Lua yang disebut `hiviznodelist.lua`—versi kode asli Patrick yang telah diubah nama dan dimodifikasi, yang tersedia di [Github](http://gist.github.com/556247). Patrick telah membuat sistem penataan huruf berbasis LuaTeX sumber terbuka yang disebut [speedata Publisher](https://speedata.github.io/publisher/index.html) yang dapat Anda unduh dan gunakan secara gratis—opsi dukungan komersial juga tersedia.


---

# 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/36-pandora-s-hbox-using-luatex-to-lift-the-lid-of-tex-boxes.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.
