Thèse d’histoire en LaTeX : quelques trucs et astuces

 x0r   0
latex histoire tex thèse

Dans mon précédent billet sur la thèse de Nausicaa préparée en LaTeX, je vous avais promis de partager quelques « astuces [de LaTeX] que j’ai découvertes au fil de l’eau ». Ce billet vise donc à tenir cette promesse.

Ce que je présente ici sont quelques personnalisations, surtout de forme, qui étaient à la fois non-triviales (c’est-à-dire qu’il n’existait pas de commandes dans la documentclass memoir pour le faire facilement) et indispensables pour que la thèse puisse être acceptée et soutenue. C’est en outre le fruit de la lecture de moult références, sur TeX, LaTeX et BibLaTeX notamment.

Je vous propose donc quelques « recettes » de LaTeX, commentées comme il se doit pour ne pas me contenter d’être une compilation de bouts de code à copier-coller dans un projet LaTeX et illustrer comment on peut construire des fonctionnalités avancées. C’est pourquoi notre progression se fera dans un ordre croissant de difficulté.

Préliminaires

Les extraits de code que je présente partent du principe que :

  • votre document utilise la documentclass memoir (et non pas book) ;
  • et votre fichier .tex principal inclut, dans son préambule, un fichier .sty contenant toutes vos commandes de personnalisation (de forme) à l’aide d’un \usepackage.

Comme je l’avais déjà expliqué dans mon précédent billet, memoir est strictement supérieur à book car le premier propose davantage de possibilités de personnalisation que le second. Le mode d’emploi de memoir est par ailleurs très bien fait et je recommande fortement au moins de le survoler.

Citations au format ISO 690

L’université de la Sorbonne exige que les références bibliographiques soient au format NF Z 44-005. Il s’agit d’une norme, annulée depuis, et remplacée par la norme ISO 690.

BibLaTeX embarque un style ISO 690, mais à l’époque où Nausicaa finissait sa thèse, ce module avait deux problèmes.

Tout d’abord, il manquait encore les traductions françaises pour les petits bouts de texte comme « supervisé par » ou « sous la direction de ». Du moins, ce n’était pas le cas dans la version 0.3.1 que nous utilisions à ce moment-là. Heureusement, ces traductions ont été introduites depuis et devraient être disponibles d’emblée à partir de la version 0.4.0.

Enfin, Nausicaa voulait aussi que les titres des articles apparaissent entre guillements. Pour cela, le seul correctif est de fournir à BibLaTeX un style de bibliographie personnalisé, dérivé du style officiel mais remplaçant le formatage des champs adéquats.

Pour cela, on place un fichier iso-custom.bbx dans le même répertoire que le fichier principal, avec le contenu suivant :

\ProvidesFile{iso-custom.bbx}[2020/07/08 v0.1 biblatex bibliography style]

\RequireBibliographyStyle{iso}

\DeclareFieldFormat[article,periodical,inproceedings]{title}{\mkbibquote{#1}}

Sommaire au début et table des matières à la fin

Le format de la thèse exigeait un sommaire et une table des matières : le sommaire étant au début et ne reprenant que les \part et les \chapter et la table des matières étant à la fin et allant jusqu’au niveau \subsubsection. Or LaTeX ne fournit que la commande \tableofcontents pour insérer une table des matières. Pour le sommaire, il faut ruser un peu.

Tout d’abord, on positionne le compteur tocdepth à 3 pour que la table des matières fasse apparaître les titres jusqu’au niveau \subsubsection.

\setcounter{tocdepth}{3}

Ensuite, on définit une commande \printshorttoc qui peut être utilisé dans le fichier .tex principal pour composer le sommaire. La commande fonctionne comme suit :

  1. Sauvegarder l’ancien nom de la table des matières, défini dans la macro \contentsname (par défaut « Table des matières ») pour le changer temporairement en « Sommaire ». De même pour la valeur du tocdepth.
  2. Positionner temporairement le compteur tocdepth à 0 pour se restreindre aux titres de niveau \chapter dans le sommaire.
  3. Réduire sensiblement les espacements verticaux introduits juste avant chaque partie ou chapitre (longueurs définies dans \cftbeforepartskip et \cftbeforechapterskip) : dans le cas contraire, on perd en effet pas mal de place inutilement sur la page.
  4. Imprimer le sommaire avec \tableofcontents.
  5. Enfin, restaurer le \contentsname et le tocdepth.

La commande \printshorttoc est définie comme suit :

\newcommand{\printshorttoc}{%
  \let\origcontentsname\contentsname
  \@tempcnta=\value{tocdepth}
  \renewcommand*{\contentsname}{Sommaire}
  \setcounter{tocdepth}{\z@}
  {%
    \cftbeforepartskip=0.55\cftbeforepartskip
    \cftbeforechapterskip=0.55\cftbeforechapterskip
    % 
    \tableofcontents%
  }%
  %
  \renewcommand*{\contentsname}{\origcontentsname}
  \setcounter{tocdepth}{\@tempcnta}
}

Un \chapter* et \section* améliorés

Un problème récurrent est l’ajout de sections non numérotées mais qui doivent tout de même apparaître dans le sommaire et la table des matières. Or, même dans la documentclass memoir, les commandes \chapter* et \section* ne le font pas.

Une solution possible est de ne plus utiliser les versions étoilées de ces commandes et d’y substituer les siennes. Concrètement, il faut faire trois choses :

  1. Composer la section au bon niveau (chapitre, section…) ;
  2. Ajouter une ligne dans la table des matières (et si on utilise le package hyperref, comme c’était le cas, il faut invoquer la commande \phantomsection immédiatement avant comme expliqué sur StackOverflow) ;
  3. Enfin, réinitialiser les marqueurs gauche et droite (le texte qui se trouve par défaut en haut de chaque page pour rappeler le titre du chapitre et de la section où on se trouve).

Voici le code (copieusement commenté, parce que le langage TeX devient vite illisible) :

\def\@mark@unnumbered@chapter#1{\markboth{#1}{}}
\def\@mark@unnumbered@section#1{\markright{#1}}
\def\@unnumberedsection#1#2{%
  % Composer le \chapter* ou \section* (en fonction de la valeur du paramètre 1)
  \expandafter\csname #1\endcsname*{#2}%
  % Ajout de l’entrée dans la TDM
  \phantomsection%
  \addcontentsline{toc}{#1}{#2}%
  % Appel de \@mark@unnumbered@chapter ou \@mark@unnumbered@section pour
  % réinitialiser les marqueurs
  \expandafter\csname @mark@unnumbered@#1\endcsname{#2}%
}

\newcommand{\addchapter}[1]{\@unnumberedsection{chapter}{#1}}
\newcommand{\addsection}[1]{\@unnumberedsection{section}{#1}}

Métadonnées personnalisées

Afin de composer une belle page de garde avec un titre, le nom de l’auteur et d’autres métadonnées, LaTeX propose les commandes \title, \author et \date, entre autres.

Mais sur la page de garde d’une thèse, doivent également figurer d’autres informations : l’université, l’année de la thèse, le grade visé, la spécialité, les noms du directeur et des membres du jury, etc.

Mon approche consistait donc à redéfinir la commande \maketitle pour faire figurer ces informations. Mais pas question de les coder en dur : afin de faire les choses proprement, on va simplement définir des champs supplémentaires.

Cela nécessite deux choses : une macro qui compose la valeur du champ, initialisée à une valeur par défaut (ou une séquence de commandes affichant un avertissement sur la console, comme le fait \title) et une commande pour affecter une nouvelle valeur à cette macro. Pour un champ appelé foo, on appelle \@foo le « getter » et \foo le « setter », lesquels peuvent être définis ainsi :

\newcommand\@foo{%
  \@latex@warning@no@line{No \noexpand \foo given}}
\newcommand\foo[1]{\gdef\@foo{#1}}

Étant donné le nombre de répétitions de « foo » dans la définition de ces deux macros, on pourrait imaginer une commande qui, avec une invocation comme \DefineMetaData{foo}, ferait ces deux définitions pour nous. Mais comme avec la technique vue ci-dessus, il faudrait une surabondance de \expandafter et de \csname #1 \endcsname. Je n’ai pas eu la patience d’élaborer une telle commande à temps pour le rendu de la thèse, donc je vous laisse proposer une solution.

Notes de bas de page

La numérotation des notes de bas de page est régie par le compteur footnote.

Normalement, LaTeX réinitialise bien les numéros de notes de bas de page au début de chaque chapitre, à condition d’utiliser \chapter. Mais ce n’est pas toujours suffisant, pour deux raisons.

Premièrement, parce que dans la thèse, les parties commencent par une introduction qui précède le début du premier chapitre de la partie. Les numéros des notes de ces introductions poursuivaient alors à partir du chapitre précédent…

Deuxièmement, parce que pour une raison obscure, ce compteur n’était pas non plus réinitialisé lorsqu’on utilise \chapter dans le \frontmatter ou le \backmatter. Ce qui est embêtant lorsqu’il y en a pour une cinquantaine de pages de contenu liminaire, introduction comprise…

Pour corriger cela, on redéfinit \chapter et \part pour s’assurer de remettre ce compteur footnote à zéro quoi qu’il arrive :

\let\orig@chapter\chapter
\def\chapter{\setcounter{footnote}{\z@}\orig@chapter}
\let\orig@part\part
\def\part{\setcounter{footnote}{\z@}\orig@part}

Conclusion

Il va sans dire que personnaliser LaTeX n’est pas forcément à la portée de tout le monde : une partie de la complexité est due à l’art de la typographie, qui est un art en soi ; l’autre partie est due au langage TeX.

TeX, au fond, est en effet un langage de macros ; cette propriété lui permet de facilement bâtir des langages dédiés très puissants entre de bonnes mains. Mais comme tous les langages de ce type, le test et le débogage de macros personnalisés peut vite virer au cauchemar. C’est pour cette raison que dans des langages comme le C ou le Lisp, par exemple, la règle no 1 de l’élaboration de macros est d’essayer de s’en passer.

C’est pourquoi une compréhension simultanée de TeX et de LaTeX est indispensable si on veut des documents qui sortent de l’ordinaire. Plus exactement, il faut comprendre à la fois le fonctionnement de TeX en tant que langage de programmation (c’est-à-dire les règles syntaxiques, les règles d’expansion…) et le fonctionnement de TeX en tant que typographe (comme la différence entre les modes horizontaux et verticaux, l’algorithme de césure…). Le TeXbook de Donald Knuth explique très bien les deux aspects de TeX et est donc un ouvrage à avoir sous la main à tout moment. Après tout, on a vite fait de sortir du domaine de la typographie pour rentrer dans celui de la programmation.

Commentaires

Poster un commentaire

Poster un commentaire