Le problème
Soit un texte avec des lignes numérotées en continu, du début à la fin du texte. Le but est de pouvoir mettre dans les en-têtes de page le numéro de ligne de début et de fin de page, comme dans l’exemple ci-dessous.
Principe général
Dans mon livre, j’explique dans le chapitre 22 comment :
- utiliser le package
fancyhdr
pour personnaliser les en-têtes. - utiliser la commande
\markboth
pour mémoriser des données qui seront ré-utilisées dans l’entête.
Dans le cas présent, nous souhaitons :
- mettre à gauche le numéro de la première ligne de la page.
- mettre à droite le numéro de la dernière ligne de la page.
Nous allons donc devoir utiliser, à chaque ligne :
\markboth{numero de ligne}{numéro de ligne}
\fancyhead[LE,LO]{\rightmark}
\fancyhead[RO,RE]{\leftmark}
Rappelons que la commande \markboth
prend deux arguments : <marqueur gauche>
et <marqueur droit
. Dans le cas présent, il s’agit à chaque fois du numéro de la ligne.
Dans le code ci-dessus, nous disons qu’à gauche nous appelons la commande \rightmark
. Contrairement à ce que son nom indique, elle n’est pas forcément appellée uniquement à droite, mais contient, dixit moi-même [1] :
l’argument
⟨marqueur droit⟩
de la première commande\markright
ou\markboth
située sur la page courante.
Soit dans le cas présent, le premier numéro de ligne sur la page présente.
Inversement, à droite nous appelons \leftmark
, qui retourne, dixit moi-même [2] .
l’argument
⟨marqueur gauche⟩
de la dernière commande\markboth
.
Soit dans le cas présent, le numéro de la dernière ligne.
Reste à mettre en place la commande \markboth
à chaque ligne.
Mise en œuvre
Comme on ne peut définir à l’avance où seront les ruptures de lignes, le mieux est de confier l’appel à \markboth
à eledmac. C’est là qu’intervient la nouvelle version.
Il était déjà possible de dire à eledmac
d’exécuter certaines actions à chaque ligne, en redéfinissant la commande \do@linehook
. Cependant, cette commande était appelée avant l’impression de chaque ligne, ce qui posait des problèmes de mise en page avec \markboth
[3].
La commande \do@insidelinehook
quant à elle est appelée au début de l’impression de chaque ligne. Elle résout ainsi ces problèmes de mis en page. Il suffit donc de la redéfinir, en lui disant de passer \the\line@num
comme arguments à \markboth
.
La séquence \the\line@num
permet de retourner la valeur du compteur TeX [4] \line@num
, qui correspond au numéro de ligne tel que défini par eledmac
.
Comme toutes ces commandes ont des @
dans leurs noms, il faut les appeller entre \makeatletter
et \makeatother
.
Ce qui donne donc :
\makeatletter
\renewcommand{\do@insidelinehook}{\markboth{\the\line@num}{\the\line@num}}
\makeatother
Résultat final
Nous avons donc un préambule contenant les lignes suivantes :
\usepackage{fancyhdr}
\pagestyle{fancy}
\fancyhead[LE,LO]{\rightmark}
\fancyhead[RO,RE]{\leftmark}
\usepackage{eledmac}
\makeatletter
\renewcommand{\do@insidelinehook}{\markboth{\the\line@num}{\the\line@num}}
Qui donne bien le résultat désiré, et présenté plus haut. Vous trouverez ci-dessous le fichier complet.