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

# 独自のパッケージの作成

ドキュメント内で独自のコマンドやマクロを使うための最善の方法は、ゼロから新しいパッケージを書くことです。この記事では、新しいパッケージの主な構成を説明します。

## はじめに

新しいパッケージを作成する前にまずやるべきことは、本当に新しいパッケージが必要かどうかを判断することです。おすすめなのは、 [CTAN（Comprehensive TeX Archive Network）で検索し](http://www.ctan.org/ctan-portal/search/) 、必要なものと似たものをすでに誰かが作成していないか確認することです。

もう一つ念頭に置くべき重要なことは、 [パッケージとクラスの違いです](/latex/ja/kurasufairu/01-understanding-packages-and-class-files.md)。選択を誤ると、最終成果物の柔軟性に影響する可能性があります。

## 全体構成

すべてのパッケージファイルの構造は、おおむね次の4つの部分に分けて説明できます：

* ***識別***。ファイルは、LaTeX2εの構文で書かれたパッケージとして自身を宣言します。
* ***事前宣言***。ここでは必要な外部パッケージを読み込みます。また、この部分で、宣言されたオプションに必要なコマンドや定義を記述します。
* ***オプション***。パッケージがオプションを宣言し、処理します。
* ***その他の宣言***。パッケージ本体です。パッケージが行うほとんどすべてはここで定義されます。

次の小節では、構造のより詳しい説明と、動作する例である、 *examplepackage.sty*を示します。

### 識別

すべてのパッケージに必要な、2つの簡単なコマンドがあります：

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

コマンド `\NeedsTeXFormat{LaTeX2e}` パッケージが動作するLaTeXの版を設定します。さらに、必要な最小リリース日を指定するために、角括弧内に日付を追加できます。

コマンド `ProvidesPackage{examplepackage}[...]` このパッケージを *examplepackage* として識別し、角括弧内にはリリース日と追加情報が含まれます。日付は YYYY/MM/DD 形式にしてください

[Overleafでパッケージの書き方の例を開く](https://www.sharelatex.com/project/new/template?zipUrl=/project/53f11ec1eceb82a67658cb02/download/zip\&templateName=PackageExample\&compiler=pdflatex)

### 事前宣言

ほとんどのパッケージは、既存のものを拡張・カスタマイズし、さらに動作のために外部パッケージも必要とします。以下では、サンプルパッケージ「examplepackage.sty」にコードを少し追加します。

```latex
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{examplepackage}[2014/08/21 Example package]

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

この部分のコマンドは、あとでオプションの管理に使ういくつかのパラメータを初期化するか、外部ファイルを読み込みます。

コマンド `\RequirePackage` は、よく知られている `\usepackage`と非常によく似ており、角括弧内に省略可能な引数を追加することもできます。唯一の違いは、 `\usepackage` は使用できません `\documentclass` コマンドです。 `\RequirePackage` 新しいパッケージやクラスを書くときには、

[Overleafでパッケージの書き方の例を開く](https://www.sharelatex.com/project/new/template?zipUrl=/project/53f11ec1eceb82a67658cb02/download/zip\&templateName=PackageExample\&compiler=pdflatex)

### オプション

パッケージにある程度の柔軟性を持たせるために、いくつかの追加オプションがあると非常に便利です。ファイル「examplepackage.sty」の次の部分では、パッケージ読み込み文に渡された引数を処理します。

```latex
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{examplepackage}[2014/08/21 Example package]

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

以下に、パッケージに渡されたオプションを扱える主なコマンドの説明を示します。

コマンド `\DeclareOption{}{}` は、与えられたオプションを処理します。2つの引数を取り、1つ目はオプション名、2つ目は、そのオプションが渡された場合に実行するコードです。

コマンド `\OptionNotUsed` はコンパイラとログにメッセージを出力し、そのオプションは使われません。

コマンド `\Declareoption*{}` は、明示的に定義されていないすべてのオプションを処理します。引数は1つだけで、未知のオプションが渡されたときに実行するコードです。この場合、次のコマンドによって警告を出力します：

`\PackageWarning{}{}`。詳細は [エラー処理](#handling-errors) の項目を参照してください。このコマンドが何をするかの説明があります。

`\CurrentOption` は、処理中のパッケージオプション名を、ある時点で保持します。

コマンド `\ProcessOptions\relax` は各オプションに対してコードを実行し、すべてのオプション処理コマンドを記述した後に挿入しなければなりません。このコマンドには星付き版があり、呼び出し側のコマンドで指定された正確な順序でオプションを実行します。

例では、オプション *red* または *blue* が `\usepackage` コマンドに渡されると、文書内で `\wordcolor` が再定義されます。どちらの色も、既定の灰色も、 [事前宣言](#preliminary-declaration) の中で *xcolor* xr

[Overleafでパッケージの書き方の例を開く](https://www.sharelatex.com/project/new/template?zipUrl=/project/53f11ec1eceb82a67658cb02/download/zip\&templateName=PackageExample\&compiler=pdflatex)

### その他の宣言

この部分にほとんどのコマンドが現れます。「examplepackage.sty」では、以下にパッケージファイル全体を示します。

```latex
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{examplepackage}[2014/08/21 Example package]

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

%%番号付き環境
\newcounter{example}[section]
\newenvironment{example}[1][]{\refstepcounter{example}\par\medskip
\noindent \textbf{My~environment~\theexample. #1} \rmfamily}{\medskip}

%%重要な語は索引に追加され、異なる色で印字されます
\newcommand{\important}[1]
{\IfSubStr{#1}{!}
    {\textcolor{\wordcolour}{\textbf{\StrBefore{#1}{!}~\StrBehind{#1}{!}}}\index{#1}}
    {\textcolor{\wordcolour}{\textbf{#1}}\index{#1}\kern-1pt}
}
```

このパッケージは新しい環境 `example`と、新しいコマンド `\important`を定義します。これは語を特別な色で印字し、索引に追加します。

各コマンドを完全に理解するには、 [リファレンスガイド](#reference-guide) および [さらに読むセクション](#further-reading).

以下は、パッケージ *examplepackage.sty*.

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

\usepackage[red]{examplepackage}

\makeindex

\title{Package Example}
\author{Team Learn ShareLaTeX}
\date{ }

\begin{document}

\maketitle

\section{導入}
この文書では新しいパッケージをテストしています。このパッケージは、特殊な番号付きの
環境

\begin{example}
このテキストは特別な環境の中にあり、太字のテキストが印字されます
冒頭に表示され、さらに新しい字下げが設定されます。
\end{example}

また、\important{important!words} 用の特別なコマンドがあり、これは
で使用されたパラメータに応じて特別な\important{色}で
\important{パッケージ}読み込み文。\important{重要}だからです。

\printindex

\end{document}
```

![WrittingPackagesEx1.png](/files/324ca2c31de5313371a890cc1e18a81429f93424)

コマンドに注目してください

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

[Overleafでパッケージの書き方の例を開く](https://www.sharelatex.com/project/new/template?zipUrl=/project/53f11ec1eceb82a67658cb02/download/zip\&templateName=PackageExample\&compiler=pdflatex)

## エラー処理

新しいパッケージを開発するときは、何か問題が起きたことをユーザーに知らせるために、起こりうるエラーを適切に処理することが重要です。コンパイラ内でエラーを報告するための主なコマンドは4つあります。

* `\PackageError{*package-name*}{*error-text*}{*help-text*}`。3つの引数を取り、それぞれ波括弧内に入れます。パッケージ名、表示されるエラーテキスト（コンパイル処理は一時停止します）、そして、エラーのためにコンパイルが停止したときにユーザーが「h」を押すと表示されるヘルプテキストです。
* `\PackageWarning{*package-name*}{*warning-text*}`。この場合、テキストは表示されますが、コンパイル処理は停止しません。警告が発生した行番号が表示されます。
* `\PackageWarningNoLine{*package-name*}{*warning-text*}`。前のコマンドと同様に動作しますが、警告が発生した行は表示されません。
* `\PackageInfo{*package-name*}{*info-text*}`。この場合、2番目の引数の情報は、行番号を含めてトランスクリプトファイルにのみ出力されます。

[Overleafでパッケージの書き方の例を開く](https://www.sharelatex.com/project/new/template?zipUrl=/project/53f11ec1eceb82a67658cb02/download/zip\&templateName=PackageExample\&compiler=pdflatex)

## リファレンスガイド

**パッケージとクラスでよく使われるコマンド一覧**

* `\newcommand{*name*}{*definition*}`。 [新しいコマンド](/latex/ja/komando/01-commands.md#defining-a-new-command)、第1引数は新しいコマンドの名前で、第2引数はそのコマンドが行う処理です。
* `\renewcommand{}{}`。 `\newcommand` と同じですが、既存のコマンドを上書きします。
* `\providecommand{}{}`。 `\newcommand` と同様に動作しますが、コマンドがすでに定義されている場合は、何も表示せずに無視されます。
* `\CheckCommand{}{}`。構文は `\newcommand`と同じですが、代わりにコマンドが存在し、期待どおりの定義になっているかを確認します。LaTeXは、コマンドが `\CheckCommand` であると期待している場合に警告を表示します。
* `\setlength{}{}`。第1引数として渡された要素の長さを、第2引数に書かれた値に設定します。
* `\mbox{}`。波括弧内に書かれた要素を含む箱を作成します。
* `\fbox{}`。 `\mbox`と同じですが、実際には内容の周囲に箱が描画されます。

## さらに読む

詳細については

* [パッケージとクラスファイルの理解](/latex/ja/kurasufairu/01-understanding-packages-and-class-files.md)
* [独自のクラスを書く](/latex/ja/kurasufairu/04-writing-your-own-class.md)
* [コマンド](/latex/ja/komando/01-commands.md) や [環境](/latex/ja/komando/02-environments.md)
* [LaTeX における長さ](/latex/ja/shu-shi-she-ding/01-lengths-in-latex.md)
* [LaTeXで色を使う](/latex/ja/shu-shi-she-ding/13-using-colors-in-latex.md)
* [大規模プロジェクトでの管理](/latex/ja/wen-shu-gou-zao/07-management-in-a-large-project.md)
* [パッケージおよびパッケージ作成者のための LaTeX2ε](http://www.latex-project.org/guides/clsguide.pdf)
* [TeXでのプログラミングに関する注記](http://pgfplots.sourceforge.net/TeX-programming-notes.pdf)
* [時間未満の分: LaTeXリソースの使用](https://tug.org/pracjourn/2005-4/hefferon/hefferon.pdf)
* [The LaTeX Companion. 第2版](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/ja/kurasufairu/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.
