Style de page avec L^{A}TEX

Piet van Oostrum^{∗} Dept. of Computer Science Utrecht University

2 mars 2004

Résumé

Cet article décrit comment adapter la disposition des éléments d’une page pour vos documents L^{A}TEX, c.-à-d. comment changer : les dimensions des marges, les en-têtes et les pieds de page ainsi que le placement approprié des figures et des tables – appelées flottants – sur la page. À l’origine c’était la documentation du package fancyheadings. Elle contenait également d’autres informations, par exemple sur l’utilisation avancée des marqueurs. Elle a maintenant été améliorée pour inclure notamment la manipulation des flottants. La documentation de fancyheadings a été améliorée pour se conformer à la version 2 de ce package^{1}. Pour des raisons de compatibilité avec certains systèmes d’exploitation, le nom du package a été à changé en fancyhdr.

Bien que cet article utilise les commandes de L^{A}TEX 2ε, la plupart des techniques peuvent être employées avec des versions plus anciennes de L^{A}TEX en effectuant quelques changements appropriés.

Notes de traduction. Ce texte est une traduction de la documentation du package fancyhdr, le titre original en est « Page layout in L^{A}TEX ».

Merci beaucoup à Piet van Oostrum pour cette extension et sa documentation. L’expression Style de page en L^{A}TEX s’applique au formatage des en-têtes et pieds de pages

et non pas à l’ensemble de la page comme dans d’autres logiciels. Cependant, dans cette documentation de fancyhdr, Piet van Oostrum fournit aussi des informations sur le placement des flottants. Lorsqu’une information due à la traduction, ou une précision, est rajoutée, elle apparait en note de bas de page précédée de « N.D.T. : ». Le terme package n’est pas traduit dans ce document, dès que l’on essaye L^{A}TEX il apparait, j’ai donc pris l’option de le conserver tel quel. Pour le préambule, adapté au français, des exemples voir dans la section 4. Cette traduction essaye de respecter la nouvelle (depuis 1990 quand même !) orthographe.

Table des matières

1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2

2 En-têtes et pieds de page . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

3 Qu’est ce que fancyhdr ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

4 Utilisation classique de fancyhdr . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

5 Un exemple simple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

6 Un exemple en impression recto-verso . . . . . . . . . . . . . . . . . . . . . . . . . 7 7 Redéfinition du style plain . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 8 Le style par défaut . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 9 Une exclusivité de L^{A}TEX, les marqueurs . . . . . . . . . . . . . . . . . . . . . . . . 9 10 En-têtes du style dictionnaire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 11 Fancy styles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 12 Largeur des en-têtes et des pieds de page . . . . . . . . . . . . . . . . . . . . . . . 13 13 Deux exemples de livres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 14 Style de page spécial pour flottants . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 15 Les pages blanches . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 16 Numérotation n/m et style de page . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 17 Numéros de page par chapitre ou section . . . . . . . . . . . . . . . . . . . . . . . . 17 18 Où placer les ordres de changement ? . . . . . . . . . . . . . . . . . . . . . . . . . . 17 19 En-têtes et pieds de page induits par le texte . . . . . . . . . . . . . . . . . . . . . 18 20 Pseudo film . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 21 Repères sur la tranche externe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 22 Placement des flottants . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 23 Flottants multipage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 23.1 Tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 23.2 Figures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 24 Contact pour information . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26

∗une considérable partie de cet article a été écrite par George Grätzer (University of Manitoba) dans Notices Amer. Math. Soc. Merci George !

1. cette version a du bénéficier d’une mise à jour maintenant.

1 Introduction

Une page dans un document L^{A}TEX est construite avec diverses zones décrites par la figure 1. Le corps de la page contient le texte principal du document ainsi que les éventuels flottants,

tables et figures.

Les pages sont construites par la routine de sortie de L^{A}TEX, qui est complexe et ne devrait donc pas être modifiée. Certains des packages décrits dans cet article contiennent de petites modifications de cette routine pour accomplir ce qui ne peut être réalisé d’une autre manière. Vous devriez employer ces packages pour obtenir le résultat désiré plutôt que de manipuler la routine de sortie vous-même.

Voici un certain nombre de points à retenir :

1. Les marges du côté gauche ne s’appellent pas \leftmargin, mais \evensidemargin (pour les pages paires) et \oddsidemargin (pour les pages impaires). Dans les documents uniquement recto \oddsidemargin est utilisé dans les deux cas. \leftmargin est un paramètre valide de L^{A}TEX mais lui a une utilisation différente (notamment l’indentation des listes).

2. La plupart des paramètres ne devraient pas être changés au milieu d’un document. Quelquesuns pourraient perdurer suite à une modification de style et/ou page. Si vous voulez changer la taille d’une seule page, vous pouvez employer la commande \enlargethispage.

La zone des notes de marge contient de petites informations créées par la commande \marginpar. Dans les documents recto-verso les notes de marge apparaissent alternativement sur la gauche et la droite. Les notes de marge ne sont pas sur des endroits fixes en ce qui concerne la page mais approximativement à la même hauteur que le paragraphe dans lequel elles sont appelées. En raison de l’algorithme traitant du placement des notes de marge, elles peuvent

[figure: Header; Body; Footer; Margin Notes; 8; 7; 1; 3; 10; 9; 11; 2; 4; 5; 6]

1   one inch + \hoffset        2   one inch + \voffset
3   \oddsidemargin = 18pt      4   \topmargin = 0pt
5   \headheight = 12pt         6   \headsep = 25pt
7   \textheight = 646pt        8   \textwidth = 424pt
9   \marginparsep = 11pt      10   \marginparwidth = 54pt
11   \footskip = 30pt               \marginparpush = 5pt (not shown)
    \hoffset = 0pt                 \voffset = 0pt
    \paperwidth = 597pt            \paperheight = 845pt

Fig. 1 – Zones composant une page. Les valeurs indiquées sont celles en cours dans ce document et non pas des valeurs par défaut. apparaitre malencontreusement – dans un document recto-verso – sur la mauvaise page si elles sont proches d’une coupure de page. Si vous voulez mettre l’information à des endroits fixes dans les marges vous pouvez employer la technique décrite dans les sections 20 et 21.

La première partie de cet article décrit comment changer les secteurs d’en-tête et de pied de page. La dernière partie décrit comment positionner vos flottants de la manière désirée.

2 En-têtes et pieds de page

Les en-têtes et pieds de page sont définis avec L^{A}TEX par les commandes \pagestyle et \pagenumbering. La commande \pagestyle définit l’aspect général des en-têtes et des pieds de page (par exemple où le numéro de page sera imprimé), alors que \pagenumbering définit le style du numéro de page. L^{A}TEX inclut quatre styles de page standards :

empty  vide, aucun en-tête ou pied de page
plain  pas d’en-tête, le pied de page contient le numéro de page centré

 headings

pas de pied de page, l’en-tête contient le nom du chapitre/section et/ou de sous-section et le numéro de page

 myheadings

pas de pied de page, l’en-tête contient le numéro de page et l’information fournie par l’utilisateur

Bien que ce soient des modèles utiles ils sont tout à fait limités. D’autres modèles de style de page peuvent être obtenus en définissant des commandes de la forme \ps@xxx. Cette commande est exécutée quand \pagestyle{xxx} est rencontrée dans le document. La commande \ps@xxx définit les commandes suivantes pour les teneurs des en-têtes et des pied de page :

 \@oddhead

en-tête sur les pages impaires dans des documents recto-verso (sur toutes les pages dans les documents recto)

\@evenhead en-tête sur les pages paires dans les document recto-verso

 \@oddfoot

pied de page sur les pages impaires dans des documents recto-verso (sur toutes les pages dans les documents recto)

\@evenfoot pied de page sur les pages paires dans les documents recto-verso

Ce ne sont pas des commandes, mais plutôt des « variables » qui sont utilisées par la routine de sortie de L^{A}TEX. Si les noms de commandes contiennent le caractère ’@’, elles doivent être définies dans un package^{2}, ou autrement comprises entre les commandes \makeatletter et \makeatother dans le préambule.

La commande \pagenumbering définit le style du numéro de page. Elle prend un paramètre de la liste suivante :

arabic  chiffre arabe
roman  chiffre romain en minuscule
Roman  chiffre romain en capitale
alph  lettre en minuscule
Alph  lettre en capitale

La commande \pagenumbering{xxx} définit \thepage en mettant le numéro de page comme défini par xxx. La commande de style de page inclut alors \thepage à la bonne place. De plus la commande \pagenumbering réinitialise le numéro de page à 1. Les commandes \pagestyle et \pagenumbering s’appliquent à la page en construction, elles doivent donc être positionnées sans ambigüité pour s’appliquer à la page voulue (voir la section 18 p.17).

2. N.D.T. : lui même appelé dans le préambule du document.

3 Qu’est ce que fancyhdr ?

Le package de macrocommandes fancyhdr permet d’adapter facilement vos en-têtes et pieds de page sous L^{A}TEX. Vous pouvez définir :

– trois zones dans les en-têtes et pieds de page ;

– des filets de séparation sous les en-têtes et au-dessus des pieds de page ;

– une plus grande largeur pour les en-têtes et pieds de page que celle du texte ;

– des en-têtes et pieds de page multilignes ;

– différents en-têtes et pieds de page pour les pages paires et impaires ;

– différents en-têtes et pieds de page pour les pages de titre de chapitre ;

– différents en-têtes et pieds de page pour les pages de flottants. Naturellement, vous avez également le contrôle complet des polices, de la casse, de la graisse, etc.

4 Utilisation classique de fancyhdr

Pour utiliser ce package dans un document L^{A}TEX 2ε placez le fichier fancyhdr.sty dans un répertoire accessible^{3} à TEX, et incluez dans le préambule de votre document après :

\documentclass{...}

les commandes^{4} :

\usepackage{fancyhdr}
\pagestyle{fancy}

Nous pouvons visualiser la disposition^{5} de page que nous créons avec fancyhdr comme suit :

en-tête gauche  en-tête centre  en-tête droit

corps de texte

pied de page gauche  pied de page centre  pied de page droit

L’en-tête gauche et le pied de page gauche sont alignés à gauche ; l’en-tête centre et le pied de page centre sont centrés ; l’en-tête droit et le pied de page droit sont alignés à droite.

Nous pouvons définir chacun des six « champs » et les deux filets de séparation séparément.

Précisions sur le préambule des exemples en français

Pour pouvoir traduire les exemples de codes et de résultats j’ai utilisé le préambule minimum suivant :

\documentclass{book}
\usepackage[latin1]{inputenc}% Saisie de caractères accentués directement.
\usepackage[T1]{fontenc}% Codage de sortie incluant les caractères accentués.

3. N.D.T. : en clair respectez la TEX Directory Structure et les commandes de mise à jour.

4. Pour L^{A}TEX 2.09 vous devriez indiquer [fancyhdr] dans \documentstyle au lieu de la commande \usepackage.

5. N.D.T. : Ce n’est pas le style par défaut de fancy, uniquement les éléments créés par fancyhdr.sty

\usepackage{lmodern}% Fonte incluant les caractères accentués.
\usepackage{fancyhdr}
\pagestyle{fancy}
ICI les exemples de code
\usepackage[frenchb]{babel}% traduction des noms chapitre, section, etc.

5 Un exemple simple

H. Dupont écrit un rapport à J.-P. Martin intitulé « La valeur des nouveaux diplômés » avec la disposition de page suivante :

La valeur des nouveaux diplômés

corps du texte

de : H. Dupont  pour : J.-P. Martin  3

où « 3 » est le numéro de page. Le titre : « La valeur des nouveaux diplômés » est en gras.

Ceci est accompli par les commandes suivant \pagestyle{fancy}^{6} soit :

\lhead{}
\chead{}
\rhead{\bfseries La valeur des nouveaux diplômés}
\lfoot{de : H. Dupont}
\cfoot{pour : J.-P. Martin}
\rfoot{\thepage}
\renewcommand{\headrulewidth}{0.4pt}
\renewcommand{\footrulewidth}{0.4pt}

(la macro \thepage donne le numéro de la page courante. Utiliser \bfseries est une manière sous L^{A}TEX 2ε d’obtenir les caractères en gras.)

C’est maintenant parfait sauf que la première page, en utilisant \documentclass{article} ou si vous démarrez par une section (bizarre…) dans les classes report et book^{7}, n’a pas besoin de tous ces en-têtes et pieds de page. Pour éliminer tout sauf le numéro de page, centré dans le pied de page :

\thispagestyle{plain}

Juste après \begin{document} ou une autre alternative :

\thispagestyle{empty}

si vous voulez l’en-tête et le pied de page vides.

Si vous utilisez \maketitle ce n’est pas utile, car la norme des classes L^{A}TEX définit la commande \maketitle de telle sorte qu’elle appelle \thispagestyle{plain} automatiquement. Donc si vous voulez utiliser le style de fancy sur la page incluant \maketitle il vous faut utiliser

\thispagestyle{fancy} juste après l’appel à \maketitle.

6. notez que la version 1 de fancyheadings utilise la commande \setlength pour changer les paramètres de \...rulewidth.

7. N.D.T. : précisions rajoutées lors de la traduction.

6 Un exemple en impression recto-verso

Plusieurs classes de documents, comme book.cls, impriment en recto-verso par défaut, les pages paires et impaires ont alors une présentation différente. D’autres classes de document utilisent l’option twoside pour imprimer en recto-verso.

Maintenant imprimons le rapport en recto-verso. Laissez la disposition de page de la section 5 pour les pages impaires (du côté droit) et la suivante pour les pages paires (du côté gauche) :

La valeur des nouveaux diplômés

corps du texte

4  de : H. Dupont  pour : J.-P. Martin

où « 4 » est le numéro de page.

Voici les commandes :

\fancyhead{} % vide l'en-tête
\fancyhead[RO,LE]{\bfseries La valeur des nouveaux diplômés}
\fancyfoot{} % vide le pied~de~page
\fancyfoot[LE,RO]{\thepage}
\fancyfoot[LO,CE]{de : H. Dupont}
\fancyfoot[CO,RE]{pour : J.-P. Martin}
\renewcommand{\headrulewidth}{0.4pt}
\renewcommand{\footrulewidth}{0.4pt}

nous employons ici les commandes \fancyhead et \fancyfoot sous leur forme non abrégée. Celles-ci ont un paramètre additionnel entre crochets indiquant pour quelles pages et/ou parties de l’en-tête/pied de page elles s’appliquent. La première commande \fancyhead omet ce paramètre, et s’applique ainsi à tous les champs d’en-tête. Elle est utilisée en général pour se débarrasser des valeurs par défaut ou d’une définition précédente, comme ici. De même \fancyfoot sans paramètre (entre accolades) vide tous les champs du pied de page. Dans cet exemple particulier il pourrait être omis puisque tous les champs du pied de page sont ensuite remplis. Les sélecteurs qui peuvent être utilisés entre les crochets sont listés dans la figure 2. Ces sélecteurs peuvent être combinés, ainsi \fancyhead[LE,RO]{texte} définira le champ pour l’en-tête gauche des pages paires et l’entête droit des pages impaires. Si vous n’indiquez pas E ou O la définition s’applique aux deux. De même pour L R et C. Ainsi l’utilisation de \lhead dans la section précédente est juste l’abréviation de \fancyhead[L]. Les sélecteurs peuvent être écrits en capitales ou en minuscules.

Il y a également la commande plus générale \fancyhf que vous pouvez employer pour combiner les caractéristiques des en-têtes et des pieds de page. Ceci uniformise les H (en-tête) et F (pied de page). En fait \fancyhead \fancyfoot équivalent à \fancyhf avec H ou F spécifiés.

Vous pouvez toujours utiliser \thispagestyle{plain} pour obtenir le style classique en première page.

7 Redéfinition du style plain

Certaines commandes L^{A}TEX , comme \chapter et \maketitle, emploient \thispagestyle pour commuter automatiquement au style de page plain, ignorant le style de page actuellement en cours. Pour adapter même de telles pages vous devez redéfinir le style plain. Comme nous l’avons déjà indiqué vous pourriez faire ceci en redéfinissant la commande \ps@plain, mais fancyhdr fournit une manière plus simple avec la commande \fancypagestyle. Celle ci peut être employée pour redéfinir les styles de page existants (comme plain) ou pour en créer de nouveaux, par exemple si des parties de votre document nécessitent un style de page différent. Cette commande a deux paramètres : le premier étant le nom du style de page à (re)définir, le second contenant les commandes changeant les en-têtes et/ou les pieds de page, c.-à-d. fancyhead, etc. Cela permet aussi les changements de \headrulewidth et de \footrulewidth. À titre d’exemple nous allons redéfinir le style plain du rapport de la section 6 en mettant le numéro de page en gras.

\fancypagestyle{plain}{%
\fancyhf{} % vide l'en-tête et le pied~de~page.
\fancyfoot[C]{\bfseries \thepage} % numéro de la page en cours en gras
  % et centré en pied~de~page.
\renewcommand{\headrulewidth}{0pt}
\renewcommand{\footrulewidth}{0pt}}

8 Le style par défaut

Employons la classe de document book.cls et les paramètres par défaut de fancyhdr, nous utilisons alors seulement les commandes ;

\usepackage{fancyhdr}
\pagestyle{fancy}

et laissons fancyhdr s’occuper de tout. Aux pages où les nouveaux chapitres débutent, nous obtenons un numéro de page centré dans le pied de page, sans en-tête ni filet de séparation.

Sur les pages paires nous obtenons la disposition :

1.2 ÉVALUATION CHAPITRE 1. INTRODUCTION

corps du texte

4

Sur les pages impaires nous obtenons la disposition :

E page paire  Even page en anglais
O page impaire Odd page en anglais
L champ gauche Left field en anglais
C champ centre Center field en anglais
R champ droit  Right field en anglais
H en-tête  Header en anglais
F pied de page Footer en anglais

Fig. 2 – Sélecteurs CHAPITRE 1. INTRODUCTION 1.2 ÉVALUATION

corps du texte

3

où le texte d’en-tête est en capitales inclinées.

Cette disposition par défaut est obtenue par les commandes suivantes :

\fancyhead[LE,RO]{\slshape \rightmark}
\fancyhead[LO,RE]{\slshape \leftmark}
\fancyfoot[C]{\thepage}

Les paramètres suivants sont employés pour les filets de séparation :

 \headrulewidth  0.4pt
 \footrulewidth  0pt

Le texte d’en-tête est transformé en majuscule dans tout book.cls.

9 Une exclusivité de L^{A}TEX, les marqueurs

Habituellement, pour des documents des classes book et report, les intitulés de chapitre et de section apparaissent dans les en-têtes (chapitre seulement pour l’impression recto) et pour des documents de classe article, ceux de section et subsection (section seulement pour l’impression recto). L^{A}TEX utilise un mécanisme de marqueurs pour repérer les sectionnements et leurs intitulés par page, pour plus de détails consultez le L^{A}TEX Companion, section 4.3.1.

Il existe deux façons de manipuler les informations du sectionnement de niveau le plus élevé et de celui le plus bas dans une page. Les macros \leftmark(niveau-haut) et \rightmark (niveaubas) contiennent les informations utilisées par L^{A}TEX et elles sont utilisables directement comme montré dans la section 8.

Le marqueur \leftmark contient l’argument de gauche (principal) du dernier \markboth de la page. Le marqueur \rightmark contient l’argument de droite (secondaire) du premier \markboth ou le seul argument du premier \markright de la page. Si aucune marque n’est présente dans une page elles sont « héritées » de la page précédente.

Vous pouvez moduler la façon dont les informations de chapitre, de section et de sous-section (seulement deux d’entre elles !) sont affichées en redéfinissant les commandes \chaptermark, \sectionmark et \subsectionmark^{8}. Vous devez créer ces redéfinitions après le premier appel de \pagestyle{fancy} puisque celui-ci leur donne des valeurs par défaut.

Illustrons ceci avec l’information de chapitre. Elle se compose de trois parties :

– le nombre (ici 2), affiché par la macro \thechapter

– le nom (en français ; chapitre), affiché par la macro \chaptername

– le titre, stocké dans l’argument de \chaptermark.

La figure 3 affiche plusieurs variantes de « chapitre 2. À faire de suite ». Le signe % à la fin des lignes est pour éviter les espaces non voulus. Si vous écrivez tout sur la même ligne il faut ôter ces signes %^{9}.

8. Il existe les commandes similaires pour paragraph et subparagraph mais elles sont rarement utilisées.

9. La commande \MakeUppercase est utilisée par L^{A}TEX 2ε pour obtenir un texte en capitales, en L^{A}TEX 2.09 il

Le code :

\renewcommand{\chaptermark}[1]{%
 \markboth{\chaptername
 \ \thechapter.\ #1}{}}
\renewcommand{\chaptermark}[1]{%
 \markboth{\MakeUppercase{%
 \chaptername}\ \thechapter.%
 \ #1}{}}
\renewcommand{\chaptermark}[1]{%
 \markboth{\MakeUppercase{%
 \chaptername\ \thechapter.%
 \ #1}}{}}
\renewcommand{\chaptermark}[1]{%
 \markboth{#1}{}}
\renewcommand{\chaptermark}[1]{%
 \markboth{\thechapter.\ #1}{}}
\renewcommand{\chaptermark}[1]{%
 \markboth{\thechapter.%
 \ \chaptername.\ #1}{}}

Affiche :

Chapitre 2. À faire de suite

CHAPITRE 2. À faire de suite

CHAPITRE 2. À FAIRE DE SUITE

remarque : ci-dessus la valeur par défaut de fancy

À faire de suite

2. À faire de suite

2. Chapitre. À faire de suite

Fig. 3 – Variations de présentation grâce aux marqueurs

Pour l’information de sectionnement la plus basse l’on utilisera la commande \markright. Ainsi si « Section 2.2. Premiers pas » est la section courante :

\renewcommand{\sectionmark}[1]{\markright{\thesection.\ #1}}

va produire : « 2.2. Premiers pas ».

Redéfinir les commandes \chaptermark et \sectionmark n’éliminera pas toute les mises en capitales. Par exemple la bibliographie aura un titre tel que bibliographie dans l’en-tête, car la commande \MakeUppercase est explicitement écrite dans la définition de \thebibliography. Idem pour index, etc. Si vous ne voulez pas redéfinir ces commandes, vous pouvez employer la commande \nouppercase de fancyhdr disponible pour les zones d’en-tête et de pied de page. Notez que ceci peut s’appliquer à d’autres choses, comme les numéros en chiffres romains en capitales dans vos en-têtes, il faut donc l’employer avec précaution. Cette commande formate son argument dans un environnement en manipulant \MakeUppercase et \uppercase pour ne pas qu’ils produisent leur effet.

\lhead{\nouppercase{\rightmark}}
\rhead{\nouppercase{\leftmark}}

Il convient de noter que les mécanismes de marqueurs de L^{A}TEX fonctionnent très bien avec les chapitres (qui commencent toujours sur une nouvelle page) et les sections assez longues. Cela ne fonctionne pas tout à fait aussi bien avec des sections et des sous-sections courtes. C’est un problème de L^{A}TEX, pas de fancyhdr.

s’agit de \uppercase. La différence étant que \MakeUppercase fonctionne avec des caractères non-ASCII. Fancyhdr définit \MakeUppercase comme un alias de \uppercase s’il n’est pas déjà défini.

Comme exemple utilisons un style de page où les leftmark(s) sont produits par les sections et les rightmark(s) par les sous-sections (par défaut dans la classe article). Prenons une page avec quelques sections courtes, par exemple :

Section 1. ICI un texte suffisant pour remplir une page et un peu de la seconde. subsection 1.1 subsection 1.2 Section 2.

Alors que leftmark contient le dernier marqueur principal de la page, soit « section 2. », rightmark contient lui le premier marqueur secondaire de cette page, donc « subsection 1.1 ». Ainsi l’en-tête de cette page combinera section 2 avec subsection 1.1, ce qui n’est pas très logique. Le mieux que vous puissiez faire dans ces cas là est d’utiliser uniquement les \rightmarks et de redéfinir \sectionmark en conséquence. Le commande L^{A}TEX \firstleftmark pourra alors vous être utile (voir le package extramarks dans la section 19).

Un autre problème avec les marqueurs dans la norme des classes L^{A}TEX est que les commandes de sectionnement de plus haut niveau (par exemple \chapter) appellent \markboth avec un argument de droite vide. Ceci signifie qu’à la première page d’un chapitre (ou d’une section dans la classe article) \rightmark sera vide. Si ceci vous pose problème, vous devrez insérer directement une commande \markright ou redéfinir les commandes \chaptermark (\sectionmark) pour obtenir \markboth avec deux paramètres valides.

Comme remarque finale, veuillez noter que les formes * des commandes \chapter, etc. ne produisent pas de marqueur. Ainsi si vous souhaitez que Préface apparaisse dans l’en-tête, mais ne soit ni numérotée ni mise dans la table des matières, vous devez créer \markboth vous-même, par exemple :

\chapter*{Préface\markboth{Préface}{}}

Entrer \markboth à l’intérieur de la commande \chapter* assure que la marque ne sera pas séparée du titre par une coupure de page. Naturellement avec \chapter* ceci ne serait pas un problème même si vous mettez la commande de marqueur après le titre de chapitre, car \chapter* commence une nouvelle page. Cependant avec la commande \section* il pourrait être dangereux de faire :

\section*{Préface}
\markboth{Préface}{}

car une coupure de page peut advenir entre les deux commandes.

10 En-têtes du style dictionnaire

Dictionnaires et index ont habituellement un en-tête contenant le premier mot défini sur la page ou les premier et dernier mots. Ceci peut facilement être obtenu avec fancyhdr et le mécanisme des mark de L^{A}TEX. Bien entendu si vous utilisez les marqueurs pour un style d’en-têtes dictionnaire vous ne pouvez pas les utiliser pour l’information sur les chapitres et sections. Donc si vous avez en même temps des chapitres et/ou sections présents vous devez redéfinir \chaptermark et \sectionmark pour les rendre inactifs :

\renewcommand{\chaptermark}[1]{}
\renewcommand{\sectionmark}[1]{}

Ensuite vous écrivez \markboth{#1}{#1} pour chaque entrée #1 du dictionnaire ou de l’index et vous utilisez \rightmark pour obtenir la première entrée et \leftmark pour la dernière présentes sur la page.

Si vous désirez obtenir un en-tête de la forme premier-mot/dernier-mot il est souhaitable d’avoir seulement premier-mot si les deux sont identiques. Ceci arrive lorsqu’il n’y a qu’une entrée sur la page. Dans ce cas un test doit être réalisé pour vérifier si les marqueurs sont identiques. Les marqueur de TEX sont cependant des bêtes étranges ne pouvant être comparés hors d’une boite avec une commande plain TEX. Heureusement le package ifthen fonctionne bien, donc pour réaliser cela il faut écrire :

\usepackage{ifthen}
\newcommand{\mymarks}{
  \ifthenelse{\equal{\leftmark}{\rightmark}}
    {\rightmark} % si égaux
    {\rightmark--\leftmark}} %si différents
\fancyhead[LE,RO]{\mymarks}
\fancyhead[LO,RE]{\thepage}

Les dictionnaires sont souvent composés sur deux colonnes. Malheureusement un bug de l’option twocolum de L^{A}TEX cause la perte des marqueurs. Pour éviter ce problème vous pouvez utiliser le package fisx2col.sty de David Carlisle .

11 Fancy styles

Vous pouvez faire un champ sur plusieurs lignes avec la commande \\. Vous pouvez aussi rajouter un espace vertical supplémentaire dans une zone avec la commande \vspace. Notez que si vous faites ceci vous devrez probablement augmenter la taille de l’en-tête (\headheight) et/ou du pied de page (\footskip) sinon vous obtiendrez des messages d’erreur « Overfull \vbox …has occurred while \output is active »^{10}. Voir la section 4.1 du L^{A}TEX Companion pour plus de détails.

Par exemple, le code suivant placera, dans le coin supérieur droit, le titre de section et le titre de sous-section d’un article sur deux lignes :

\documentclass{article}
\usepackage{fancyhdr}
\pagestyle{fancy}
\addtolength{\headheight}{\baselineskip}
\renewcommand{\sectionmark}[1]{\markboth{#1}{}}
\renewcommand{\subsectionmark}[1]{\markright{#1}}
\rhead{\leftmark\\\rightmark}

Vous pouvez aussi paramétrer les filets de séparation. Par exemple pour épaissir le filet sous l’en-tête :

\renewcommand{\headrulewidth}{0.6pt}

ou pour faire disparaitre le filet en pied de page^{11} :

\renewcommand{\footrulewidth}{0pt}

10. si vous employez une taille de 11pt ou 12pt vous devrez probablement aussi le faire car les valeurs par défaut de L^{A}TEX sont plus petites

11. N.D.T. : Ce qui est l’option par défaut de \pagestyle{fancy}

Les filets de séparation sont eux mêmes définis par deux macros, \headrule et \footrule. Par exemple, si vous préférez un filet en pointillé plutôt que continu dans l’en-tête, redéfinissez la

commande \headrule :
\renewcommand{\headrule}{\vbox to 0pt{\hbox
    to\headwidth{\dotfill}\vss}}

Il existe un paramètre additionnel que vous pouvez utiliser : \footruleskip. Il définit la distance entre le filet de séparation du pied de page et le dessus de la ligne du texte de ce pied de page. Par défaut il est placé à 30% de la valeur entre deux lignes classiques. Vous pouvez vouloir l’ajuster si vous employez des polices inhabituellement grandes ou petites dans le pied de page. Changez sa

valeur avec \renewcommand.

12 Largeur des en-têtes et des pieds de page

La largeur des en-têtes et des pieds de page est \headwidth, qui par défaut égale \textwidth donc la largeur du corps de texte. Vous pouvez élargir ou rétrécir ces zones là avec les commandes

\fancyheadoffset, \fancyfootoffset et \fancyhfoffset^{12}. Elles sont similaires à \fancyhead,

\fancyfoot et \fancyhf. La seule différence est que les commandes de décalages n’acceptent pas l’option C (centre).

Utilisation : \fancyhfoffset[place]{length}^{13} et de même pour les autres.

Elle définit des décalages à appliquer aux en-têtes et pieds de pages, élargir dans les marges si la longueur (length) est > 0 et rétrécir si cette longueur est < 0. L’utilisation est semblable à celle de \fancyhead, en utilisant uniquement les sélecteurs (voir figure 2, p. 8) E, O, L, R ou e, o, l, r pour indiquer la ou les zones à traiter.

Avec ces commandes \headwidth sera calculée dynamiquement pour obtenir une dimension d’en-tête et de pied de page ayant pour valeur \textwidth + décalage-gauche + décalage-droit. L’exemple suivant^{14} permet de créer un filet de la largeur voulue (10pt+largeur du texte+10pt), rouge en en-tête et bleu en pied de page (veuillez noter que la largeur du pied de page s’appelle aussi \headwidth bien que sa valeur puisse différer de celle de l’en-tête) :

\fancyhfoffset{10pt}
\renewcommand{\headrule}{{%
 \color{red}\hrule \headwidth \headrulewidth \vskip-\headrulewidth}}
\renewcommand\footrulewidth{\headrulewidth}
\renewcommand{\footrule}{{%
 \color{blue}\vskip-\footruleskip\vskip-\footrulewidth
 \hrule \headwidth \footrulewidth\vskip\footruleskip}}

13 Deux exemples de livres

Les définitions suivantes donnent une approximation du style utilisé par Leslie Lamport pour le L^{A}TEX book.

L’en-tête du L^{A}TEX book de Lamport surplombe la marge extérieure. Ceci est obtenu avec les commandes de décalage décrites dans la section précédente.

12. ces commandes sont définies depuis la version 3.0 de fancyhdr. Dans les versions plus anciennes vous pouvez juste changer \headwidth avec les commandes \setlength et \addtolength. Vous êtes encouragés à employer les nouvelles commandes de décalage à la place. Vous ne pouvez absolument pas mélanger les deux approches.

13. N.D.T. : et l’utilisation du package calc pour automatiser le calcul.

14. N.D.T. : exemple corrigé, merci A.S.

\documentclass{book}
\usepackage{fancyhdr}
\pagestyle{fancy}
\usepackage{calc}
\fancyheadoffset[LE,RO]{\marginparsep+\marginparwidth}
\renewcommand{\chaptermark}[1]{\markboth{#1}{}}
\renewcommand{\sectionmark}[1]{\markright{\thesection\ #1}}
\fancyhf{}
\fancyhead[LE,RO]{\bfseries\thepage}
\fancyhead[LO]{\bfseries\rightmark}
\fancyhead[RE]{\bfseries\leftmark}
\fancypagestyle{plain}{%
   \fancyhead{} % rien en en-tête
   \renewcommand{\headrulewidth}{0pt} % et pas de filets
}

Notez que les commandes \chaptermark et \sectionmark ont été redéfinies pour éliminer le numéro de chapitre ainsi que la mise en capitale.

Pour le second exemple nous prenons le livre AMS-L^{A}TEX.

Les pages de chapitre n’ont aucun en-tête ou pied de page. Ainsi nous utilisons :

\thispagestyle{empty}

pour chaque page de chapitre et nous n’avons pas besoin de redéfinir le style plain.

Les titres de chapitre et de section apparaissent sous la forme : 2. À FAIRE DE SUITE, nous devons donc redéfinir \chaptermark et \sectionmark (voir section 9) comme suit :

\renewcommand{\chaptermark}[1]%
   {\markboth{\MakeUppercase{\thechapter.\ #1}}{}}
\renewcommand{\sectionmark}[1]%
   {\markright{\MakeUppercase{\thesection.\ #1}}}

Dans un en-tête de page paire, le numéro de page est imprimé dans le champ gauche et le titre du chapitre dans le champ droit ; dans un en-tête de page impaire, le titre de section est imprimé dans le champ gauche et le numéro de page dans le champ droit. Le champ centre reste toujours vide. Il n’y a aucun pied de page.

Il y a un filet de séparation dans l’en-tête, d’une épaisseur de 0.5pt. Nous déclarons donc les commandes :

\renewcommand{\headrulewidth}{0.5pt}
\renewcommand{\footrulewidth}{0pt}

La police Helvetica en 9 pt grasse est utilisée dans les en-têtes. Le système PSNFSS de Sebastian Rahtz emploie le nom court (Karl Berry ) phv pour l’Helvetica, donc nous utiliserons :

\fontfamily{phv}\fontseries{b}\fontsize{9}{11}\selectfont

dans notre cas (voir les sections 7.6.1 et 11.9.1 du L^{A}TEX Companion.) Définissons un raccourci pour cela :

\newcommand{\helv}{%
   \fontfamily{phv}\fontseries{b}\fontsize{9}{11}\selectfont}

Nous sommes prêts maintenant pour le style de page :

\documentclass{book}
\usepackage{fancyhdr}
\pagestyle{fancy}
\renewcommand{\chaptermark}[1]%
   {\markboth{\MakeUppercase{\thechapter.\ #1}}{}}
\renewcommand{\sectionmark}[1]%
   {\markright{\MakeUppercase{\thesection.\ #1}}}
\renewcommand{\headrulewidth}{0.5pt}
\renewcommand{\footrulewidth}{0pt}
\newcommand{\helv}{%
   \fontfamily{phv}\fontseries{b}\fontsize{9}{11}\selectfont}
\fancyhf{}
\fancyhead[LE,RO]{\helv \thepage}
\fancyhead[LO]{\helv \rightmark}
\fancyhead[RE]{\helv \leftmark}

14 Style de page spécial pour flottants

Certains souhaitent une disposition spéciale pour les pages contenant uniquement des flottants. Ces pages sont produites automatiquement par L^{A}TEX, l’utilisateur n’ayant aucun contrôle sur elles. Il n’existe pas de \thispagestyle pour les pages de flottants et toute tentative de changement du style de ces pages affectera la page avant celle composée de flottants. Avec fancyhdr, cependant, vous pouvez indiquer dans chacun des champs d’en-tête ou de pied de page

\iffloatpage{valeur pour la page}{valeur pour les autres pages}

N.D.T. : les textes de tous les en-têtes ou de pieds de page sont alors droits, pour retrouver le

style penché il faut alors taper : \lhead{\slshape \iffloatpage{}{\rightmark}} pour, dans

cet exemple, un en tête gauche vide (page de flottants) ou avec le contenu du marqueur rightmark. Fin N.D.T.

Vous pouvez même employer ceci pour supprimer le filet de séparation des pages de flottants uniquement en redéfinissant :

\renewcommand{\headrulewidth}{\iffloatpage{0pt}{0.4pt}}

Parfois vous pouvez aussi vouloir changer de style pour les pages contenant un flottant en haut de page ou en bas de page.

fancyhdr fournit les commandes \iftopfloat et \ifbotfloat similaires à \iffloatpage.

Note : Les marqueurs dans des flottants ne sont pas visibles par la routine de sortie de L^{A}TEX il n’est pas donc pas utile d’utiliser des marqueurs avec les flottants. Donc il n’y a actuellement aucune manière d’insérer un titre de figure, par exemple, dans un en-tête ou un pied de page

15 Les pages blanches

Dans la classe book quand l’option openany n’est pas stipulée, ou dans la classe report quand l’option openright est utilisée, les chapitres commencent sur des pages impaires, en provoquant l’insertion d’une page blanche la moitié du temps. L’on peut souhaiter que cette page soit absolument vide, c.-à-d. sans en-têtes ni pieds de page. Ceci ne peut pas être obtenu avec \thispagestyle car cette commande devrait être écrite sur la page précédente. Aucune magie n’est cependant nécessaire pour obtenir cela :

\clearpage{\pagestyle{empty}\cleardoublepage}

Comme \pagestyle{empty} est enfermée dans un groupe elle affecte seulement la page qui peut être produite par \cleardoublepage. Vous pouvez bien sûr mettre ce qui précède dans une commande personnelle. Si vous voulez une exécution automatique de ceci à chaque début de chapitre et si vous voulez une note spécifique pour ces pages vous devez redéfinir \cleardoublepage comme ci-dessous^{15} :

\makeatletter
\def\cleardoublepage{\clearpage\if@twoside \ifodd\c@page\else
  \hbox{}
  \vspace*{\fill}
  \begin{center}
    Cette page contient uniquement cette phrase intentionnellement.
  \end{center}
  \vspace{\fill}
  \thispagestyle{empty}
  \newpage
  \if@twocolumn\hbox{}\newpage\fi\fi\fi}
\makeatother

16 Numérotation n/m et style de page

Quelques auteurs de documents préfèrent une numérotation de pages du type n/m où m est le nombre de pages du document. Il y a un package nofm.sty disponible, mais plusieurs de ses versions sont défectueuses et la plupart ne fonctionnent pas avec fancyhdr car elles redéfinissent complètement le style de page. Pour L^{A}TEX 2ε il existe le package lastpage que vous pouvez employer avec fancyhdr comme suit :

\usepackage{lastpage}
...
\cfoot{\thepage/\pageref{LastPage}}

Si vous êtes toujours utilisateur de L^{A}TEX 2.09 et ne souhaitez pas passer à L^{A}TEX 2ε vous devez utiliser le package lastpage209.sty compatible L^{A}TEX 2.09 comme suit :

\let\origenddocument=\enddocument
\def\enddocument{\clearpage\if@filesw
  {\addtocounter{page}{-1} \immediate\write\@mainaux
    {\string\newlabel{LastPage}{{}{\thepage}}}}\origenddocument}

La valeur de l’étiquette LastPage peut être employée pour obtenir un en-tête ou pied de page différent sur la dernière page d’un document. Par exemple si vous voulez le pied de page des pages impaires, excepté la dernière si elle est impaire, contenant le texte « tournez s.v.p. », ceci peut être obtenu comme suit^{16} :

\usepackage{lastpage}
\usepackage{ifthen}

15. N.D.T. : les lignes de \vspace*{\fill} à \vspace{\fill} inclues permettent l’affichage de la note, otez-les pour obtenir une page absolument vide.

16. ceci exige une version assez récente du package ifthen.

...
\rfoot{\ifthenelse{\isodd{\value{page}} \and \not
    \value{page}=\pageref{LastPage}}{tournez s.v.p.}{}}

17 Numéros de page par chapitre ou section

Très souvent dans une documentation technique les numéros de page sont notés sous la forme 2-10 où le premier nombre est le numéro du chapitre et le second est le numéro de page relativement à ce chapitre. Parfois la section est employée plutôt que chapitre. Le package chappg peut être employé pour obtenir ce format. Si vous voulez changer la disposition, par exemple un point plutôt qu’un tiret, ou une section plutôt qu’un chapitre, vous devriez réaliser une copie privée, puis éditer cette dernière pour la modifier comme vous le souhaitez.

   Ce package redéfinit \thepage comme \arabic{chapter}-\arabic{page}. Malheureusement

ceci donne des nombres plutôt que des lettres pour les annexes. Une meilleure définition est \thechapter-\arabic{page} mais vous devez vous-même inscrire cette définition après \usepackage{chappg}. De même ce package réinitialise le numéro de page à 1 au début de chaque chapitre.

Il y a une différence fondamentale entre la numérotation de page du style « n/m » comme décrit dans la section précédente et celui ci. Le style « n/m » est uniquement employé dans l’en-tête ou le pied de page, mais pas dans la table des matières, l’index, ou les références comme « voir page xx ». Par conséquent il ne modifie pas la commande \thepage. Les numéros de page du style « 2-10 », toutefois, doivent être employés dans toutes les références au numéro de page, donc ils doivent être obtenus par la redéfinition de \thepage.

18 Où placer les ordres de changement d’en-têtes et de pieds de page ?

Parfois l’on souhaite changer la disposition d’en-tête ou de pied de page en cours de document. Certains de ces changements peuvent être accomplis en employant le mécanisme des marqueurs comme indiqué dans les sections 9 et 19. Cependant, l’on veut quelquefois un changement plus radical, par exemple pour changer le style des chiffres du romain vers l’arabe (avec \pagenumbering), pour changer un des champs obtenus par fancyhdr ou pour passer à un autre style de page. Quelquefois le changement peut se produire plus tôt que souhaité. En général les changements mentionnés ci-dessus prennent effet immédiatement, c.-à-d. à la page en construction à ce moment là. Si vous désirez que le changement prenne effet à la prochaine page vous devez vous assurer que la page courante est terminée. Dans la plupart des cas ceci peut être fait en écrivant \clearpage avant les changements mentionnés ci-dessus. Si ce n’est pas possible vous pouvez employer : le package

afterpage avec :
\afterpage{\lhead{nouvelle valeur}} ou \afterpage{\pagenumbering{roman}}

Vous ne pouvez pas avec la commande \afterpage modifier \pagestyle. \afterpage agit localement dans un groupe, donc à la fermeture de celui-ci les redéfinitions d’\afterpage ne font plus effet. En revanche, les commandes \pagenumberging et toutes celles de fancyhdr effectuent des modifications globales et fonctionneront donc comme la commande \thispagestyle.

Il convient de noter que bien que les commandes de fancyhdr comme \fancyhead prennent effet immédiatement, ceci ne signifie pas que toutes les « variables » utilisées dans ces commandes obtiennent leur valeur à l’endroit où ces instructions sont données. Par exemple si \fancyfoot[C]{\thepage} est écrit, le numéro de page qui sera inséré dans le pied de page n’est pas le numéro de la page où cette instruction est écrite, mais plutôt le numéro de la page où le pied de page est construit. Pour le numéro de page c’est naturellement ce qui est voulu, mais ce mécanisme est identique pour d’autres commandes.

Ainsi avec un livre dont chaque chapitre est écrit par un auteur différent, si vous voulez le nom de l’auteur du chapitre dans le coin inférieur gauche vous pouvez employer les commandes suivantes :

\newcommand{\TheAuthor}{}
\newcommand{\Author}[1]{\renewcommand{\TheAuthor}{#1}}
\lfoot{\TheAuthor}

et commencer chaque chapitre avec la commande \Author{Nom de l'auteur du chapitre}. Cependant, si le nom de l’auteur change avant la construction de la page, le mauvais nom pourrait apparaitre en pied de page. Ce serait le cas si vous donniez l’instruction ci-dessus avant la commande \chapter plutôt qu’après elle. Une autre source de problèmes, le fonctionnement de la routine de sortie de TEX produit des éléments en amont de la zone traitée, ainsi le traitement de certaines commandes produit du texte qui paraitra à la page suivante. La prochaine section en fournit un exemple.

19 En-têtes et pieds de page induits par le texte

Nous avons vu comment employer les marqueurs de L^{A}TEX pour obtenir l’information contenue dans les en-têtes et pieds de page. Le mécanisme des marqueurs est le seul mécanisme fiable que vous pouvez employer pour obtenir une information variable dans les en-têtes ou pieds de page. Ceci car L^{A}TEX traite votre document en aval avant de décider ou placer le saut de page.

Parfois les deux marqueurs fournis par L^{A}TEX sont insuffisants. Prenons l’exemple suivant : si une solution d’exercice continue sur la page suivante, alors je voudrais avoir « suite prochaine page… » en bas de de la première et « suite… » en haut de la marge de la suivante.

Vous ne pouvez utiliser pour cela le mécanisme des marqueurs de L^{A}TEX en gardant l’information des chapitre et section.

Fancyhdr inclut un package fournissant deux marqueurs supplémentaires, utilisables dans ces situations^{17}. Voici une façon d’utiliser ce package :

\usepackage{extramarks}
...
\pagestyle{fancy}
\lhead{\firstxmark}
\rfoot{\lastxmark}
...
\extramarks{}{suite prochaine page\ldots}
Texte s'étendant ou pas sur plusieurs pages
\extramarks{suite\ldots}{}
\extramarks{}{}

Notez que \extramarks et le texte forment un bloc. Aucun changement de paragraphe (ligne vide ou \par) ne doit avoir lieu. Sinon la page peut changer sur cette rupture et les extramarks apparaitraient sur la mauvaise page.

17. ce n’est qu’après avoir réalisé ce package que j’ai découvert le package secret.sty qui permet aussi de marquer des paragraphes particuliers s’étendant sur plusieurs pages. Cependant, secret.sty modifie la routine de sortie.

Deux nouveaux marqueurs peuvent être employés dans le style de page avec ce package : Si une commande de la forme \extramarks{m_{1}}{m_{2}} est écrite \firstleftxmark^{18} vous donne la première valeur de m_{1}, \lastleftxmark donne la dernière valeur de m_{1}, \firstrightxmark fournit la première valeur de m_{2} et \lastrightxmark la dernière valeur de m_{2} sur la page en cours. En outre par convention (respect de la norme des marqueurs de L^{A}TEX) \firstxmark est

égal à \firstleftxmark et \lastxmark est égal à \lastrightxmark. Ceci comme \topxmark ou

\topleftxmark sont identique à \topmark de TEX, mais probablement peu employés.

Finalement ceci fournit les commandes \firstleftmark et \lastrightmark en complément des marqueurs standards de L^{A}TEX.

Pour souligner le fait que les marqueurs sont la bonne façon de procéder, laissez-moi vous montrer une mauvaise solution^{19} :

\lhead{suite}
\rfoot{suite prochaine page\ldots}
Texte s'étendant ou pas sur plusieurs pages
\lhead{}
\rfoot{}

Vous pouvez être tenté de penser que les premiers \lhead et \rfoot seront en fonction lorsque TEX produira un saut de page au milieu du texte et les derniers s’il le place après le texte. Ce n’est pas vrai car le paragraphe entier (y compris les dernières définitions) sera traité avant que TEX positionne le saut de page, ainsi au moment de ce saut les dernières définitions sont utilisées, que le saut de page ait lieu dans le texte ou après lui. Un changement de paragraphe entre le texte et les dernières définitions ne fonctionnera pas non plus, parce que vous ne voulez pas que les premières définitions soient utilisées si TEX positionne un saut de page sur ce changement de paragraphe. En fait le mécanisme des marqueurs a été inventé pour se débarrasser de ce genre de problèmes.

Dans le dernier exemple « suite » apparait dans l’en-tête. Il peut-être préférable de l’avoir dans la marge. Ceci peut facilement s’obtenir en le positionnant de façon fixe relativement à l’en-tête. En plain TEX nous devrions employer une combinaison de \hbox to 0pt, \vbox to 0pt, \hskip,\vskip, \hss et \vss, heureusement l’environnement picture de L^{A}TEX fournit une manière beaucoup plus simple pour y arriver. Pour ne pas perturber la disposition normale des en-têtes nous mettons le texte dans une image (picture) de dimension nulle. C’est la meilleure façon, généralement, de placer des choses en des endroits fixes sur la page. Vous pouvez alors employer en même temps les en-têtes normaux. Voir aussi la section 21 pour un autre exemple de cette technique.

\lhead{\setlength{\unitlength}{\baselineskip}%
\begin{picture}(0,0)
  \put(-2,-3){\makebox(0,0)[r]{\firstxmark}}
  \end{picture}\leftmark}

Cette solution peut naturellement être employée aussi pour le pied de page. Assurez-vous que vous avez mis picture en tant que premier élément dans les champs gauches pages paires [LE] et dernier dans ceux droits pages impaires [RO].

Enfin vous pouvez vouloir mettre « suite… » au début du texte plutôt qu’en en-tête ou en marge. Alors vous devez employer le package afterpage. Créons pour cela un nouvel environnement.

18. avant la version 2.0 d’extramarks.sty uniquement les commandes \firstxmark et \lastxmark sont définies.

19. en fait il existe une autre manière mais elle nécessite deux « compilations » L^{A}TEX, vous pouvez mettre des commandes \label avant et après le texte et comparer les valeurs des \pageref.

\newenvironment{suite}{\par
  \extramarks{}{suite prochaine page\ldots}
  \afterpage{\noindent\firstxmark\vspace{1ex}}
  }{\extramarks{(suite\ldots)}{}\par}

Il est dangereux d’employer \firstxmark en dehors de la routine du style de page, mais apparemment avec \afterpage cela fonctionne. Si vous avez besoin de l’information plus loin dans la page vous devez stocker le contenu du marqueur dans votre propre variable. Vous pouvez placer ceci dans un des champs de fancyhdr. Par exemple, si vous voulez ajouter quelque chose après la solution de l’exercice (donc au redémarrage du texte coupé par la solution) vous pouvez employer ce qui suit :

\newcommand{\mysaved}{}
\newenvironment{suite}{\par
  \extramarks{}{suite prochaine page\ldots}
  }{\extramarks{(suite\ldots)}{}\par\vspace{1ex}\mysaved}
\lhead{\leftmark}
\chead{\ifthenelse{\equal{\lastxmark}{}}
  {\gdef\mysaved{}}
  {\gdef\mysaved{\noindent[suite de la page précédente]}}}

Si vous voulez inclure un des marqueurs ou toute autre information variable dans le texte stocké, vous devez employer \xdef plutôt que \gdef.

20 Pseudo film

Si vous mettez sur le même endroit de chaque page une image qui varie légèrement de page en page, il est possible d’obtenir comme un film en feuilletant les pages. Vous pouvez créer un tel pseudo-film facilement avec fancyhdr. Pour plus de simplicité nous supposerons que chaque image est dans un fichier postscript (EPS) appelé pic⟨n⟩.ps ou ⟨n⟩ est le numéro de page et nous emploierons le package graphics ou mieux graphicx^{20}. Pour positionner le pseudo-film à droite^{21} du pied de page la suite fonctionnera :

\rfoot{\setlength{\unitlength}{1mm}
  \begin{picture}(0,0)
    \put(5,0){\includegraphics{pic\thepage.ps}}
  \end{picture}}

Notez que le paramètre de \unitlength doit être placé localement dans le champ de fancyhdr afin d’éviter une interférence, non souhaitable, avec sa valeur dans le corps du texte.

21 Repères sur la tranche externe

Sur certains annuaires et bibles l’on trouve des repères-index (thumb-index), ce sont des marques sur la tranche externe des pages qui indiquent où sont les chapitres. Vous pouvez créer ces derniers en imprimant des zones noires dans la marge externe des pages. Leur position verticale devrait être déterminée par le numéro du chapitre ou un autre compteur. Leur position est indépendante du contenu de la page, nous imprimerons donc ces zones en tant qu’éléments d’en-tête dans une image (picture) de taille nulle comme décrit dans la section précédente.

20. si vous utilisez une ancienne version de L^{A}TEX vous utiliserez le package epsf ou epsfig.

21. en recto seul sinon pensez à le placer sur les pages impaires.

Naturellement nous devons prendre soin d’imprimer recto et verso, nous pouvons aussi avoir une page d’index avec toutes les zones en position correcte. La solution exige un réglage fin pour obtenir des zones bien espacées verticalement. Pour une application personnelle où j’avais 12 sections, j’ai séparé les zones de 18 millimètres, zone imprimée de 9 mm séparée par un blanc de 9 mm. Afin d’éviter des calculs, les zones sont créées dans un environnement picture avec un \unitlength valant 18 mm. Les numéros de page sont placés dans les en-têtes, côtés externes, et les zones sont liées à ces derniers. Dans cet exemple les numéros de section sont utilisés pour placer les zones, mais vous pouvez remplacer ceci avec n’importe quelle valeur numérique. Voir la figure 4 pour la page d’index et la figure 5 page 22 pour le code.

1_{1 Introduction 2 Première année 3 Spécialisation}

Fig. 4 – Page d’index des repères de tranche

22 Placement des flottants

Les flottants sont des éléments de page qui flottent par rapport au reste du document. Les flottants standard sont les tables et les figures, mais avec le package float vous pouvez facilement en créer de nouveaux, comme des algorithmes. La plupart du temps les flottants fonctionnent de manière satisfaisante, mais parfois L^{A}TEX semble trop têtu pour faire ce que vous voulez. Cette section décrit comment influencer L^{A}TEX de sorte qu’il fasse, le plus souvent, comme vous le désirez. Il se peut toutefois, dans quelques cas irréductibles, que vous ne puissiez contraindre L^{A}TEX à votre convenance. Dans la suite nous emploierons des figures comme exemples, mais tout s’applique aussi bien aux autres flottants.

Les problèmes les plus fréquents avec des flottants sont :

1. Vous voulez un flottant à un certain emplacement dans le texte, mais L^{A}TEX le déplace, souvent à la page suivante.

2. Passé un certain point, L^{A}TEX déplace tous vos flottants à la fin du chapitre ou à la fin du document.

3. L^{A}TEX signale Too many floats, soit trop de flottants.

Dans les deux premiers cas vous devez vérifier si vous avez donné un paramètre correct de « placement » pour votre flottant, par exemple \begin{figure}[htp] signifie que votre figure peut être placée :

– h, ici (h pour here) c.-à-d. à la position ou vous la placez dans le texte ;

– t, en haut de page (t pour top), page en cours ou suivante ;

– p, sur une page ne contenant que des flottants.

\documentclass[a4paper]{book}% N.D.T. : a4paper pour ajuster
% les repéres en bord de feuille
...
etc.
\setlength{\unitlength}{18mm}
\newcommand{\blob}{\rule[-.2\unitlength]{2\unitlength}{.5\unitlength}}
\newcommand\rblob{\thepage
  \begin{picture}(0,0)
    \put(1,-\value{section}){\blob}
  \end{picture}}
\newcommand\lblob{%
  \begin{picture}(0,0)
    \put(-3.3,-\value{section}){\blob}
  \end{picture}%
  \thepage}
\pagestyle{fancy}
\cfoot{}
\newcounter{line}
\newcommand{\secname}[1]{\addtocounter{line}{1}%
  \put(1,-\value{line}){\blob}
  \put(-7.5,-\value{line}){\Large \arabic{line}}
  \put(-7,-\value{line}){\Large #1}}
\newcommand{\overview}{\thepage
  \begin{picture}(0,0)
    \secname{Introduction}
    \secname{Première année}
    \secname{Spécialisation}
    ...
    etc.
  \end{picture}}
\begin{document}
\fancyhead[R]{\overview}\mbox{}\newpage % Ceci produit la page récapitulative
\fancyhead[R]{}
\clearpage
\fancyhead[RE]{\rightmark}
\fancyhead[RO]{\rblob}
\fancyhead[LE]{\lblob}
\fancyhead[LO]{\leftmark}
...
etc.

Fig. 5 – Code pour les repères sur la tranche externe, section 21 page 20 Vous pourriez aussi avoir indiqué b pour le bas (bottom) de la page. L’ordre des lettres est insignifiant, vous ne pouvez pas forcer L^{A}TEX à essayer en bas d’abord puis en haut par l’indication

[bt].

Si L^{A}TEX ne met pas le flottant à l’endroit où vous l’attendiez, cela est habituellement provoqué par ce qui suit :

1. Le flottant ne s’adapte pas à la page. Dans ce cas il doit être déplacé à la prochaine page ou même plus loin. Si vous n’indiquez pas l’un [t] ou l’autre [b] des paramètres de position L^{A}TEX doit continuer jusqu’à ce qu’il ait assez de flottants pour une page entière. Ainsi n’utilisez pas seulement [h]. Si vous voulez que L^{A}TEX place ce flottant sur une page de flottants, vous devez spécifier « p ».

2. La position violerait les contraintes imposées par les paramètres de placement des flottants de L^{A}TEX. C’est une cause des plus fréquente. Elle peut être facilement corrigée en changeant ces paramètres, dont voici la liste :

Compteurs – changez avec \setcounter

topnumber  nombre max. de flottants en haut de page  2
bottomnumber  nombre max. de flottants en bas de page  1
totalnumber  nombre max. de flottants par page  3

Macros – changez avec \renewcommand

\topfraction  fraction max. en haut de page pour les flottants  0.7
\bottomfraction  fraction max. en bas de page pour les flottants  0.3
\textfraction  fraction min. du texte sur une page  0.2
\floatpagefraction fraction min. de flottants/page pour créer une page de flottants 0.5

Quelques autres paramètres existent pour des flottants sur deux colonnes dans les documents multicolonnes.

Les valeurs dans la colonne de droite sont celles par défauts pour les classes standard de L^{A}TEX. D’autres classes peuvent employer d’autres valeurs par défaut. Comme précisé par ces valeurs, un flottants ne sera pas mis en bas d’une page si sa taille est supérieure à 30 % de la taille de page. Ainsi si vous indiquez [hb] pour un flottant plus grand, il sera déplacé vers une page de flottants. Mais s’il fait moins de 50 % de la taille de page il devra attendre le moment où assez de flottants seront créés pour qu’une page de flottants soit remplie en respectant le paramètre de \floatpagefraction. Si cela vous pose problème vous pouvez facilement adapter les paramètres, par exemple avec :

\renewcommand{\textfraction}{0.05}
\renewcommand{\topfraction}{0.95}
\renewcommand{\bottomfraction}{0.95}
\renewcommand{\floatpagefraction}{0.35}
\setcounter{totalnumber}{5}

Attention de ne pas définir un \floatpagefraction trop petit, vous risqueriez d’obtenir beaucoup de pages de flottants peu remplies.

Vous pouvez forcer L^{A}TEX à ignorer la plupart des paramètres pour une occurrence spécifique de flottant en incluant une marque d’exclamation ( !) dans les paramètres de placement, par exemple :

\begin{figure}[!htb]

Les flottants contenant « t » dans les paramètres de position peuvent apparaitre donc en haut de page avant l’endroit où ils sont cités (mais à la même page). C’est le comportement normal de L^{A}TEX mais vous pouvez ne pas souhaiter cela. Il existe un certain nombre de façons d’empêcher ceci :

1. Bien sur, supprimer le paramètre « t » régle ce soucis, mais c’est indésirable, vous pouvez vouloir que le flottant soit en haut de la page suivante.

2. Utilisez le package flafter, celui-ci n’autorise pas de flottants en amont de leur appel.

3. Utilisez la commande \suppressfloats[t]^{22}. Cette commande déplace le flottant du haut de sa page d’appel à la suivante. Elle peut être utilisée avec le paramètre [b] ou sans paramètre pour tout flottant sur la page où elle est inscrite.

Si malgré toutes vos tentatives L^{A}TEX déplace toujours vos flottants à la fin du document ou à la fin d’un chapitre, vous pouvez insérer la commande \clearpage. Celle-ci débutera une nouvelle page et insérera tous les flottants en suspens avant de continuer. Si vous ne souhaitez pas de saut de page immédiat, vous pouvez recourir au package afterpage et ajouter dans le texte :

\afterpage{clearpage}

Ceci permet de composer la page courante entièrement et ensuite d’obtenir une page de flottants, si le paramètre de \floatpagefraction est atteint. Cependant, dans certaines circonstances, l’utilisation d’afterpage peut produire d’étranges résultats.

En conclusion, si vous voulez un flottant à l’endroit où vous le définissez, sans que L^{A}TEX ne le déplace, vous pouvez employer le package float et écrire dans le préambule :

\restylefloat{figure}

Vous devez utiliser ensuite le paramètre de position [H], qui signifie « ICI et uniquement ICI ». Ceci peut cependant provoquer un saut de page non désiré^{23}. Si vous voulez éviter ce saut de page non désiré, donc laisser L^{A}TEX déplacer le flottant seulement s’il ne s’adapte pas à la page, l’utilisation du package afterpage est conseillée avec :

\afterpage{\clearpage \begin{figure}[H] ... \end{figure}}

Les plaintes de L^{A}TEX avec « Too many floats » proviennent habituellement d’un des problèmes ci-dessus, flottants ne pouvant être placés et L^{A}TEX en accumulant du coup un trop grand nombre. Les solutions indiquées, particulièrement avec \clearpage, en viendront souvent à bout. Dans certains cas il y aura vraiment trop de flottants cumulés et L^{A}TEX possède un nombre limité de « boites » pour les stoker. Le package morefloats pourra alors être utilisé pour augmenter cette valeur. Si cela ne suffit pas à vos besoins il faudra éditer ce package pour le modifier (gardez cette version modifiée dans un répertoire personnel), mais vous atteindriez alors une limite qu’il vaut mieux ne pas dépasser. Votre seul recours acceptable sera alors de modifier votre document.

23 Flottants multipage

Un flottant sous L^{A}TEX ne peut s’étendre sur plusieurs pages. Cependant, il peut arriver quelquefois qu’un tableau ou une figure ne rentre pas sur une page. La façon facile de régler cela est de sectionner votre tableau ou figure en plusieurs parties. Ceci peut provoquer des effets indésirables :

– où couper ? En général plus délicat pour un tableau ;

– comment les conserver sur des pages successives ;

– comment n’avoir qu’une entrée dans la liste des tables/figures.

Bien que ces problèmes ne soient pas toujours solubles, voici une paire de suggestions.

22. Cette commande ainsi que le paramètre « ! » ne sont pas définis en L^{A}TEX2.09.

23. here.sty a le même effet, mais est incompatible avec avec L^{A}TEX 2ε

23.1 Tables

Pour les tables s’étendant sur plus d’une page, vous pouvez utiliser le package longtable. Ce package définit un environnement longtable, mélange de table et de tabular. Il garde approximativement la syntaxe de l’environnement tabular, mais avec quelques éléments de table, comme les légendes. Ces longtables seront automatiquement étalées sur plusieurs pages si besoin et auront une entrée unique dans la liste des tables (si une légende est données). Cependant, elles ne flottent pas et ne peuvent être incluses dans un environnement flottant. Il peut donc arriver qu’un environnement table soit défini avant le longtable, qu’il soit positionné après ce dernier et donc que la numérotation soit faussée^{24}. Un autre problème est le début d’un longtable trop bas dans la page, ce qui n’est guère plaisant. Si vous voulez qu’un longtable démarre en haut d’une page, la meilleure manière est de l’inclure dans une commande \afterpage (incluez le package afterpage dans le préambule). Puisqu’une longtable est grande par définition, il vaut mieux la mettre dans un fichier séparé et utiliser la commande \input dans une commande \afterpage. En voici deux exemples :

\afterpage{\input{malonguetable}}
\afterpage{\clearpage\input{malonguetable}}

La seconde formulation présente l’avantage de provoquer l’impression des flottants en attente (si suffisants) avant malonguetable, donc moins de risques avec la numérotation des tables.

23.2 Figures

Il n’existe pas d’option longfigure équivalente. Il vous faudra scinder les figures vous même, ce qui est plus simple en général. Maintenant le problème est de les garder groupées, c.-à-d. dans l’ordre sur des pages successives et d’obtenir une seule entrée dans la liste des figures.

Vous devrez scinder la figure et mettre chaque partie dans un environnement figure séparé. Pour les garder groupées, il vaut mieux utiliser l’argument de placement [p] de sorte qu’elles soient disposées sur des pages de flottants successives. Comme elles sont plus grandes qu’une page ceci est approprié. Pour la légende il faut uniquement en donner une à la première partie et pour la (les) partie(s) suivante(s), rien ou inclure le texte de la légende dans la portion de figure. Comme pour longtable, il est préférable d’englober une commande \clearpage et les morceaux dans un environnement \afterpage. Par exemple :

\afterpage{\clearpage\input{grandefigure}}
ou grandefigure.tex contient :
\begin{figure}[p]
\includegraphics{mafigure1.eps}
\caption{Ceci est une figure sur plusieurs pages}
\label{fig:xxx}
\end{figure}
\begin{figure}[p]
\includegraphics{mafigure2.eps}
\begin{center}
Suite de la figure~\ref{fig:xxx}
\end{center}
\end{figure}

24. N.D.T. : Table 5 avant Table 4 dans le document par exemple.

Vous devez vous assurer que la dernière partie de figure soit assez grande, sinon L^{A}TEX pourrait choisir de remettre à plus tard son affichage. Pour cela il est possible d’agrandir la figure (par exemple avec l’utilisation de \vspace), ou en adaptant le paramètre de \floatpagefraction .

Si vous voulez que votre figure multipage débute sur une page de gauche (paire), vous devez effectuer un test sur la commande \afterpage en utilisant le package ifthen :

\afterpage{\clearpage
\ifthenelse{\isodd{\value{page}}{\afterpage{\input{grandefigure}}}% page impaire
    {\input{grandefigure}}}}% page paire

Cependant si il y a trop de flottants à positionner sur la page sautée, cela empêchera le démarrage de votre « grandefigure » sur la page paire.

24 Contact pour information

Piet van Oostrum Dept. of Computer Science Utrecht University P.O. Box 80.089 3508 TB Utrecht, The Netherls Telephone : +31 30 2532180 Telefax : +31 30 2513791 E-mail : piet@cs.uu.nl WWW : http ://www.cs.uu.nl/people/piet