> 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/03-writing-your-own-package.md).

# Menulis paket Anda sendiri

Terkadang pilihan terbaik untuk menggunakan perintah dan makro Anda sendiri dalam sebuah dokumen adalah menulis paket baru dari awal. Artikel ini menjelaskan struktur utama sebuah paket baru.

## Pendahuluan

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

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 paket dapat secara kasar dijelaskan dalam empat bagian berikut:

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

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

### Identifikasi

Ada dua perintah sederhana yang harus dimiliki semua paket:

```latex
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{examplepackage}[2014/08/24 Paket LaTeX contoh]
```

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

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

[Buka contoh cara menulis paket di Overleaf](https://www.sharelatex.com/project/new/template?zipUrl=/project/53f11ec1eceb82a67658cb02/download/zip\&templateName=PackageExample\&compiler=pdflatex)

### Deklarasi awal

Sebagian besar paket memperluas dan menyesuaikan paket yang sudah ada, dan juga memerlukan beberapa paket eksternal untuk bekerja. Di bawah ini, beberapa kode tambahan ditambahkan ke paket contoh "examplepackage.sty".

```latex
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{examplepackage}[2014/08/21 Paket contoh]

\RequirePackage{imakeidx}
\RequirePackage{xstring}
\RequirePackage{xcolor}
\definecolor{greycolour}{HTML}{525252}
\definecolor{sharelatexcolour}{HTML}{882B21}
\definecolor{mybluecolour}{HTML}{394773}
\newcommand{\wordcolour}{greycolour}
```

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

Perintah `\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 paket atau kelas baru.

[Buka contoh cara menulis paket di Overleaf](https://www.sharelatex.com/project/new/template?zipUrl=/project/53f11ec1eceb82a67658cb02/download/zip\&templateName=PackageExample\&compiler=pdflatex)

### Opsi

Untuk memberikan fleksibilitas pada paket, beberapa opsi tambahan sangat berguna. Bagian berikutnya dalam file "examplepackage.sty" menangani parameter yang diteruskan ke pernyataan pengimpor paket.

```latex
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{examplepackage}[2014/08/21 Paket contoh]

\RequirePackage{imakeidx}
\RequirePackage{xstring}
\RequirePackage{xcolor}
\definecolor{greycolour}{HTML}{525252}
\definecolor{sharelatexcolour}{HTML}{882B21}
\definecolor{mybluecolour}{HTML}{394773}
\newcommand{\wordcolour}{greycolour}

\DeclareOption{red}{\renewcommand{\wordcolour}{sharelatexcolour}}
\DeclareOption{blue}{\renewcommand{\wordcolour}{mybluecolour}}
\DeclareOption*{\PackageWarning{examplepackage}{Tak dikenal ‘\CurrentOption’}}
\ProcessOptions\relax
```

Di bawah ini adalah deskripsi perintah utama yang dapat menangani opsi yang diteruskan ke paket.

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 kompiler dan log, opsi tersebut tidak akan digunakan.

Perintah `\Declareoption*{}` menangani setiap opsi yang tidak didefinisikan secara eksplisit. Perintah ini hanya mengambil satu parameter, yaitu kode yang dijalankan ketika opsi yang tidak dikenal diteruskan. Dalam hal ini, ia akan menampilkan peringatan melalui perintah berikut:

`\PackageWarning{}{}`. Lihat [menangani kesalahan](#handling-errors) untuk deskripsi tentang apa yang dilakukan perintah ini.

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

Perintah `\ProcessOptions\relax` mengeksekusi kode untuk setiap opsi dan harus disisipkan setelah semua perintah penanganan opsi diketik. Ada versi bertanda bintang dari perintah ini yang akan mengeksekusi opsi dalam urutan persis yang ditentukan oleh perintah pemanggil.

Dalam contoh ini, jika opsi *merah* atau *blue* diteruskan ke `\usepackage` perintah di dalam dokumen, perintah `\wordcolor` didefinisikan ulang. Kedua warna tersebut dan warna abu-abu bawaan didefinisikan dalam [deklarasi awal](#preliminary-declaration) setelah mengimpor *xcolor* paket.

[Buka contoh cara menulis paket di Overleaf](https://www.sharelatex.com/project/new/template?zipUrl=/project/53f11ec1eceb82a67658cb02/download/zip\&templateName=PackageExample\&compiler=pdflatex)

### Deklarasi lebih lanjut

Pada bagian ini sebagian besar perintah akan muncul dalam "examplepackage.sty". Di bawah ini Anda dapat melihat berkas paket lengkap.

```latex
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{examplepackage}[2014/08/21 Paket contoh]

\RequirePackage{imakeidx}
\RequirePackage{xstring}
\RequirePackage{xcolor}
\definecolor{greycolour}{HTML}{525252}
\definecolor{sharelatexcolour}{HTML}{882B21}
\definecolor{mybluecolour}{HTML}{394773}
\newcommand{\wordcolour}{greycolour}

\DeclareOption{red}{\renewcommand{\wordcolour}{sharelatexcolour}}
\DeclareOption{blue}{\renewcommand{\wordcolour}{mybluecolour}}
\DeclareOption*{\PackageWarning{examplepackage}{Tak dikenal ‘\CurrentOption’}}
\ProcessOptions\relax

%%Lingkungan bernomor
\newcounter{example}[section]
\newenvironment{example}[1][]{\refstepcounter{example}\par\medskip
\noindent \textbf{Lingkungan~saya~\theexample. #1} \rmfamily}{\medskip}

%%Kata-kata penting ditambahkan ke indeks dan dicetak dengan warna berbeda
\newcommand{\important}[1]
{\IfSubStr{#1}{!}
    {\textcolor{\wordcolour}{\textbf{\StrBefore{#1}{!}~\StrBehind{#1}{!}}}\index{#1}}
    {\textcolor{\wordcolour}{\textbf{#1}}\index{#1}\kern-1pt}
}
```

Paket ini mendefinisikan lingkungan baru `contoh`, dan sebuah perintah baru `\important`, yang mencetak kata-kata dalam warna khusus dan menambahkannya ke indeks.

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

Di bawah ini, sebuah dokumen yang menggunakan paket *examplepackage.sty*.

```latex
\documentclass{article}
\usepackage[utf8]{inputenc}

\usepackage[red]{examplepackage}

\makeindex

\title{Contoh Paket}
\author{Tim Learn ShareLaTeX}
\date{ }

\begin{document}

\maketitle

\section{Pendahuluan}
Dalam dokumen ini, sebuah paket baru diuji. Paket ini memungkinkan penomoran khusus
lingkungan

\begin{example}
Teks ini berada di dalam lingkungan khusus, beberapa teks tebal dicetak
di awal dan inden baru diatur.
\end{example}

Selain itu, ada perintah khusus untuk \important{important!words} yang akan
dicetak dengan \important{warna} khusus tergantung pada parameter yang digunakan dalam
pernyataan impor \important{package}. Karena itu \important{penting}.

\printindex

\end{document}
```

![WrittingPackagesEx1.png](/files/4efe4100800af3ce2a5dfa38122a604b033127a7)

Perhatikan perintah

```latex
\usepackage[red]{examplepackage}
```

[Buka contoh cara menulis paket di Overleaf](https://www.sharelatex.com/project/new/template?zipUrl=/project/53f11ec1eceb82a67658cb02/download/zip\&templateName=PackageExample\&compiler=pdflatex)

## Menangani kesalahan

Saat mengembangkan paket baru, penting untuk menangani kemungkinan kesalahan agar memberi tahu pengguna bahwa ada sesuatu yang salah. Ada empat perintah utama untuk melaporkan kesalahan di kompiler.

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

[Buka contoh cara menulis paket Overleaf](https://www.sharelatex.com/project/new/template?zipUrl=/project/53f11ec1eceb82a67658cb02/download/zip\&templateName=PackageExample\&compiler=pdflatex)

## Panduan referensi

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

* `\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 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 kelas Anda sendiri](/latex/id/file-kelas/04-writing-your-own-class.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 paket dan penulis 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/03-writing-your-own-package.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.
