> 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/04-writing-your-own-class.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εの構文で書かれたクラスとして自らを宣言しています。
* ***事前宣言***。ここでは、必要な外部パッケージとクラスを読み込みます。また、この部分では、宣言されたオプションに必要なコマンドと定義が記述されます。
* ***オプション***。クラスはオプションを宣言し、それを処理します。
* ***追加の宣言***。クラス本体です。クラスが行うほとんどすべてがここで定義されます。

次の小節では、構成のより詳しい説明と、 *exampleclass.cls*の動作例を示します。

### 識別

すべてのクラスが持つべき簡単なコマンドは2つあります。

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

コマンド `\NeedsTeXFormat{LaTeX2e}` は、このクラスが動作するためのLaTeXのバージョンを設定します。さらに、最低限必要なリリース日を指定するために、角括弧内に日付を追加できます。

コマンド `ProvidesClass{exampleclass}[...]` は、このクラスを *exampleclass* として識別し、角括弧内にはリリース日と追加情報が含まれます。日付は YYYY/MM/DD 形式である必要があります。

[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=)

### 事前宣言

クラスの多くは既存のものを拡張・カスタマイズするものであり、動作のために外部パッケージも必要とします。以下では、サンプルクラス `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}
```

この部分のコマンドは、後でオプションを管理するために使われるパラメータを初期化するか、外部ファイルを読み込みます。

コマンド `\LoadClass[twocolumn]{article}` はクラスを読み込みます `article` 追加パラメータ `twocolumn`を使って。したがって、標準の `article` クラス内のすべてのコマンドが自動的に **example** クラスで利用可能になります。ただし、文書は2段組で印字されます。

`\RequirePackage` は、よく知られている `\usepackage`と非常によく似ており、角括弧内にオプションのパラメータを追加することもできます。唯一の違いは、 `\usepackage` は `\documentclass` コマンドより前では使用できないことです。新しいクラスやパッケージを書く際には、 `\RequirePackage` を使うことを強くおすすめします。

[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=)

### オプション

クラスにある程度の柔軟性を持たせるため、いくつかの追加オプションが非常に役立ちます。ファイルの次の部分は、 `exampleclass.cls` 文書クラスコマンドに渡されたパラメータを処理します。また、 `\LoadClass` を *の後に* をオプション処理の後ろに移しているので、.tex ファイルで設定されたオプションをベースクラスに渡せます。

```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}
```

ここには、クラスに渡されたオプションを扱う4つの主要コマンドがあります。

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

コマンド `\OptionNotUsed` はコンパイラとログにメッセージを出力し、そのオプションは使用されません。この場合、文書は2段組に設定され、ユーザーが1段組に変更しようとしても機能せず、そのオプションは無視されます。

コマンド `\Declareoption*{}` は、明示的に定義されていないすべてのオプションを処理します。未知のオプションが渡されたときに実行するコードという1つのパラメータだけを取ります。この場合、次のコマンドが実行されます。

`\PassOptionsToClass{}{}`。最初の波括弧の中のオプションを、2つ目の波括弧の中で指定された文書クラスに渡します。この例では、未知のオプションはすべて **article** 文書クラス

`\CurrentOption` で処理中のクラスオプション名を、その時点で保持します。

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

例では、オプション `赤で表示されます` または `green` が文書に渡されると、見出しと節に使われるフォントは対応する色に設定されます。 `slcolor` という名前の色は [事前宣言](#preliminary-declaration) で定義されており、 `xcolor` パッケージ。

[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=)

### 追加の宣言

この部分には、ほとんどのコマンドが登場します。「exampleclass.cls」では、ページの寸法、タイトル、本文、節のフォントサイズが設定されています。以下でクラスファイル全体を見ることができます。

```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}
```

残りのコマンドを理解するには、 [リファレンスガイド](#reference-guide) と、 [さらに読むセクション](#further-reading).

のリンクを参照してください。

* の定義は `normalsize`。デフォルトの [フォントサイズ](/latex/ja/fonto/01-font-sizes-families-and-styles.md).
* の既定値を設定します [`textwidth`](/latex/ja/shu-shi-she-ding/07-page-size-and-margins.md)
* の既定値を設定します [`textheight`](/latex/ja/shu-shi-she-ding/07-page-size-and-margins.md)
* の指定は、 [ページ番号付け](/latex/ja/shu-shi-she-ding/03-page-numbering.md).

以下に、クラス *exampleclass.cls*.

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

\usepackage{blindtext}

\title{クラスの動作を示す例}
\author{Team Learn ShareLaTeX}
\date{August 2014}

\begin{document}

\maketitle

\noindent
まずは、ここで簡単な動作例から始めましょう。

\blindtext

\section{はじめに}

モンティ・ホール問題...

\section{同じもの}

モンティ...
```

![WrittingClassesEx1.png](/files/29189f1fe99fc12149fd720905e671fe6cf485ee)

ここで最初のコマンドが

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

[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=)

## エラー処理

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

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

[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=)

## リファレンスガイド

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

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

## 参考文献

詳しくは次を参照してください。

* [パッケージとクラスファイルの理解](/latex/ja/kurasufairu/01-understanding-packages-and-class-files.md)
* [独自のパッケージの作成](/latex/ja/kurasufairu/03-writing-your-own-package.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/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.
