> 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/47-tex-tables-how-tex-calculates-spanned-column-widths.md).

# Tabel TeX: Cara TeX menghitung lebar kolom yang membentang

## Tujuan artikel ini

Dalam artikel ini kita mengeksplorasi bagaimana $$\mathrm\TeX$$ menghitung lebar kolom tabel ketika tabel berisi entri (mis., judul tabel) yang membentang beberapa kolom (mis., menggunakan $$\mathrm\TeX$$ primitif `\omit` dan `\span`). Dengan menggunakan sebuah [tabel “referensi” sederhana](#reference-table) sebagai titik awal, kita membuat berbagai contoh—yang diturunkan dari tabel referensi itu—dengan mengubah berbagai entri untuk membuat kolom yang membentang. Dengan memeriksa efek dari perubahan-perubahan itu kita dapat mulai mengembangkan pemahaman tentang algoritme mendasar yang $$\mathrm\TeX$$ digunakan untuk menghitung lebar kolom yang membentang.

### Menggunakan $$\mathrm\TeX$$ berisi nilai data aktual yang disimpan dalam $$\mathrm\LaTeX$$

Untuk memeriksa dan menjelaskan *bagaimana* $$\mathrm\TeX$$ menentukan lebar kolom yang membentang, perlu mengesampingkan semua $$\mathrm\LaTeX$$ paket tabel yang menakjubkan dan kembali ke perintah pembuatan tabel tingkat dasar, rendah (primitif): khususnya, `\halign{...}`, `\span` dan `\omit`. [Paket $$\mathrm\TeX$$/$$\mathrm\LaTeX$$ tabel](https://ctan.org/topic/table) yang ada tentu merupakan alat produktivitas yang esensial dan menyediakan banyak fungsi yang sangat berguna yang memungkinkan pengguna dengan cepat menghasilkan berbagai macam materi tabular menggunakan $$\mathrm\LaTeX$$. Paket-paket tersebut menyediakan “kerangka makro” esensial yang dibangun di sekitar $$\mathrm\TeX$$perilaku tingkat rendah dan para pengembangnya menyediakan abstraksi dan lapisan isolasi yang sangat membantu yang menangani kompleksitas yang mendasarinya. Banyak dari paket-paket tersebut sungguh merupakan pencapaian luar biasa dari pemrograman kompleks $$\mathrm\TeX$$ pemrograman: kita semua patut bersyukur bahwa mereka ada untuk melindungi kita agar tidak perlu menggunakan kode mentah $$\mathrm\TeX$$!

Algoritme sebenarnya yang $$\mathrm\TeX$$ digunakan untuk menghitung lebar kolom yang membentang dijelaskan di halaman 245 dari [$$\mathrm\TeX\text{book}$$](https://www.amazon.co.uk/TeXbook-Donald-E-Knuth/dp/0201134489) dan, dengan rincian lebih lanjut, dalam Bagian 801 (halaman 336) dari buku cetak yang memuat $$\mathrm\TeX$$kode sumber [$$\mathrm\TeX\text{: The Program}$$](https://www.amazon.co.uk/Computers-Typesetting-Tex-Program-TEX/dp/0201134373). Namun, bagi banyak orang (termasuk saya sendiri) penjelasan Knuth, pada beberapa kesempatan, agak padat dan ringkas dan, kadang-kadang, sulit diikuti secara rinci: contoh-contoh bergambar selalu sangat membantu.

### Ya, tabel memang kompleks

Di bagian 768 (halaman 322) dari buku [$$\mathrm\TeX\text{: The Program}$$](https://www.amazon.co.uk/Computers-Typesetting-Tex-Program-TEX/dp/0201134373), Knuth membuat komentar yang menarik:

> “Anehnya, ini semacam mukjizat setiap kali `\halign` dan `\valign` berfungsi, karena hal itu melintasi begitu banyak struktur kontrol dari $$\mathrm\TeX$$.”

Selain itu, Jilid IV dari seri buku empat jilid [$$\mathrm\TeX\text{ in Practice}$$](https://www.amazon.co.uk/Tex-Practice-Set-Stephan-Bechtolsheim/dp/038797296X/ref=sr_1_11?s=books\&ie=UTF8\&qid=1504256043\&sr=1-11\&keywords=TeX+in+Practice) mendedikasikan tidak kurang dari 180 halaman (hlm. 199–379) untuk membuat tabel dalam $$\mathrm\TeX$$ melalui `\halign` dan `\valign`.

Jadi, aman untuk menyatakan bahwa $$\mathrm\TeX$$ tabel memang “cukup rumit”.

### Kolom yang membentang: \omit, \span, dan \multispan

Sebagaimana dicatat, untuk mengeksplorasi $$\mathrm\TeX$$perhitungan lebar kolom dari kita perlu menggunakan $$\mathrm\TeX$$; yang dimaksud adalah kombinasi perintah-primitif dan satu $$\text{Plain }\mathrm\TeX$$ makro bernama `\multispan`. Meskipun kita tidak akan menggunakan perintah-perintah ini untuk langsung mengilustrasikan tabel contoh kita (yakni, menjelaskan secara lengkap semua $$\mathrm\TeX$$ kode), ada baiknya menyertakan catatan singkat untuk menjelaskannya:

* `\halign`: Salah satu dari dua $$\mathrm\TeX$$ primitif (perintah) untuk membuat tabel. Yang lainnya adalah `\valign` tetapi itu tidak digunakan secara luas dan tidak akan dibahas dalam artikel ini.
* `\omit`: Sebuah $$\mathrm\TeX$$ primitif (perintah) yang menginstruksikan $$\mathrm\TeX$$ untuk mengabaikan templat preambel entri tabel.
* `\span`: Sebuah $$\mathrm\TeX$$ primitif (perintah) yang digunakan untuk menggabungkan dua entri tabel yang bersebelahan.
* `\multispan{n}`: Sebuah $$\mathrm\TeX$$ makro biasa untuk membentangkan `n` kolom.

Pada dasarnya, untuk membentangkan kolom $$\mathrm\TeX$$ mengabaikan jumlah templat preambel tabel yang sesuai dan menggabungkan jumlah entri tabel yang diperlukan menjadi satu entri tunggal. `\multispan{n}` bekerja dengan mengembang menjadi urutan `\omit` dan `\span` token yang diperlukan untuk membentangkan `n` kolom. Misalnya, `\multispan{3}` mengembang menjadi `\omit\span\omit\span\omit`.

## Memperkenalkan tabel “referensi” kita

Berikut adalah tabel referensi kita diikuti oleh versi beranotasi yang menjelaskan elemen-elemen yang digunakan dalam pembuatannya:

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

Dengan mengubah tabel referensi kita, kita akan mengamati apa yang terjadi pada lebar tabel, dan lebar kolom-kolom individual, saat kita menambahkan entri yang membentang berbagai kolom. Tabel referensi ini dibuat dalam raw $$\mathrm\TeX$$ menggunakan `\halign{...}` primitif bersama dengan sejumlah makro kustom yang diperlukan untuk menata tabel—kita tidak akan membahas makro tersebut karena tidak penting untuk memahami contoh dan penjelasannya.

Berikut adalah versi beranotasi dari tabel referensi kita untuk menjelaskan fitur-fiturnya:

![{{{alt}}}](/files/16d88d1b32153fddaddb8a6ab5db743169aeb736)

Kumpulan contoh tabel pertama kita, dan tabel referensi awal, semuanya disetel `\tabskip=0pt` sehingga $$\mathrm\TeX$$ tidak menambahkan spasi apa pun di antara kolom-kolom kita: pada praktiknya, semuanya saling bersentuhan. Alasannya adalah untuk menyederhanakan pembahasan awal dan perhitungan berikutnya—nanti dalam artikel ini kita memperkenalkan kembali `\tabskip` glue tak-nol untuk memeriksa pengaruhnya terhadap perhitungan lebar kolom yang membentang.

Sebagaimana dicatat dalam anotasi, kita telah menambahkan sedikit ruang putih (5pt) di awal semua entri tabel yang tidak membentang (kecuali baris pertama). Ruang putih 5pt itu merupakan bagian dari lebar total semua entri yang tidak membentang (kecuali baris pertama) dan ditambahkan hanya agar tabel terlihat sedikit kurang padat.

### Catatan singkat tentang lebar tabel

Fitur `\halign{...}` perintah memiliki tiga bentuk:

* `\halign{...}`: atur tabel menjadi lebar apa pun yang $$\mathrm\TeX$$ hitung, berdasarkan ukuran entri (dan `\tabskip` glue);
* `\halign to *width* {...}`: instruksikan $$\mathrm\TeX$$ untuk menata tabel pada `*lebar*`;
* `\halign spread *amount*{...}`: sesuaikan lebar yang dihitung dengan `*jumlah*`.

Saat $$\mathrm\TeX$$ menata sebuah tabel menggunakan `\halign{...}` ia harus membaca seluruh tabel ke dalam memori untuk melakukan berbagai perhitungan yang diperlukan untuk menatanya. Akibatnya, kecuali Anda telah menentukan lebarnya dengan menggunakan `\halign to *width* {...}` Anda tidak dapat mengetahui lebar akhirnya sampai $$\mathrm\TeX$$ selesai memproses (menata) tabel itu. Salah satu cara untuk memperoleh lebar tabel yang dihasilkan oleh `\halign{...}` adalah terlebih dahulu menata tabel di dalam sebuah `\vbox{...}` (mis., `\setbox0=\vbox{\halign{...}}`) lalu, misalnya, gunakan `\the\wd0` untuk memperoleh lebarnya.

### Tidak ada pemutusan baris otomatis dalam entri tabel

Penting untuk dicatat bahwa ketika $$\mathrm\TeX$$ menata sebuah tabel yang dibuat dengan `\halign{...}` teks apa pun di dalam entri tabel tidak secara otomatis diproses dengan pemutusan baris: entri tabel ditata dalam *mode horizontal terbatas*—sama seperti sebuah `\hbox`hbox. Untuk mengaktifkan pemutusan baris, teks suatu entri tabel perlu ditempatkan di dalam sebuah `\vbox{...}` bersama dengan menggunakan nilai yang sesuai untuk `\hsize` di dalam `\vbox{...}`. Namun, perlu dicatat bahwa teks dalam sebuah `\noalign{...}` perintah (sebuah $$\mathrm\TeX$$ primitif) yang digunakan dalam sebuah `\halign{...}` tunduk pada $$\mathrm\TeX$$pemutusan baris dari `\noalign{...}` memungkinkan $$\mathrm\TeX$$ untuk “keluar” dari `\halign{...}` mode vertikal dan menempatkan materi di antara baris-baris tabel—biasanya untuk menghasilkan garis horizontal di antara baris-baris tabel.

### Tidak diizinkan: \halign{...} di dalam \hbox{...}

Anda tidak dapat *langsung* menata `\halign{...}` di dalam sebuah `\hbox{...}`. Mencoba menggunakan `\hbox{\halign{...}}` akan menghasilkan pesan kesalahan yang agak membingungkan:

```latex
! Missing } inserted.
<inserted text>
                }
<untuk dibaca lagi>
                   \halign
l.1 \hbox{\halign
```

#### Penjelasan atas kesalahan ini

Karena `\hbox{...}` $$\mathrm\TeX$$ yang melingkupi *mode horizontal terbatas*berada dalam `\halign{...}` ; lalu ia mendeteksi *perintah mode vertikal* Sebagai contoh, jika Anda menggunakan `\halign{...}` di dalam sebuah paragraf, $$\mathrm\TeX$$ akan mengakhiri paragraf, memproses `\halign{...}` lalu melanjutkan sisa paragraf.

Ketika digunakan di dalam sebuah `\hbox{...}`,  `\halign{...}` memicu $$\mathrm\TeX$$ untuk mencoba keluar kembali ke mode vertikal dengan mencoba memaksa penutupan grup saat ini: $$\mathrm\TeX$$ melaporkan sebuah “`! Missing }`” dan menampilkan kesalahan karena ia mengira Anda telah membuat kesalahan dalam penggunaan pengelompokan. Meskipun kurung kurawal kanan (`}`) mungkin tidak hilang dari $$\mathrm\TeX$$ kode Anda, pesan kesalahan tersebut merupakan gejala `\hbox{...}` perintah \hbox yang “menghalangi” dan $$\mathrm\TeX$$ mengambil “perkiraan terbaik”-nya terhadap tindakan yang tepat untuk menyelesaikan masalah.

## Contoh tabel dengan kolom yang membentang

Rangkaian grafik tabel berikut menyediakan berbagai contoh untuk menunjukkan efek dari pembentangan kolom tabel: menandakan bahwa entri tabel yang panjang dapat berdampak tak terduga pada lebar kolom tertentu—dan, akibatnya, pada lebar tabel itu sendiri. Pertanyaan yang akan kita bahas adalah apa yang dilakukan $$\mathrm\TeX$$ ketika entri tabel tertentu membentang sejumlah kolom tetapi “terlalu lebar untuk muat”. Sebagaimana dicatat di atas, $$\mathrm\TeX$$ memang menerapkan algoritme khusus untuk masalah perhitungan lebar kolom ini: contoh-contoh berikut dirancang untuk membantu mengembangkan “rasa” tentang cara kerja algoritme itu.

### Contoh tabel 1

Dalam contoh ini kita menggunakan `\multispan{2}` untuk membentangkan kolom 1 dan 2 dengan entri yang teksnya adalah **Sebuah judul tabel**:

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

#### Pengamatan

* Lebar tabel ini sama dengan [tabel referensi](#reference-table): $$327.71722\text{pt}$$.
* Lebar entri yang membentang kolom 1 dan 2 adalah $$81.04953\text{pt}$$ yang lebih kecil daripada lebar total entri dalam kolom-kolom yang dibentangnya: $$52.56676\text{pt} + 57.06679\text{pt} = 109.63355\text{pt}$$

## Contoh tabel 2

Seperti pada [Contoh tabel 1](#example-table-1), contoh ini juga menggunakan `\multispan{2}` untuk membentangkan kolom 1 dan 2 tetapi di sini kita menggunakan entri yang lebih panjang dengan teks **Sebuah judul tabel yang sedikit lebih panjang**.

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

#### Pengamatan

Jika Anda membandingkan contoh ini dengan [tabel referensi](#reference-table) kita dapat melihat hal-hal berikut:

* Lebar tabel ini telah meningkat dari $$327.71722\text{pt}$$ ke $$374.37032\text{pt}$$: total sebesar $$46.6531\text{pt}$$.
* Lebar entri yang membentang kolom 1 dan 2 ($$156.28664\text{pt}$$) lebih besar daripada lebar total entri dalam kolom-kolom yang dibentangnya: $$52.56676\text{pt} + 57.06679\text{pt} = 109.63355\text{pt}$$. Selisih itu adalah $$156.28664\text{pt}-109.63355\text{pt} = 46.6531\text{pt}$$ yang besarnya sama dengan jumlah kenaikan lebar tabel.
* $$\mathrm\TeX$$ telah menyesuaikan lebar kolom 2 untuk menyediakan ruang tambahan yang diperlukan. Nanti kita akan melihat bagaimana $$\mathrm\TeX$$ menghitung besarnya penambahan lebar yang harus dilakukan pada kolom 2.
* Kolom 1 tidak terpengaruh: lebarnya tidak terpengaruh oleh entri yang membentang kolom 1 dan 2.

### Contoh tabel 3

Dalam contoh ini kita menggunakan `\multispan{3}` untuk membentangkan kolom 1 sampai 3 dengan entri yang teksnya sama seperti [Contoh tabel 2](#example-table-2): **Sebuah judul tabel yang sedikit lebih panjang**.

![{{{alt}}}](/files/911855be5901e754c501cb23d75216d724d75252)

#### Pengamatan

* Lebar tabel ini sama dengan [tabel referensi](#reference-table): $$327.71722\text{pt}$$.
* Lebar entri yang membentang kolom 1 sampai 3 ($$156.28664\text{pt}$$) lebih kecil daripada lebar total entri dalam ketiga kolom yang dibentangnya: $$52.56676\text{pt} + 57.06679\text{pt} + 59.03899\text{pt} = 168.67254\text{pt}$$.
* Tidak satu pun lebar kolom yang terpengaruh oleh entri yang membentang kolom 1 sampai 3.

Apakah Anda mulai melihat pola yang muncul?

### Contoh tabel 4

Seperti pada [Contoh tabel 3](#example-table-3), di sini kita menggunakan `\multispan{3}` untuk membentangkan kolom 1 sampai 3 tetapi kali ini dengan entri yang teksnya jauh lebih panjang: **Sebuah judul tabel yang jauh lebih panjang yang memanjang jauh**.

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

#### Pengamatan

* Dibandingkan dengan [tabel referensi](#reference-table), lebar tabel ini telah meningkat dari $$327.71722\text{pt}$$ ke $$465.95685\text{pt}$$: kenaikan sebesar $$138.23963\text{pt}$$.
* Lebar entri yang membentang kolom 1 sampai 3 adalah $$306.91216\text{pt}$$.
* Lebar total entri dalam ketiga kolom yang dibentang adalah $$52.56676\text{pt} + 57.06679\text{pt} + 59.03899\text{pt} = 168.67254\text{pt}$$.
* Selisih lebar antara entri panjang yang membentang dan entri dalam kolom 1 sampai 3 adalah $$306.91216\text{pt}-168.67254\text{pt}=138.23962\text{pt}$$. Jumlah yang sama (hingga 4 angka desimal!) yang merupakan kenaikan lebar tabel.
* Hanya kolom 3 yang lebar-nya meningkat: baik kolom 1 maupun kolom 2 tidak terpengaruh.

#### Sebuah pola muncul

Jika kita melihat [Contoh tabel 2](#example-table-2) dan [Contoh tabel 4](#example-table-4) kita dapat melihat bahwa dalam kedua kasus, itu adalah **kolom terakhir dalam bentang** yang lebarnya meningkat untuk memberi ruang bagi entri panjang yang membentang kolom-kolom:

* Di [Contoh tabel 2](#example-table-2): Entri panjang itu membentang kolom 1 dan 2. Kolom 2 menjadi “tertarik”.
* Di [Contoh tabel 4](#example-table-4): Entri panjang itu membentang kolom 1 sampai 3. Kolom 3 menjadi “tertarik”.

#### Lebar kolom 3: Munculkah sebuah algoritme?

Perhitungan berikut memberikan petunjuk yang lebih jelas tentang apa yang $$\mathrm\TeX$$ lakukan. Inilah yang kita ketahui:

* Lebar entri panjang yang membentang kolom 1 sampai 3 adalah $$306.91216\text{pt}$$.
* Lebar total entri di kolom 1 dan 2 adalah $$52.56676\text{pt} + 57.06679\text{pt} = 109.63355\text{pt}$$.

Apa selisih di antara nilai-nilai itu? Yaitu $$306.91216\text{pt}-109.63355\text{pt} = 197.2786\text{pt}$$ dan ini adalah lebar yang digunakan untuk kolom 3: hal ini muncul langsung dari algoritme yang digunakan oleh $$\mathrm\TeX$$.

### Contoh tabel 5

Sebelum kita sampai pada contoh yang lebih rumit, berikut satu contoh “sederhana” lagi. Tabel ini memuat entri panjang yang sama seperti pada [Contoh tabel 4](#example-table-4): **Sebuah judul tabel yang jauh lebih panjang yang memanjang jauh**; namun, kali ini kita menggunakan `\multispan{6}` yang memungkinkan entri itu membentang seluruh tabel. Seperti yang Anda lihat, tabel yang dihasilkan tetap memiliki lebar yang sama seperti tabel referensi kita [tabel referensi](#reference-table) ($$327.71722\text{pt}$$) yang berarti tidak ada kolom yang terpengaruh oleh entri yang sangat panjang ini. Jelas, ini karena lebar entri ($$306.91216\text{pt}$$) lebih kecil daripada lebar total seluruh entri yang dibentangnya: $$327.71722\text{pt}$$; yaitu, lebar tabel.

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

### Contoh tabel 6: Sedikit lebih rumit

Di sini, kita melihat serangkaian tiga tabel contoh (6(a)–6(c)) untuk menunjukkan efek dari dua entri berbeda yang keduanya membentang sampai kolom 5. [Contoh tabel 6(a)](#example-table-6a) dan [Contoh tabel 6(b)](#example-table-6b) keduanya menampilkan tabel yang berisi satu entri yang membentang beberapa kolom sampai kolom 5. [Contoh tabel 6(c)](#example-table-6c) menggabungkan kedua entri yang membentang itu ke dalam satu tabel dan mengajukan pertanyaan: entri mana yang sebenarnya menentukan lebar kolom 5, dan mengapa? Jawabannya membawa kita ke inti algoritme yang digunakan oleh $$\mathrm\TeX$$.

#### Contoh tabel 6(a)

![{{{alt}}}](/files/5ef3200d951ddcc84260e92ae3d373d06df2246b)

**Pengamatan**

* Dibandingkan dengan [tabel referensi](#reference-table), lebar tabel ini telah meningkat dari $$327.71722\text{pt}$$ ke $$371.11153\text{pt}$$: kenaikan sebesar $$43.39431\text{pt}$$.
* Lebar entri yang membentang kolom 3 sampai 5 adalah $$215.06683\text{pt}$$.
* Lebar total entri dalam kolom 3 sampai 5 adalah $$59.03899\text{pt} + 52.98344\text{pt} + 59.6501\text{pt} = 171.67253\text{pt}$$.
* Selisih lebar antara entri yang dibentangkan dalam kolom 3 sampai 5 dan lebar entri yang membentang adalah $$215.06683\text{pt}-171.67253\text{pt}=43.3943\text{pt}$$: jumlah tepat (hingga 4 angka desimal!) yang menyebabkan lebar tabel meningkat.

#### Contoh tabel 6(b)

![{{{alt}}}](/files/92b68f2f88c970749ba088ce55db7b1f006c6ebd)

**Pengamatan**

* Dibandingkan dengan [tabel referensi](#reference-table), lebar tabel ini telah meningkat dari $$327.71722\text{pt}$$ ke $$353.3233\text{pt}$$: kenaikan sebesar $$25.60608\text{pt}$$.
* Lebar entri yang membentang kolom 1 sampai 5 adalah $$306.91216\text{pt}$$.
* Lebar total entri dalam kolom 1 sampai 5 adalah $$52.56676\text{pt} + 57.06679\text{pt} + 59.03899\text{pt} + 52.98344\text{pt} + 59.6501\text{pt} = 281.30608\text{pt}$$.
* Selisih lebar antara entri yang dibentangkan dalam kolom 1 sampai 5 dan lebar entri yang membentang adalah $$306.91216\text{pt}-281.30608\text{pt}=25.60608\text{pt}$$: **note** ini adalah *lebih kecil* daripada nilai yang dihitung untuk [Contoh 6(a)](#example-table-6a), yaitu $$43.3943\text{pt}$$.

#### Contoh tabel 6(c)

Di sini, kita menggabungkan entri pada tabel contoh [6(a)](#example-table-6a) dan [6(b)](#example-table-6b) ke dalam satu tabel: apa yang terjadi?

![{{{alt}}}](/files/733ddc90be027409d7ffb1c2802928a84f3d2a1d)

**Pengamatan**

* Dibandingkan dengan [tabel referensi](#reference-table), lebar tabel ini telah meningkat dari $$327.71722\text{pt}$$ ke $$371.11153\text{pt}$$: kenaikan sebesar $$43.39431\text{pt}$$. Kita mencatat ini persis sama dengan [Contoh tabel 6(a)](#example-table-6a).

#### Apa yang $$\mathrm\TeX$$ lakukan?

Untuk memahami hasil dari $$\mathrm\TeX$$algoritme dan proses pengambilan keputusan, kita perhatikan bahwa entri ini

![{{{alt}}}](/files/77fdc824fc14d9154068bf8d16b451fde6bb456e)

melampaui entri-entri yang dibentang oleh $$25.60608\text{pt}$$; namun, entri ini

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

meluas bahkan lebih jauh lagi melampaui entri-entri yang dibentang: sebesar $$43.3943\text{pt}$$. Maka entri itu “menang dalam perlombaan” dan lebar kolom 5 meningkat sebesar **maksimum** dari kedua nilai ini ($$43.3943\text{pt}$$). Lebar kolom 5 sekarang menjadi $$59.6501\text{pt} + 43.3943\text{pt} = 103.0444\text{pt}$$ untuk mengakomodasi entri yang membentang kolom 3 sampai 5. Uraian kami tentang “urutan kejadian” yang tepat sedikit disederhanakan, tetapi hasil akhirnya seperti yang telah kami jelaskan.

## Mengembalikan sedikit kompleksitas

Untuk meminimalkan kompleksitas pembahasan kita (sejauh ini) kita telah menggunakan contoh yang relatif sederhana untuk menunjukkan prinsip-prinsip $$\mathrm\TeX$$algoritme; khususnya, kita menetapkan `\tabskip=0pt`. Dalam praktiknya, tabel “dunia nyata” kemungkinan memiliki banyak entri yang membentang berbagai kolom dan, tentu saja, akan memiliki nilai tak-nol untuk `\tabskip` glue—sebuah topik yang sekarang akan kita tinjau kembali.

### \tabskip glue dan lebar kolom yang membentang

Perancangan tabel sering memerlukan penambahan ruang putih di antara kolom dan, tentu saja, $$\mathrm\TeX$$ memiliki fasilitas ini melalui sebuah perintah primitif bernama `\tabskip`. Perintah ini bisa digunakan untuk menempatkan glue tetap atau fleksibel (spasi):

* sebelum tabel (yaitu, di sebelah kiri kolom 1);
* di antara satu atau lebih kolom;
* setelah tabel (yaitu, di sebelah kanan kolom terakhir).

Berikut contoh untuk mengingatkan kita:

![{{{alt}}}](/files/11e1dbc863ae9dceae0a6f532b1dd5ededcacb1c)

### Bagaimana glue \tabskip memengaruhi lebar kolom yang membentang?

Kehadiran `\tabskip` glue tak-nol di antara kolom menyediakan ruang tambahan yang dapat “diserap” oleh entri yang membentang sebelum $$\mathrm\TeX$$ perlu memikirkan peningkatan lebar kolom terakhir dalam bentang.

Pada contoh berikutnya kita akan menggunakan dua tabel untuk membandingkan hasil membentangkan dua kolom. Satu-satunya perbedaan antara tabel-tabel tersebut adalah penggunaan `\tabskip` glue.

* Contoh pertama menggunakan tabel “referensi” asli kita yang, jika Anda ingat, telah disetel `\tabskip=0pt`.
* Contoh kedua menggunakan versi modifikasi dari [tabel referensi](#reference-table) (dianotasi di atas) yang telah `\tabskip=10pt` sebelum dan sesudah tabel tetapi, yang lebih penting, telah disetel `\tabskip=20pt` di antara kolom-kolom.

Di dalam *yang dimodifikasi* tabel referensi, dua kolom yang dibentangkan tidak berpengaruh pada lebar kolom (dan lebar tabel) tetapi mereka memengaruhi lebar kolom 2 (dan lebar tabel) dalam *asli* [tabel referensi](#reference-table).

### Tabel referensi asli: \tabskip=0pt

Di sini, kita menampilkan [tabel referensi](#reference-table) asli kita bersama dengan tabel kedua (diturunkan dari [tabel referensi](#reference-table)asli kita) yang memiliki entri “**Uji judul tabel yang lebih panjang**” yang membentang kolom 1 dan 2, Jelas sekali, kolom 2 (dari tabel kedua pada diagram) dan dengan demikian seluruh tabel, keduanya terpengaruh oleh kolom yang membentang.

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

### Tabel referensi yang dimodifikasi: \tabskip=20pt

Di sini, kita menampilkan tabel referensi yang dimodifikasi bersama dengan tabel kedua (diturunkan dari tabel referensi yang dimodifikasi) yang juga memiliki entri “**Uji judul tabel yang lebih panjang**” yang membentang kolom 1 dan 2, Jelas sekali, di dalam tabel kedua pada diagram, baik lebar kolom 2 maupun tabel tidak terpengaruh oleh kolom yang membentang. Dalam kasus ini, kehadiran `\tabskip` glue (`20pt`) di antara kolom-kolom telah membantu “menyerap” ruang yang dibutuhkan oleh teks dalam entri yang membentang kolom 1 dan 2:

![{{{alt}}}](/files/25fe69266c31f84cbe0fbaeee837cc1969a25ff1)

## Inti dari $$\mathrm\TeX$$algoritme

Semoga, rangkaian contoh yang disediakan di atas telah membantu mengembangkan “rasa” tentang apa yang $$\mathrm\TeX$$ lakukan untuk mengakomodasi entri yang membentang dan bagaimana $$\mathrm\TeX$$ akan, jika perlu, menyesuaikan lebar **kolom** terakhir `\tabskip` di dalam setiap rentang kolom yang membentang. Selain lebar entri dalam kolom-kolom individual yang dibentang, kehadiran $$\mathrm\TeX$$ glue tak-nol merupakan faktor penting yang $$\mathrm\TeX$$tujuannya adalah menghitung lebar yang sesuai untuk **kolom terakhir** di dalam setiap rentang kolom yang dibentang.

### Contoh tabel akhir: kolom-kolom terakhir dalam rentang yang dibentang

Dalam contoh akhir ini kami sekali lagi menggunakan tabel referensi yang telah dimodifikasi (dengan `\tabskip` nilai glue yang dibahas di atas) untuk menurunkan tabel lain yang berisi berbagai kolom yang dibentang oleh garis—kami menggunakan garis untuk membuat bentangan lebih mudah dilihat.

Kedua tabel telah disejajarkan dengan hati-hati untuk menunjukkan bahwa, pada tabel atas, tidak ada kolom sebelum kolom 5 yang terpengaruh oleh kolom yang dibentang. Area hijau lebih gelap di sebelah kiri diagram menunjukkan bahwa kolom 1 hingga 4 dari kedua tabel masih sejajar sempurna. Di sebelah kanan ada area berarsir hijau lebih muda yang menunjukkan bahwa hanya kolom 5 dan 6 yang terpengaruh oleh entri yang dibentang.

Pada tabel atas, bentangannya adalah sebagai berikut:

* kolom 1 hingga 5: dibentang oleh sebuah $$400\text{pt}$$ garis;
* kolom 3 hingga 5: dibentang oleh sebuah $$200\text{pt}$$ garis;
* kolom 4 hingga 6: dibentang oleh sebuah $$250\text{pt}$$ garis.

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

Sekali lagi, penjelasannya adalah bahwa dalam serangkaian kolom yang dibentang, hanya lebar kolom terakhir yang disesuaikan (jika diperlukan): kolom-kolom di antaranya tidak terpengaruh dan di sini itu berarti kolom 1 hingga 4—meskipun, tentu saja, lebar kolom 1 hingga 4 (dan kolom-kolom di antaranya `\tabskip` glue) dipertimbangkan saat menghitung lebar yang disesuaikan dari kolom 5 dan 6.

### Tinjauan langkah demi langkah tentang $$\mathrm\TeX$$algoritme

Kita akan menutup dengan sebuah *yang disederhanakan* tinjauan langkah demi langkah tentang “$$\mathrm\TeX$$proses berpikir” saat menghitung lebar kolom dalam entri yang dibentang. Menjelaskan $$\mathrm\TeX$$algoritma tidak selalu sederhana, jadi kami akan memakai sedikit “kebebasan artistik yang menyederhanakan” untuk memberikan gambaran umum tentang apa yang sedang terjadi. Pembaca yang tertarik pada semua detail yang rumit dipersilakan merujuk ke Bagian 801 (halaman 336) dari buku cetak yang memuat $$\mathrm\TeX$$kode sumber [$$\mathrm\TeX\text{: The Program}$$](https://www.amazon.co.uk/Computers-Typesetting-Tex-Program-TEX/dp/0201134373).

Tabel dunia nyata sering dibuat dengan banyak penggunaan `\span` primitif (mis., di dalam $$\mathrm\LaTeX$$ paket) untuk membangun beberapa instance kolom yang dibentang di dalam tabel. Untuk mengelola ini, struktur data (di bagian dalam $$\mathrm\TeX$$) menyimpan informasi (yang disebut *simpul bentang*) yang memberi tahu $$\mathrm\TeX$$ tentang tautan (bentangan) antara entri/kolom tabel. Tentu saja, $$\mathrm\TeX$$ harus menerapkan algoritmanya secara sistematis dan perlu memproses seluruh tabel untuk melakukan perhitungan akhirnya—untuk menentukan semua lebar kolom, lebar total tabel, dan, jika diperlukan, jumlah pemanjangan atau penyusutan glue fleksibel yang digunakan dalam tabel. Tidaklah mengherankan bahwa $$\mathrm\TeX$$ tidak dapat memberi tahu Anda lebar tabel akhir sampai selesai memproses `\halign{...}` perintah itu—ia benar-benar punya banyak pekerjaan!

Titik awal untuk perhitungan lebar kolom adalah kolom 1 karena, tentu saja, tidak ada yang dapat membentang dari kiri (dan *melintasi/ke dalam*) kolom 1. $$\mathrm\TeX$$ memulai dengan menentukan lebar kolom 1 dengan menentukan entri mana yang memiliki *lebar alami*. Mari kita sebut lebar maksimum itu $$w\_1$$dan jika ada entri yang membentang dari kolom 1 ke kolom 2 mari kita sebut lebar entri itu $$w\_{12}$$ (lebar dari 1 ke 2). Selain itu, kami akan menandai `\tabskip` glue antara kolom 1 dan 2 sebagai $$t\_{1}$$—catat bahwa kami hanya mempertimbangkan *lebar alami* dari `\tabskip` glue tersebut dan, untuk saat ini, mengabaikan komponen pemanjangan atau penyusutan yang mungkin dimilikinya. Juga, misalkan lebar alami maksimum dari semua entri yang tidak membentang di kolom 2 adalah $$w\_2$$.

Poin penting yang perlu dicatat adalah bahwa $$\mathrm\TeX$$ berusaha menghitung lebar kolom 2 dengan hanya mempertimbangkan entri-entri yang bentangannya *dimulai* dengan kolom 1 dan *berakhir* pada kolom 2. Pertimbangan utama bagi $$\mathrm\TeX$$ adalah uji $$\max(w\_{2}, w\_{12} - (w\_1+ t\_1))$$—mungkin ada beberapa entri yang membentang di kolom 1 dan 2: sebagian mungkin sempit (kecil $$w\_{12}$$), yang lain sangat lebar (besar $$w\_{12}$$) sehingga $$\mathrm\TeX$$ mencari yang memiliki pengaruh terbesar (karena itu $$\max(\text{...})$$). Di sini, nilai $$w\_{12} -(w\_1+ t\_1)$$ adalah jumlah yang menyebabkan entri yang membentang di kolom 1 dan 2 “meluber” dari kolom 1 ke kolom 2: perhatikan bahwa $$\mathrm\TeX$$ menggunakan lebar kolom 1 **dan** situs web `\tabskip` glue ($$t\_{1}$$) di antara kolom 1 dan 2. Setelah $$\mathrm\TeX$$ telah menentukan apakah ada bentangan dari kolom 1 ke 2 yang memang memengaruhi lebar kolom 2, ia menetapkan lebar kolom 2 ke nilai maksimum yang telah ditentukannya (dengan menggunakan uji yang dijelaskan). $$\mathrm\TeX$$ terus menelusuri semua kolom lainnya, melakukan uji serupa.

Dan akhirnya, sekadar untuk kelengkapan, di sini kami mengutip inti dari $$\mathrm\TeX$$algoritma untuk menghitung lebar kolom (diambil dari dokumentasi kode sumber Knuth tentang $$\mathrm\TeX$$):

Misalkan $$w\_{ij}$$ menjadi maksimum dari lebar alami semua entri yang membentang pada kolom-kolom $$i$$ hingga $$j$$, termasuk keduanya. Lebar kolom akhir ditentukan oleh rumus

$$\begin{equation\*} w\_j=\max\_{1\leq i\leq j}\biggl(w\_{ij}-\sum\_{i\leq k< j}(t\_k+w\_k)\biggr) \end{equation\*}$$

di mana $$t\_k$$ adalah lebar alami dari glue tabskip antara kolom-kolom $$k$$ dan $$k+1$$.

## Kolofon: Menggunakan Overleaf untuk menghasilkan tabel sebagai grafis SVG

Semua $$\mathrm\TeX$$ tabel yang disajikan dalam artikel ini adalah berkas Scalable Vector Graphics (SVG) yang dihasilkan di platform Overleaf. Anotasi (panah dan kotak hijau) ditambahkan dengan membuka grafis SVG di Inkscape—namun, perhatikan bahwa teks anotasi disusun huruf dalam $$\mathrm\TeX$$ sebagai teks tambahan untuk mendampingi tabel: hanya panah dan latar belakang hijau yang ditambahkan di Inkscape. Jika Anda ingin tahu bagaimana ini dicapai, lanjutkan membaca.

Server Overleaf menggunakan $$\mathrm\TeX \text{ Live}$$ distribusi yang, selain $$\mathrm\TeX$$mesin penataan huruf berbasis -, menyediakan banyak sekali perangkat lunak dan utilitas $$\mathrm\TeX$$terkait - yang sangat berguna. Di antaranya ada yang bernama [`dvisvgm`](https://dvisvgm.de) yang, seperti namanya, mengonversi $$\mathrm\TeX$$DVI tradisional (**D**e**V**es **I**ndependen) format berkas keluaran menjadi SVG. Di antara banyak [opsi baris perintah](https://dvisvgm.de/Manpage/) `dvisvgm` menyediakan opsi (`-n` atau `--no-fonts`) yang akan memerintahkannya untuk mengonversi semua teks menjadi *jalur* yang berarti bahwa teks dalam grafis SVG digambar menggunakan garis dan kurva alih-alih font dan glif yang sebenarnya. Ini mungkin meningkatkan ukuran berkas grafis SVG yang dihasilkan, tetapi memastikan bahwa grafis SVG sangat portabel dan hampir pasti berfungsi dengan baik di perangkat apa pun.

### Jadi... bagaimana itu dilakukan?

Dalam sebuah [artikel sebelumnya](https://www.overleaf.com/blog/510-using-luatex-to-run-tools-and-utilities-installed-on-overleafs-servers) saya membahas bagaimana Anda dapat menggunakan $$\text{Lua}\mathrm\TeX$$ untuk menjalankan berbagai alat dan utilitas perangkat lunak yang terpasang di server Overleaf—ini adalah teknik yang sangat mudah dan nyaman. Teknik tersebut digunakan untuk menghasilkan grafis SVG dari hasil penyusunan huruf $$\mathrm\TeX$$ tabel, sebagai berikut. Dari dalam $$\mathrm\TeX$$ berkas dokumen utama, kode untuk menyusun setiap tabel (dibuat dengan menggunakan menggunakan `\halign`) ditulis ke sebuah `.tex` berkas. Hal ini dicapai dengan membungkus kode tabel di dalam sepasang perintah yang saya sebut `\beginscoop` dan `\endscoop`. Kemungkinan ada banyak cara lain untuk mencapai hasil yang diinginkan, tetapi berikut definisi makro yang saya gunakan:

```latex
\def\cc{\catcode`\#=12\relax}
\long\def\scoop#1\endscoop{\global\fulltoks={#1}\egroup}
\def\beginscoop{\global\advance\numfigs by1\relax\bgroup\cc\scoop}
```

Anda menggunakannya seperti ini:

```latex
\beginscoop
\halign{...}
\endscoop
```

Perhatikan bahwa `\endscoop` token hanya berfungsi untuk membatasi parameter dari `\scoop` makro: $$\mathrm\TeX$$ pada dasarnya membuang `\endscoop` token, jadi kita sebenarnya tidak perlu mendefinisikannya (mis., dengan `\def\endscoop{...}`).

Fitur $$\mathrm\TeX$$ kode yang terdapat dalam `\halign{...}` disimpan ke dalam sebuah `toks` register yang disebut `\fulltoks`. Salah satu hal rumit yang saya temui (dengan $$\text{Lua}\mathrm\TeX$$) adalah perlunya mencegah `#` karakter dalam `\halign{...}` preamble agar tidak “digandakan” menjadi `##` saat ditulis ke sebuah `.tex` berkas. Untuk menghindari ini saya harus sementara mengatur `\catcode`sebesar `#` karakter menjadi 12 sebelum menyimpan $$\mathrm\TeX$$ kode (token) dalam `\fulltoks` register token.

Langkah berikutnya adalah menulis token yang terdapat dalam `\fulltoks` sebagai sebuah $$\mathrm\TeX$$ berkas—karena saya menggunakan $$\text{Lua}\mathrm\TeX$$ ini terbukti *sangat* mudah berkat $$\text{Lua}\mathrm\TeX$$API Lua yang luar biasa dari `\writefile{...}` yang mengambil sebagai parameternya nama sebuah register token yang token-token di dalamnya ingin Anda tulis ke berkas (mis., `\writefile{fulltoks}`). Di dalam `\writefile{...}` makro itu saya menggunakan API Lua untuk memperoleh representasi tekstual dari `\fulltoks` register token:

```latex
\def\writefile#1{%
\directlua{
...
...
 local p=tex.toks["#1"]
...
...
}}
```

Berikut adalah tangkapan layar yang menunjukkan sedikit lebih banyak tentang `\writefile{...}` perintah:

[![{{{alt}}}](/files/6db120a8b3cc128f0fd402737516d31e5a184b5c)](https://www.filepicker.io/api/file/ngeDmgRStGWvG044RE1A)

Bahasa Lua dan API Lua yang disediakan oleh $$\text{Lua}\mathrm\TeX$$ sering kali dapat menyederhanakan $$\mathrm\TeX$$ tugas pemrograman dan karena fitur-fitur yang berguna dan kuat inilah saya telah menggunakan $$\text{Lua}\mathrm\TeX$$ sejak \~2009—dan tetap menjadi penggemar berat dari yang benar-benar menakjubkan ini $$\mathrm\TeX$$ mesin. Oke, iklan $$\text{Lua}\mathrm\TeX$$ sekarang berakhir.

Setelah dengan mudah memperoleh $$\mathrm\TeX$$ kode yang tersimpan di `\fulltoks` kode itu ditulis ke sebuah berkas bersama beberapa kode tambahan untuk menjadikannya sebuah $$\mathrm\LaTeX$$ berkas yang terbentuk dengan benar. Langkah berikutnya adalah:

1. Proses `.tex` berkas yang berisi tabel kita dengan $$\text{pdf}\mathrm\LaTeX$$ (dalam mode DVI) sehingga menyusun tabel dan menghasilkan sebuah `.dvi` berkas untuk `dvisvgm` memproses. Ya, Anda dapat menggunakan $$\text{Lua}\mathrm\TeX$$ untuk menjalankan $$\text{pdf}\mathrm\LaTeX$$—sekali lagi saya menggunakan metode yang dibahas dalam sebuah [artikel sebelumnya](/latex/id/artikel-mendalam/52-using-luatex-to-run-tools-and-utilities-installed-on-overleaf-s-servers.md).
2. Dan akhirnya, jalankan `dvisvgm` untuk memproses `.dvi` berkas untuk menghasilkan grafis SVG dari tabel yang disusun huruf $$\mathrm\TeX$$ .
3. Untuk memperoleh grafis SVG yang sebenarnya Anda dapat mengunduh berkas ZIP dari Overleaf—pastikan untuk memilih **Berkas Input dan Output** dan buka ke opsi


---

# 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/47-tex-tables-how-tex-calculates-spanned-column-widths.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.
