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.
Lorsque DVIPS construit les pages d'un document en PostScript, il commence leur description par
n1 n2 bop ...
Où
n1
est le numéro de page tel que TeX l'a calculé (en fonction de vos choix éventuels de pagination), n2
est le numéro de page réel (en commençant à O), bop
(begin of page) est une commande définie par DVIPS qui appelle au début de son exécution une autre commande, bop-hook
, si elle est connue du système. 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.
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 :
run
, cela ne fonctionnera pas si vous expédiez le fichier PS vers une imprimante PostScript. Dans ce cas une des solutions est de copier le contenu du fichier EPS en lieu et place de la ligne (fond.eps) run
. 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}
|
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}
|
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}
|
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 !
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.
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 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