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

# Kendi paketinizi yazma

Bir belgede kendi komutlarınızı ve makrolarınızı kullanmak için bazen en iyi seçenek, sıfırdan yeni bir paket yazmaktır. Bu makale, yeni bir paketin temel yapısını açıklar.

## Giriş

Yeni bir paket kodlamadan önce yapılacak ilk şey, gerçekten yeni bir pakete ihtiyacınız olup olmadığını belirlemektir. Şu tavsiye edilir: [CTAN'da (Comprehensive TeX Archive Network) arama yapmak](http://www.ctan.org/ctan-portal/search/) ve birinin sizin ihtiyacınıza benzer bir şey oluşturup oluşturmadığına bakmak.

Aklınızda bulundurmanız gereken bir diğer önemli şey de [paketler ile sınıflar arasındaki farktır](/latex/tr/sinif-dosyalari/01-understanding-packages-and-class-files.md). Yanlış seçim yapmak, nihai ürünün esnekliğini etkileyebilir.

## Genel yapı

Tüm paket dosyalarının yapısı kabaca şu dört bölümde açıklanabilir:

* ***Tanımlama***. Dosya, kendisini LaTeX2ε sözdizimiyle yazılmış bir paket olarak ilan eder.
* ***Ön tanımlar***. Burada gerekli dış paketler içe aktarılır. Ayrıca, dosyanın bu bölümünde bildirilen seçenekler tarafından gereken komutlar ve tanımlar kodlanır.
* ***Seçenekler***. Paket, seçenekleri tanımlar ve işler.
* ***Daha fazla tanım***. Paketin ana gövdesi. Bir paketin yaptığı neredeyse her şey burada tanımlanır.

Sonraki alt bölümlerde yapının daha ayrıntılı bir açıklaması ve çalışan bir örnek, *examplepackage.sty*, sunulacaktır.

### Tanımlama

Tüm paketlerin sahip olması gereken iki basit komut vardır:

```latex
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{examplepackage}[2014/08/24 Örnek LaTeX paketi]
```

Komut `\NeedsTeXFormat{LaTeX2e}` paketin çalışacağı LaTeX sürümünü ayarlar. Ayrıca, gereken en düşük sürüm tarihini belirtmek için köşeli parantez içinde bir tarih eklenebilir.

Komut `ProvidesPackage{examplepackage}[...]` bu paketi *examplepackage* olarak tanımlar ve köşeli parantezlerin içinde sürüm tarihi ve bazı ek bilgiler yer alır. Tarih YYYY/AA/GG biçiminde olmalıdır

[Overleaf'te bir paket yazmanın örneğini açın](https://www.sharelatex.com/project/new/template?zipUrl=/project/53f11ec1eceb82a67658cb02/download/zip\&templateName=PackageExample\&compiler=pdflatex)

### Ön tanımlar

Paketlerin çoğu mevcut olanları genişletir ve özelleştirir; ayrıca çalışmak için bazı dış paketlere ihtiyaç duyar. Aşağıda, örnek paket "examplepackage.sty"'ye biraz daha kod eklenmiştir.

```latex
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{examplepackage}[2014/08/21 Örnek paket]

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

Bu bölümdeki komutlar ya daha sonra seçenekleri yönetmek için kullanılacak bazı parametreleri başlatır ya da dış dosyaları içe aktarır.

Komut `\RequirePackage` iyi bilinen komuta çok benzer `\usepackage`ve köşeli parantezler içinde isteğe bağlı parametreler eklemek de işe yarar. Tek fark, `\usepackage` komutu kullanılmadan önce `\documentclass` kullanılamaz. Yeni paketler veya sınıflar yazarken `\RequirePackage` kullanılması şiddetle tavsiye edilir.

[Overleaf'te bir paket yazmanın örneğini açın](https://www.sharelatex.com/project/new/template?zipUrl=/project/53f11ec1eceb82a67658cb02/download/zip\&templateName=PackageExample\&compiler=pdflatex)

### Seçenekler

Paketlerde biraz esneklik sağlamak için birkaç ek seçenek çok kullanışlıdır. "examplepackage.sty" dosyasının bir sonraki kısmı, paket içe aktarma ifadesine geçirilen parametreleri işler.

```latex
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{examplepackage}[2014/08/21 Örnek paket]

\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}{Bilinmeyen ‘\CurrentOption’}}
\ProcessOptions\relax
```

Aşağıda, pakete geçirilen seçenekleri işleyebilen ana komutların açıklaması yer almaktadır.

Komut `\DeclareOption{}{}` verilen bir seçeneği işler. İki parametre alır; ilki seçeneğin adı, ikincisi ise seçenek geçirildiğinde çalıştırılacak koddur.

Komut `\OptionNotUsed` derleyicide ve günlüklerde bir mesaj yazdırır, seçenek kullanılmayacaktır.

Komut `\Declareoption*{}` açıkça tanımlanmamış her seçeneği işler. Yalnızca bir parametre alır; bilinmeyen bir seçenek geçirildiğinde çalıştırılacak kod. Bu durumda, bir sonraki komut aracılığıyla bir uyarı yazdırır:

`\PackageWarning{}{}`. Bakınız [hata işleme](#handling-errors) bu komutun ne yaptığına dair açıklama için.

`\CurrentOption` işlenen paket seçeneğinin adını belirli bir anda saklar.

Komut `\ProcessOptions\relax` her seçenek için kodu çalıştırır ve tüm seçenek işleme komutları yazıldıktan sonra eklenmelidir. Bu komutun, çağıran komutlar tarafından belirtilen tam sırayla seçenekleri çalıştıracak yıldızlı bir sürümü vardır.

Örnekte, eğer *red* ya da *blue* seçenekleri `\usepackage` komutu ile belgede geçirilirse, komut `\wordcolor` yeniden tanımlanır. Hem renkler hem de varsayılan gri renk [ön tanımlarda](#preliminary-declaration) içe aktarımdan sonra tanımlanmıştır. *xcolor* paketi.

[Overleaf'te bir paket yazmanın örneğini açın](https://www.sharelatex.com/project/new/template?zipUrl=/project/53f11ec1eceb82a67658cb02/download/zip\&templateName=PackageExample\&compiler=pdflatex)

### Daha fazla tanım

Bu bölümde komutların çoğu yer alacaktır. "examplepackage.sty" içinde. Aşağıda tam paket dosyasını görebilirsiniz.

```latex
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{examplepackage}[2014/08/21 Örnek paket]

\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}{Bilinmeyen ‘\CurrentOption’}}
\ProcessOptions\relax

%%Numaralandırılmış ortam
\newcounter{example}[section]
\newenvironment{example}[1][]{\refstepcounter{example}\par\medskip
\noindent \textbf{Benim~ortamım~\theexample. #1} \rmfamily}{\medskip}

%%Önemli kelimeler dizine eklenir ve farklı renkte yazdırılır
\newcommand{\important}[1]
{\IfSubStr{#1}{!}
    {\textcolor{\wordcolour}{\textbf{\StrBefore{#1}{!}~\StrBehind{#1}{!}}}\index{#1}}
    {\textcolor{\wordcolour}{\textbf{#1}}\index{#1}\kern-1pt}
}
```

Bu paket yeni ortamı tanımlar `örnek`, ve yeni bir komut `\important`, kelimeleri özel bir renkte yazdırır ve onları dizine ekler.

Her bir komutu tam olarak anlamak için bakınız: [başvuru kılavuzuna](#reference-guide) ve içindeki bağlantılar [daha fazla okuma bölümü](#further-reading).

Aşağıda, paketi kullanan bir belge *examplepackage.sty*.

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

\usepackage[red]{examplepackage}

\makeindex

\title{Paket Örneği}
\author{Team Learn ShareLaTeX}
\date{ }

\begin{document}

\maketitle

\section{Giriş}
Bu belgede yeni bir paket test ediliyor. Bu paket özel numaralandırılmış
ortamları

\begin{example}
Bu metin özel bir ortamın içindedir, bazı kalın yazılmış metinler yazdırılır
başta ve yeni bir girinti ayarlanır.
\end{example}

Ayrıca, \important{important!words} için özel bir komut vardır; bu, kullanılan parametreye bağlı olarak
içe aktarma ifadesinde kullanılan parametreye bağlı olarak özel bir \important{renkte} yazdırılacaktır
\important{paket}. Çünkü bu \important{önemlidir}.

\printindex

\end{document}
```

![WrittingPackagesEx1.png](/files/47f57bf8c6e42566f6ecd17eaf837d377d2a4867)

Komuta dikkat edin

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

[Overleaf'te bir paket yazmanın örneğini açın](https://www.sharelatex.com/project/new/template?zipUrl=/project/53f11ec1eceb82a67658cb02/download/zip\&templateName=PackageExample\&compiler=pdflatex)

## Hata işleme

Yeni paketler geliştirmek söz konusu olduğunda, bir şeylerin ters gittiğini kullanıcıya bildirmek için olası hataları ele almak önemlidir. Derleyicide hataları bildirmek için dört ana komut vardır.

* `\PackageError{*paket-adı*}{*hata-metin*}{*yardım-metin*}`. Her biri süslü parantezler içinde olmak üzere üç parametre alır: paket adı, görüntülenecek hata metni (derleme işlemi duraklatılacaktır) ve hata nedeniyle derleme durakladığında kullanıcı "h" tuşuna basarsa yazdırılacak yardım metni.
* `\PackageWarning{*paket-adı*}{*uyarı-metin*}`. Bu durumda metin görüntülenir, ancak derleme işlemi durmaz. Uyarının oluştuğu satır numarasını gösterecektir.
* `\PackageWarningNoLine{*paket-adı*}{*uyarı-metin*}`. Önceki komut gibi çalışır, ancak uyarının oluştuğu satırı göstermez.
* `\PackageInfo{*paket-adı*}{*bilgi-metin*}`. Bu durumda ikinci parametredeki bilgi yalnızca satır numarası dahil olmak üzere aktarım dosyasına yazdırılır.

[Overleaf'te bir paket yazmanın örneğini açın](https://www.sharelatex.com/project/new/template?zipUrl=/project/53f11ec1eceb82a67658cb02/download/zip\&templateName=PackageExample\&compiler=pdflatex)

## Başvuru kılavuzu

**Paketlerde ve sınıflarda yaygın olarak kullanılan komutların listesi**

* `\newcommand{*isim*}{*tanım*}`. Bir [yeni komut](/latex/tr/komutlar/01-commands.md#defining-a-new-command)tanımlar; ilk parametre yeni komutun adı, ikinci parametre ise komutun ne yapacağıdır.
* `\renewcommand{}{}`. ile aynıdır `\newcommand` ancak mevcut bir komutun üzerine yazar.
* `\providecommand{}{}`. Şununla aynı şekilde çalışır `\newcommand` ancak komut zaten tanımlıysa bu sessizce yok sayılır.
* `\CheckCommand{}{}`. Sözdizimi aynıdır `\newcommand`; ancak bunun yerine komutun var olup olmadığını ve beklenen tanıma sahip olup olmadığını kontrol eder, komut şu an beklenenden farklıysa LaTeX bir uyarı gösterir `\CheckCommand` bekleniyordu.
* `\setlength{}{}`. İlk parametre olarak verilen öğenin uzunluğunu ikinci parametre olarak yazılan değere ayarlar.
* `\mbox{}`. Süslü parantezlerin içine yazılan öğeleri içeren bir kutu oluşturur.
* `\fbox{}`. ile aynıdır `\mbox`ile aynı şeydir, ancak içeriğin etrafına gerçekten bir kutu çizilir.

## Daha fazla okuma

Daha fazla bilgi için bakınız

* [Paketleri ve sınıf dosyalarını anlamak](/latex/tr/sinif-dosyalari/01-understanding-packages-and-class-files.md)
* [Kendi sınıfınızı yazma](/latex/tr/sinif-dosyalari/04-writing-your-own-class.md)
* [Komutlar](/latex/tr/komutlar/01-commands.md) ve [Ortamlar](/latex/tr/komutlar/02-environments.md)
* [LaTeX'teki uzunluklar](/latex/tr/bicimlendirme/01-lengths-in-latex.md)
* [LaTeX'te renk kullanımı](/latex/tr/bicimlendirme/13-using-colors-in-latex.md)
* [Büyük bir projede yönetim](/latex/tr/belge-yapisi/07-management-in-a-large-project.md)
* [Paketler ve paket yazarları için LaTeX2ε](http://www.latex-project.org/guides/clsguide.pdf)
* [tex'te programlama üzerine notlar](http://pgfplots.sourceforge.net/TeX-programming-notes.pdf)
* [Saatlerden kısa süreler: LaTeX Kaynaklarını Kullanma](https://tug.org/pracjourn/2005-4/hefferon/hefferon.pdf)
* [The LaTeX Companion. İkinci baskı](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/tr/sinif-dosyalari/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.
