Formats de titres (titlesec)

La police, la numérotation et les espacements autour de \section ou \chapter sont normalement décidés par la classe du document. Le paquet titlesec (Javier Bezos) permet de tout redessiner depuis votre préambule. Ses deux piliers sont \titleformat, qui définit l’apparence du titre, et \titlespacing, qui règle les espaces autour de lui. La structure du document est traitée dans « Structure, titres et table des matières » ; ici, nous examinons seulement l’*aspect* des titres.

Commencer par le réglage rapide

Avant les définitions détaillées, titlesec propose un « réglage simple » qui modifie l’apparence uniquement par des options de paquet. Par exemple, \usepackage[sf,bf]{titlesec} met tous les titres en sans sérif gras. Les options sont réparties en trois groupes, chacun avec une valeur par défaut ; il suffit donc d’indiquer ce que vous voulez changer.

GroupeValeurs possiblesDéfaut
font / shaperm sf tt md bf up it sl sc (famille / graisse / forme)bf
sizebig medium small tiny (taille des titres)big (comme dans les classes standard)
alignraggedleft center raggedright (alignement)(défaut de la classe)

Indépendamment de ces options, compact resserre l’espace au-dessus et au-dessous des titres. Pour changer l’affichage du *numéro*, utilisez \titlelabel : \thetitle représente le numéro du titre, et la valeur par défaut des classes standard est \titlelabel{\thetitle\quad}. Si vous voulez seulement ajouter un point après le numéro, écrivez ceci.

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

Et si vous voulez changer seulement la police, sans toucher au numéro ni aux espacements, la forme étoilée \titleformat* est le chemin le plus court. Donnez la commande de titre puis la police voulue ; la *shape* du titre reste celle de la classe, seul l’aspect change.

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

Définir l’apparence avec \titleformat

La refonte complète se fait avec \titleformat sans étoile. Le nombre d’arguments peut intimider, mais chacun est simple si on les prend séparément. La forme générale est la suivante.

latex
\titleformat{⟨command⟩}[⟨shape⟩]{⟨format⟩}{⟨label⟩}{⟨sep⟩}{⟨before-code⟩}[⟨after-code⟩]
  • ⟨command⟩ — la commande de sectionnement à redessiner : \part, \chapter, \section, \subsection, \subsubsection, \paragraph ou \subparagraph.
  • [⟨shape⟩] (facultatif) — la « forme » du titre : hang, block, display, runin, leftmargin, frame, etc. Par défaut : hang.
  • {⟨format⟩} — mise en forme appliquée à la fois au label et au texte. Police, taille et alignement se règlent ici, par exemple \normalfont\Large\bfseries.
  • {⟨label⟩} — façon d’imprimer le numéro ; on y met \thesection ou similaire. On peut laisser vide pour un niveau non numéroté, mais le numéro disparaît aussi de la table.
  • {⟨sep⟩} — espace entre le label et le texte. Il doit être une longueur et ne peut pas être vide (horizontal avec hang/block, vertical avec display, distance texte-cadre avec frame).
  • {⟨before-code⟩} — code exécuté juste avant le texte du titre. Sa dernière commande peut prendre un argument, qui devient le texte du titre.
  • [⟨after-code⟩] (facultatif) — code exécuté juste après le texte du titre (mode vertical avec hang/block/display, mode horizontal avec runin/leftmargin).

⟨shape⟩ fixe la disposition de base du titre. Voici les formes les plus courantes.

shapeEffet
hangDéfaut : label suspendu, texte aligné à côté (comme un \section standard)
blockCompose tout le titre comme un bloc (paragraphe) ; utile pour les titres centrés et formats spéciaux comme picture
displayPlace le label sur sa propre ligne (paragraphe) au-dessus du texte (comme un \chapter standard)
runinTitre run-in : le texte continue sur la même ligne, sans coupure (comme un \paragraph standard)
leftmarginPlace le titre dans la marge gauche (rightmargin est la version pour la marge droite)
frameComme display, mais le titre est encadré

Définir les espacements avec \titlespacing

Le pendant de l’apparence est \titlespacing, qui règle l’espace autour d’un titre. On utilise généralement la forme étoilée \titlespacing*.

latex
\titlespacing*{⟨command⟩}{⟨left⟩}{⟨before-sep⟩}{⟨after-sep⟩}[⟨right⟩]
  • ⟨left⟩ — quantité ajoutée à la marge gauche (dans les formes leftmargin, c’est la largeur du titre ; dans runin, le retrait juste avant le titre).
  • ⟨before-sep⟩ — espace vertical au-dessus du titre.
  • ⟨after-sep⟩ — séparation entre titre et texte (verticale avec hang/block/display, horizontale avec runin/leftmargin).
  • [⟨right⟩] (facultatif) — augmente la marge droite avec hang/block/display.

Le sens de l’étoile est ici essentiel : \titlespacing* supprime le retrait du paragraphe qui suit le titre. LaTeX suit la convention de ne pas indenter le paragraphe immédiatement après un titre, et l’étoile choisit ce comportement (dans les formes drop, wrap et runin, cette suppression n’a pas de sens, donc l’étoile n’a pas d’effet). Tous les arguments doivent être des longueurs (dimensions) ; une valeur contenant une commande comme \stretch provoque une erreur. Si les valeurs de skip complètes sont pénibles à écrire, on peut abréger avec * et un nombre, comme *4, les unités étant \beforetitleunit et \aftertitleunit.

Un exemple complet

\titleformat et \titlespacing s’écrivent généralement ensemble. Le préambule ci-dessous redessine \section de sorte qu’un filet fin se trouve à gauche, avec le numéro et le titre à droite en sans sérif gras plus grand.

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}

Dans ce \titleformat, [hang] choisit la forme à label suspendu, et {\sffamily\Large\bfseries} s’applique au numéro comme au titre. {\thesection} imprime le numéro (« 1 », « 2 », …), et {1em} est l’espace entre ce numéro et le titre. Le dernier {} est le code avant le texte du titre ; ici il ne fait rien. Le \titlespacing* suivant n’ajoute pas de marge gauche (0pt), met environ 3.5ex au-dessus du titre et 2.3ex entre titre et texte. Les parties plus/minus sont les marges d’étirement et de rétraction qui aident LaTeX à équilibrer la page. Comme la commande est étoilée, le paragraphe juste après \section n’est pas indenté. Pour ajouter un filet, l’usage est de placer \titlerule de titlesec dans {⟨before-code⟩} et de passer à la forme [display].

Par défaut, le texte du titre suit implicitement {⟨before-code⟩} ; mais l’option explicit change ce comportement : il faut alors placer le texte explicitement avec #1 (par exemple \titleformat{\section}{..}{\thesection}{..}{#1.}). C’est utile pour décorer les deux côtés du titre.

Accorder la table avec titletoc et points d’attention

Après avoir restylé les titres, on veut souvent harmoniser la table des matières. Pour cela, titlesec est accompagné du paquet titletoc (utilisable aussi seul). Ses commandes centrales sont \titlecontents, qui définit complètement une entrée de table, et \dottedcontents, un préréglage avec points de conduite. Attention : le premier argument ⟨section⟩ est le nom sans contre-oblique (section, chapter, figure, …).

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

Enfin, deux pièges fréquents. D’abord, \titlespacing ne fonctionne pas avec \chapter ou \part si vous ne modifiez pas aussi leur format via \titleformat (ou le réglage simple). \part a une implémentation non standard, donc les réglages simples ne le touchent pas ; utilisez \titleformat pour le changer. Ensuite, titlesec s’accorde mal avec les classes KOMA-Script (scrartcl et autres). KOMA-Script avertit que l’association n’est pas recommandée, et plusieurs fonctions se cassent, dont l’option headings et les arguments optionnels étendus des commandes de section. Avec KOMA-Script, stylisez les titres avec les mécanismes propres à KOMA (\setkomafont, \RedeclareSectionCommand) plutôt qu’avec titlesec.