Insertion d'un fond de page

Jean-Michel Sarlat (jsarlat@planete.net) - 4 novembre 2002

Si un peu de programmation PostScript ne vous rebute pas, il existe plusieurs méthodes relativement simples pour insérer un fond à toutes les pages d'un document produit par (La)TeX. Cela comprend l'insertion d'une image au format EPS, l'inscription de mentions spéciales ou des décorations écrites directement en PostScript.
À priori, toutes les méthodes présentées ici conviennent lorsque la composition suit le chemin :

                (La)TeX                   DVIPS  
monfichier.tex ---------> monfichier.dvi -------> monfichier.ps

L'insertion n'est effective qu'au moment de l'interprétation du fichier final en PostScript.

Les possibilités offertes par DVIPS

Lorsque DVIPS construit les pages d'un document en PostScript, il commence leur description par

n1 n2 bop ...

C'est cette dernière macro, laissée à notre disposition, que l'on peut définir pour insérer un fond de page ou pour exécuter tout ensemble de commandes PostScript préalable à la construction de la page. Les deux nombres n1 et n2 présents sur la pile doivent y rester, il suffit d'en faire une copie pour les exploiter.
Pour la mise en œuvre, le mieux est d'écrire un fichier contenant tout le matériel PostScript (on lui donnera, conformément à ce qui se fait déjà, l'extension .pro) et de commander son chargement en tapant le plus tôt possible dans le document (La)TeX la séquence

\special{header=mesmacros.pro}.

Il suffira maintenant de définir la commande bop-hook au moment souhaité dans le document (La)TeX en spécifiant

\special{!userdict begin \bop_hook {mamacro} def end}.

Cette définition (exécution de mamacro) s'appliquera à toutes les pages tant qu'une nouvelle définition ne viendra pas l'écraser.

Insertion d'une image

Le plus simple, pour commencer, est d'insérer une image au format EPS (fond.eps dans mon exemple).

Fichier : fond.pro

/monfond {
  /masauvegarde save def
  /showpage {} def
  [ 
  .5 dup scale 1075 115 translate  
  (fond.eps) run                 
  cleartomark
  masauvegarde restore           
} def
Fichier : test01.tex

\documentclass[12pt]{article}
\usepackage{t1enc}
\usepackage[frenchb]{babel}
\usepackage[a4paper,margin=2.25cm,nohead]{geometry}
\parindent0pt
\begin{document}
\special{header=fond.pro}
\special{!userdict begin /bop-hook {monfond} def end}
\input{euclide.tex}
\end{document}

Commentaires :

Pagination

Si l'on souhaite prendre en charge l'aspect que prendra l'inscription des numéros de page, il suffit de la désactiver au niveau du fichier (La)TeX et de coder tout cela en PostScript !

Fichier : pagination.pro

4 dict /Pagination exch def
/getPage {
  2 copy
  Pagination begin
    1 add /b exch def
    /a exch def
  end
} def
/mapagination {
  getPage
  gsave
    Pagination begin
	/Times-Italic findfont 24 scalefont setfont
	.5 0 .3 setrgbcolor
	15 730 moveto
	b 3 string cvs show
	15 727 moveto 30 727 lineto stroke
    end
  grestore
} def
Fichier : test02.tex

\documentclass[12pt]{article}
\usepackage{t1enc}
\usepackage[frenchb]{babel}
\usepackage[a4paper,margin=2.25cm,nohead,nofoot]{geometry}
\parindent0pt
\pagestyle{empty}   % pas d'indication de pages
\begin{document}
\special{header=pagination.pro}
\special{!userdict begin /bop-hook {mapagination} def end}
\input{euclide.tex}
\end{document}

Image et pagination

Il est bien sûr possible de coupler les deux : une image de fond et une pagination adaptée.

Fichier : test03.tex

\documentclass[12pt]{article}
\usepackage{t1enc}
\usepackage{ae}
\usepackage[frenchb]{babel}
\usepackage[a4paper,margin=2.25cm,nohead,nofoot]{geometry}
\parindent0pt
\pagestyle{empty}   % pas d'indication de pages
\begin{document}
\special{header=fond.pro}
\special{header=pagination.pro}
\special{!userdict begin /bop-hook {monfond mapagination} def end}
\input{euclide.tex}
\end{document}
  

Surimpression

Jusqu'à maintenant les éléments ajoutés étaient recouverts par la page provenant du fichier DVI, ils étaient apposés avant celle-ci. Pour une surimpression, il faut agir à la fin de la construction de la page et, naturellement, c'est prévu par DVIPS à travers la commande eop qui appelle eop-hook si ... elle est connue du système.

Fichier : surcharge.pro

/masurcharge {
  gsave
	/Helvetica-Bold findfont 64 scalefont setfont
	.6 1 .2 setrgbcolor
	842 596 atan rotate
	300 0 moveto (DEPRECATED) show
  grestore
} def
Fichier : test04.tex

\documentclass[12pt]{article}
\usepackage{t1enc}
\usepackage{ae}
\usepackage[frenchb]{babel}
\usepackage[a4paper,margin=2.25cm,nohead,nofoot]{geometry}
\parindent0pt
\pagestyle{empty}   % pas d'indication de pages
\begin{document}
\special{header=fond.pro}
\special{header=pagination.pro}
\special{header=surcharge.pro}
\special{!userdict begin
              /bop-hook {monfond mapagination} def
              /eop-hook {masurcharge} def
             end}
\input{euclide.tex}
\end{document}

Pour finir

Il existe deux autres procédures permettant d'avoir une emprise sur le document : start-hook et end-hook, elles permettent d'agir avant la première page et après la dernière page. Cela sera pour une autre fois !

Redéfinition de showpage

Sans intervenir sur le fichier (La)TeX et sans utiliser les possibilités de DVIPS on peut arriver aux mêmes résultats que ceux présentés précédemment en adaptant la définition de la commande clé de PostScript : showpage. C'est celle qui est invoquée pour signifier la fin de la construction d'une page et le début d'une autre.

Le fichier pilote

Pour rendre cette nouvelle définition opérante sur tout le document, elle est inscrite dans la VM (Virtual Memory) globale, le code correspondant constitue un fichier pilote qu'il suffira de coller en tête du fichier PostScript qui va, de ce fait, être interprété autrement !

Fichier : showpage.ps

%!
%%BoundingBox: 0 0 596 842
true setglobal        % passage en VM globale
globaldict begin      % ouverture du dictionnaire "globaldict"
  /sysshowpage {      % récupération de la vraie bonne procédure "showpage"
    systemdict /showpage get exec
  } def    
  /flagpage false store       % un drapeau pour l'initialisation
  /numeropage 1 store         % une clé pour identifier le numéro de page
  /showpage {         % la nouvelle définition
    flagpage {
      {surcharge} cvx exec  % exécution de la procédure de surimpression
      sysshowpage           % exécution du vrai "showpage"
      /numeropage numeropage 1 add store % incrémentation du numéro de page
    } if
    /flagpage true store
    {fond} cvx exec % exécution de la procédure de fond
  } def
  /surcharge {
    gsave
      /Helvetica-Bold findfont 64 scalefont setfont
      .6 1 .2 setrgbcolor
      842 596 atan rotate
      300 0 moveto
      (DEPRECATED) show
    grestore
  } def
  /fond {
    -1 -1 moveto -1 843 lineto 597 843 lineto 597 -1 lineto closepath
    gsave .8 setgray fill grestore newpath
    gsave 
      /Times-Italic findfont 24 scalefont setfont
      .5 0 .3 setrgbcolor
      15 730 moveto
      numeropage 3 string cvs show
      15 727 moveto 30 727 lineto stroke
    grestore
    /masauvegarde save def
    /showpage {} def
    [ 
      .5 dup scale 1075 115 translate  
      (fond.eps) run                 
    cleartomark
    masauvegarde restore           
  } def
end     % fin d'écriture dans le dictionnaire "globaldict"
false setglobal
%% L'idée de cette redéfinition de showpage est empruntée à Don Lancaster 
%%                   (http://www.tinaja.com)
showpage
%% Cette première exécution de showpage va seulement levé le drapeau "flagpage" 
%% et charger le fond sur la première page. A la première exécution de showpage 
%% dans le fichier qui va suivre, la surcharge sera apposée, la page éjectée et 
%% le fond placé sur la page à suivre. Et ainsi de suite .... Après le dernier 
%% showpage, il restera un dernier fond, visible par certains interpréteurs 
%% (ghostscript par exemple).

Le test

Le fichier (La)TeX est maintenant dépouillé de toute commande \special{...}, le fichier PS produit par DVIPS est quelconque...

Fichier : test05.tex

\documentclass[12pt]{article}
\usepackage{t1enc}
\usepackage[frenchb]{babel}
\usepackage[a4paper,margin=2.25cm,nohead,nofoot]{geometry}
\parindent0pt
\pagestyle{empty}   % pas d'indication de pages
\begin{document}
\input{euclide.tex}
\end{document}

Il suffit maintenant d'effectuer la fusion

showpage.ps + test05.ps > test05bis.ps
pour obtenir un fichier qui, après interprétation, donnera des pages ayant une toute autre apparence !


Source index.txt mouliné par petitParseur(Z+B) le dimanche 17 novembre 2002.