Marges et zone de page

Mettez \oddsidemargin à 0pt dans LaTeX et la marge gauche ne devient pas nulle : elle devient exactement un pouce. Cela ressemble à un défaut de conception, mais c’est une convention héritée de DVI : le point de référence d’une page se trouve à un pouce du coin supérieur gauche du papier, et chaque paramètre de marge mesure un écart par rapport à ce point. Ce seul fait change le regard sur toute la question des marges. Cette page explique d’où vient ce pouce, quelle zone de texte les classes standard composent réellement, et comment atteindre exactement une spécification de marges avec la réponse d’aujourd’hui, le package geometry — le tout avec des valeurs mesurées.

Pourquoi \oddsidemargin=0pt donne une marge d’un pouce

Parce que le point de référence n’est pas le coin de la feuille mais un point situé un pouce plus à l’intérieur. On peut le vérifier par la mesure : dans un article\oddsidemargin et \topmargin valent tous deux 0pt, demander à pdfTeX la position absolue du premier caractère donne 72.26999pt depuis le bord gauche, soit exactement 1.00000 pouce. La marge gauche réelle résulte donc de la somme suivante. \hoffset est le bouton qui déplace le point de référence lui-même, \oddsidemargin décale ensuite à partir de là. Remesuré avec \hoffset à 20pt, le bord gauche s’est déplacé à exactement 92.27pt (soit 72.27 + 20).

latex
% How the page is actually built up (all measured, article, letterpaper)
%   left margin        = 1in + \hoffset + \oddsidemargin
%   top of header      = 1in + \voffset + \topmargin
%   top of body        = top of header + \headheight + \headsep
%   first baseline     = top of body + \topskip

% The classical way, by hand. Correct, but you own every consequence.
\setlength{\oddsidemargin}{0pt}   % real left margin = 1in + 0pt = 1in
\setlength{\topmargin}{0pt}       % header top at 1in; body starts 37pt lower
\setlength{\textwidth}{16cm}      % the RIGHT margin is now whatever is left
\setlength{\textheight}{24cm}     % likewise the bottom margin

% Measured with the two margins above: left edge 72.26999pt = 1.00000in,
% first baseline 119.27pt from the paper top = 1in + 0 + 12 + 25 + 10

Le contenu de ce 1in mérite aussi un coup d’œil. Le pt de TeX est le point typographique américain, 72,27 au pouce — et non le point DTP ou PostScript, à 72 au pouce. TeX appelle ce dernier bp (big point) ; à la mesure, 1bp = 1.00374pt. 12pt et 12bp diffèrent donc d’environ 0,37 %. Invisible sur une ligne, mais appliquez la même fraction aux 345pt de \textwidth et cela fait 1,29pt, près d’un demi-millimètre. Sur un document dont les marges sont spécifiées en millimètres, se tromper d’unité peut faire sortir des clous. pdfTeX conserve ce décalage d’un pouce sous les noms \pdfhorigin et \pdfvorigin, tous deux à 72.26999pt par défaut.

ParamètreSens
\paperwidth / \paperheightDimensions du papier telles que LaTeX les comprend — pas la taille physique de la page PDF (voir plus bas)
\textwidth / \textheightLargeur et hauteur du corps (zone de texte) ; 345.0pt sur 550.0pt dans un article en 10pt
\oddsidemarginDéplacement de la marge gauche sur les pages impaires (toutes en oneside), depuis l’origine ; ajouter 1in
\evensidemarginIdem pour les pages paires en twoside ; par défaut 89.0pt dans un book en 10pt
\topmarginDistance de l’origine au haut de l’en-tête — pas au haut du corps
\headheightHauteur de la boîte contenant le titre courant ; 12.0pt par défaut
\headsepEspace entre l’en-tête et le haut du corps ; 25.0pt par défaut dans article
\footskipDistance de ligne de base entre la dernière ligne de texte et le pied ; 30.0pt par défaut
\marginparwidth / \marginparsepLargeur des notes marginales et leur écart au corps ; 65.0pt et 11.0pt dans un article en 10pt
\hoffset / \voffsetDéplacent le point de référence lui-même ; on les laisse normalement à 0pt

Dès qu’on veut régler cela à la main, le tableau devient une liste de pièges. Élargir \textwidth ne rétrécit pas la marge droite : celle-ci n’est que le reste de « largeur du papier − marge gauche − \textwidth » et change donc à votre insu. Et comme \topmargin ne va que jusqu’au haut de l’en-tête, descendre le corps à un pouce impose de soustraire soi-même \headheight et \headsep. Mesure : avec margin=1in passé à geometry, \topmargin vaut −37.0pt, exactement −(12 + 25). Plus aucune raison de refaire ce calcul soi-même.

Pourquoi les classes standard laissent tant de blanc : article et book mesurés

Pour maintenir le nombre de caractères par ligne dans une plage lisible. Un article en 10pt fixe \textwidth à 345.0pt quelle que soit la feuille : sur du Letter (614,295pt de large), il reste environ 134pt de chaque côté, et sur A4 (597,5pt de large) le texte fait toujours 345.0pt. Une feuille plus large n’achète pas des lignes plus longues, car la longueur de ligne doit se décider sur la lisibilité. Un corps plus grand élargit un peu le bloc — 360.0pt en 11pt, 390.0pt en 12pt — puisque de plus grandes lettres tiennent moins nombreuses dans la même mesure.

Classe (papier Letter)textwidthtextheightoddsidemarginevensidemargin
article345.0pt550.0pt62.0pt62.0pt
article, 11pt360.0pt541.4pt54.0pt55.0pt
article, 12pt390.0pt548.5pt39.0pt40.0pt
book345.0pt550.0pt35.0pt89.0pt

La ligne book contient toute la philosophie d’une mise en page recto-verso. Sur une page impaire, le côté gauche (côté reliure) fait 1in + 35.0pt = 107.27pt, et le côté droit, extérieur, reçoit les 162.02pt restants. Le book de LaTeX rend donc la marge extérieure plus large que la marge de reliure — l’inverse apparent de la règle habituelle. La raison : la marge extérieure est réservée comme logement des notes marginales (\marginpar), ce qui explique aussi que \marginparwidth atteigne 65.0pt. Sur les pages paires, les deux s’échangent et les 89.0pt d’\evensidemargin prennent le relais. Dans un document sans notes marginales, cette mise en page paraît simplement molle du côté extérieur — c’est là qu’intervient geometry.

Utiliser geometry : papier et marges en une ligne

Une ligne — \usepackage[a4paper, margin=25mm]{geometry} — règle à la fois le papier et les quatre marges. Les options se mettent entre les crochets de \usepackage ou, plus loin, dans une commande \geometry{...} ; c’est équivalent, et l’on peut l’appeler autant de fois qu’on veut dans le préambule, un réglage ultérieur de la même clé remplaçant le précédent. L’ordre n’a pas d’importance. Le package est de Hideo Umeki, sa ligne de copyright commence en 1996, et depuis 2018 il est maintenu par David Carlisle (TeX Live 2024 livre la v5.9, janvier 2020). Il est la réponse aux marges depuis un quart de siècle parce que son interface épouse l’ordre dans lequel on pense : tant de millimètres depuis le bord du papier.

OptionSens
a4paper / letterpaper / …Choisir la feuille par nom ; A0–A6, B0–B6, b5paper, a5paper, legalpaper, executivepaper, etc.
paperwidth= / paperheight= / papersize=Format libre ; papersize={210mm,297mm} donne les deux d’un coup
margin=Les quatre marges à la fois ; margin={A,B} signifie gauche/droite = A, haut/bas = B
left= / right= / top= / bottom=Chaque côté séparément ; lmargin, rmargin, tmargin, bmargin sont des alias
hmargin= / vmargin=Par paires : hmargin={gauche,droite} et vmargin={haut,bas}
inner= / outer=Marges de reliure et de gouttière en recto-verso ; alias de left et right
textwidth= / textheight= / total=Spécifier le bloc de texte plutôt que les marges ; total={largeur,hauteur} dimensionne tout le bloc, et width= / height= relèvent de la même famille
bindingoffset=Décalage de reliure ; ajoute cette longueur du côté intérieur (à gauche en oneside)
includehead / includefootCompter l’en-tête (\headheight + \headsep) ou le pied (\footskip) dans la hauteur du bloc
landscapeOrientation paysage ; échange largeur et hauteur
asymmetricEmpêche l’échange des marges entre pages impaires et paires, gardant les notes du même côté
showframeTrace effectivement les cadres du corps, de l’en-tête et du pied ; pour vérifier une consigne à l’œil

Respecter exactement une spécification de marges

Le plus court est de recopier les chiffres exigés directement dans les clés de geometry. Vérification chiffrée : en écrivant la consigne « A4, 30 mm côté reliure, 20 mm en gouttière, 5 mm de reliure, recto-verso » comme ci-dessous, la mesure donne \oddsidemargin = 27.31464pt et \evensidemargin = −15.36449pt. En ajoutant le pouce, le côté reliure d’une page impaire fait 99,5846pt = 35 mm (30 + 5), tandis que le bord gauche, extérieur, d’une page paire fait 56,9055pt, soit exactement 20 mm. Quel que soit l’échange des côtés, la marge de reliure reste à 35 mm et la gouttière à 20 mm.

document.tex
\documentclass[twoside]{book}
\usepackage{geometry}
\geometry{
  a4paper,
  inner=30mm,        % binding side
  outer=20mm,        % fore-edge
  bindingoffset=5mm, % added to the inner side
  includehead,       % count the header into the block height
}
% Measured result: \oddsidemargin 27.31464pt, \evensidemargin -15.36449pt
% -> binding side 35mm, fore-edge 20mm, on both odd and even pages
\begin{document}
Body text goes into this block.
\end{document}

Il vaut la peine de savoir vérifier le résultat. Ajouter showframe au préambule trace réellement les cadres du corps, de l’en-tête et du pied, et la commande \layout du package layout produit une page de schéma annotant chaque paramètre. Pour les chiffres bruts, affichez par exemple \the\textwidth avec \typeout et lisez le journal. Une mise en garde : spécifier à la fois marges et bloc de texte fait apparaître Package geometry Warning: Over-specification in h-direction. et geometry ignore discrètement l’une des valeurs. Donner gauche, droite et textwidth et tomber juste relève de la chance — la règle est de n’en spécifier que deux au plus et de laisser calculer le reste.

Vous avez demandé un format et le PDF sort dans un autre

Une option de classe indique seulement à LaTeX la taille du papier ; elle ne touche pas à la taille physique de la page du PDF. Ce sont deux variables distinctes. Mesure : avec \documentclass[a5paper]{article}, le \paperwidth de LaTeX passe à 421,10078pt tandis que le \pdfpagewidth de pdfTeX reste à 597,50787pt, la largeur de l’A4. Idem avec [letterpaper] et [b5paper] : la feuille du PDF reste à la valeur par défaut de la distribution TeX (a4 sur une TeX Live 2024 d’origine). Résultat : un PDF bancal, dont la mise en page a été calculée pour de l’A5 et dont la page est en A4.

Charger geometry résout la discordance tout seul. Dans les quatre cas mesurés où le papier était confié à geometry, \pdfpagewidth et \pdfpageheight correspondaient à \paperwidth et \paperheight. Confiez le format de papier à geometry, pas à l’option de classe — une règle de travail à retenir.

Changer les marges en cours de document : \newgeometry et \restoregeometry

Appelez \newgeometry{...} dans le corps et un nouveau bloc de texte prend le relais à partir de là. La commande réinitialise tout ce qui a été donné avant, sauf le format de papier, puis n’applique que les options transmises : l’écrire comme si elle corrigeait deux valeurs est la meilleure façon de provoquer un accident. Mesure : dans un document A4 avec margin=1in, \newgeometry{margin=1cm} a fait passer \textwidth de 452,9679pt à 540,60239pt (soit 597,50787 − 2 × 28,4526), et \restoregeometry l’a ramené à 452,9679pt. Les deux commandes insèrent un \clearpage ; le basculement ne tombe donc jamais en milieu de page. Pour réutiliser une mise en page, enregistrez-la avec \savegeometry{nom} et rappelez-la par \loadgeometry{nom}.

latex
\usepackage[a4paper, margin=1in]{geometry}
\savegeometry{normal}          % remember this layout under a name
% ... in the body:
\newgeometry{margin=1cm}       % wide pages start here (a \clearpage is inserted)
%   a big landscape table, an appendix, a fold-out figure ...
\restoregeometry               % back to the preamble layout (another \clearpage)
% \loadgeometry{normal}        % or recall a saved one by name

Pour insérer une seule page en paysage, combinez \newgeometry{landscape, ...} ou utilisez l’environnement landscape des packages dédiés lscape / pdflscape (pdflscape fait aussi pivoter l’affichage dans le lecteur PDF, ce qu’on veut pour une lecture à l’écran). Si ce que vous voulez changer n’est pas la forme de la page mais l’aspect des titres ou le contenu de l’en-tête et du pied, cela relève respectivement de titlesec et de fancyhdr. La composition en colonnes a également sa page.