LaTeX & les compteurs : définition, modification et création

Fleuron

LaTeX possède de nombreux compteurs, en gros tout ce qui porte un numéro (les pages, les figures, le sectionnement, les notes de bas de page . . .) est relié à un compteur. Voici la liste des compteurs d’un document de base, ils portent, en général, le nom de la commande associée.

partparagraphfigureenumi
chaptersubparagraphtableenumii
sectionpagefootnoteenumiii
subsectionequationmpfootnoteenumiv
subsection   

enumi à enumiv correspondent aux compteurs des énumérations (\begin{enumerate}) et mpfootnote est le compteur des notes de bas de page dans un environnement minipage (numérotation avec des lettres).

Plusieurs compteurs sont liés, par exemple les compteurs chapter et section. À chaque fois que chapter est incrémenté, section est remis à zéro. Dans les classes book et report les images sont numérotées en fonction des chapitres de même que les notes de bas de page.

Associé à chaque compteur il existe une commande \arabic{compteur} qui affiche la valeur du compteur. Par exemple \arabic{page} affiche le numéro de page. Si le compteur se trouve sur la troisième page de ton document \arabic{page} = 3

\arabic{compteur} affiche le compteur en chiffres arabes. Tu peux choisir de l’afficher sous d’autres formes :

Pour ces deux derniers exemples la valeurs doit être comprise entre a et z soit dans un intervalle de 1 à 26 sinon une erreur est indiquée.

\fnsymbol{page} = ‡

Dans ce cas la valeur ne peux dépasser 9.

Il existe une autre commande pour afficher le compteur (en chiffres arabes)\thecompteur.

\thepage pour le compteur de page, \thechapter pour les chapitres,. . .

Pour comprendre la différence entre \thecompteur et \arabic{compteur} on va prendre l’exemple de la numérotation des figures qui je le rappelle est liée, dans les environnements book et report, au chapitre.

Donc la troisième illustration du deuxième chapitre sera numérotée « 2.3 ». La commande \arabic{figure} retournera « 3 », par contre \thefigure donne « 2.3 ».

Désolidariser les compteurs

Si tu veux avec une classe book ou report avoir une numérotation continue de tes figures (ou de tes notes de bas de page) de 1 à l’infini sans tenir compte des chapitres, il va falloir désolidariser le compteur des figures du compteur des chapitres. Pour cela il faut utiliser le package remreset (\usepackage{remreset}) et ajouter cette ligne dans le préambule :

\makeatletter \@removefromreset{figure}{chapter} \makeatother

Maintenant les figures ne sont plus liées aux chapitres et il n’y a plus de ré-initialisation du compteur figure quand le compteur chapitre augmente. La numérotation des figures est continue. En remplaçant figure par footnote tu as une numérotation continue de tes notes de bas de page.

C’est quoi ces @, \makeatletter et \makeatother ?

Les commandes internes de LaTex contiennent des @ dans leur nom. Cela empêche ces noms d’être utilisés dans le document et pour les commandes que tu crées. Donc on ne peut pas les utiliser dans le document, même dans le préambule, sauf si on les entoure de \makeatletter et \makeatother.

Si tu utilises pour gérer la mise en page de tes documents tes propres extensions (package) fichier en .sty ou tes classes personnelles (.cls), tu ne dois pas y mettre \makeatletter et \makeatother. En effet avec les fichiers .sty et .cls,\makeatletter et \makeatother sont appelés automatiquement et la rencontre d’un nouveau \makeatother stopperait leur action prématurément.

Grâce à la manip vue précédemment on a bien notre numérotation des figures en continue, mais il y a un petit problème. Si tu regardes la numérotation de tes illustrations, tu verras toujours apparaître le numéro du chapitre :

Figure 1.1 –, Figure 1.2 –, Figure 2.3 –, Figure 3.4 –,. . .

Et oui, \caption, qui sert à mettre une légende, utilise \thefigure pour mettre le numéro de la figure et pour les environnements book et report, il estdéfinit comme ceci :

\newcommand\thefigure{\thechapitre.\arabic{figure}}

Tu as le numéro du chapitre un point et le numéro de la figure. Si tu veux voir également dans les légendes une numérotation continue sans le numéro de chapitre il faut modifier \thefigure :

\renewcommand\thefigure{\arabic{figure}}

N’oublie pas le re de \renewcommand car il s’agit de redéfinir une commande.

Faire dépendre un compteur d’un autre

Si tu veux faire le contraire, c’est à dire faire dépendre un compteur d’un autre, il te faut utiliser la commande \@addtoreset, avec bien entendu les \makeatletter et \makeatother car il y a un @. Tu n’es pas obligé de charger un package car cette commande fait parti de LaTeX.

Dans la classe article les images sont numérotés de 1 à l’infini. Imaginons que tu veuilles avoir une numérotation par section, tu ajoutes dans ton préambule :

\makeatletter \@addtoreset{figure}{section}\makeatother

Attention, si la numérotation de tes figures est réinitialisée à chaque section, elle reste imprimée sous la forme Figure 1 –, Figure 2 –,… et non pas Figure 1.1 –, Figure 1.2 –,… car \thefigure n’a pas été modifié. Il faut ajouter :

\renewcommand\thefigure{\thesection.\arabic{figure}}

Tu peux remplacer le « . » par « – » si tu préfères les voir sous cette forme Figure 1 – 1

\renewcommand\thefigure{\thesection - - \arabic{figure}}

Une autre fiche expliquera en détail comment modifier les légendes des illustrations.

N’oublie pas, quand tu commences à manipuler les compteurs, qu’ils n’apparaissent par forcement à un seul endroit dans ton document. Par exemple \thefigure se retrouve dans la légende mais aussi dans la liste des figures et dans les références croisées (\ref et \pageref) De même \thechapter est présent dans \thesection (pour book et report), la table des matières, les référence croisées.

Modifier ou incrémenter un compteur

Il existe deux commandes :

\setcounter{compteur}{nouvelleValeur}

qui attribue au compteur la nouvelle valeur ;

et

\addtocounter{compteur}{Valeur}

qui incrémente de la nouvelle valeur le compteur, le nombre peut être négatif pour diminuer le compteur.

Attention au comportement de certaines commandes, comme \section, qui incrémentent le compteur puis affichent le résultat.

Si tu modifies le compteur de \section par :

\setcounter{section}{10}

La prochaine commande \section{La nouvelle section} affichera :

11. La nouvelle section

et non

10. La nouvelle section

Créer un compteur

Pour comprendre tous les aspects de la création d’un compteur, nous allons étudier un exemple concret. Nous allons créer un nouvel environnement qui nous permettra d’ajouter dans notre document des exercices numérotés. Pour rappel un environnement se crée avec la commande :

\newenvironment{nomEnvironnement}{début}{fin}

Où dans début sont spécifiées toutes les actions effectuées lorsque l’on rentre dans l’environnement (\begin{monEnvironnement}) et dans fin les actions réalisées quand on quitte l’environnement (\end{monEnvironnement}). Cet environnement doit reproduire l’exemple ci-dessous :

Exercice 1 : L’énoncé de l’exercice qui pourra s’étendre sur plusieurs lignes et être séparé du texte environnant par un espace.

Nous allons tout d’abord créer un compteur que l’on va appeler exo :

\newcounter{exo}

C’est tout, notre compteur est créé avec la commande associée \theexo qui affiche pour l’instant :

0

Maintenant nous allons créer notre environnement que nous appelons exo. Il n’est pas nécessaire que le compteur et l’environnement porte le même nom. C’est juste plus facile à retenir.

\newenvironment{exo}{\vspace{0.5cm}{\bfseries Exercice \theexo\ :}}{\par\vspace{0.5cm}}

Maintenant si j’écris :

\begin{exo}
L’énoncé de mon premier exercice.
\end{exo}
\begin{exo}
L’énoncé de mon deuxième exercice.
\end{exo}

J’obtiens

Exercice 0 : L’énoncé de mon premier exercice.

Exercice 0 : L’énoncé de mon deuxième exercice.

Il y a un petit problème, notre compteur n’est pas incrémenté.

Il y a deux commandes qui incrémentent automatiquement un compteur :

\stepcounter{compteur}

et

\refstepcounter{compteur}.

Ces deux commandes incrémentent de 1 le compteur et réinitialisent tous les compteurs qui en dépendent.

La différence est que \refstepcounter{compteur} définie la commande \ref{label} comme ayant pour valeur \thecompteur.

Pour comprendre l’ensemble on va exécuter le code page suivante qui dans une classe scrreprt crée deux chapitres ayant chacun une section et un exercice par section.

\documentclass{scrreprt}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[frenchb]{babel}
\newcounter{exo}
\newenvironment{exo}{\stepcounter{exo}\vspace{0.5cm}{\bfseries Exercice\theexo\ :}}{\par\vspace{0.5cm}}
\begin{document}
\chapter{Chapitre 1}
\section{Première section}
\begin{exo}\label{exo1}
L’énoncé de mon premier exercice.
\end{exo} \chapter{Chapitre 2}
\section{Première section}
\begin{exo}\label{exo2}
L’énoncé de mon deuxième exercice.
\end{exo}
L’exercice \ref{exo1} est à la page \pageref{exo1}
L’exercice \ref{exo2} est à la page \pageref{exo2}
\end{document}

Si on emploie comme dans l’exemple \stepcounter on va obtenir :

et sur la deuxième page :

On a bien nos exercices numérotés respectivement 1 et 2 mais \ref fait référence au numéro de section et pas au numéro d’exercice. Si on remplace \stepcounter par \refstepcounter les premières lignes ne changent pas seules les deux dernières deviennent :

L’exercice 1 est à la page 1

L’exercice 2 est à la page 2

Attention à l’emplacement des commandes \stepcounter et \refstepcounter à l’intérieur de \newenvironment{exo}{. . .}. Il est préférable de les placer au début. De même \label{exo1} doit être placé à l’intérieur de l’environement exo.

Si tu veux faire dépendre la numérotation de tes exercices, de la section, tu crées ton compteur exo de cette façon :

\newcounter{exo}[section]

Si en plus tu veux que l’affichage des exercices prennent en compte le numéro de section il te faut procéder ainsi :

\newcounter{exo}[section]
\renewcommand\theexo{\thesection.\arabic{exo}}

Exemple d’utilisation des compteurs

Cet exemple montre comment incrémenter automatiquement une colonne dans un tableau. Pour cela on va utiliser le descripteurs >{texte} du package array qui permet d’insérer un même texte dans chaque cellule d’une colonne. Voir la fiche à Bébert LATEX & les tableaux, Deuxième partie : améliorer ses tableaux avec le package array. Voici le code complet, j’ajouterais une petite explication après.

\documentclass{article}
\usepackage[frenchb]{babel}
\usepackage{array}
\newcounter{cptcol}
\begin{document}
\begin{tabular} {>{\stepcounter{cptcol}\thecptcol}cl}
\multicolumn{1}{r}{\No.}& texte \\
\hline
& ligne 1 \\
& ligne 2 \\
& ligne 3 \\
& ligne 4 \\
\end{tabular}
\end{document}

Remarque l’utilisation de \multicolumn. Son rôle est d’empêcher que la numérotation de colonne commence sur cette première ligne. En effet \multicolumn redéfini le format de la cellule et donc ne prend pas en compte le descripteur et donc l’incrémentation démarre à la ligne suivante. Le résultat :


Le même sans utiliser \multicolumn :


Cette astuce provient du TeXblog de Stefan Kottwitz

Conclusion

Maintenant tu peux t’amuser avec les compteurs. Mais surtout, ils vont nous être très utiles dans une prochaine fiche où nous allons voir comment modifier l’affichage des légendes des illustrations.