{\bf\it x} と書いても、太字のイタリックにはなりません。イタリックだけになります。順番を入れ替えて {\it\bf x} にすると、今度はイタリックが消えて立体の太字になる——LaTeX の古い 2 文字命令には、こういう 足し算のできない 性質があります。理由は article.cls の 493 行目に一語だけ書いてあって、それを読んだ瞬間に、なぜ現代の \textbf{...} と \bfseries が二重に用意されているのかまで一続きに理解できます。このページでは、書体を変える命令が ファミリ・シリーズ・シェイプという 3 つの独立した軸 の上にどう並んでいるか、引数を取る命令形と範囲で効く宣言形をどう使い分けるか、そして「太字のスモールキャピタルを指定したのに普通の太字が出てくる」ときログに何が書かれているかを、実測値つきで見ていきます。
\textbf{...} と \bfseries の違い
同じ切り替えが 2 通り用意されています。\text… で始まる命令形は引数を取り、その波括弧の中だけに効きます。…family / …series / …shape で終わる宣言形は引数を取らず、その地点から囲んでいるグループや環境の終わりまで効き続けます。 選び方は範囲の長さで決まります。数語なら \textbf{ここだけ}、段落まるごとや環境全体なら {\bfseries …} や \begin{quote}\itshape …\end{quote}。宣言形をグループで囲み忘れると、そこから文書の最後まで効いたままになるので、{ と } の対応だけは必ず確かめてください。パッケージやクラスの内部で宣言形が好まれるのも、何も余計なものを足さず、範囲の管理を呼び出し側に任せられるからです。
% command form: for a short span
This is \textbf{bold} and this is \textit{italic}.
% declaration form: a group limits the scope
Normal here. {\bfseries Bold from here on.} Back to normal.
% declaration applied to a whole environment
\begin{quote}
\itshape The whole quotation is set in italic.
\end{quote}2 つの形には、範囲以外にもうひとつ実質的な違いがあります。命令形はイタリック補正を自動で入れ、宣言形は入れません。 傾いた字は右上へ外形がはみ出すのに、組版上の幅にはその分が含まれていないため、次に立体の字が来ると衝突します。実測すると \textit{f}h は 10.74167pt、{\itshape f}h は 8.62222pt で、2.11945pt の差がまるごと空きの不足です。宣言形を使うなら、傾いた範囲の末尾に \/ を自分で書きます({\itshape f\/}h は 10.74167pt となり、命令形と一致しました)。この補正が何をしているのかは強調のページで詳しく扱っています。
ファミリ・シリーズ・シェイプ — 書体を決める 3 つの軸
LaTeX2e の書体は、互いに独立した 3 つの属性の組み合わせで決まります。ファミリ(family)が字の骨格、シリーズ(series)が太さと幅、シェイプ(shape)が傾きや形です。 ひとつの軸を切り替えても残りの 2 つはそのまま——この直交性が仕組みの核心で、だから「サンセリフのまま太字にする」「太字のままイタリックにする」が素直に書けます。この設計は NFSS(New Font Selection Scheme) として 1989 年に登場し、1993 年に第 2 版が出て、1994 年の LaTeX2e に標準搭載されました。それ以前の LaTeX 2.09 には、書体の属性という考え方そのものがありませんでした。シリーズが「太さ」だけでなく「幅」も含む一本の軸である点は覚えておくと役に立ちます。Computer Modern の太字が bx(bold extended、太くて広い)という 2 文字で表されるのはそのためです。
- ファミリ(family) — ローマン体(セリフあり)
\textrm/\rmfamily、サンセリフ体\textsf/\sffamily、タイプライター体(等幅)\texttt/\ttfamily。 - シリーズ(series) — ミディアム(標準の太さ)
\textmd/\mdseries、ボールド\textbf/\bfseries。属性値は太さと幅を並べた 2 文字までの文字列で、m(medium)、b(bold)、bx(bold extended)、c(condensed)などがあります。 - シェイプ(shape) — アップライト(直立・既定)
\textup/\upshape、イタリック\textit/\itshape、スラント\textsl/\slshape、スモールキャピタル\textsc/\scshape。属性値は順にn、it、sl、scです。 - イタリックとスラントは別物です。
\itshapeは専用に描き起こされた活字(Computer Modern ならcmti10)を呼び、\slshapeは立体を機械的に傾けた活字(cmsl10)を呼びます。イタリックのaは一階建てになるなど、字の形自体が違います。
| キー | 軸と効果 | 命令形(短い範囲) | 宣言形(グループで区切る) |
|---|---|---|---|
roman | ファミリ: ローマン体(セリフあり) | \textrm{...} | {\rmfamily ...} |
sans | ファミリ: サンセリフ体 | \textsf{...} | {\sffamily ...} |
typewriter | ファミリ: タイプライター体(等幅) | \texttt{...} | {\ttfamily ...} |
bold | シリーズ: ボールド(属性値 bx など) | \textbf{...} | {\bfseries ...} |
medium | シリーズ: ミディアム(既定・属性値 m) | \textmd{...} | {\mdseries ...} |
italic | シェイプ: イタリック(属性値 it) | \textit{...} | {\itshape ...} |
slanted | シェイプ: スラント(属性値 sl) | \textsl{...} | {\slshape ...} |
small caps | シェイプ: スモールキャピタル(属性値 sc) | \textsc{...} | {\scshape ...} |
upright | シェイプ: 直立に戻す(属性値 n) | \textup{...} | {\upshape ...} |
reset all | 3 軸すべてを文書の既定へ戻す | \textnormal{...} | {\normalfont ...} |
太字とイタリックを同時にかける
\textbf{\textit{...}} と書けば太字イタリックになります。順番はどちらでもよく、宣言形なら {\bfseries\itshape ...} と並べるだけです。 軸が独立しているので、後から書いたほうが前の指定を消すことはありません。実測で確かめると、\textbf{\textit{Y}} の内側ではシリーズが bx のまま、シェイプだけが it になり、Computer Modern の太字イタリック cmbxti10 が読み込まれます。3 軸を全部使えば \textsf{\textbf{\textit{...}}} でサンセリフの太字イタリックにもなります。ただし「書ける」ことと「フォントが持っている」ことは別問題で、指定した組み合わせの活字が存在しなければ LaTeX は近いものに置き換えます——それが次の節の話です。
% nest the command forms
\textsf{\textbf{\textit{Bold sans-serif italic}}}
% or list the declarations in one group (equivalent)
{\sffamily\bfseries\itshape Bold sans-serif italic\/}
% one word back to the document default inside a sans-serif run
{\sffamily A heading-like line with one \textnormal{normal} word}3 軸をまとめて文書の既定へ戻すのが \textnormal{...}(命令形)と \normalfont(宣言形)です。 サンセリフの見出しの中に標準の書体で一語だけ入れたい、といった場面で使います。ひとつの軸だけ戻したいなら、その軸の既定を指す命令——\rmfamily、\mdseries、\upshape——を呼びます。ついでに知っておくと得なのが、latex.ltx の 11158 行から 11170 行にかけて \DeclareTextFontCommand が並んでいて、ここに挙げた \text… はすべて対応する宣言から機械的に作られている、という事実です。同じ並びには \textulc(大小文字へ戻す)と \textsw(スワッシュ体)も入っていますが、これらの字形を実際に持つフォントはごく限られます。
\bf や \it が組み合わない理由
\bf の定義に \normalfont が入っているからです。 article.cls の 490 行目から 496 行目には、古い 2 文字命令がこう並んでいます——\DeclareOldFontCommand{\bf}{\normalfont\bfseries}{\mathbf}、\DeclareOldFontCommand{\it}{\normalfont\itshape}{\mathit}、以下 \rm・\sf・\tt・\sl・\sc も同じ形です。つまり \bf は「太字にする」命令ではなく 「3 軸すべてを既定に戻してから太字にする」 命令です。{\bf\it x} を組むと、\it の中の \normalfont が直前の \bfseries を丸ごと捨ててしまう。実測でもシリーズが bx から m に戻り、シェイプだけ it が残りました。逆順の {\it\bf x} ではシェイプが n に戻り、シリーズだけ bx が残ります。新旧を混ぜた \textbf{\tt x} も同じで、ファミリは cmtt になるもののシリーズは m に戻り、\textbf が黙って無効化されます。
% the old two-letter commands do not stack
{\bf\it x} % italic only -- the bold is thrown away
{\it\bf x} % upright bold -- the italic is thrown away
\textbf{\tt x} % typewriter, medium weight -- \textbf silently lost
% the modern commands do stack
{\bfseries\itshape x}
\textbf{\ttfamily x}この非直交性は欠陥ではなく、LaTeX 2.09(1994 年より前)の書体モデルをそのまま保存したものです。当時は「いま選ばれている書体」が属性の組ではなく単一の名前だったので、切り替えとは常に丸ごとの置き換えでした。LaTeX2e は 1994 年に軸ごとに積み重ねられる現在の命令を導入し、古い命令は 既存文書を壊さないための互換層 として \DeclareOldFontCommand 経由で残されました。実際、いまでもエラーなく動きます。動くけれども組み合わさらない——これが厄介なところで、{\bf\it 重要} と書いた人は太字イタリックのつもりで、PDF を見るまで気づきません。なお \DeclareOldFontCommand の第 3 引数は数式モードでの意味で、\bf は数式中では \mathbf として振る舞います。本文と数式で意味が変わる点も、これらを避ける理由のひとつです。新しく書くコードでは必ず \textbf / \bfseries 系を使ってください。
Font shape ... undefined が出たとき
それは綴りの誤りではなく、「その組み合わせの活字がフォントに存在しない」という報告です。 典型は太字のスモールキャピタルで、既定の OT1 エンコーディングの Computer Modern には bx と sc を兼ねた活字がありません。\textsc{\textbf{...}} を組むと、下のログのように Font shape の行と using ... instead の行が対で出ます。LaTeX はエラーで止まらず、スモールキャピタルを捨てて普通の太字で組み続けます。だから PDF を見て初めて「指定したはずのスモールキャピタルが出ていない」と気づくことになります。同じ理由で \textsw{...} も OT1/cmr/m/sw が undefined だという警告を出します。
LaTeX Font Warning: Font shape `OT1/cmr/bx/sc' undefined
(Font) using `OT1/cmr/bx/n' instead on input line 8.
LaTeX Font Warning: Some font shapes were not available, defaults substituted.この特定の警告には、ほぼ一行で済む解決策があります。\usepackage[T1]{fontenc} を足してください。 T1 エンコーディング用の Computer Modern(EC フォント)は太字スモールキャピタルを持っているので、同じ \textsc{\textbf{...}} が警告なしで通ります。実際に [T1]{fontenc} を読み込んで組み直すと、ログからフォント警告が消えました。T1 は欧文のアクセント付き文字やハイフネーションの扱いも改善するので、欧文文書ではいずれ入れることになる指定です。警告が別の組み合わせを指しているときは、まずログの OT1/cmr/bx/sc のような 4 つ組(エンコーディング/ファミリ/シリーズ/シェイプ)を読んで、どの軸が足りていないのかを特定します。そのうえで、フォントを持っているものに替えるか、要求を一段簡単にするか、代替を受け入れると決めて、決めたことをメモに残しておきます。
% OT1 Computer Modern has no bold small caps -> warning + silent fallback
% T1 (the EC fonts) does have it
\usepackage[T1]{fontenc}
\textsc{\textbf{Bold Small Capitals}}
% low-level NFSS: name the four attributes, then commit with \selectfont
{\fontfamily{cmr}\fontseries{bx}\fontshape{sc}\selectfont Explicit}最後の 2 行が示すとおり、\textbf のような高水準命令は内部で NFSS の低水準命令 に展開されます。\fontfamily{...}・\fontseries{...}・\fontshape{...} が属性を書き換え、\selectfont がその時点の 4 属性でフォントを実際に選びます。属性を設定しただけでは何も起きず、\selectfont を呼ぶまで書体は変わりません。ふだんこの層を直接触る必要はありませんが、特定の活字を名指しで呼びたいとき、あるいは警告の 4 つ組が何を指しているのかを確かめたいときには役に立ちます。エンコーディングの意味や、実際のフォントファイルを読み込む方法は、フォントの仕組みのページに譲ります。
和文の書体切り替え — 明朝体とゴシック体
pLaTeX / upLaTeX では和文が欧文とは別の軸を持ち、ファミリは明朝体 \textmc / \mcfamily とゴシック体 \textgt / \gtfamily の 2 つです。 定義は plcore.ltx の 1471 行目からで、\kanjifamily という和文専用の属性を切り替えます。おもしろいのは \bfseries を和文にかけたときの挙動です。実測すると、和文のファミリは mc(明朝)のままでシリーズだけが bx になります。そして jy1mc.fd の 25 行目に \DeclareFontShape{JY1}{mc}{bx}{n}{<->ssub*gt/m/n}{} と書かれていて、「明朝の太字」を要求するとゴシックの標準ウェイトが代わりに使われる、と定義されています。つまり「太字にしたらゴシックになった」のは偶然でも代用でもなく、フォント定義ファイルにそう明記された正式な置換です。和文の強調が伝統的に「書体の切り替え」で行われてきた事情が、そのまま実装に反映されています。
原稿での運用ルール
本文に直接書く書体命令は、意味を持つものだけに絞ってください。 卒論や技術文書では、書体命令を「見た目をちょっと直す道具」として散らすほど、あとから直しにくくなります。見出しを太くしたい、キャプションを小さくしたい、定義語を一貫してサンセリフにしたい——こうした規則は、本文中で毎回 \textbf を打つのではなく、クラス、パッケージ、あるいは自作の意味マクロに寄せます。\newcommand{\term}[1]{\textsf{#1}} のように一段挟んでおけば、方針が変わったときに直すのは 1 行です。逆に、UI のボタン名やキー名のように「その見た目でなければ意味が伝わらない」ものは、本文中で \textsf や \texttt を直接使って構いません。判断の基準は「見た目が目的か、意味の代理か」です。
- 強調は
\emphに任せる。 見た目の指定を本文に埋め込むと、あとから強調の見え方を変えられなくなります。 - 長い範囲は宣言形で。 引用全体や欄外注全体なら環境の先頭で
\itshapeを宣言し、環境の終わりでグループごと閉じます。 - 組み合わせは最小例で試す。
\textsf{\textbf{...}}や\textsc{...}を短いファイルで一度組み、ログにフォント警告が出ないことを確かめてから本文に散らします。 - 代替された書体を放置しない。 警告を無視すると、章ごとに同じ指定が違って見えることがあります。フォントを替えるか、要求を簡単にします。
- 古い 2 文字命令を混ぜない。 共同執筆で
\bfや\itを見つけたら、\bfseries/\itshapeまたは\textbf/\textitへ置き換えます。動いているように見えても組み合わせは効いていません。