Examens et thèses

Les enseignants qui finissent par composer leurs examens en LaTeX y viennent presque toujours pour une raison : gardez le sujet et le corrigé dans deux fichiers et, tôt ou tard, ils divergeront. On corrige une question et on oublie la solution ; on change le barème et on oublie le total. La classe exam règle cela par la structure. La solution s'écrit juste à côté de la question, et la présence ou l'absence d'un seul \printanswers produit, depuis une même source, deux PDF différents : le sujet et le corrigé. Mesuré sur un document réel : deux pages avec les réponses, trois sans. Même fichier, documents différents. Cette page traite de la classe exam et de l'autre genre fortement structuré, la thèse : en quoi report, book et memoir diffèrent, dans quelles classes \frontmatter n'existe pas, et le conseil le plus utile de tous — ne vous battez pas contre le modèle de votre université.

Le squelette de la classe exam : \question, parts, les points

La structure de la classe exam est une imbrication à trois niveaux : \question dans un environnement questions, \part dans un environnement parts en dessous, et \subpart dans subparts encore en dessous. Les points s'indiquent entre crochets — \question[10] — et l'option de classe addpoints les additionne automatiquement. Les compteurs sont accessibles dans le corps sous les noms \numquestions, \numpoints et \numpages, si bien que la phrase « 4 questions, 30 points, 3 pages » n'a jamais à être mise à jour à la main. Les QCM disposent de quatre environnements : choices à la verticale, oneparchoices sur une seule ligne, et checkboxes / oneparcheckboxes avec une case à cocher. La bonne réponse s'écrit non pas avec \choice mais avec \CorrectChoice, ce qui fait fonctionner le corrigé décrit plus bas.

L'emplacement des points se règle finement. Par défaut, ils suivent le numéro de la question, mais \pointsinmargin et \pointsinrightmargin les repoussent dans la marge, et \pointsdroppedatright transforme la marge de droite en colonne où noter les points retirés. Remplacer le mot « points » par un autre tient en une redéfinition d'une ligne de \pointname. Les en-têtes et pieds de page, une fois choisi \pagestyle{headandfoot}, s'écrivent en trois parties — \header{gauche}{centre}{droite} et \footer{gauche}{centre}{droite} — et \firstpageheader / \runningheader permettent à la première page de différer des suivantes. Imprimer « Page 2 sur 3 » fait ici partie de l'équipement de série ; cela suffit à repérer la copie à laquelle il manque une feuille.

latex
\documentclass[addpoints,12pt]{exam}
\pagestyle{headandfoot}
\header{Calculus I --- Midterm}{}{Page \thepage\ of \numpages}
\begin{document}
\begin{center}\gradetable[v][questions]\end{center}

\begin{questions}
  \question[10] Differentiate $f(x)=x^3$.

  \question[5] Pick the correct answer.
  \begin{oneparchoices}
    \choice wrong \CorrectChoice right \choice wrong
  \end{oneparchoices}

  \question Answer both parts.
  \begin{parts}
    \part[3] State the definition.
    \part[7] Prove the claim.
  \end{parts}
\end{questions}
\end{document}

Ce que change \printanswers : une source, le sujet et le corrigé

\printanswers est l'interrupteur qui décide si les solutions apparaissent, mais l'intéressant est ce qui prend leur place quand elles sont masquées. Un environnement solution se contente d'imprimer ou non. Écrivez plutôt solutionorlines[2.5in] et vous obtenez la solution quand les réponses sont activées, et 2,5 pouces de lignes réglées quand elles ne le sont pas. Sur le même principe existent solutionorbox (un cadre), solutionordottedlines (pointillés) et solutionorgrid (papier quadrillé). Un document de six questions, chacune enveloppée dans solutionorlines[2.5in], compilé des deux façons, donne deux pages avec \printanswers et trois avec \noprintanswers. Le texte des solutions apparaît six fois dans le premier et pas une seule fois dans le second. La page supplémentaire est exactement l'espace d'écriture qui a remplacé les solutions masquées.

latex
% One source, two documents.
%   \printanswers   -> the key   (measured: 2 pages, 6 solutions printed)
%   \noprintanswers -> the paper (measured: 3 pages, 0 solutions printed)
\documentclass[addpoints,12pt]{exam}
\printanswers          % comment this line out to get the blank paper
\begin{document}
\begin{questions}
  \question[10] State the definition and prove the claim.
  \begin{solutionorlines}[2.5in]
    $f'(x)=3x^2$ by the power rule.
  \end{solutionorlines}
\end{questions}
\end{document}

À l'usage, il est utile de savoir qu'il existe deux façons d'actionner l'interrupteur : écrire \printanswers dans la source, ou passer l'option de classe [answers]. La sortie est identique — vérifié sur le même document, les deux donnent deux pages et six solutions. La voie par option laisse le corps intact, de sorte qu'une règle latexmk ou un Makefile peut produire les deux PDF via \PassOptionsToClass sans rien modifier. Il existe aussi cancelspace, qui n'imprime ni les solutions ni l'espace qui leur est réservé : il ignore complètement l'argument entre crochets des environnements solutionor… et donne les questions seules, exactement ce qu'il faut pour distribuer une ancienne épreuve comme feuille d'exercices. Notez que cancelspace n'a aucun effet tant que les réponses sont imprimées.

Commande / environnementavec printanswersavec noprintanswers
solutionimprime la solutionn'imprime rien
solutionorlinesimprime la solutiondes lignes réglées de la hauteur indiquée
solutionorboximprime la solutionun cadre vide de la hauteur indiquée
solutionorgridimprime la solutiondu papier quadrillé de la hauteur indiquée
\fillwithlinesimprime des lignes quel que soit l'interrupteuridem
cancelspacesans effetignore l'argument entre crochets, ne laisse aucun espace

Imprimer un barème : \gradetable et \pointsonpage

Une seule ligne, \gradetable[v][questions], place en couverture un barème alignant numéros de question, points et cases de notation vides. Le premier argument est l'orientation (v verticale, h horizontale), le second l'axe : questions donne une ligne par question, pages une ligne par page. Le tableau indexé par page prend tout son sens quand plusieurs personnes corrigent ensemble, car il épouse la répartition « toi, la page 3 ». Les calculs sont également disponibles : \pointsofquestion{3} renvoie les points de la question 3 et \pointsonpage{2} le total de la page 2. Combiné à l'option addpoints, cela signifie que modifier un barème met à jour le tableau et les totaux en même temps. Ne plus additionner à la main, c'est là toute la valeur de la fonction. Les questions bonus disposent de \bonuspoints et de leurs propres tableaux.

Le sérieux de la construction de la classe exam se lit à l'épaisseur de son manuel. Le examdoc.pdf de TeX Live 2024 compte 135 pages — un guide de 135 pages pour une classe dont l'unique objet est de composer des examens. Il est écrit par Philip Hirschhorn, du département de mathématiques du Wellesley College, topologue connu pour Model Categories and Their Localizations. La ligne de copyright du manuel énumère les années de révision 1994, 1997, 2000, 2004, 2008, 2011, 2015, 2017, 2021, 2023 : c'est une classe qu'un seul mathématicien entretient depuis près de trente ans, pour son propre enseignement. La version fournie avec TeX Live 2024 est la v2.704, datée du 9 juillet 2023.

Modèles de thèse : ne combattez pas celui de votre université

La conclusion d'abord : si votre université distribue une classe ou un modèle, utilisez-le et modifiez-le le moins possible. La raison n'est pas typographique mais procédurale. Marges, interlignage, formulation de la page de titre, style de numérotation des figures et tableaux sont, dans la plupart des établissements, inscrits dans les exigences de dépôt, et une thèse qui s'en écarte est renvoyée sans égard pour son contenu — en général le jour même de l'échéance. TeX Live 2024 contient à lui seul 64 répertoires dont le nom comporte thesis ou diss et qui livrent une .cls : mitthesis, ucbthesis, uiucthesis, thuthesis, njuthesis, ut-thesis, york-thesis, etc. Les modèles locaux qui n'atteignent jamais le CTAN sont bien plus nombreux encore, et la plupart circulent sous la forme du « .cls hérité de la promotion précédente ».

Qu'est-ce donc qu'un tel modèle, en dessous ? Presque toujours une classe qui pose une page de titre et une géométrie de page imposées par-dessus book ou report. C'est pourquoi \chapter et \tableofcontents s'y comportent normalement — et, inversement, pourquoi un modèle qui semble cassé a d'ordinaire un problème dans ses fondations. Si rien n'est imposé et que le choix vous revient, une thèse avec chapitres appelle report ou book ; pour un contrôle plus fin de la mise en page, memoir (v3.8.2 dans TeX Live 2024, datée du 26 janvier 2024, qui se présente elle-même comme une « configurable book, report, article document class ») ou scrbook / scrreprt de KOMA-Script. La section suivante examine leurs différences à travers ce qui est réellement défini dans chacune.

La différence entre report et book : recto-verso, et où commence un chapitre

La différence est écrite dans les options par défaut. book.cls porte \ExecuteOptions{letterpaper,10pt,twoside,onecolumn,final,openright} ; report.cls a la même ligne avec oneside et openany. Autrement dit, book est réglé pour l'impression recto-verso et chaque chapitre commence sur une page impaire (de droite), ce qui suppose parfois l'insertion d'une page blanche. report est en recto simple et un chapitre commence simplement à la page suivante. Pour une thèse destinée à être reliée, le comportement de book est le bon ; pour un dépôt en PDF que personne n'imprimera en recto-verso, report est plus direct. article n'a pas de \chapter du tout — avoir besoin ou non de \chapter est la première bifurcation du choix d'une classe.

ClasseRecto-verso par défautOuverture de chapitrefrontmatter
articleonesidepas de \chapternon défini
reportonesideopenany (page suivante)non défini
booktwosideopenright (page impaire)défini
memoircomme book (configurable)openright (configurable)défini
scrbooktwosideopenrightdéfini
scrreprtonesideopenanynon défini

Pourquoi \frontmatter donne ! Undefined control sequence, et ce que les trois font vraiment

\frontmatter, \mainmatter et \backmatter n'existent que dans les classes dérivées de book. Écrivez \frontmatter sous \documentclass{report} et vous obtenez ! Undefined control sequence. avec la ligne fautive affichée comme l.3 \frontmatter. La recherche dans les fichiers de classe le confirme : la chaîne frontmatter figure dans book.cls, memoir.cls et scrbook.cls, et pas dans article.cls, report.cls ni scrreprt.cls. La plupart des « \frontmatter ne marche pas dans le modèle de mon université » se ramènent à cela : le modèle repose sur report. Si le comportement lié à la numérotation des chapitres ne vous importe pas, écrire à la main \pagenumbering{roman} puis \pagenumbering{arabic} donne le même résultat, car c'est à peu près tout ce que contiennent les trois commandes.

Que contiennent-elles au juste ? Dans book.cls : \frontmatter exécute un \cleardoublepage, pose \@mainmatterfalse et \pagenumbering{roman}. \mainmatter exécute un \cleardoublepage, pose \@mainmattertrue et \pagenumbering{arabic}. Et \backmatter termine la page et pose \@mainmatterfalse — il ne touche pas du tout à la pagination. Ce point est souvent mal rapporté ; toute explication affirmant que les annexes changent la pagination est fausse. Ce qu'un \@mainmatter faux modifie réellement, c'est le comportement de \@chapter : le compteur de chapitre n'avance pas, aucun numéro n'est imprimé dans le titre, et l'entrée de table des matières est ajoutée sans \numberline. Ainsi, dans les préliminaires et les annexes, les chapitres sortent sans numéro mais figurent toujours dans la table — remerciements et bibliographie n'ont pas de numéro et restent accessibles depuis la table. Toute cette convention de la rédaction académique tient à cet unique interrupteur.

latex
% Measured page labels from this exact file (book, 12pt):
%   front matter -> i, ii, iii, iv   (roman, chapters unnumbered but in the ToC)
%   main matter  -> 1, 2, 3, 4       (arabic, "Chapter 1", "Chapter 2")
%   back matter  -> 5                (still arabic; chapter unnumbered)
\documentclass[12pt]{book}   % or your university's class
\begin{document}
\frontmatter
\chapter{Acknowledgements}
Thanks.
\tableofcontents

\mainmatter
\include{chapters/intro}
\include{chapters/method}

\backmatter
\chapter{Bibliography}
Refs.
\end{document}

En pratique : découper les chapitres, et ne rien casser la veille

La première chose à faire pour une thèse longue est de la découper en un fichier par chapitre et de les inclure avec \include. \include commence une nouvelle page avant et après chaque fichier, ce qui convient aux frontières de chapitre, et \includeonly{chapters/method} permet ensuite de composer un seul chapitre sans les autres tout en conservant pagination et renvois corrects. Sur une thèse de 300 pages où seul le chapitre 7 doit être repris, l'avoir ou non change le temps d'attente d'un ordre de grandeur. Le découpage d'un projet et la gestion des grands documents ont chacun leur page ici ; suivez les liens related. Une autre habitude payante à l'approche de l'échéance : créer une branche avant de toucher à la mise en page. L'envie de gagner un millimètre sur les marges arrive, presque sans exception, la dernière nuit.

  • Le résumé va dans un environnement abstract — mais beaucoup de modèles imposés réclament \chapter*{Abstract} dans les classes dérivées de book : vérifiez d'abord la feuille de style distribuée.
  • Pour un chapitre non numéroté qui doit néanmoins figurer dans la table, faites suivre \chapter*{...} d'un \addcontentsline{toc}{chapter}{...}. À l'intérieur de \frontmatter, un simple \chapter le fait déjà.
  • Les fichiers appelés par \include ne doivent contenir ni \documentclass ni \begin{document} ; sinon vous obtenez ! LaTeX Error: Can be used only in preamble.
  • Faites toujours une compilation propre avant de déposer. Un .aux périmé conserve volontiers un renvoi que vous avez déjà supprimé, et la compilation réussit quand même.
  • Si vous avez malgré tout modifié la classe de l'université, laissez un commentaire indiquant quoi. Vous dans trois mois comme l'étudiant suivant finirez par le lire.

Un dernier trait commun aux deux genres. L'examen comme la thèse sont des documents dont le contenu et la présentation relèvent de personnes différentes : d'un côté celui qui rédige et celui qui corrige, de l'autre l'auteur et l'institution qui évalue. LaTeX est fort ici non parce que la composition est belle, mais parce que cette séparation s'exprime directement dans la structure de la source. Un \printanswers sépare le sujet du corrigé ; un \frontmatter sépare les chapitres numérotés de ceux qui ne le sont pas. Savoir replier une bifurcation en un unique interrupteur, c'est ce qui se ressent la veille de l'échéance.