クラス・パッケージ作者のためのLaTeX 2ε（抄訳）

(注） これは [LaTeX 2ε for class and package writers](https://ctan.org/pkg/clsguide)の第3章までの日本語訳です。本文書の原文は [The LaTeX Project Public License](https://ctan.org/license/lppl) で提供されています。

# 1 はじめに

このドキュメントは、LaTeX用のクラスとパッケージの作成方法、特に既存のLaTeX 2.09パッケージをLaTeX2ε用にアップグレードする場合に注目して紹介しています。後者の問題は、TUGboat 15.3に掲載されたJohannes Braamsの記事でも触れられています。

## 1.1 LaTeX 2ε用のクラスとパッケージの作成

LaTeXは文書作成システムであり、文書執筆者がテキストの書式にあまり気を使わず、テキストの内容に集中できるようにします。例えば、章は18ptの太字を指定するのではなく、 `\chapter{<title>}`で表されます。

（`‘\chapter’`のような）論理構造を（`‘18pt bold ragged right’`のように）書式化する方法についての情報を含むファイルは、ドキュメントクラスです。
さらに、一部の機能（カラーやグラフィックスなど）はドキュメントクラスとは独立していて、これらはパッケージに含まれています。

LaTeX 2.09とLaTeX2εの最大の違いの1つは、パッケージとクラスを書くためのコマンドです。 LaTeX 2.09では、`.sty`ファイルの作成がほとんどサポートされていなかったため、作者は低レベルのコマンドを使用する必要がありました。

LaTeX2εは、パッケージを構造化するための高レベルのコマンドを提供しています。また、クラスやパッケージはそれぞれの上に構築する方が簡単です。たとえば、`article`クラスに基づいて、ローカルな技術レポートクラス`cetechr`（Chemical Engineering department, 化学工学部門用）を作成するといったやり方です。

## 1.2 概要

このドキュメントは、LaTeXのクラスとパッケージの書き方の概要を記しています。パッケージを書くために必要なすべてのコマンドを紹介しているわけではありません。これらは「LaTeX：A Document Preparation System」や「LaTeX Companion」にあります。しかし、ここではクラスとパッケージを構造化するための新しいコマンドを記述しています。

第2.7節には、クラスとパッケージの作成に関する一般的なアドバイスが含まれています。クラスとパッケージの違い、コマンドの命名規則、`doc`と`docstrip`の使い方、TeXのプリミティブなファイルとボックスコマンドがLaTeXと連携する方法について説明しています。また、一般的なLaTeXスタイルに関するヒントも含まれています。

第3章では、クラスとパッケージの構造について説明します。これには、他のクラスとパッケージの上にクラスとパッケージを構築すること、オプションを宣言すること、およびコマンドを宣言することが含まれます。また、サンプルクラスも含まれています。

第4章は新しいクラスとパッケージコマンドを記載しています。

第6章では、既存のLaTeX 2.09クラスとパッケージをLaTeX2εにアップグレードする方法について詳しく説明します。

## 1.3 さらなる情報

LaTeX2εの新機能を含む、LaTeXの一般的な紹介については、Leslie Lamport 「LaTeX：A Document Preparation System[^2]」を読んでください。

LaTeXの新機能の詳細な説明は、200以上のパッケージと1000を超える実行可能なサンプルの概要を含む、Frank MittelbachとMichel Goossensによる「LaTeX Companion 第2版[^3]」にあります。

LaTeXシステムは、TeXに基づいています。TeXについてはDonald E. Knuth「The TEXbook [^1]」に記述されています。

LaTeXのすべてのコピーに付随する多数のドキュメントファイルがあります。 「LaTeX News」のコピーは、6ヶ月ごとのLaTeXリリースと合わせて公開されており、`ltnews*.tex`ファイルにあります。著者のためのガイドである「LaTeX2ε for Authors」は、新しいLaTeXドキュメントの機能について説明しており、usrguide.texにあります。「LaTeX2εFont Selection」は、クラス作者とパッケージ作者のためのLaTeXフォント選択スキームを記述しており、fntguide.texにあります。 LaTeXの設定については、cfguide.texの「Configuration options for LaTeX2ε」で説明されていますが、LaTeXの変更に関するポリシーの背景にある考え方は、modguide.texの「Modifying LaTeX」で説明しています。

（latex.ltxを介してカーネルフォーマットを生成するために使用されたファイルから）文書化されたソースコードは、「The LaTeX2ε Sources」として利用可能になりました。この非常に大きな文書には、LaTeXコマンドの索引も含まれています。このディレクトリのソースファイルとクラスファイルltxdoc.clsを使用して、baseディレクトリのLaTeXファイルsource2e.texからタイプセットすることができます。

TeXおよびLaTeXの詳細については、近くのTeXユーザーグループまたは国際TeXユーザーグループにお問い合わせください。 住所やその他の詳細情報は以下にあります:

http://www.tug.org/lugs.html

# 1.4 標準クラスのポリシー

標準クラスに関する問題報告の多くはバグには関係していないのですが、その中に組み込まれている設計方針が「最適ではない」ということを（丁重さの多寡はさておき）示しています。

これらのファイルに変更を加えるべきではない理由はいくつかあります。

* 見当違いがあるにせよ、現状の挙動は、これらのクラスが設計されたときに意図されたものである
* 多くの人がそれに頼っているため、「標準クラス」のそのような側面を変更することは良い慣習ではない

そのため、我々はそのような変更を行うことを考慮しないこと、さらにその決定を正当化する時間を費やさないことも決定しました。これは、標準クラスの設計に多くの欠陥があることに同意しないことを意味するものではありません。しかし、LaTeXの標準クラスを変更できない理由を継続的に説明するよりも、優先度の高い多くのタスクがあります。

もちろん、より良いクラス、またはこれらのクラスを強化するために使用できるパッケージの制作を歓迎します。そういった欠点について検討するときに最初の考えることが、「これを改善するために、私は何ができるのだろうか？」といったことであるのを期待しています。

カーネルの設計意思決定を実装している部分にも同様の考慮があてはまりますが、その多くはクラスファイルに残されていて、現在のシステムには存在していません。このような場合には、自分で問題を修正することははるかに難しいですが、カーネルでこのような変更を行うことはおそらく私たちにとって大きなプロジェクトになるでしょう。そのような拡張はLaTeX3を待たなければならないでしょう。


# 2 クラスとパッケージの作成

このセクションでは、LaTeXのクラスとパッケージの作成に関する一般的な点について説明します。

## 2.1 古いバージョン

既存のLaTeX 2.09スタイルファイルをアップグレードする場合は、2.09バージョンをフリーズして、それを維持しないことをお勧めします。 1990年代初めに存在していたLaTeXの様々な方言の経験は、LaTeXの異なるバージョンのパッケージを維持することはほとんど不可能であることを示唆しています。もちろんいくつかの組織では両方のバージョンをしばらく並行して保守する必要がありますが、これは個人がサポートするパッケージやクラスには必須ではありません。LaTeXの古いバージョンではなく、新しい標準のLaTeX2εだけをサポートするべきです。

## 2.2 ‘docstrip’と‘doc’を使う

LaTeXのために大きなクラスやパッケージを書くつもりなら、LaTeXに付属の`doc`ソフトウェアの使用を検討するべきです。これを使って書かれたLaTeXクラスとパッケージは、2つの方法で処理することができます: 一つはLaTeXを使って、ドキュメントを生成することです。もう一つは`docstrip`で処理して`.cls`または`.sty`ファイルを生成することです。

`doc`ソフトウェアは、定義の索引、コマンド使用の索引、およびchange-logリストを自動生成することができます。これは、大規模なTeXソースの保守と文書化に非常に役立ちます。

文書化されたLaTeXカーネル自体や標準クラスなどのソースは`doc`ドキュメントです。それらはディストリビューションの`.dtx`ファイルにあります。実際には、カーネルのソースコードを`source2e.tex`を使ってLaTeXを実行することで、索引付きの長いドキュメントとして組むことができます。これらの文書の組版は、クラスファイルltxdoc.clsを使用します。

`doc`および`docstrip`の詳細については、docstrip.dtxやdoc.dtxファイル、そして「The LaTeX Companion」を参照してください。使用例については、`.dtx`ファイルを参照してください。

## 2.3 クラスにするかパッケージにするか？

新しいLaTeXコマンドをファイルに入れたいときにまず行うべきことは、ドキュメントクラスかパッケージかを決定することです。経験則は次の通りです。

> コマンドを任意のドキュメントクラスで使用できる場合は、パッケージにします。そうでなければ、クラスにします。

クラスには2つの主要なタイプがあります: 一つは`article`、`report`、`letter`といった、独立しているものです。もう一つは、他のクラスの拡張または変形であるもので、例えば、`article`ドキュメントクラス上に構築された`proc`ドキュメントクラスが該当します。

したがって、ある会社は、自分のヘッダのついたnote paperを使って手紙を印刷するためのローカルの`ownlet`クラスを持っているかもしれません。このようなクラスは、既存の`letter`クラスの上に構築されますが、他のドキュメントクラスでは使用できません。したがって、`ownlet.sty`ではなく`ownlet.cls`にします。

対照的に、`graphics`パッケージはLaTeX文書に画像を含めるためのコマンドを提供します。これらのコマンドはどのドキュメントクラスでも使用できるため、`graphics.cls`ではなく`graphics.sty`を使用しています。


## 2.4 コマンド名

LaTeXには3種類のコマンドがあります。

`\section`、`\emph`、`\times`などの執筆者用コマンドがあります。これらのほとんどは短い名前で、すべて小文字です。

クラス作者コマンドとパッケージ作者コマンドもあります。これらのほとんどは、以下のような長く、大文字小文字の混ざった名前を持っています。

> `\InputIfFileExists` `\RequirePackage` `\PassOptionsToClass`

最後に、`\@tempcnta`、`\@ifnextchar`、`\@eha` のようなLaTeXの実装で使用される内部コマンドがあります。これらのコマンドのほとんどは、名前に`@`を含んでいます。つまり、ドキュメントでは使用できません。クラスやパッケージファイルの中でのみ使用できます。

残念ながら、歴史的な理由から、これらのコマンドの区別はしばしばぼやけています。例えば、`\hbox`は内部コマンドであり、LaTeXカーネルでのみ使用されるべきですし、一方で `\m@ne` は定数 -1 ですが、これは `\MinusOne` でもよかったはずです。

しかし、この経験則はまだ有効です。コマンド名に`@`が付いているなら、それはLaTeX言語としてサポートされているものの一部ではなく、その動作が将来のリリースで変更される可能性があります。大文字と小文字が混在している場合や、「LaTeX: A Document Preparation System」で記述されている場合は、LaTeX2εの将来のリリースでもコマンドがサポートされることを期待できます。

## 2.5 ボックスコマンドと色

あなた自身のドキュメントで色を使用するつもりがない場合でも、このセクションで指摘する点に気をつけると、あなたのクラスまたはパッケージがcolorパッケージと互換性をもっているかどうかを確認できるようになります。これは、カラープリンタを持っている、あなたのクラスまたはパッケージを使用している人にとって有益です。

「色の安全性」を保証する最も簡単な方法は、TeXプリミティブではなく、LaTeXのボックスコマンドを必ず使うようにすることです。これは`\setbox`ではなく、`\sbox`を、`\hbox`や`\parbox`ではなく`\mbox`を、また`\vbox`ではなく`minipage`環境で使用することです。LaTeXボックスのコマンドには新しいオプションがあり、TeXプリミティブと同じくらい強力なものになっています。

うまくいかない例として、`{\ttfamily <text>}`ではフォントが`}`の直前に復元されているのに対し、同様の構造の`{\color{green} <text>}`では最後の`}`の直後に色が復元されることを考えてみましょう。通常、この区別は全く問題ではありません。次のようなプリミティブなTeXボックスの割り当てを考えてみましょう：

```tex
\setbox0=\hbox{\color{green} <text>}
```

今度は色の復元が`}`の後に起こるので、ボックスには保存**されません**。これがもたらす悪影響は、どのように色を実装しているかに依存します: ドキュメントの残りの部分で間違った色を取得することから、ドキュメントの印刷に使用されるdviドライバでエラーが起きることまでの可能性があります。

また、`\normalcolor`コマンドも重要です。これは通常は単なる`\relax`（つまり何もしません）ですが、キャプションやセクション見出しなどのページの領域を「主要なドキュメントの色」に設定する場合は`\normalfont`のように使うことができます。


## 2.6 テキストと数学記号の定義

LaTeX2εは異なるエンコーディングをサポートするため、シンボル、アクセント、合成グリフなどを生成するコマンドの定義は、この目的のために提供されている、「LaTeX2ε Font Selection」に記載されたコマンドを使って定義する必要があります。 システムのこの部分はまだ開発中ですので、そのような作業は大きな注意を払いながら行う必要があります。

また、`\DeclareRobustCommand` は、この種のエンコードに依存しないコマンドに使用する必要があります。

数学モード以外で数学フォントの設定を参照することはできないことに注意してください。例えば、`\textfont1`と`\scriptfont2`のどちらも、他のモードでは定義されていることは保証されていません。

## 2.7 一般的なスタイル

新しいシステムでは、堅牢でポータブルな構造化されたクラスファイルとパッケージファイルを作成するための、さまざまなコマンドが用意されています。この節では、これらを賢く使用するいくつかの方法の概要を説明します。

### 2.7.1 他のファイルを読み込む

LaTeXは次のコマンドを提供します:

```tex
\LoadClass \LoadClassWithOptions
\RequirePackage \RequirePackageWithOptions
```

これは他のクラスやパッケージの中でクラスやパッケージを使うためのコマンドです。プリミティブの`\input`コマンドではなく、さまざまな理由で、これらのコマンドを使用することを強くお勧めします。

`\input <filename>`でロードされたファイルは、`\listfiles`リストにはリストされません。


パッケージが常に`\RequirePackage ...`または`\usepackage`で読み込まれている場合、複数回読み込みを要求されても、読み込まれるのは1回だけです。一方、`\input`でロードされている場合、それは複数回ロードすることができます。 そのような余分なロードは時間とメモリを浪費し、奇妙な結果を生むかもしれません。

パッケージがオプション処理を提供する場合、パッケージが`\usepackage`または `\RequirePackage ...`によってロードされるのではなく、`\input`であれば、奇妙な結果が起きる可能性があります。

パッケージ`foo.sty`が `\input baz.sty`を使ってパッケージ `baz.sty` をロードすると、警告メッセージが表示されます：


```
LaTeX Warning: You have requested package ‘foo’,
               but the package provides ‘baz’.
```

したがって、いくつかの理由から、`\input`を使用してパッケージをロードするのはおすすめできません。

残念ながら、ファイル`myclass.sty`をクラスファイルにアップグレードする場合は、`\input myclass.sty`を含む古いファイルがまだ動作していることを確認する必要があります。

これは、既存のLaTeX 2.09ドキュメントスタイルの多くに`\input article.sty`が含まれているため、標準クラス（article、book、report）にも当てはまりました。 これを解決するために使用するアプローチは、適切なクラスファイルを単にロードする最小限のファイル`article.sty`、`book.sty`、および`report.sty`を提供することです。

たとえば、`article.sty`には次の行だけが含まれます。

```
\NeedsTeXFormat{LaTeX2e}
\@obsoletefile{article.cls}{article.sty}
\LoadClass{article}
```

このようにしたい場合もありますし、そうしても安全だと思われる場合であれば、単に`myclass.sty`を削除することもできます。

### 2.7.2 堅牢にする

可能な限りLaTeXコマンドを使用することは、パッケージやクラスを記述する際の良い慣習であると考えています。

したがって、`\def...`を使用する代わりに、`\newcommand`や`\renewcommand`、`\providecommand`のいずれかを使用することをお勧めします。`\CheckCommand`も便利です。これにより、誤ってコマンドを再定義して予期せぬ結果を出す危険性が低くなります。

環境を定義するときは、`\def\foo{...}`と`\def\endfoo{...}`の代わりに`\newenvironment`または`\renewenvironment`を使用します。

`<dimen>`または`<skip>`レジスタの値を設定または変更する必要がある場合は、`\setlength`を使用します。

ボックスを操作するには、`\setbox`、`\hbox`、`\vbox`ではなく、`\sbox`、`\mbox`、`\parbox`といったLaTeXコマンドを使用します。

`\@latexerr`や`\@warning`、`\wlog`ではなく、`\PackageError`や`\PackageWarning`、`\PackageInfo`（または同等のクラスコマンド）を使用します。

`\ds@<option>`を定義して`\@options`を呼び出すことによって、オプションを宣言することもできます。しかし、それよりも`\DeclareOption`および`\ProcessOptions`コマンドを使用することをお勧めします。これらはより強力で、より省メモリです。そのため、このようにするよりは:

```tex
\def\ds@draft{\overfullrule 5pt}
\@options
```

こうするべきです:

```tex
\DeclareOption{draft}{\setlength{\overfullrule}{5pt}}
\ProcessOptions\relax
```

この種の慣習の利点は、コードがより読みやすく、より重要なこととして、LaTeXの将来のバージョンで使用する場合でも壊れにくいことです。

### 2.7.3 ポータブルにする

ファイルをできるだけポータブルにすることも大切です。 これを確実にするには、7ビットの表示可能テキストのみを含めるようにするべきです。 ファイル名は最大8文字（と3文字の拡張子を加えたもの）にするべきです。もちろん、標準のLaTeXディストリビューションのファイルと同じ名前であってはいけませんが、その内容はこれらのファイルのどれかと類似していてもかまいません。

また、ローカルクラスやパッケージに共通のプレフィックスがある場合に便利です。たとえば、University of Nowhereクラスは`unw`で始まるかもしれません。 これは、すべての大学が同じの論文クラス`thesis.cls`になってしまう、といったことを避けるのに役立ちます。

LaTeXカーネルの一部の機能やパッケージに依存している場合は、必要なリリース日を指定してください。 たとえば、1994年6月のリリースでパッケージエラーコマンドが導入されたので、それらを使用する場合は次のように記述するべきです:

```tex
\NeedsTeXFormat{LaTeX2e}[1994/06/01]
```

### 2.7.4 便利なフック

いくつかのパッケージとドキュメントスタイルでは、`\document`または`\enddocument`コマンドを再定義してその目標を達成する必要がありました。これはもはや必要ではありません。 'hooks' `\AtBeginDocument`と`\AtEndDocument`が使用できるようになりました（4.6項を参照）。

ここでも、これらのフックを使用すると、LaTeXの将来のバージョンでコードが壊れる可能性は低くなります。また、あなたのパッケージが他のパッケージと一緒に動作する可能性も高くなります。

ただし、`\AtBeginDocument`フックのコードはプリアンブルの一部です。したがって、そこに置くことができるものには制限があります。特に、組版は行えません。

# 3 クラスまたはパッケージの構造

LaTeX2εのクラスとパッケージは、LaTeX 2.09のスタイルファイルよりも多くの構造を持っています。クラスまたはパッケージファイルの概要は次のとおりです。

* **識別情報** このファイルがLaTeX2εのパッケージまたはクラスであることと、自身の内容を簡単に記述します。
* **予備宣言** ここでは、ファイルはいくつかのコマンドを宣言し、他のファイルをロードすることもできます。通常、これらのコマンドは、オプション宣言部分で使われているコードが必要とするものに限られます。
* **オプション** オプションを宣言して処理します。
* **より多くの宣言** ほとんどの作業はファイルのこの場所で行われます: 新しい変数やコマンド、フォントの宣言、そして他のファイルをロードといったことです。

## 3.1 識別情報

クラスやパッケージファイルの最初に書かれることは、自分自身を識別する情報です。パッケージファイルには次のように記載します:

```tex
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{<package>}[<date> <other information>]
```

例えば:

```tex
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{latexsym}[1994/06/01 Standard LaTeX package]
```

クラスファイルは以下のようになります:

```tex
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{<class-name>}[<date> <other information>]
```

例えば:

```tex
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{article}[1994/06/01 Standard LaTeX class]
```

`<date>`は `yyyy/mm/dd` の形式で指定します。オプションの引数が使用されている場合は必ず指定します（これは `\NeedsTeXFormat`コマンドにも当てはまります）。この構文の形式から派生したものは、低レベルのTeXエラーを発生させます。コマンドは、パッケージまたはクラスの日々の使用を高速化し、開発者がミスをした場合のための規定を作らないという有効な構文を期待しています。

この日付は、ユーザーが `\documentclass`または`\usepackage`コマンドで日付を指定するたびにチェックされます。たとえば、次のように書いたとします。

```tex
\documentclass{article}[1995/12/23]
```

そうすると、別の場所のユーザーには、`article`のコピーが期限切れであったという警告が表示されるかもしれません。

クラスが使用されると、クラスの説明が表示されます。このパッケージの説明はログファイルに書き込まれます。これらの説明は`\listfiles`コマンドでも表示されます。 `Standard LaTeX`というフレーズは、標準のLaTeXディストリビューション以外のファイルの識別バナーに使用しては**いけません**。

## 3.2 クラスとパッケージを使う

LaTeX 2.09のスタイルファイルと、LaTeX2εのパッケージとクラスとの最初の大きな違いは、LaTeX2εが大きな単一ファイルを使用するのではなく、小さなビルディングブロックからファイルをビルドするという意味で、モジュール性をサポートしていることです。

LaTeXパッケージまたはクラスは、次のようにパッケージをロードできます。

```tex
\RequirePackage[<options>]{<package>}[<date>]
```

例えば:

```tex
\RequirePackage{ifthen}[1994/06/01]
```

このコマンドの構文は、執筆者用コマンド`\usepackage`と同じです。 これにより、パッケージやクラスは、他のパッケージによって提供される機能を使用できます。たとえば、`ifthen`パッケージをロードすることによって、パッケージ作者は `if...then...else...`というコマンドが利用できるようになります。

LaTeXクラスは、次のように他のクラスをロードすることができます：

```tex
\LoadClass[<options>]{<class-name>}[<date>]
```

例えば:

```tex
\LoadClass[twocolumn]{article}
```

このコマンドは、執筆者用コマンド `\documentclass`と同じ構文をしています。

これは、クラスが別のクラスの構文と外観に基づいていることを可能にします。 たとえば、`article`クラスを読み込むことによって、クラス作者は、新しいクラスを最初から書くのではなく、`article`の気に入らないところを少し変更するだけで済みます。

以下のコマンドは、現在のクラスで使用されているオプションとまったく同じクラスまたはパッケージファイルを単にロードする場合に使用できます。

```tex
\LoadClassWithOptions{<class-name>}[<date>]
\RequirePackageWithOptions{<package>}[<date>]
```

例えば:

```tex
\LoadClassWithOptions{article}
\RequirePackageWithOptions{graphics}[1995/12/01]
```

## 3.3 オプションを宣言する

LaTeX 2.09のスタイルとLaTeX2εのパッケージとクラスとの、その他の主な違いは、オプション処理です。 パッケージとクラスはオプションを宣言できるようになりました。これらは執筆者が指定できます。例えば、`twocolumn`オプションはarticleクラスによって宣言されます。 オプションの名前には、'LaTeX名'に許可されている文字のみを含めるようにしてください。特に、コントロールシーケンスを含むことはできません。

オプションは次のように宣言します:


```tex
\DeclareOption{<option>}{<code>}
```

例えば、`graphics`パッケージの`dvips`オプション(の若干簡素化されたもの)は以下のようになります:

```tex
\DeclareOption{dvips}{\input{dvips.def}}
```

これは、作者が`\usepackage[dvips]{graphics}`と書くと、`dvips.def`ファイルが読み込まれることを意味します。別の例として、`article`クラスの中では`a4paper`オプションが`\paperheight`と`\paperwidth`の長さを設定するように宣言されています：

```tex
\DeclareOption{a4paper}{%
  \setlength{\paperheight}{297mm}%
  \setlength{\paperwidth}{210mm}%
}
```

クラスやパッケージが明示的に宣言していないオプションを、ユーザーが要求することがあります。デフォルトでは警告（クラスの場合）またはエラー（パッケージの場合）が発生します。この挙動は次のようにすることで変更できます。

```tex
\DeclareOption*{<code>}
```

例えば、パッケージ`fred`が不明なオプションに対してエラーではなく警告を生成させるには、次のように指定します:

```tex
\DeclareOption*{%
  \PackageWarning{fred}{Unknown option '\CurrentOption'}%
}
```

こうすると、執筆者が`\usepackage[foo]{fred}`と書いた場合、`Package fred Warning: Unknown option ‘foo’.` という警告を受け取ります。別の例として、`fentenc`パッケージは、`<ENC>`オプションが使用されるたびに、ファイル`<ENC>enc.def`をロードしようとします。これは次のように書くことで実現できます：

```tex
\DeclareOption*{%
  \input{\CurrentOption enc.def}%
}
```

`\PassOptionsToPackage`または`\PassOptionsToClass`コマンドを使用して、別のパッケージやクラスにオプションを渡すことができます（これはオプション名に対してのみ機能する特殊な操作です）。たとえば、すべての未知のオプションを`article`クラスに渡すには、次のようにします：

```tex
\DeclareOption*{%
\PassOptionsToClass{\CurrentOption}{article}%
}
```

これを行う場合、後でクラスをロードする必要があります。そうしないと、オプションは決して処理されません。

ここまでは、オプションの宣言方法についてのみ説明してきましたが、実行方法は説明しませんでした。

ファイルが呼び出されたオプションを処理するには、以下を使用する必要があります。

```tex
\ProcessOptions\relax
```

これは、指定されかつ宣言された各オプションに対して `<code>`を実行します（この詳細については、4.7節を参照してください）。

たとえば、`jane`パッケージファイルに次のものが含まれているとします。


```tex
\DeclareOption{foo}{\typeout{Saw foo.}}
\DeclareOption{baz}{\typeout{Saw baz.}}
\DeclareOption*{\typeout{What’s \CurrentOption?}}
\ProcessOptions\relax
```

そして執筆者が `\usepackage[foo,bar]{jane}`と書くと、`Saw foo`と`What's bar？`というメッセージが表示されます。

## 3.4 最小のクラスファイル

クラスやパッケージの動作の大部分は、新しいコマンドの定義やドキュメントの外観の変更にあります。 これは、`\newcommand`や`\setlength`などのコマンドを使用して、パッケージの本体で行われます。

LaTeX2εは、クラスとパッケージ作者を支援するいくつかの新しいコマンドを提供します。 これらは第4章で詳細に説明されています。

すべてのクラスファイルには、`\normalsize`の定義、`\textwidth`と`\textheight`の値の定義、ページ番号の指定という4つの項目が含まれています。 したがって、最小のドキュメントクラスファイルは次のようになります（このクラスは現在、minimal.clsとして標準ディストリビューションに収録されています）。


```tex
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{minimal}[1995/10/30 Standard LaTeX minimal class]
\renewcommand{\normalsize}{\fontsize{10pt}{12pt}\selectfont}
\setlength{\textwidth}{6.5in}
\setlength{\textheight}{8in}
\pagenumbering{arabic} % needed even though this class will
% not show page numbers
```

ただし、このクラスファイルでは、脚注、余白、浮動小数点などはサポートされません。`\rm`などの2文字のフォントコマンドも提供されません。したがって、ほとんどのクラスはこの最小設定以上のことを含んでいます。

## 3.5 例：ローカルなletterクラス

会社は会社独自のスタイルのレターを設定するため、独自のletterクラスを持つことができます。 このセクションでは、そのようなクラスの単純な実装を示しますが、実際に使用するクラスではより複雑な構造が求められます。

このクラスは、自身を`neplet.cls`として宣言することから始まります。

```tex
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{neplet}[1995/04/01 NonExistent Press letter class]
```

次に `letter`クラスにすべてのオプションを渡します。これは` a4paper`オプションで読み込まれます。

```tex
\DeclareOption*{\PassOptionsToClass{\CurrentOption}{letter}}
\ProcessOptions\relax
\LoadClass[a4paper]{letter}
```

会社のレターヘッドで使うために、`firstpage`というページスタイルを再定義します。これはレターの最初のページで使用されるページスタイルです。

```tex
\renewcommand{\ps@firstpage}{%
  \renewcommand{\@oddhead}{<letterhead goes here>}%
  \renewcommand{\@oddfoot}{<letterfoot goes here>}%
}
```

これでできあがりです！

## 3.6 例: ニュースレタークラス

`article`クラスの変種を使用して、シンプルなニュースレターをLaTeXで組むことができます。 クラスは、自身を`smplnews.cls`として宣言することから始まります。

```tex
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{smplnews}[1995/04/01 The Simple News newsletter class]

\newcommand{\headlinecolor}{\normalcolor}
```

ほとんどの指定されたオプションを`article`クラスに渡します: オフになっている`onecolumn`オプションと、見出しを緑色に設定する`green`オプションを除いて。

```tex
\DeclareOption{onecolumn}{\OptionNotUsed}
\DeclareOption{green}{\renewcommand{\headlinecolor}{\color{green}}}

\DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}}

\ProcessOptions\relax
```

次に、オプション`twocolumn`を指定しつつ、`article`クラスをロードします。

```tex
\LoadClass[twocolumn]{article}
```

ニュースレターはカラーで印刷されるため、カラーパッケージがロードされるようになりました。

このクラスは、デバイスドライバオプションを指定していません。`smplnews`クラスのユーザが指定するものだからです。

```tex
\RequirePackage{color}
```

このクラスは`\maketitle`を再定義して、適切な色で72pt Helvetica太字斜体のタイトルを生成するようにしてします。

```tex
\renewcommand{\maketitle}{%
  \twocolumn[%
    \fontsize{72}{80}\fontfamily{phv}\fontseries{b}%
    \fontshape{sl}\selectfont\headlinecolor
    \@title
  ]%
}
```

`\section`を再定義し、セクションの番号付けをオフにします。

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

\setcounter{secnumdepth}{0}
```

3つの基本的な項目も設定します。

```tex
\renewcommand{\normalsize}{\fontsize{9}{10}\selectfont}
\setlength{\textwidth}{17.5cm}
\setlength{\textheight}{25cm}
```

実際には、クラスはこれ以上のものを必要とするでしょう: 発行番号、記事の執筆者、ページスタイルなどのコマンドを提供します。このスケルトンはあくまで開始地点にすぎません。`ltnews`クラスファイルは、これよりもはるかに複雑というわけでもありません。



# 参考文献

[^1]: Donald E. Knuth. The TEXbook. Addison-Wesley, Reading, Massachusetts, 1986. Revised to cover TeX3, 1991.
[^2]: Leslie Lamport. LaTeX: A Document Preparation System. Addison-Wesley, Reading, Massachusetts, second edition, 1994.
[^3]: Frank Mittelbach and Michel Goossens. The LaTeX Companion second edition. With Johannes Braams, David Carlisle, and Chris Rowley. AddisonWesley, Reading, Massachusetts, 2004.