Comment savoir si une page est un recto ou un verso ?#

Une autre question détaille le problème rencontré pour que la commande \marginpar positionne correctement les notes marginales dans les documents recto-verso : à gauche ou à droite de la page. Ce cas appartient à une famille plus large de problèmes où il faut savoir où un morceau de texte va se trouver mis en forme. En effet, la routine de sortie (qui produit les pages composées) est asynchrone et comme vont traiter une bonne partie de la page suivante avant de déterminer où découper la page présente. Par conséquent, le compteur page (nommé dans \c@page) n’a de fiabilité qu’au moment du traitement de la routine de sortie.

La solution revient :

  • à utiliser une version du mécanisme de \label pour déterminer sur quelle page vous êtes ;

  • et à intégrer le fait que la valeur du compteur de page apparaissant dans une commande \pageref est insérée lors de la routine de sortie, ce qui la rend fiable.

Toutefois… \pageref elle-même n’est pas fiable ! En toute logique, l’instruction

\ifthenelse{\isodd{\pageref{foo}}}{...recto...}{...verso...}

aurait normalement du faire le nécessaire mais les extensions babel et hyperref sont toutes deux connues pour interférer avec la valeur de \pageref. Soyez donc prudent !

1.  L’extension « changepage »#

L’extension changepage, pour définir certaines de ses propres fonctionnalités, fournit une commande \checkoddpage : elle définit une « étiquette » pour son propre usage et l’élément de référence à la page de cette étiquette est ensuite examinée (hyperref ne pouvant la parasiter) afin de définir une variable conditionnelle \ifoddpage vraie si la commande a été émise sur un recto. La classe memoir propose d’ailleurs la même commande.

Les utilisateurs de qui ne sont pas familiers avec les commandes \if... de peuvent utiliser l’extension ifthen :

\usepackage{ifthen,changepage}
...
\checkoddpage
\ifthenelse{\boolean{oddpage}}{...recto...}{...verso...}

Bien sûr, ces nouvelles « étiquettes » contribuent à alimenter les messages d’erreur « Rerun to get cross-references » (autrement dit « Relancer le programme pour mettre à jour les références croisées ») de

2.  Les classes KOMA-Script#

Les classes KOMA-Script ont un environnement addmargin* qui fournit des fonctionnalités similaires à celles qu’offre changepage. La commande \ifthispageodd{...recto...}{...verso...} permet ici d’exécuter différentes tâches selon le numéro de page documentation en français pour KOMA-Script).

3.  L’extension « ifoddpage »#

L’extension ifoddpage est conçue pour fournir une fonctionnalité identique. Elle se comporte en tenant compte du fait que vous composez un document recto-verso ou recto uniquement. Comme l’extension changepage, elle utilise une commande de vérification nommée \checkoddpage. Les autres commandes de tests sont définies en utilisant des commandes conditionnelles de (Plain) elles sont définis localement, afin que vous puissiez minimiser leur utilisation de l’espace de travail de La documentation de l’extension détaille la délicate séquence impliquée. De plus, l’extension fournit une commande \ifoddpageoroneside, qui est vraie pour les pages de droite d’un document recto-verso, ou sur toutes les pages d’un document recto.

L’utilisation de cette extension se limite généralement à :

\checkoddpage
\ifoddpage
  ...recto...
\else
  ...verso...
\fi

Le principe recommandé par l’auteur de l’extension consiste à inclure toute l’opération dans une boîte. Cela présente l’avantage d’avoir un test qui fonctionne toujours mais cette technique a aussi le désavantage des boîtes (un bloc ne pouvant se scinder). Dans la pratique, l’ensemble du travail sera réalisé à l’intérieur d’une boîte (comme, par exemple, dans le cas d’un flottant) : ainsi, le travail élaboré proposé par l’auteur ne sera pas nécessaire.