6. 新しいフォントの設定方法
LaTeX で新しいフォントを使用できるように設定するには、内部のフォント選択テーブルに、文書中のフォント要求と外部の .tfm ファイル(文字情報を保持)を結びつけるための情報を埋める必要があります。つまり、テーブルは外部ファイル cmdunh10.tfm と次の要求を関連付けます。
1\fontencoding{OT1}\fontfamily{cmdh}\fontseries{m}\fontshape{n}%
2\fontsize{10}{12pt}\selectfont新しいフォントを追加するには、このプロセスを逆に行います。外部フォントごとに、次の 5 つの質問に答える必要があります。
- フォントエンコーディングとは何か(どの文字がどの位置にあるか)?
- ファミリ名は何か?
- シリーズ(ウェイトと幅)は何か?
- シェイプは何か?
- サイズは何か?
これらの質問への回答が、LaTeX の慣例に従って外部フォントを分類するために必要な情報を提供します。以下のセクションでは、NFSS テーブルに新しいフォントを入力し、本文中で使用できるようにする方法を説明します。新しいフォントを利用したい場合(例: 新しいフォントファミリへのアクセス用に簡易パッケージを作成する)にこの情報が必要です。後のセクションでは、標準フォントではなく、たとえば数式用の特殊フォントを使用したい場合に重要な、より複雑な概念についても取り上げます。
6.1. 外部フォントの命名規則
TeX 世界で事実上の標準となっているフォント命名方式では、フォントファイル名は 8 文字の英数字で構成され、大小文字は区別されません。この 8 文字の上限により、すべてのコンピュータプラットフォームで同じファイル名が使用できます。スキームの原則は以下の表に示されており、デフォルトに相当する部分は角括弧で省略可能です。たとえば、デザインサイズはフォントが線形に拡大縮小されない場合にのみ記述します。

以下は LaTeX のフォントインタフェースに従った 35 種類の「基本」PostScript フォントの分類です。各フォントについて、フル Adobe 名と現在議論中の分類で使用される短いファイル名が示されています。OT1、T1、TS1 の場合はそれぞれ 7t、8t、8c を付加してフルファイル名にします。例として、T1 エンコーディングの Utopia Regular は putr8t となります。以降の説明で役立ちます。

この命名規則は、次のものをカバーします。
\DeclareFontShape宣言で使用される内部 TeX 名(次節参照)- 仮想フォントおよびその構成要素の名前(例:物理フォントの再エンコーディング)
- 物理フォントの名前
PostScript フォントの場合、物理フォント名は TeX が内部で使用する名前とは異なることが多く、結果として LaTeX の実行結果を表示/印刷する際に外部フォントへマッピングする必要があります。たとえば、PostScript ドライバ dvips は次のような行を含むマッピングファイル(拡張子 .map がデフォルト)を利用します。
1putr8r Utopia-Regular "TeXBase1Encoding ReEncodeFont " <8r.enc <putr8a.pfbこれはフォント putr8r が外部フォント putr8a.pfb から 8r.enc という特殊エンコーディングベクタで再エンコードされて得られることを示しています。しかし t1put.fd ファイル(T1 エンコーディングの Utopia ファミリの \DeclareFontShape 宣言が入っている)には putr8r への参照はありません。これは putr8t が fontinst ユーティリティで作成された仮想フォントで、内部で putr8r を参照しているためです。そのリンクは仮想フォントのソース内にだけ存在します。
6.2. 新しいフォントファミリとフォントシェイプグループの宣言方法
エンコーディングとファミリ名の組み合わせは、\DeclareFontFamily コマンドで LaTeX に導入します。このコマンドは 3 つの引数を取ります。最初の 2 つがエンコーディング方式とファミリ名、3 番目は通常空ですが、フォント読み込み時の特殊オプションを指定できます。たとえば、古い TeX エンコーディングで Computer Modern Dunhill を宣言するには次のように書きます。
1\DeclareFontFamily{OT1}{cmdh}{}通常、フォントファミリには多数の個別フォントが含まれます。サイズが異なるだけのフォントは個別に宣言せず、グループとしてまとめることで宣言数を減らします。
このようなグループは \DeclareFontShape コマンドで内部テーブルに登録します。\DeclareFontShape は 6 つの引数を取ります。最初の 4 つはエンコーディング、ファミリ名、シリーズ名、シェイプ名です。5 番目はサイズと外部フォント名のリスト(特別な書式)で、6 番目は通常空で、こちらも本文で説明します。
例として、古い TeX エンコーディングで Computer Modern Dunhill の中ウェイト・立体(upright)を登録する場合は次のようになります。
1\DeclareFontShape{OT1}{cmdh}{m}{n}{ <10> cmdunh10 }{}これは 10pt 用の外部フォントが 1 つだけあるという前提です。12pt(10pt からスケーリング)も利用できる場合は次のように書きます。
1\DeclareFontShape{OT1}{cmdh}{m}{n}{ <10> <12>cmdunh10 }{}外部ファイルがすべてのサイズで利用可能な場合は、宣言は非常にシンプルになります。これは Type 1 PostScript(アウトライン)フォントや、ドライバが METAFONT を呼び出してオンデマンドでフォントを生成できる場合に当てはまります。
たとえば、LaTeX の T1 エンコーディングで Times Roman のボールド立体を導入するには次のようにします。
1\DeclareFontShape{T1}{ptm}{b}{n}{ <-> ptm8t }{}この例はサイズ範囲の両端が開いていることを示し、同じ外部ファイル ptmb8t.tfm がすべてのサイズで使用され、要求サイズに合わせてスケーリングされます。複数の .tfm ファイルがある場合(例: emtt10 がテキストサイズ、emtt12 がディスプレイサイズ)には次のように書くことができます。
1\DeclareFontShape{T1}{emtt}{m}{n}{<-12> emtt10 <12-> emtt12}{}この場合、12pt 未満は emtt10.tfm が、12pt 以上は emtt12.tfm が使用されます。
上記の例は、\DeclareFontShape の第 5 引数が「サイズ情報」と「フォント情報」の組み合わせで構成されていることを示しています。角括弧(<...>)で囲まれた部分が サイズ情報、閉じ括弧の後ろが フォント情報 です。フォント情報はさらに サイズ関数(省略可能)とその引数に分かれます。\DeclareFontShape の引数内では空白は無視されますが、実際の空白が必要な場合は \space コマンドを使用できます。
シンプルサイズとサイズ範囲
サイズ情報は シンプルサイズ と サイズ範囲 に分けられます。シンプルサイズは単一の十進数で表され、例として <10> や <17.28> があります。正の数であれば任意の値が可能ですが、実際には 4pt 未満や 120pt 超はほとんど使われません(単位はポイント)。サイズ範囲は 2 つのシンプルサイズをハイフンで結び、同じフォント情報を共有するサイズ群を表します。下限は含み、上限は除外されます。例: <5-10> は 5pt 以上 10pt 未満のサイズを指します。ハイフンの片側を省略することもでき、<-> はすべてのサイズ、<-10> は 10pt 未満、<12-> は 12pt 以上を意味します。
同一のフォント情報を持つシンプルサイズが多数ある場合、次のように最後の情報だけを書いて省略できます。
1\DeclareFontShape{OT1}{panr}{m}{n}{ <5> <6> <7> <8> <9> <10>
2 <10.95> <12> <14.4> <17.28> <20.74> <24.88> pan10 }{}これは Pandora 中ウェイト・ローマンがすべて pan10 をスケーリングして生成できることを示しています。
サイズ関数
前述の通り、フォント情報は サイズ関数 とその引数に分かれます。フォント情報文字列に * がある場合、左側が関数名、右側が引数です。* が無い場合は全体が引数で、関数名は空(empty)になります。
サイズ関数は、ユーザが要求したサイズと \DeclareFontShape の情報に基づき、外部フォントを探してロードするための仕様を提供します。関数はロード時の警告メッセージの有無なども制御します。
サイズ関数名は英字で構成され、オプション引数(角括弧で囲む)と必須引数の 2 つを取ることがあります。例として、すべてのサイズで s 関数をオプション引数 0.9、必須引数 cmfbi10 と共に使用する場合は次のようになります。
1<-> s * [0.9] cmfib8\DeclareFontShape のサイズ指定は上から順に評価され、マッチしたサイズ情報が見つかるとその関数が実行されます。有効なフォントが得られたら以降のエントリはチェックされません。標準のサイズ関数は以下の通りです。
「empty」関数
サイズがシンプルサイズの場合はそのまま要求サイズでフォントをロードし、サイズ範囲にマッチすればその範囲内のサイズでロードします。たとえばユーザが 14.4 を要求した場合、
1<-> panr10は panr10.tfm を 14.4pt でロードします(.tfm のデザインサイズが 10pt なので 1.44 倍にスケーリング)。
空関数はオプション引数でスケール係数を指定でき、必要に応じて警告を出します。
1<-> [0.95] phvr8tは phvr8t.tfm(T1 エンコーディングの Helvetica)を要求サイズの 95% でロードし、オプション引数が使われたことを警告します。
「s」関数
空関数と同様に動作しますが、ターミナルにはメッセージを出さず、トランスクリプトファイルにのみ書き込みます。
「gen」関数
外部フォント名がデザインサイズを表す数字で終わる場合に便利です。gen はサイズ情報とフォント名を結合して外部フォント名を生成します。
1<8> <9> <10> gen * cmttは実質的に
1<8> cmtt8 <9> cmtt9 <10> cmtt10と同じです。小数点サイズ(例: 14.4)には使用しないでください。
「sgen」関数gen のサイレント版で、メッセージはトランスクリプトにのみ出力します。
「genb」関数
フォント名にセンチポイントが埋め込まれている場合(例: EC フォント)に使用します。
1<9> <10> <10.95> <12> genb * ecrmは
1<9> ecrm0900 <10> ecrm1000 <10.95> ecrm1095 <12> ecrm1200と展開されます。オプション引数は空関数と同様に機能します。
「sgenb」関数genb のサイレント版です。
「sub」関数
現在のフォントシェイプグループに外部フォントが無い場合、別のファミリ・シリーズ・シェイプの組み合わせに置き換えるために使用します。例として Computer Modern Sans にはイタリックがなく、スラント形が代替になります。
1\DeclareFontShape{OT1}{cmss}{m}{it}{ <-> sub * cmss/m/sl }{}この宣言が無いと、LaTeX の自動置換機構はデフォルトの立体(upright)に置き換えてしまいます。
「ssub」関数sub のサイレント版です。
「subf」関数
空関数と同様にフォントをロードしますが、置換であることを警告します。たとえば
1\DeclareFontShape{OT1}{ptm}{bx}{n}{ <-> subf * ptmb7t }{}は要求された組み合わせが利用できないことをユーザに警告し、代わりに ptmb7t をロードしたことを知らせます。情報量が少ないため、sub 関数の使用が推奨されます。
「ssubf」関数subf のサイレント版です。
「fixed」関数
要求サイズに関係なく、固定サイズの外部フォントをロードします。オプション引数でロード時のサイズ(pt)を指定できます。
「sfixed」関数fixed のサイレント版で、主に大きな数式記号フォントが単一サイズしか提供されていない場合に使用します。
フォントロード時のオプション
先述のとおり、各フォントファミリは \DeclareFontFamily で宣言します。このコマンドの第 3 引数、または \DeclareFontShape の第 6 引数は、フォントがロードされる際に実行される特殊操作を指定できます。これにより、フォント全体に対してパラメータを変更できます。
TeX は外部フォントごとに グローバル寸法(例: ハイフン文字、単語間の標準幅・伸縮幅など)を保持しています。たとえばフォントのハイフン文字は \hyphenchar\font=<number> で設定できます。デフォルトは \defaulthyphenchar(通常 45)です。-1 に設定するとハイフン処理が抑制されます。
1\DeclareFontFamily{0T1}{cmtt}{\hyphenchar\font=-1}は OT1 エンコーディングの cmtt ファミリ全体でハイフンを無効にします。T1 エンコーディングでは位置 127 が代替ハイフンになるため、次のように設定できます。
1\DeclareFontFamily{T1}{cmr}{\hyphenchar\font=127}この設定により、たとえば so‑called のような単語内のハイフンが通常のハイフン文字と区別されます。
\fontdimen の変更
各フォントには少なくとも 7 つの寸法があり、\fontdimen<number>\font=<dimen> で変更できます。主なものは次の通りです。
\fontdimen1– 文字のスラント(ポイント単位)。0 なら直立。\fontdimen2– 単語間の標準幅(interword space)。\fontdimen3– 余白の伸長可能量。\fontdimen4– 余白の縮小可能量。\fontdimen5– x-height(1ex)。\fontdimen6– quad 幅(1em)。\fontdimen7– 文末句読点の後に加える余白(\nonfrenchspacingが有効なとき)。
たとえば、あるシェイプグループで単語間のスペースを 70% にしたい場合は次のように書きます。
1\DeclareFontShape{0T1}{cmr}{m}{n}{...}
2 {\fontdimen2\font=.7\fontdimen2\font}同様に伸縮量も調整可能です。
数式フォントでは、symbols と largesymbols がそれぞれ 22 個、13 個以上の \fontdimen パラメータを必要とします。これらが不足すると数式の組版が失敗します。
同一外部フォントの二重ロードに関する制限
TeX は同一サイズの .tfm を一度だけロードします。そのため、同じ外部フォントを別の \DeclareFontShape で異なる \fontdimen を設定してロードしようとしても、両方のシェイプグループで同じ設定が共有されてしまいます。回避策としては、同一文字セットを持つ仮想フォントを作成するか、次のように微妙に異なるサイズでロードする方法があります。
1\DeclareFontShape{T1}{ptm}{m}{n}{ <-> ptmr8t }{}
2\DeclareFontShape{T1}{ptm}{c}{n}{ <-> [0.9999] ptmr8t }
3 {\fontdimen2\font=.7\fontdimen2\font}あるいは \spaceskip を直接設定してフォント自体の寸法を上書きすることも可能です。
6.3. フォントファミリとフォントシェイプグループの変更方法
文書固有の非標準フォントシェイプ宣言が必要な場合は、パッケージまたは文書のプリアンブルにこのプライベート宣言を置きます。これにより既存の宣言が上書きされますが、\DeclareFontFamily が .fd ファイルのロードを妨げる点に注意が必要です。また、すでにロード済みのフォントには影響しません。
6.4. 新しいフォントエンコーディング方式の宣言方法
エンコーディングが関係するフォント変更には注意が必要です。たとえば T1 エンコーディングではほとんどのアクセント文字が独自のグリフを持ちますが、従来の TeX テキストエンコーディング OT1 では文字とアクセントを組み合わせて生成します。両者を混在させる場合、たとえば \" のようなコマンドは現在のエンコーディングに応じて振る舞いを変える必要があります。
そのため、各エンコーディングは \DeclareFontEncoding コマンドで正式に LaTeX に導入しなければなりません。このコマンドは次の 3 つの引数を取ります。
- エンコーディング名(
\fontencodingで使用) - エンコーディング切替時に実行するコード
- 数式アルファベットとしてフォントが使用されるときに実行するコード
標準エンコーディングの一覧は 標準エンコーディング方式 の表にあります。
LaTeX3e プロジェクトは次の文字で始まるエンコーディングの使用を予約しています。
T– 256 文字の標準テキストエンコーディングTS–T系エンコーディングを拡張するシンボルX–Tの厳格な要件を満たさないテキストエンコーディングM– 256 文字の標準数式エンコーディングS– その他のシンボルエンコーディングA– 特殊用途OT– 128 文字の標準テキストエンコーディング(古い)OM– 128 文字の標準数式エンコーディング(古い)
O で始まるエンコーディングは「古い」かつ 廃止予定 です。将来的には TeX ユーザーグループが標準化したエンコーディングに置き換わることが想定されています。
独自エンコーディングを定義する場合は、L(ローカル)または E(実験的)で始まる名前を選びます。U は「不明」または「未分類」のエンコーディングで、共通パターンに合わないフォントに使用します。
\DeclareFontEncoding は新エンコーディング名を \LastDeclaredEncoding に保存します。これは同系統のエンコーディング情報を宣言する際に便利です(例: キリル文字のエンコーディング宣言ファイルで使用)。
また、前稿で触れたフォント置換の話と同様に、エンコーディングごとにデフォルトのファミリ・シリーズ・シェイプが異なることがあります。その場合は \DeclareFontSubstitution コマンドでエンコーディングに対するデフォルト値を指定します。指定された 3 つの引数は有効なフォントシェイプでなければならず、存在しないと \begin{document} 時にエラーメッセージが出ます。
6.5. 内部ファイル構成
フォントファミリは次のいずれかのタイミングで宣言されます。
- LaTeX フォーマット生成時
- 文書のプリアンブルで
- フォント変更コマンドが未使用の組み合わせを要求したときにオンデマンドで
最初の方法はフォーマットが毎回メモリを消費しますが、後者は文書のコンパイル時に少し時間が掛かります。多くの場合、後者が推奨されます。
フォーマット生成時、LaTeX は fonttext.ltx を読み込み、標準のフォントファミリ定義やテキストフォントに関する宣言を取得します。
その他のフォントファミリ定義は外部ファイル(パッケージまたは .fd ファイル)に置くべきです。パッケージに入れる場合は \documentclass の直後で明示的にロードします。もう一つの方法は、NFSS が未知のファミリ/エンコーディングの組み合わせを要求されたときに自動的に barfoo.fd という名前のファイルを検索し、そこに以下のような宣言が含まれていると期待します。
1\DeclareFontFamily{BAR}{foo}{...}
2\DeclareFontShape{BAR}{foo}{...}{...}{...}{...}
3...
4\endinputこの仕組みのおかげで、実際に使わない多数のフォントファミリ情報をメモリに保持する必要がなくなります。
.fd ファイルは「1 つのフォントファミリ+1 つのエンコーディング」の全定義を含むべきで、以下が必須です。
- 1 つ以上の
\DeclareFontShape - 正確に 1 つの
\DeclareFontFamily - その他の定義は
\ProvidesFileや\typeout(あるいは\wlog)程度に留めます。
\typeout の代わりに \wlog を使うとメッセージはトランスクリプトファイルにだけ書き込まれます。.fd の空白や空行は無視されるため、画面・トランスクリプトに空白を出したいときは \space を使用します。
新しいエンコーディングは .fd メカニズムでは導入できません。NFSS はフォーマット、パッケージ、またはプリアンブルで明示的に宣言されていないエンコーディングへの切替要求を拒否します。
6.6. 数式で使用する新しいフォントの宣言方法
フォントサイズの指定方法
テキストサイズごとに、NFSS は 数式用の 3 種類のサイズ(textstyle/displaystyle 用の主要サイズ、scriptstyle 用の第 1 級下付き・上付き、scriptscriptstyle 用の第 2 級下付き・上付き)を保持します。新しいテキストサイズに対して対応する数式サイズがまだ知られていない場合、NFSS はテキストサイズの分数として自動計算します。自分で明示的に指定したい場合は \DeclareMathSizes を使用します。この宣言は 4 つの引数を取り、外側のテキストサイズとそれに対応する 3 つの数式サイズを指定します。例:
1\DeclareMathSizes{14}{14}{10}{7}上の例は 14pt(見出しサイズ)の数式サイズをそれぞれ 14pt、10pt、7pt と定義しています。
次の宣言は 36pt のテキストサイズに対して数式サイズが不要であることを示し、余計なフォントのロードを防ぎます。
1\DeclareMathSizes{36}{}{}{}新しいシンボルの追加
以前に紹介した 数式アルファベットコマンド を使って文字に特殊形状を付与する方法と同様に、シンボルフォント と呼ばれる特殊記号フォントを追加し、数式で利用できるようにします。
シンボルフォントの追加手順は新しい数式アルファベット識別子の宣言に似ています。\DeclareSymbolFont ですべての数式バージョンのデフォルトを定義し、\SetSymbolFont で特定バージョンのオーバーライドを行います。
たとえば AMS フォント msbm10(下図参照)を導入する場合、まず次のように NFSS にフォントを認識させます。
1\DeclareFontFamily{U}{msb}{}
2\DeclareFontShape{U}{msb}{m}{n}{ <5> <6> <7> <8> <9> gen * msbm
3 <10> <10.95> <12> <14.4> <17.28> <20.74> <24.88> msbm10}{}これらは通常 .fd ファイルに記述されます。次にシンボルフォントを全数式バージョンに対して宣言します。
1\DeclareSymbolFont{AMSb}{U}{msb}{m}{n}これで U/msb/m/n がシンボルフォント AMSb として利用可能になります。もし太字系列が存在すれば(実際には存在しませんが)次のように設定できます。
1\SetSymbolFont{AMSb}{bold}{U}{msb}{b}{n}シンボルフォントが定義されたら、数式モードで使用できます。たとえば \lessdot コマンドをこのフォントのシンボルに結び付けるには、次のように \DeclareMathSymbol でシンボル名を NFSS に登録します。
1\DeclareMathSymbol{\lessdot}{\mathbin}{AMSb}{"6c}第一引数はコマンド名、第二引数は以下の表で示すシンボル種別(スペース量が決まる)、第三引数は先ほどの \DeclareSymbolFont で定義したシンボルフォント名、第四引数はフォントエンコーディング内での位置(10 進、8 進、16 進いずれか)です。
数字や文字そのものを第一引数に使うこともできます。たとえば eulervm パッケージは次のように書きます。
1\DeclareMathSymbol{0}{\mathalpha}{letters}{"30}シンボルフォントが同じエンコーディング(または U)で揃っていれば、文字位置が一致することが保証されます。
シンボルフォントに含まれる「ブラックボード太字」文字(例: '101 から始まる)は、\DeclareMathAlphabet で数式アルファベットとしても利用できますが、すでにシンボルフォントがロードされている場合は次のようにショートカットで個別シンボルにアクセスできます。
1\DeclareSymbolFontAlphabet{\mathbb}{AMSb}フォントを不要に二重にロードしないことは重要です。TeX では同時にアクティブにできる数式フォントは最大 16 個に制限されており、シンボルフォントは必ずカウントされます。したがって、8 つのシンボルフォントを宣言した場合、各数式バージョンで使用できる数式アルファベットは最大 8 つです。
要点をまとめると、新しいシンボルフォントの導入は \DeclareSymbolFont と \SetSymbolFont の数回の宣言と、必要に応じた多数の \DeclareMathSymbol 宣言 で完了します。したがって、パッケージファイルにまとめて実装するのが最適です。
新しい数式バージョンの導入
標準設定では normal と bold の 2 つの数式バージョンが自動で宣言されます。追加のバージョンを作るには、\DeclareMathVersion を使ってバージョン名を指定します。
1\DeclareMathVersion{myver}この新バージョンでは、既存のシンボルフォントと数式アルファベットが自動的に利用可能で、デフォルトフォントはそれまでに \DeclareMathAlphabet や \DeclareSymbolFont で設定したものが引き継がれます。続いて \SetMathAlphabet や \SetSymbolFont で必要な調整を行います(例は前節参照)。
シンボルフォント設定の変更方法
既存のシンボルフォント設定を変更したい場合も、先ほどと同じコマンドを使用します。標準設定は次のとおりです。
1\DeclareMathVersion{normal} \DeclareMathVersion{bold}
2\DeclareSymbolFont{operators} {OT1}{cmr}{m} {n}
3\DeclareSymbolFont{letters} {OML}{cmm}{m}{it}
4\DeclareSymbolFont{symbols} {OMS}{cmsy}{m}{n}
5\DeclareSymbolFont{largesymbols} {OMX}{cmex}{m}{n}
6
7% ボールド専用フォント
8\SetSymbolFont {operators}{bold}{OT1}{cmr}{bx}{n}
9\SetSymbolFont {letters}{bold}{OML}{cmm}{b}{it}たとえば演算子フォント(\log や \max など)を Computer Modern Sans 系に変更したい場合は次のようにします。
1\SetSymbolFont{operators}{normal}{0T1}{cmss}{m}{n}
2\SetSymbolFont{operators}{bold}{0T1}{cmss}{bx}{n}symbols と largesymbols は特殊な \fontdimen パラメータを必要とするため、特別に準備されたフォントでなければ使用できません。必要ならば \DeclareFontFamily の第 3 引数や \DeclareFontShape の第 6 引数で追加パラメータを設定できます。
6.7. 自作 .fd ファイルの例
PostScript フォントを設定し、必要な .fd ファイルを作成したい場合は、前述の手順に従ってください。fontinst を使ってメトリックファイルを生成すれば、対応する .fd も自動生成されます。手作業で単一ファミリの .fd を書くことも可能です(エンコーディングが分かっていることが前提)。
例として、T1 エンコーディングの Bitstream Charter 用 t1bch.fd を示します。
1\ProvidesFile{t1bch.fd}[2001/06/04 font definitions for T1/bch.]
2% Primary declarations
3\DeclareFontFamily{T1}{bch}{}
4\DeclareFontShape{T1}{bch}{m}{n}{<-> bchr8t}{}
5\DeclareFontShape{T1}{bch}{m}{sc}{<-> bchrc8t}{}
6\DeclareFontShape{T1}{bch}{m}{sl}{<-> bchro8t}{}
7\DeclareFontShape{T1}{bch}{m}{it}{<-> bchri8t}{}
8\DeclareFontShape{T1}{bch}{b}{n}{<-> bchb8t}{}
9\DeclareFontShape{T1}{bch}{b}{sc}{<-> bchbc8t}{}
10\DeclareFontShape{T1}{bch}{b}{sl}{<-> bchbo8t}{}
11\DeclareFontShape{T1}{bch}{b}{it}{<-> bchbi8t}{}
12% Substitutions
13\DeclareFontShape{T1}{bch}{bx}{n}{<->ssub * bch/b/n}{}
14\DeclareFontShape{T1}{bch}{bx}{sc}{<->ssub * bch/b/sc}{}
15\DeclareFontShape{T1}{bch}{bx}{sl}{<->ssub * bch/b/sl}{}
16\DeclareFontShape{T1}{bch}{bx}{it}{<->ssub * bch/b/it}{}
17\endinput1 行目は identification line です。続いて \DeclareFontFamily でファミリとエンコーディング(bch と T1)を宣言します。ここでの引数は .fd ファイル名(エンコーディングは小文字)と一致させる必要があります。その後、シリーズとシェイプの組み合わせごとに .tfm ファイル名をマッピングします。<-> は任意サイズでスケーリング可能であることを示します。最後のブロックは、フォントが無い組み合わせに対する置換定義です。
追加の Charter フォント(Black、BlackItalic)を持っている場合、対応する仮想フォントを用意すればこの .fd に追記できます。
別の例として、Aldus と Palatino を混合した擬似ファミリ zasj を作成する場合は次のようになります。
1\ProvidesFile{t1zasj.fd}
2 [2003/10/12 font definitions for T1 Aldus/Palatino mix.]
3\DeclareFontFamily{T1}{zasj}{}
4% Medium series
5\DeclareFontShape{T1}{zasj}{m}{n} {<->pasr9d}{}
6\DeclareFontShape{T1}{zasj}{m}{sc}{<->pasrc9d}{}
7\DeclareFontShape{T1}{zasj}{m}{it}{<->pasri9d}{}
8\DeclareFontShape{T1}{zasj}{m}{sl}{<->ssub * pasj/m/it}{}
9% Bold series
10\DeclareFontShape{T1}{zasj}{b}{n}{<-> pplb8t}{}
11\DeclareFontShape{T1}{zasj}{b}{sc}{<->pplbc8t}{}
12\DeclareFontShape{T1}{zasj}{b}{sl}{<->pplbo8t}{}
13\DeclareFontShape{T1}{zasj}{b}{it}{<->pplbi8t}{}この擬似ファミリを使用するには、T1 エンコーディングで zasj を選択し、\textbf が bold extended ではなく bold を指すように設定します(この .fd には置換が無いため)。次のような小さなパッケージで自動化できます。
1\ProvidesPackage{fontmix}[2003/10/12 T1 Aldus/Palatino mix.]
2\RequirePackage[T1]{fontenc}
3\renewcommand\rmdefault{zasj} \renewcommand\bfdefault{b}このパッケージをロードすれば、見出しで Aldus と Palatino Bold を組み合わせて利用できます。実用的な例ではありませんが、ランダムな組み合わせの作成方法を示しています。
6.8. 宣言の順序
NFSS はすべての宣言を特定の順序で提供しなければなりません。順序が間違うとエラーになります。守るべき依存関係は次のとおりです。
\DeclareFontFamilyは、事前に\DeclareFontEncodingでエンコーディングが宣言されている必要があります。\DeclareFontShapeは、対象エンコーディングでファミリが\DeclareFontFamilyにより宣言されていることを確認します。\DeclareSymbolFontはエンコーディングが有効であることを確認します。\SetSymbolFontは、対象の数式バージョンが\DeclareMathVersionで宣言され、かつシンボルフォントが\DeclareSymbolFontで宣言されていることを確認します。\DeclareSymbolFontAlphabetは、使用するコマンド名が利用可能であり、シンボルフォントが宣言されていることを確認します。\DeclareMathAlphabetは、コマンド名が利用可能であり、エンコーディングが宣言されていることを確認します。\SetMathAlphabetは、対象のアルファベット識別子が事前に\DeclareMathAlphabetまたは\DeclareSymbolFontAlphabetで宣言され、数式バージョンとエンコーディングが既知であることを確認します。\DeclareMathSymbolは、コマンド名が未使用または既に数式シンボルとして宣言済みであり、シンボルフォントが事前に宣言されていることを確認します。\begin{document}に到達したとき、NFSS は追加チェックを行い、たとえばすべてのエンコーディングに対する置換デフォルトが既知のフォントシェイプグループに指すかどうかを検証します。
これらの規則を守れば、フォント設定は正しく機能し、LaTeX の強力なフォント選択機構をフルに活用できます。