Compteurs et longueurs

LaTeX dispose de deux sortes de registres, des emplacements où mémoriser une valeur. Un compteur contient un entier ; une longueur contient une dimension. Les numéros de chapitre, de figure et d’équation se comptent avec des compteurs ; les marges et les largeurs de boîtes se mesurent avec des longueurs. Cette page couvre les bases de programmation pour définir et manipuler vos propres compteurs et longueurs. Les unités elles-mêmes et les commandes d’espace comme \hspace/\vspace sont traitées sur une page séparée (lien ci-dessous) ; ici nous nous concentrons sur les mécanismes qui comptent, mesurent et mémorisent.

Compteurs — registres entiers

Un compteur est un conteneur qui mémorise un entier. À mesure que LaTeX lit le document, il avance chapter au début d’un chapitre, figure lorsque vous placez une figure, puis imprime ces numéros dans le titre ou la légende. Ce sont des compteurs standard prédéfinis, et vous pouvez aussi créer les vôtres.

Vous créez un nouveau compteur avec \newcounter{foo}. Sa valeur juste après la création est 0. Le nom se compose seulement de lettres (sans barre oblique inverse) et ne doit pas déjà exister. Le point essentiel est le parent optionnel : \newcounter{foo}[⟨parent⟩] rend foo subordonné à parent, de sorte que chaque fois que parent avance, foo est automatiquement remis à 0. C’est exactement pourquoi le numéro de sous-section recommence lorsque la section change.

Trois commandes changent la valeur. \setcounter{foo}{3} attribue la valeur 3 à foo ; \addtocounter{foo}{2} ajoute 2 à la valeur actuelle (passez un nombre négatif pour soustraire) ; et \stepcounter{foo} ajoute simplement 1. \stepcounter a un effet de bord important : il remet à 0 tout compteur enregistré comme enfant de ce compteur. Notez que les affectations faites par \setcounter et \addtocounter sont globales ; elles ne sont pas annulées lorsque vous quittez un groupe ({ } ou un environnement).

Son proche parent \refstepcounter{foo} effectue le même avancement et la même remise à zéro, mais fait en plus de foo la cible de référence courante. Ainsi, un \label{…} placé juste après pointera vers la valeur imprimée de foo (son \thefoo, ci-dessous), et \ref rappellera ce numéro. C’est précisément la commande que LaTeX utilise en interne lorsqu’il avance section, equation ou figure ; voilà pourquoi un \label placé sur un titre ou une équation référence le bon numéro. Utilisez \stepcounter pour seulement avancer un nombre en interne, et \refstepcounter pour créer une « chose numérotée » référencable.

latex
\newcounter{trial}            % trial を作成(初期値 0)
\setcounter{trial}{5}         % trial = 5
\addtocounter{trial}{-2}      % trial = 3
\stepcounter{trial}           % trial = 4(子カウンタがあれば 0 に)

Extraire le nombre — \value

\value{foo} extrait le contenu d’un compteur comme un nombre avec lequel TeX peut calculer. Vous pouvez l’utiliser partout où LaTeX attend un entier : dans la position de valeur de \setcounter/\addtocounter, dans un test \ifnum, même dans un calcul de dimension (comme \value{foo}\parindent). Par exemple, pour aligner bar sur la valeur de foo :

latex
\setcounter{bar}{\value{foo}}        % bar に foo の現在値を代入
\addtocounter{bar}{\value{foo}}      % bar に foo の値をさらに加える

C’est un piège courant au début : \value ne sert pas à afficher. Pour réellement *imprimer* un numéro dans le texte, utilisez une commande d’affichage comme \arabic (section suivante) ou \thefoo. La distinction est simple : \value donne le nombre brut pour le calcul, tandis que les commandes d’affichage donnent une chaîne destinée aux lecteurs.

Afficher un compteur — \the et commandes de format

Chaque compteur possède une famille de commandes d’affichage qui transforment sa valeur en chaîne imprimée. Vous choisissez la notation :

CommandeSortiePlage / notes
\arabicChiffres arabes (1, 2, 3 …)Choix habituel ; valeurs négatives autorisées
\romanChiffres romains minuscules (i, ii, iii …)Sous 1, rien ne s’imprime
\RomanChiffres romains majuscules (I, II, III …)Sous 1, rien ne s’imprime
\alphLettres minuscules (a, b, c …)1–26 ; hors plage, erreur
\AlphLettres majuscules (A, B, C …)1–26 ; hors plage, erreur
\fnsymbolSymboles de note (∗ † ‡ § ¶ ‖ …)1–9 ; pour le mode mathématique

\alph/\Alph correspondent aux 26 lettres ; une valeur inférieure à 1 ou supérieure à 26 produit donc l’erreur « Counter too large ». \fnsymbol émet neuf symboles de note dans l’ordre : astérisque, obèle, double obèle, signe section, signe paragraphe, barres parallèles, double astérisque, double obèle, double double obèle ; la plage valide est 1–9. Comme il fonctionne en mode mathématique, entourez-le ainsi dans le texte : $\fnsymbol{footnote}$, ou passez par \thefootnote.

Ces commandes prennent le nom du compteur en argument (comme \arabic{page}). Mais le numéro réellement imprimé est produit par une macro dédiée que chaque compteur reçoit automatiquement : \thefoo. section a \thesection, figure a \thefigure, etc. Redéfinir ce \the… avec \renewcommand change tout le format du numéro. Pour écrire les numéros de section en chiffres romains, par exemple, une ligne suffit :

latex
\renewcommand{\thesection}{\Roman{section}}   % 1, 2, 3 → I, II, III
% 図番号を「節.通し番号」に:図 2.3 のように
\renewcommand{\thefigure}{\thesection.\arabic{figure}}

Comme dans le second exemple, insérer l’affichage d’un autre compteur dans une définition \the… produit des numéros composés comme « 2.3 ». Cela fonctionne parce que le compteur des figures est configuré avec le compteur des sections comme parent (son déclencheur de remise à zéro). On voit ainsi que l’apparence du numéro et le lien qui décide quand il revient à 0 se règlent séparément.

Compteurs standard et profondeur de numérotation

LaTeX prédéfinit et pilote automatiquement un ensemble de compteurs dans le document. Vous pouvez aussi les manipuler librement avec \setcounter et les commandes voisines : renuméroter des chapitres en cours de route, afficher les figures d’une annexe sous la forme A.1, etc. :

  • Titres : part, chapter, section, subsection, subsubsection, paragraph, subparagraph (disponibilité selon la classe)
  • Flottants et équations : figure, table, equation
  • Notes : footnote, mpfootnote (notes dans une minipage)
  • Listes : enumi, enumii, enumiii, enumiv (les quatre niveaux d’imbrication de enumerate)
  • Page : page
  • Contrôle : secnumdepth (jusqu’à quelle profondeur les titres sont numérotés) et tocdepth (jusqu’à quelle profondeur les entrées vont dans la table des matières)

Les deux derniers sont d’une autre nature : ce sont des commutateurs entiers qui règlent la profondeur de la numérotation et des listes. Chaque commande de titre a un numéro de niveau (section vaut 1, subsection vaut 2, …), et un niveau est numéroté lorsqu’il est inférieur ou égal à secnumdepth. La valeur par défaut tourne autour de 2 ; ainsi \setcounter{secnumdepth}{1} supprime les numéros sous le niveau section, et \setcounter{tocdepth}{1} limite la table des matières aux sections. C’est un bon exemple de compteurs qui ne servent pas seulement à compter, mais aussi de valeurs de configuration pilotant la composition.

Longueurs — registres de dimension

L’autre sorte, une longueur, est un registre qui mémorise une dimension comme 12pt ou 2cm. Là où un compteur est un entier, une longueur contient une dimension avec une unité, et peut porter de l’étirement et du rétrécissement (plus/minus). Si vous réutilisez la même dimension dans tout un document, nommer une longueur est bien plus maintenable que coder le nombre en dur.

Vous déclarez une nouvelle longueur avec \newlength{\mylen}. Contrairement à un compteur, l’argument est un nom de commande avec barre oblique inverse (\mylen), et la valeur initiale est 0pt. Deux commandes assurent le travail de base : \setlength{\mylen}{2em} (affecter) et \addtolength{\mylen}{-3pt} (ajouter ; une valeur négative soustrait). Une fois créée, la longueur peut être utilisée partout où une dimension est attendue, comme dans \hspace{\mylen}.

Vous pouvez aussi calculer avec des longueurs existantes comme \textwidth (largeur du corps de texte) et \baselineskip (interligne). Placez un facteur devant pour les mettre à l’échelle : 0.8\textwidth vaut 80 % de la largeur du texte ; vous pouvez aussi additionner ou soustraire des longueurs directement. Pour une arithmétique plus riche, surtout la division, chargez le package calc. Alors une expression comme \setlength{\x}{\textwidth/3} (un tiers de la largeur du texte), qui divise une dimension par un entier, fonctionne telle quelle.

Une réserve avec calc : pour multiplier une dimension par un facteur réel, la syntaxe diffère de la division entière et il faut insérer \real{} (par exemple \widthof{mot} * \real{0.68}). Les expressions doivent aussi rester cohérentes par type : 2cm + 4 (un entier nu ajouté à une dimension) est illégal, tandis que 2cm + 4pt, avec des dimensions des deux côtés, convient.

document.tex
\usepackage{calc}
\newlength{\thirdcol}
\setlength{\thirdcol}{\textwidth/3}     % 本文幅の 1/3
\addtolength{\thirdcol}{-1em}            % そこから 1em 引く

Mesurer du contenu composé — \settowidth et variantes

Parmi les opérations sur les longueurs, les plus puissantes mesurent le résultat d’une composition réelle et le stockent dans une longueur. \settowidth{\mylen}{texte} compose le texte donné en interne et place sa largeur dans \mylen. De même, \settoheight mesure la hauteur au-dessus de la ligne de base, et \settodepth la profondeur au-dessous (chacune cible une longueur déclarée auparavant avec \newlength).

C’est très utile lorsque vous voulez une dimension ajustée à son contenu : « un filet exactement aussi large que ce mot de titre », ou « une largeur d’étiquette calée sur l’entrée la plus longue ». L’exemple ci-dessous mesure la largeur d’un mot et trace dessous un filet de même longueur :

document.tex
\newlength{\wd}
\settowidth{\wd}{重要}        % 「重要」の組版幅を測る
\noindent 重要\par
\rule{\wd}{0.4pt}            % 同じ幅の罫線

La même idée de « composer puis mesurer » se retrouve dans les commandes du package calc mentionnées plus haut : \widthof{texte}/\heightof/\depthof. La différence : \settowidth est une commande qui affecte le résultat à une longueur, tandis que \widthof peut être inséré directement dans une expression comme valeur.

Assembler le tout — compteur personnalisé et longueur mesurée

Pour finir, voici un petit exemple qui utilise les deux. Nous créons un compteur personnalisé question, formatons son affichage en « Q1. », « Q2. », …, puis définissons une commande simple \question qui avance le compteur et imprime le numéro à chaque appel. Comme elle utilise \refstepcounter, vous pouvez placer un \label sur chaque question et la référencer ensuite avec \ref :

document.tex
\newcounter{question}
\renewcommand{\thequestion}{Q\arabic{question}}
\newcommand{\question}{\refstepcounter{question}\par\noindent\textbf{\thequestion.}\ }
\begin{document}
\question 最初の問い。\label{q:first}
\question 次の問い。
問い~\ref{q:first} を参照。   % → 問い Q1 を参照
\end{document}

En définissant \thequestion avec \renewcommand, le format du numéro (Q + chiffre arabe) est concentré en un seul endroit et reste facile à changer plus tard. Le même réflexe vaut pour les longueurs : construisez des dimensions relatives à la largeur du texte (\textwidth), ou fixez-les en mesurant le contenu avec \settowidth, et votre document conserve ses proportions lorsque le format du papier ou les marges changent. Plutôt que de coder des valeurs fixes en dur, donnez-leur des noms et gérez-les au même endroit : c’est le bon réflexe pour utiliser compteurs et longueurs comme outils de programmation.