\textbf や \sffamily で書体を切り替えると、その下では何が起きているのか——このページは、書体命令の 裏側にある仕組み を扱います。LaTeX は一つのフォントを 5 つの独立した属性 で指定し(NFSS)、入力した文字を実際の字形に対応づける エンコーディング で組版します。命令の一覧は別ページに譲り、ここでは \selectfont で確定する低水準の選択法と、OT1 / T1 / TU といったエンコーディングの違い、そして pdfLaTeX でなぜ \usepackage[T1]{fontenc} を書くのかを掘り下げます。
NFSS — フォントは 5 つの属性で決まる
LaTeX2e のフォント選択は NFSS(New Font Selection Scheme、新フォント選択方式) という仕組みに支えられています。その中核にあるのが、どんなテキストフォントも 5 つの属性で完全に決まる という考え方です。fntguide(LaTeX2e のフォント選択ガイド)はこの 5 属性を次のように定めています——エンコーディング(encoding)、ファミリ(family)、シリーズ(series)、シェイプ(shape)、サイズ(size)。
- エンコーディング — フォント内で文字が並ぶ順序(入力文字と字形スロットの対応)。本文用では
OT1(TeX text)とT1(TeX extended text、いわゆる Cork)が代表的。次節で詳述します。 - ファミリ — 字の骨格をなすフォントの集まり。コードは Computer Modern Roman が
cmr、同 Sans がcmss、同 Typewriter がcmtt。商用フォントなら Times がptm、Helvetica がphv、Courier がpcr。 - シリーズ — 太さ(weight)と幅(width)を合わせた軸。
m(ミディアム=標準)、b(ボールド)、bx(ボールドエクステンデッド=太字広幅)、c(コンデンス=細幅)、sb(セミボールド)など。 - シェイプ — 字の形。
n(直立・ローマン)、it(イタリック)、sl(スラント=斜体)、sc(スモールキャップス)。まれにui(疑似的に立てた直立イタリック)も。 - サイズ — デザインサイズ。
10ptのような寸法で、単位を省くとptとみなされます。
要点は、シリーズが 太さと幅をひとつにまとめた軸 だということです。標準の表記では太さが ul〜ub(ウルトラライト〜ウルトラボールド)、幅が uc〜ux(ウルトラコンデンス〜ウルトラエクスパンデッド)。両者を連結して 1 つの値にし、ただし m は——太さも幅も m のときに 1 文字だけ残すのを除いて——省きます。だから「ボールド・標準幅」は b、「ボールド・広幅」は bx、「標準の太さ・細幅」は c になります。
この 5 つを並べた **エンコーディング/ファミリ/シリーズ/シェイプ/サイズ** という表記が、LaTeX 内部でのフォントの正式名です。たとえば OT1/cmr/m/n/10 は「OT1 エンコーディングの Computer Modern Roman、標準の太さ・直立、10 ポイント」。オーバーフルボックスの警告に \OT1/cmr/m/n/10 のような形で現れるのは、まさにこの 5 属性です。普段あなたが使う \textbf などの高水準命令は、この 5 属性のいずれかを書き換える操作にすぎません。
低水準セレクタと \selectfont
高水準命令の下には、属性を 1 つずつ指定する 低水準セレクタ があります。\fontencoding{T1}、\fontfamily{ptm}、\fontseries{b}、\fontshape{it}、\fontsize{12}{14}。ただし重要な決まりがあります——**これらは設定するだけでは効かず、\selectfont を呼んで初めて反映** されます。fntguide はこう警告します。「フォントパラメータを設定したら、後続のテキストの前に、ただちに \selectfont を置かなければならない」。
% 正しい:設定 → \selectfont → テキスト / Correct: set, then \selectfont, then text
\fontfamily{ptm}\fontseries{b}\selectfont Some text.
% 誤り:設定とテキストの間に文字を挟んではいけない / Wrong: no text between a setting and \selectfont
\fontfamily{ptm} Some \fontseries{b}\selectfont text.5 属性をまとめて指定する近道が **\usefont{エンコーディング}{ファミリ}{シリーズ}{シェイプ}** です。これは対応する \font... 命令の並びに \selectfont を付けたものと等価で、サイズは現在値が引き継がれます。特定のフォントを名指しで一度だけ呼びたいときに便利です。なお \fontencoding を変えたときも、確定にはやはり \selectfont が要ります。
これらの属性を 直接書く必要はめったにありません。\textbf は内部で \fontseries を、\sffamily は \fontfamily を呼んでいるからです。命令一覧と命令形・宣言形の使い分けは「書体を変える命令」のページにまとめてあります。低水準を触るのは、特定のフォントを名指しするときや、新しいフォントをクラス・パッケージに組み込むときに限られます。
既定値マクロ — \rmdefault と仲間たち
\textrm や \rmfamily が どのファミリを選ぶか は、ハードコードされておらず、マクロ に保持されています。\rmdefault(ローマン)、\sfdefault(サンセリフ)、\ttdefault(タイプライター)の 3 つで、article クラスでの既定値はそれぞれ cmr・cmss・cmtt。だから本文フォントを Times・Helvetica・Courier に替えたいデザイナーは、命令を書き換えずにこのマクロを差し替えます。
% 文書全体の3ファミリを差し替える / Re-point the three families for the whole document
\renewcommand{\rmdefault}{ptm} % roman → Times
\renewcommand{\sfdefault}{phv} % sans → Helvetica
\renewcommand{\ttdefault}{pcr} % mono → Courier本文フォントそのものは **\encodingdefault / \familydefault / \seriesdefault / \shapedefault** の 4 つで決まり、既定では OT1・\rmdefault・m・n。\familydefault が \rmdefault を指すので、\rmdefault を変えれば本文フォントが変わります。太字の太さは \bfdefault(既定 bx)が持っていて、PostScript フォントなど太字に bx を持たないフォントを使うときは、これを b に下げる必要が生じます。
フォントエンコーディング — 入力から字形へ
フォントエンコーディング とは、フォント内で字形が並ぶ順序、すなわち 入力された文字をフォントのどのスロット(字形)に対応づけるか の取り決めです。5 属性の最初の 1 つでありながら、\textbf のような 作者向け命令が用意されていない 唯一の属性でもあります。fntguide が言うとおり、エンコーディングの切り替えは fontenc のような パッケージが提供 するものだからです。
本文で押さえるべきは次の通り。**OT1 は Knuth による オリジナルの 7 ビット TeX text エンコーディング**(既定)。文字が 128 個しか入らないため、é や ñ のようなアクセント付き文字は 基底文字とアクセント記号の合成(\accent)で作られます。この合成が曲者で、アクセント付きの語はハイフネーションされず、PDF からのコピー&ペーストも崩れます。**T1(TeX extended text、1990 年の TUG Cork 会議に由来し Cork エンコーディング とも呼ばれる)は 8 ビット 256 字形で、アクセント付き文字を 独立した 1 つの字形 として持ちます。これにより西欧・一部東欧の言語が 正しくハイフネーションされ**、コピペも正常になります。
TU(TeX Unicode)は、システムにインストールされた OpenType フォントを Unicode のコードポイントで直接使うためのエンコーディングで、XeLaTeX と LuaLaTeX の既定**です。fontspec がこれを自動で設定するため、Unicode エンジンでは TU を明示的に書く場面はほとんどありません。このほか用途別に、**T2A(キリル文字)、LGR(ギリシャ文字。現在ギリシャ語で主に使われるエンコーディング)、TS1(Text Companion**。著作権記号や通貨記号など、本文中で使う記号の字形を集めた符号で textcomp が扱う)があります。数式用には OML(数式イタリック)、OMS(数式記号)、OMX(大型数式記号)が割り当てられています。
| エンコーディング | 内容 | ビット幅・備考 |
|---|---|---|
OT1 | Knuth のオリジナル TeX text(既定) | 7 ビット。アクセントは合成 → ハイフネーション不可 |
T1 | TeX extended text(Cork)。西欧言語 | 8 ビット 256 字形。アクセントは単一字形 → ハイフネーション可 |
TU | TeX Unicode。OpenType フォントを直接 | Xe/LuaLaTeX の既定。fontspec が設定 |
T2A | キリル文字 | 8 ビット(T2B / T2C も) |
LGR | ギリシャ文字 | 現在ギリシャ語で主流の 256 字形 |
TS1 | Text Companion(記号類) | 著作権・通貨記号など。textcomp が扱う |
入力エンコーディングとフォントエンコーディング
混同しやすい 2 つを切り分けておきます。入力エンコーディング は、ソースの .tex ファイルの バイト列をどんな文字として読むか(UTF-8 など)の取り決めで、歴史的には inputenc パッケージが担当しました。フォントエンコーディング は、その読み取った文字を 出力フォントのどの字形に流し込むか の取り決めで、fontenc が担当します。入口(inputenc)と出口(fontenc) の関係です。
現代の pdfLaTeX では、ソースの文字コードは UTF-8 が既定 になったため、inputenc を明示的に読み込む必要はほぼなくなりました。一方フォントエンコーディングは依然として指定する価値があります。fontenc は pdfLaTeX 向け のパッケージで、XeLaTeX・LuaLaTeX を使う場合は代わりに fontspec を使います(Unicode エンジンでは TU が既定なのでこの問題自体が起きにくい)。
pdfLaTeX では T1 を読み込む
pdfLaTeX で文書を組むなら、プリアンブルに **\usepackage[T1]{fontenc}** を書くのが定石です。これは文書のフォントエンコーディングを T1 に切り替え、OT1 既定の弊害——アクセント付きの語がハイフネーションされない、PDF からコピペすると崩れる——を一掃します。fontenc のドキュメントも、これによりフランス語・ドイツ語・イタリア語・ポーランド語など広範な西欧言語が扱え、「アクセント付きの語があっても LaTeX がハイフネーションし、出力をコピー&ペーストできる」と述べています。
なお fontenc のオプションに複数のエンコーディングを並べると、最後に挙げたものが既定 になります(\encodingdefault がそれに設定される)。たとえばギリシャ語を交える文書なら \usepackage[LGR,T1]{fontenc} のように書き、本文の既定は T1 のまま、必要に応じて LGR へ切り替えます。
\documentclass{article}
\usepackage[T1]{fontenc} % フォントエンコーディングを T1 に / font encoding -> T1
% pdfLaTeX では入力は UTF-8 が既定(inputenc は通常不要)
% Input is UTF-8 by default on pdfLaTeX (inputenc usually unneeded)
\begin{document}
% T1 ならアクセント付きの語も正しくハイフネーションされる
% With T1, accented words hyphenate correctly
Na\"ive r\"esum\"e, \"uberfl\"ussig, Stra\ss{}e.
\end{document}低水準セレクタの実例
最後に、低水準セレクタと \usefont の使い方を一つの文書で確かめます。\usefont は 5 属性のうち 4 つ(エンコーディング・ファミリ・シリーズ・シェイプ)を一度に与えてその場で確定し、\fontfamily+\selectfont は属性を個別に設定して確定します。いずれもグループ { } で囲めば、効果はその範囲に限定されます。
\documentclass{article}
\usepackage[T1]{fontenc}
\begin{document}
% \usefont で 4 属性を一括指定 / \usefont sets four attributes at once
{\usefont{T1}{ptm}{b}{it} Bold italic Times}
% 低水準セレクタを個別に設定し \selectfont で確定
% Set selectors individually, then commit with \selectfont
{\fontfamily{phv}\fontseries{b}\selectfont Bold Helvetica}
% サイズだけ変える(baselineskip は現在値を流用)
% Change only the size (reuse the current baselineskip)
{\fontsize{14}{\f@baselineskip}\selectfont Fourteen point}
\end{document}ここで {\usefont{T1}{ptm}{b}{it} ...} は「T1 エンコーディングの Times、ボールド・イタリック」を選びます。グループを抜ければ元のフォントに戻ります。\fontsize の第 2 引数に内部マクロ \f@baselineskip を渡しているのは、行送りを変えずに文字サイズだけ変えるためのイディオムです(内部マクロを直接書き換えてはいけませんが、読み出して渡すのは差し支えありません)。