5. 低レベルインターフェイス
高レベルのフォントコマンド(文書中での使用を想定)とは対照的に、低レベルのコマンドは主にパッケージや文書プリアンブルで新しいコマンドを定義するために使われます。このようなコマンドを有効に活用するには、LaTeX のフォント選択スキーム(NFSS)の内部構造を理解しておくと便利です。
一方で、LaTeX のフォント選択スキームの目的は、汎用的なマークアップの原則に従ったアルゴリズムで合理的にフォントを選択できるようにすることです。そのためできるだけ多くのフォント属性を独立に変更できることが望まれます。もう一方で、実際のフォントファミリは想定できる属性の組み合わせのごく一部しか持っていません。したがって、属性をあまりにも多く独立に変更できるようにすると、実際の外部フォントが存在しない組み合わせが多数生じ、デフォルトフォントに置き換えられることになります。
内部的には、LaTeX は次の 5 つの独立したフォント属性を管理しています:現在のエンコーディング、現在のファミリ、現在のシリーズ、現在のシェイプ、現在のサイズ。エンコーディング属性は、NFSS バージョン 2 で導入され、他のフォント属性とは独立に文字エンコーディングを管理しなければ多言語対応が不可能になることが判明したためです。
これらの属性の値が現在使用中のフォントを決定します。LaTeX はさらに、属性の組み合わせを外部フォント(.tfm ファイル)に結び付けるための大規模なテーブルも保持しています。フォント選択は次の 2 段階で行われます。
低レベルコマンド
\fontencoding、\fontfamily、\fontseries、\fontshape、\fontsizeを使って、いくつかのフォント属性を変更します。変更後の属性設定に対応するフォントを
\selectfontコマンドで選択します。
2 段階目は複数の処理から構成されます。まず、目的の属性設定に対応するフォントがシステムに既に登録されているか(すなわち .tfm ファイルがロード済みか)を確認し、もしあればそのフォントを選択します。登録されていなければ、内部テーブルを検索して該当する外部フォント名を探します。フォント名が見つかればその .tfm ファイルをメモリに読み込み、フォントを選択します。フォント名が見つからなければ、後述する代替フォント探索が行われます。
5.1. 個々のフォント属性の設定
各フォント属性に対応するコマンドがあり、現在の値を変更できます。これらのコマンドはほぼ任意の文字列を引数に取りますが、意味のある値は限られています。これらの値は NFSS にハードコードされているわけではなく、内部テーブルに設定された慣例です。以下の節では標準 LaTeX の設定で使われている命名規則を紹介しますが、内部テーブルに新しいフォント宣言を追加すれば誰でも設定を変更できます。新しいフォントを LaTeX で利用する際は、できるだけこの慣例に従うことが推奨されます。なぜなら、一貫した命名規則がなければ、汎用的にマークアップされた文書で適切なフォントが選択できなくなるからです。
このインターフェイスだけで特定のフォント(例:Computer Modern Dunhill の太字・コンデンス・イタリック 14pt)を選択したい場合、属性の組み合わせに対応する外部フォントが存在しないことがあります。例えば次のように書くことができます。
1\fontencoding{OT1}\fontfamily{cmdh}\fontseries{bc}\fontshape{it}%
2\fontsize{14}{16pt}\selectfont上記は命名規則上は正しいコードですが、この属性の組み合わせに該当する実際のフォントが存在しないため、LaTeX は別のフォントに置き換える必要があります。置換機構は、目的と大きく異なるフォントを選択することもあるため、フォントテーブルを確認して目的の組み合わせが利用可能かどうかを確かめるべきです。詳細は フォント置換プロセス を参照してください。
フォントファミリの選択
フォントファミリはコマンド \fontfamily で選択します。引数には内部テーブルで宣言されたファミリを指す文字列を渡します。文字列はテーブル作成時に決められ、通常は短い文字列です(例:Computer Modern Roman ファミリは cmr)。ファミリ名は 5 文字以内に抑えるべきです。なぜなら、ファイル名は最大 8 文字に制限されているシステムもあり、ファミリ名にさらに最大 3 文字が付加されてファイル名が形成されるためです。
フォントシリーズの選択
\fontseries コマンドはシリーズ属性を変更します。シリーズはウェイトと幅を組み合わせた形で表され、幅だけをウェイトから独立に変更することはできません。これは、実際に幅だけを変更する必要がほとんどないという前提に基づいています。デザイナーが仕様でウェイトと幅を同時に変更することは一般的です。シリーズ名はウェイトと幅の略称を組み合わせて作られ、各組み合わせは唯一になります。以下の表に命名規則を示します。ウェイト・幅ともに「中」(m)の場合は省略され、両方が中のときだけ単一の m が使用されます。たとえば、太字拡張は bx、中間拡張は x、太字中間は b と表記されます。

フォントシェイプの選択
\fontshape コマンドはシェイプ属性を変更します。標準シェイプは 1 文字または 2 文字の略称で表され、以下の表にまとめられています。

フォントサイズの選択
\fontsize{<size>}{<skip>} コマンドはフォントサイズを変更します。2 つの引数はそれぞれ サイズ と ベースラインスキップ(行間)です。サイズはポイント単位で指定するのが慣例であり、単位は省略できます。第 2 引数も同様です。ただし、ベースラインスキップを伸縮長(rubber length)で指定したい場合は単位を付ける必要があります。たとえば次のように書くことができます。
1\fontsize{14.4}{17}\selectfontこの要求が妥当でも、対応する外部フォントが存在しないことがあります。その場合、内部テーブルがサイズ補正を許可していれば近似サイズが選択され、そうでなければエラーが報告されます。
任意のサイズのフォントを使う場合は、次のように好きなサイズを指定できます。
1\fontsize{1in}{1.2in}\selectfont A text in an arbitrary font sizeエンコーディングの選択
\fontencoding コマンドはエンコーディングを変更します。引数は目的のエンコーディングの内部名です。この名前は LaTeX に認識されている必要があります(カーネルがロードする既定エンコーディング、または \DeclareFontEncoding で宣言されたもの)。詳しくは
フォントエンコーディングの宣言 を参照してください。標準エンコーディング名の一覧は以下の表に示します。

NFSS は「テキスト用のほとんどすべてのフォントが同じエンコーディングで利用可能である」ことを前提としています。つまり、エンコーディングの変更は別言語に切り替えるときだけ必要になるはずです。このような場合、babel パッケージなどの言語サポートパッケージが自動的にエンコーディングを処理します。
以下の例では、Cyrillic 用の環境 Cyr を手動で定義してエンコーディングを切り替えています。この環境ではフォントエンコーディングと入力エンコーディングの両方がローカルに変更されます。実際の言語サポートにはハイフネーション規則の変更など追加の作業が必要です。エンコーディングは fontenc パッケージでロードします。T2A は標準 Cyrillic エンコーディングの一つ、T1 は最後にロードされたためデフォルトになります。


残念ながら、T1 は多くの PostScript フォントで完全には実装できません。次の例の 5 文字はインクの塊として表示され、フォントに該当文字が欠けていることを示します。千分率や万分率の記号はパーセント記号に 0 を 1〜2 個付け加えて合成されており、欠けているのは後者の小さな零だけです。
1\usepackage[T1]{fontenc}
2-----------------------------------------
3\fontfamily{cmr}\selectfont
4\j{} \ng{} \NG{} \textperthousand{}\textpertenthousand \par
5\fontfamily{ptm}\selectfont
6\j{} \ng{} \NG{} \textperthousand{}\textpertenthousand{}
5.2. 複数のフォント属性を同時に設定する
ページスタイルやレイアウト指向のコマンドを設計する際、すべての属性に対して値を指定して特定のフォントを選択したいことがあります。そのために LaTeX は \usefont コマンドを提供しています。\\usefont は 4 つの引数(エンコーディング、ファミリ、シリーズ、シェイプ)を取り、属性を更新したうえで \selectfont を呼び出します。サイズとベースラインスキップも指定したい場合は、\\usefont の前に \fontsize コマンドを置きます。例として
1\fontsize{14}{16pt}\usefont{OT1}{cmdh}{bc}{it}は次のコマンド列と同じ結果を生みます。
1\fontencoding{OT1}\fontfamily{cmdh}\fontseries{bc}\fontshape{it}%
2\fontsize{14}{16pt}\selectfontLaTeX には \DeclareFixedFont 宣言もあり、完全に固定されたフォントに切り替える新しいコマンドを定義できます。固定フォントは内部テーブル参照がないため非常に高速で、フォントを頻繁に切り替えるようなコマンド定義に有用です。例として、スクリプトサイズのテキスト用コマンドを次のように定義できます。
1\DeclareFixedFont\ScriptSizeFont{\encodingdefault}{\familydefault}
2 {\seriesdefault}{\shapedefault}{7pt}
3\newcommand\theScript[1]{{\ScriptSizeFont #1}}\DeclareFixedFont は 6 つの引数を取ります。定義したいコマンド名に続き、NFSS の 5 つのフォント属性が並びます。サイズ以外はドキュメント全体のフォント設定を参照するビルトインフックが使用されます。したがって上記例の \ScriptSizeFont は文書全体のレイアウトに依存しますが、一度定義されるとその意味は凍結され、以後デフォルトが変更されてもこのフォントは変わりません。
5.3. フォントの自動置換
フォント変更要求が LaTeX に認識されない組み合わせだった場合、類似した属性を持つフォントで代替しようとします。具体的には次の手順で処理が進みます。まず、エンコーディング・ファミリ・シリーズ・シェイプの組み合わせが未宣言であれば、まずシェイプをデフォルトに戻して既知の組み合わせを探します。まだ見つからなければシリーズをデフォルトに、最後の手段としてファミリをデフォルトに戻します。最終的にサイズに対する内部テーブルエントリを検索します。たとえば \ttfamily\bfseries\itshape(太字かつイタリックのタイプライタフォント)を要求すると、実際には中間シリーズ・立体シェイプのタイプライタフォントが得られます。これは LaTeX がまずシェイプをリセットし、次にシリーズをリセットするためです。イタリック形のタイプライタフォントが欲しい場合は、
新しいフォントの設定方法 記事で説明されている sub 関数を使って希望を明示します。
置換プロセスはエンコーディングスキームは決して変更しません。エンコーディングを変えると、出力文字が誤った文字になる恐れがあるからです。エンコーディングは入力文字の解釈方法を定義し、他の属性は出力の見た目を決定します。したがって、たとえば契約書でポンド記号がドル記号に置き換えられるようなことは許容できません。
このため、すべてのエンコーディングスキームはデフォルトのファミリ、シリーズ、シェイプを持ち、エンコーディング+それらデフォルトの組み合わせが LaTeX 内で定義されている必要があります。
5.4. 文書中で低レベルコマンドを使用する方法
前節で紹介した低レベルコマンドは、主に高レベルコマンド(\textsf など)の定義内、すなわち文書クラスやパッケージ、あるいはプリアンブルで使用することを想定しています。
高レベルコマンドを使用できるのであれば、文書中で低レベルコマンドを直接使うのは避けた方がよいでしょう。低レベルコマンドは特定のフォントへ正確に切り替える指示であり、高レベルコマンドはパッケージや宣言で柔軟にカスタマイズできます。たとえば \fontfamily{cmss}\selectfont で Computer Modern Sans を選択した状態で、後から PSNFSS バンドル(例:Times)に切り替えた場合、\fontfamily が明示的に書かれた箇所は変更されません。これが低レベルコマンドの使用を控えるべき理由です。