> 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/file-kelas/04-writing-your-own-class.md).

# Menulis kelas Anda sendiri

Terkadang opsi terbaik untuk menyesuaikan sebuah dokumen adalah menulis kelas baru dari awal. Artikel ini menjelaskan struktur utama dan perintah yang diperlukan dalam kelas baru.

## Pendahuluan

Hal pertama yang perlu dilakukan sebelum membuat kode kelas baru adalah menentukan apakah Anda benar-benar membutuhkan kelas baru atau tidak. Disarankan untuk [mencari di CTAN (Comprehensive TeX Archive Network)](http://www.ctan.org/ctan-portal/search/) dan melihat apakah sudah ada orang yang membuat sesuatu yang serupa dengan kelas dokumen yang Anda perlukan.

Hal penting lainnya yang perlu diingat adalah [perbedaan antara paket dan kelas](/latex/id/file-kelas/01-understanding-packages-and-class-files.md). Memilih yang salah dapat memengaruhi fleksibilitas produk akhir.

## Struktur umum

Struktur semua file kelas secara garis besar dapat dijelaskan dalam empat bagian berikut:

* ***Identifikasi***. File ini menyatakan dirinya sebagai kelas yang ditulis dengan sintaks LaTeX2ε.
* ***Deklarasi awal***. Di sini paket eksternal dan kelas yang diperlukan diimpor. Selain itu, pada bagian file ini perintah dan definisi yang diperlukan oleh opsi yang dideklarasikan dikodekan.
* ***Opsi***. Kelas mendeklarasikan dan memproses opsi.
* ***Deklarasi lebih lanjut***. Bagian utama kelas. Hampir semua yang dilakukan sebuah kelas didefinisikan di sini.

Pada subbagian berikutnya akan disajikan deskripsi struktur yang lebih rinci dan contoh kerja, *exampleclass.cls*, akan disajikan.

### Identifikasi

Ada dua perintah sederhana yang harus dimiliki semua kelas:

```latex
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{exampleclass}[2014/08/16 Example LaTeX class]
```

Perintah `\NeedsTeXFormat{LaTeX2e}` menetapkan versi LaTeX agar kelas dapat bekerja. Selain itu, tanggal dapat ditambahkan di dalam tanda kurung siku untuk menentukan tanggal rilis minimum yang diperlukan.

Perintah `ProvidesClass{exampleclass}[...]` mengidentifikasi kelas ini sebagai *exampleclass* dan, di dalam tanda kurung, tanggal rilis serta beberapa informasi tambahan disertakan. Tanggal harus dalam format YYYY/MM/DD

[Buka contoh cara menulis kelas di Overleaf](https://www.overleaf.com/project/new/template/19419?id=65524436\&templateName=An+example+of+writing+a+LaTeX+class\&latexEngine=\&texImage=texlive-full%3A2020.1\&mainFile=)

### Deklarasi awal

Sebagian besar kelas memperluas dan menyesuaikan kelas yang sudah ada, dan juga memerlukan beberapa paket eksternal agar dapat bekerja. Di bawah ini, beberapa kode tambahan ditambahkan ke kelas contoh `exampleclass.cls`.

```latex
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{exampleclass}[2014/08/16 Example LaTeX class]

\newcommand{\headlinecolor}{\normalcolor}
\LoadClass[twocolumn]{article}
\RequirePackage{xcolor}
\definecolor{slcolor}{HTML}{882B21}
```

Perintah-perintah pada bagian ini entah menginisialisasi beberapa parameter yang nantinya akan digunakan untuk mengelola opsi, atau mengimpor file eksternal.

Perintah `\LoadClass[twocolumn]{article}` memuat kelas `article` dengan parameter tambahan `twocolumn`. Oleh karena itu semua perintah dalam `article` kelas standar akan otomatis tersedia di **contoh** kelas, kecuali bahwa dokumen akan dicetak dalam format dua kolom.

`\RequirePackage` sangat mirip dengan yang sudah dikenal luas `\usepackage`, menambahkan parameter opsional di dalam tanda kurung juga akan berfungsi. Satu-satunya perbedaan adalah bahwa `\usepackage` tidak dapat digunakan sebelum `\documentclass` perintah. Sangat disarankan untuk menggunakan `\RequirePackage` saat menulis kelas atau paket baru.

[Buka contoh cara menulis kelas di Overleaf](https://www.overleaf.com/project/new/template/19419?id=65524436\&templateName=An+example+of+writing+a+LaTeX+class\&latexEngine=\&texImage=texlive-full%3A2020.1\&mainFile=)

### Opsi

Untuk memungkinkan sedikit fleksibilitas dalam kelas, beberapa opsi tambahan sangat berguna. Bagian berikutnya dalam file `exampleclass.cls` menangani parameter yang diteruskan ke perintah kelas dokumen. Kami juga telah memindahkan `\LoadClass` ke *setelah* opsi diproses, sehingga opsi yang diatur dalam file .tex dapat diteruskan ke kelas dasar.

```latex
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{exampleclass}[2014/08/16 Example LaTeX class]

\newcommand{\headlinecolor}{\normalcolor}
\RequirePackage{xcolor}
\definecolor{slcolor}{HTML}{882B21}

\DeclareOption{onecolumn}{\OptionNotUsed}
\DeclareOption{green}{\renewcommand{\headlinecolor}{\color{green}}}
\DeclareOption{red}{\renewcommand{\headlinecolor}{\color{slcolor}}}
\DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}}
\ProcessOptions\relax
\LoadClass[twocolumn]{article}
```

Ada empat perintah utama di sini yang menangani opsi yang diteruskan ke kelas.

Perintah `\DeclareOption{}{}` menangani opsi tertentu. Perintah ini mengambil dua parameter; yang pertama adalah nama opsi dan yang kedua adalah kode yang dijalankan jika opsi tersebut diteruskan.

Perintah `\OptionNotUsed` akan menampilkan pesan di kompilator dan log, opsi tersebut tidak akan digunakan. Dalam kasus ini dokumen diatur menjadi dua kolom dan jika pengguna mencoba mengubahnya menjadi satu kolom hal itu tidak akan berhasil, opsi akan diabaikan.

Perintah `\Declareoption*{}` menangani setiap opsi yang tidak didefinisikan secara eksplisit. Ini hanya menerima satu parameter, yaitu kode yang akan dijalankan saat opsi yang tidak dikenal diteruskan. Dalam kasus ini ia akan menjalankan perintah berikut:

`\PassOptionsToClass{}{}`. Meneruskan opsi di dalam pasangan kurung kurawal pertama ke kelas dokumen yang ditetapkan di dalam pasangan kurung kurawal kedua. Dalam contoh ini, semua opsi yang tidak dikenal akan diteruskan ke **article** kelas dokumen.

`\CurrentOption` menyimpan nama opsi kelas yang sedang ditangani pada saat tertentu.

Perintah `\ProcessOptions\relax` menjalankan kode untuk setiap opsi dan harus disisipkan setelah semua perintah penanganan opsi diketik. Ada versi berbintang dari perintah ini yang akan menjalankan opsi sesuai urutan tepat yang ditentukan oleh perintah pemanggil.

Dalam contoh ini, jika opsi `merah` atau `hijau` diteruskan ke dokumen, font yang digunakan untuk judul dan bagian akan diatur ke warna yang sesuai. Warna yang disebut `slcolor` didefinisikan di [deklarasi awal](#preliminary-declaration) setelah mengimpor `xcolor` paket.

[Buka contoh cara menulis kelas di Overleaf](https://www.overleaf.com/project/new/template/19419?id=65524436\&templateName=An+example+of+writing+a+LaTeX+class\&latexEngine=\&texImage=texlive-full%3A2020.1\&mainFile=)

### Deklarasi lebih lanjut

Pada bagian ini sebagian besar perintah akan muncul. Dalam "exampleclass.cls" dimensi halaman, ukuran font untuk judul, isi, dan bagian diatur. Di bawah ini Anda dapat melihat file kelas lengkap.

```latex
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{exampleclass}[2014/08/16 Example LaTeX class]

\newcommand{\headlinecolor}{\normalcolor}
\RequirePackage{xcolor}
\definecolor{slcolor}{HTML}{882B21}

\DeclareOption{onecolumn}{\OptionNotUsed}
\DeclareOption{green}{\renewcommand{\headlinecolor}{\color{green}}}
\DeclareOption{red}{\renewcommand{\headlinecolor}{\color{slcolor}}}
\DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}}
\ProcessOptions\relax
\LoadClass[twocolumn]{article}

\renewcommand{\maketitle}{%
    \twocolumn[%
        \fontsize{50}{60}\fontfamily{phv}\fontseries{b}%
        \fontshape{sl}\selectfont\headlinecolor
        \@title
        \medskip
        ]%
}

\renewcommand{\section}{%
    \@startsection
    {section}{1}{0pt}{-1.5ex plus -1ex minus -.2ex}%
    {1ex plus .2ex}{\large\sffamily\slshape\headlinecolor}%
}

\renewcommand{\normalsize}{\fontsize{9}{10}\selectfont}
\setlength{\textwidth}{17.5cm}
\setlength{\textheight}{22cm}
\setcounter{secnumdepth}{0}
```

Untuk memahami perintah lainnya, lihat [panduan referensi](#reference-guide) dan tautan di [bagian bacaan lanjutan](#further-reading).

Empat perintah terakhir dalam contoh menunjukkan empat hal yang harus dimiliki semua kelas:

* Definisi `normalsize`. Menetapkan default [ukuran font](/latex/id/font/01-font-sizes-families-and-styles.md).
* Nilai default untuk [`textwidth`](/latex/id/pemformatan/07-page-size-and-margins.md)
* Nilai default untuk [`textheight`](/latex/id/pemformatan/07-page-size-and-margins.md)
* Spesifikasi untuk [penomoran halaman](/latex/id/pemformatan/03-page-numbering.md).

Di bawah ini, sebuah dokumen yang menggunakan kelas *exampleclass.cls*.

```latex
\documentclass[red]{exampleclass}
\usepackage[utf8]{inputenc}
\usepackage[english]{babel}

\usepackage{blindtext}

\title{Example to show how classes work}
\author{Tim Learn ShareLaTeX}
\date{August 2014}

\begin{document}

\maketitle

\noindent
Mari kita mulai dengan contoh kerja sederhana di sini.

\blindtext

\section{Pendahuluan}

Masalah Monty Hall...

\section{The same thing}

Monty...
```

![WrittingClassesEx1.png](/files/df551dd00bd4ef18a30e41aa5c0ec979e2174d16)

Perhatikan bahwa perintah pertama di sini adalah

```latex
\documentclass[red]{exampleclass}
```

[Buka contoh cara menulis kelas di Overleaf](https://www.overleaf.com/project/new/template/19419?id=65524436\&templateName=An+example+of+writing+a+LaTeX+class\&latexEngine=\&texImage=texlive-full%3A2020.1\&mainFile=)

## Menangani kesalahan

Ketika hendak mengembangkan kelas baru, penting untuk menangani kemungkinan kesalahan agar memberi tahu pengguna bahwa ada sesuatu yang salah. Ada empat perintah utama untuk melaporkan kesalahan di kompilator.

* `\ClassError{*class-name*}{*error-text*}{*help-text*}`. Menerima tiga parameter, masing-masing di dalam kurung kurawal: nama kelas, teks kesalahan yang akan ditampilkan (proses kompilasi akan dijeda), dan teks bantuan yang akan dicetak jika pengguna menekan "h" saat kompilasi dijeda karena kesalahan.
* `\ClassWarning{*class-name*}{*warning-text*}`. Dalam kasus ini teks ditampilkan tetapi proses kompilasi tidak akan berhenti. Nomor baris tempat peringatan terjadi akan ditampilkan.
* `\ClassWarningNoLine{*class-name*}{*warning-text*}`. Bekerja sama seperti perintah sebelumnya, tetapi tidak akan menampilkan baris tempat peringatan terjadi.
* `\ClassInfo{*class name*}{*info-text*}`. Dalam kasus ini informasi pada parameter kedua hanya akan dicetak di berkas transcript, termasuk nomor baris.

[Buka contoh cara menulis kelas di Overleaf](https://www.overleaf.com/project/new/template/19419?id=65524436\&templateName=An+example+of+writing+a+LaTeX+class\&latexEngine=\&texImage=texlive-full%3A2020.1\&mainFile=)

## Panduan referensi

**Daftar perintah yang umum digunakan dalam kelas dan paket**

* `\newcommand{*name*}{*definition*}`. Mendefinisikan sebuah [perintah baru](/latex/id/perintah/01-commands.md#defining-a-new-command), parameter pertama adalah nama perintah baru, parameter kedua adalah apa yang akan dilakukan perintah tersebut.
* `\renewcommand{}{}`. Sama seperti `\newcommand` tetapi akan menimpa perintah yang sudah ada.
* `\providecommand{}{}`. Bekerja sama seperti `\newcommand` tetapi jika perintah tersebut sudah didefinisikan, yang ini akan diabaikan tanpa pesan.
* `\CheckCommand{}{}`. Sintaksnya sama seperti `\newcommand`, tetapi alih-alih itu akan memeriksa apakah perintah tersebut ada dan memiliki definisi yang diharapkan, LaTeX akan menampilkan peringatan jika perintah tersebut bukan seperti yang `\CheckCommand` diharapkan.
* `\setlength{}{}`. Menetapkan panjang elemen yang diteruskan sebagai parameter pertama ke nilai yang ditulis sebagai parameter kedua.
* `\mbox{}`. Membuat sebuah kotak yang berisi elemen-elemen yang ditulis di dalam kurung kurawal.
* `\fbox{}`. Sama seperti `\mbox`, tetapi sebuah kotak benar-benar dicetak di sekitar isinya.

## Bacaan lanjutan

Untuk informasi lebih lanjut, lihat

* [Memahami paket dan file kelas](/latex/id/file-kelas/01-understanding-packages-and-class-files.md)
* [Menulis paket Anda sendiri](/latex/id/file-kelas/03-writing-your-own-package.md)
* [Perintah](/latex/id/perintah/01-commands.md) dan [Lingkungan](/latex/id/perintah/02-environments.md)
* [Panjang dalam LaTeX](/latex/id/pemformatan/01-lengths-in-latex.md)
* [Menggunakan warna di LaTeX](/latex/id/pemformatan/13-using-colors-in-latex.md)
* [Pengelolaan dalam proyek besar](/latex/id/struktur-dokumen/07-management-in-a-large-project.md)
* [LaTeX2ε untuk penulis kelas dan paket](http://www.latex-project.org/guides/clsguide.pdf)
* [Catatan tentang pemrograman di TeX](http://pgfplots.sourceforge.net/TeX-programming-notes.pdf)
* [Menit dalam waktu kurang dari jam: Menggunakan Sumber Daya LaTeX](https://tug.org/pracjourn/2005-4/hefferon/hefferon.pdf)
* [The LaTeX Companion. Edisi kedua](http://ptgmedia.pearsoncmg.com/images/9780201362992/samplepages/0201362996.pdf)


---

# 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/file-kelas/04-writing-your-own-class.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.
