見出しの書式(titlesec)

\section\chapter がどんな書体・番号・前後の空きで組まれるかは、本来クラスファイルが決めています。それを本文側から手軽に作り変えるのが **titlesec** パッケージ(Javier Bezos 作)です。要となるのは見出しの体裁を定義する \titleformat と、前後の空きを定義する \titlespacing の二つ。文書の構造そのものは「文書構造・見出し・目次」で扱うので、ここではその見た目だけを掘り下げます。

まずは手軽な設定から

こまかな定義に入る前に、titlesec には パッケージオプションだけで体裁を変えられる 簡易設定が用意されています。\usepackage[sf,bf]{titlesec} のように読み込むと、すべての見出しがサンセリフ+ボールドになります。オプションは三つのグループから選び、各グループに既定値があるので、変えたいものだけ指定すれば十分です。

グループ選べる値既定値
font / shaperm sf tt md bf up it sl sc(書体・太さ・字形)bf
sizebig medium small tiny(見出しの大きさ)big(標準クラスと同じ)
alignraggedleft center raggedright(揃え方)(クラス依存)

これらと独立に、見出しの前後の空きを詰める compact オプションもあります。番号の出し方そのものを変えたいなら **\titlelabel** を使います。\thetitle がその見出しの番号を表し、標準クラスの既定は \titlelabel{\thetitle\quad}。番号のうしろにピリオドを足したいだけなら、次のように書きます。

latex
\usepackage[sf,bf]{titlesec}     % 見出しをサンセリフ+ボールドに
\titlelabel{\thetitle.\quad}     % 「1.」のように番号のあとにピリオド

さらに「番号や空きはそのままで、書体だけ変えたい」場合は、星付きの **\titleformat*** が最短です。第 1 引数に見出し命令、第 2 引数に適用したい書体を渡すだけで、見出しの形(shape)はクラスのまま字面だけが変わります。

latex
\titleformat*{\section}{\large\bfseries\sffamily}     % \section の書体だけ差し替え

\titleformat で体裁を定義する

体裁を本格的に作り変えるのが(星なしの)**\titleformat** です。引数が多いので身構えますが、一つずつ見れば素直です。全体の形はこうです。

latex
\titleformat{⟨command⟩}[⟨shape⟩]{⟨format⟩}{⟨label⟩}{⟨sep⟩}{⟨before-code⟩}[⟨after-code⟩]
  • ⟨command⟩** — 作り変えたい見出し命令そのもの。\part\chapter\section\subsection\subsubsection\paragraph\subparagraph のいずれか。
  • [⟨shape⟩]**(省略可) — 見出しの「形」。後述の hangblockdisplayruninleftmarginframe など。省略時は hang
  • {⟨format⟩} — 番号と本文の 両方** に効く書式。\normalfont\Large\bfseries のように、書体・サイズ・揃えをここでまとめて指定します。
  • {⟨label⟩}** — 番号(ラベル)の出し方。\thesection などを置きます。番号を出さないレベルでは空にできますが、その場合は目次にも番号が出ない点に注意。
  • {⟨sep⟩} — ラベルと本文のあいだの空き。必ず長さを書き、空にはできません**(hang/block では水平方向、display では垂直方向、frame では本文と枠の距離)。
  • {⟨before-code⟩} — 見出し本文の 直前** に実行するコード。最後の命令は引数を一つ取ることができ、それが見出しの文字列になります。
  • [⟨after-code⟩](省略可) — 見出し本文の 直後** に実行するコード(hang/block/display では垂直モード、runin/leftmargin では水平モード)。

⟨shape⟩ は見出しの基本的なレイアウトを決めます。よく使うものを挙げます。

shape効果
hang既定値。番号をぶら下げ、本文をそろえる(標準の \section と同じ)
block番号も本文も一つの段落として組む。中央揃えや picture 等の特殊な体裁向き
display番号を別行(別段落)にして本文の上に置く(標準の \chapter と同じ)
runin見出しのあとに改行せず本文を続ける行内見出し(標準の \paragraph と同じ)
leftmargin見出しを左余白に置く(rightmargin は右余白版)
framedisplay に似るが、見出しを罫線で囲む

\titlespacing で前後の空きを定義する

体裁と対になるのが、見出しの前後の空きを決める **\titlespacing です。ふつうは星付きの \titlespacing*** を使います。

latex
\titlespacing*{⟨command⟩}{⟨left⟩}{⟨before-sep⟩}{⟨after-sep⟩}[⟨right⟩]
  • ⟨left⟩** — 左余白を増やす量(leftmargin 系では見出しの幅、runin では見出し直前の字下げを表します)。
  • ⟨before-sep⟩ — 見出しの 上** の空き。
  • ⟨after-sep⟩** — 見出しと本文のあいだの空き(hang/block/display では垂直、runin/leftmargin では水平)。
  • [⟨right⟩]**(省略可) — hang/block/display で右余白を増やす量。

ここで星の意味が肝心です。**星付きの \titlespacing* は、見出しに続く段落の字下げ(インデント)を抑制します**。LaTeX では見出し直後の段落を字下げしない流儀があり、その挙動を選ぶのが星です(dropwraprunin の形では字下げ抑制が意味を持たないため、星の有無は効きません)。引数はすべて 長さ(寸法) でなければならず、\stretch のように命令を含む値はエラーになります。フルの skip 値を書くのが面倒なら、*4 のように * と数値で略記でき、\beforetitleunit\aftertitleunit がその単位になります。

組み合わせた実例

\titleformat\titlespacing はふつう一組で書きます。次のプリアンブルは、\section を「左に細い罫線を引き、その右に大きめのサンセリフ・ボールドで番号と題を並べる」体裁に作り変える例です。

document.tex
\documentclass{article}
\usepackage{titlesec}

\titleformat{\section}            % 対象は \section
  [hang]                          % 形:番号をぶら下げる
  {\sffamily\Large\bfseries}      % 番号・本文に効く書式
  {\thesection}                   % ラベル(番号)
  {1em}                           % ラベルと本文の間隔
  {}                              % 本文直前のコード(ここでは無し)

\titlespacing*{\section}
  {0pt}                           % 左余白の追加なし
  {3.5ex plus 1ex minus .2ex}     % 見出しの上の空き
  {2.3ex plus .2ex}               % 見出しと本文の間の空き

\begin{document}
\section{はじめに}
本文がここから続きます。
\end{document}

この \titleformat では、[hang] で番号をぶら下げる形を選び、{\sffamily\Large\bfseries} が番号と題の両方に効きます。{\thesection} が「1」「2」といった番号を出し、{1em} がその番号と題のあいだの空き。最後の {} は本文直前のコードで、ここでは何もしていません。続く \titlespacing* は、左余白を増やさず(0pt)、見出しの上に約 3.5ex、見出しと本文のあいだに約 2.3ex の空きを与えます。plus/minus は伸縮の許容量で、ページ全体を均すための「のりしろ」です。星付きなので、\section 直後の段落は字下げされません。罫線を足したいなら、{⟨before-code⟩}titlesec\titlerule を置いて [display] 形にするのが定石です。

なお、{⟨before-code⟩} を本文の前に置くのが標準ですが、**explicit** オプションを付けると挙動が変わり、見出しの文字列を #1明示的に 置かねばなりません(例:\titleformat{\section}{..}{\thesection}{..}{#1.})。題の前後に飾りを付けたいときに使います。

目次をそろえる titletoc と注意点

見出しの体裁を変えたら、目次の見え方もそろえたくなります。そこで titlesec には姉妹パッケージ **titletoc** が付属します(独立して使うこともできます)。中心となるのは目次項目を完全に定義する \titlecontents と、点線リーダー付きの定番を一発で作る \dottedcontents です。引数の先頭 ⟨section⟩バックスラッシュなしの名前sectionchapterfigure など)である点に注意してください。

latex
\usepackage{titletoc}
% 節の目次項目:点線リーダー付き(左寄せ 1.5em、ラベル幅 2.3em、リーダー幅 1pc)
\dottedcontents{section}[1.5em]{}{2.3em}{1pc}

最後に、よく踏む落とし穴を二つ。第一に、**\titlespacing\chapter\part には、同時に \titleformat(または簡易設定)で体裁も変えないかぎり効きません**。\part はもともと非標準な実装のため簡易設定では変わらず、変えるなら \titleformat 側を使います。第二に、**titlesec は KOMA-Script 系クラス(scrartcl など)とは相性が悪い** ことです。KOMA-Script は併用を推奨しない旨の警告を出し、headings オプションや節命令の拡張オプション引数など複数の機能が壊れます。KOMA-Script を使うなら、見出しは titlesec ではなく **KOMA 自身の \setkomafont\RedeclareSectionCommand といった仕組み** で変えてください。