Source
%% 3 lignes de jps a eliminer pour avoir du pur postscript
%% taille fenetre en jps
-12 12 setxrange
-2 3 setyrange
20 setxunit
%% fin du jps a eliminer

%% 2 definitions preliminaires : "defppathtable" et "interpolfunct"
%% voir http://melusine.eu.org/syracuse/bbgraf/jps2ps/pps/defppathtable.pps
%% et http://melusine.eu.org/syracuse/bbgraf/jps2ps/pps/interpolfunct.pps

%% definition d'une fonction numerique a partir de son graphe (défini
%% par un chemin)
%% on utilisera ensuite cette fonction numerique pour deformer le texte

newpath
-200.0   9.99988 moveto   
-170.858   20.0947   -134.665   23.7141   -99.9998   19.9999   curveto   
-29.9998   12.4999   -29.9998   12.4999   39.9998   4.99994   curveto
63.2333   2.51058   81.0974   12.7908   99.9998   19.9999   curveto   
128.472   30.8586   165.365   34.548   200.0   30.0   curveto

defppathtable
/table exch def
/f {table interpolfunct} def

%% juste pour visualiser le chemin
0 0 1 setrgbcolor 
stroke
0 setgray

%% le fichier de Manuel Luque 
%% modifie par jpv, dim jun 18 13:18:13 CEST 2006
% (c) P. Kleiweg 1997
% adaptation plagiat M.L. 05/06/2006
 
%% les parametres du fichier :

%% le decalage pour positionner le texte dans la page
%% 297 600 translate

%% le decalage (en picas) du texte par rapport a sa ligne de base
/decalage_vertical 0 def

%% la police et sa taille 
/Times-Roman findfont 40 scalefont setfont

%% le texte a deformer (les x sont dans [-warphalf ; warphalf])
/warptxt (Modulation d'amplitude) def

%% la procedure de base pour la transformation des points du chemin 
%% (x, y) --> (X, Y)
%% cette fonction peut utiliser les variables warpwidth et warphalf
/warp {
3 dict begin
   /y exch def
   /x exch def
   x y 
   %% on multiplie y par f (x)/20 (on divise par 20 car les f(x)
   %% oscillent autour de 20)
   x f 20 div mul
end
} bind def


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% tout ce qui suit n'a pas a etre modifie %%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
/warpwidth warptxt stringwidth pop def %% largeur horizontale du texte
/warphalf warpwidth 2 div def          %% demi-largeur horizontale

%% pour remplacer 'move'
/warpmove{
   %% on teste le booleen place 2 tokens plus en avant sur la pile
   %% si c'est 'true', alors on en est au 1er appel => on initialise
   %% le chemin
   2 index {
	 newpath
   } if
   %% puis on applique warp a notre point
   warp  moveto
   %% on enleve le 'true' pour mettre un 'false' a la place
   pop false
} bind def
 
%% pour remplacer 'lineto
/warpline {
   warp lineto
} bind def
 
%% pour remplacer 'curveto'
/warpcurve {
   6 2 roll warp
   6 2  roll warp
   6 2 roll warp
   curveto
}  bind def
 
%% 'warpit' declenche la transformation du chemin courant
/warpit {
true
{ warpmove } {  warpline } { warpcurve } { closepath } pathforall
pop
}  bind def
 
newpath
%% on se deplace (init chemin) de facon a  
%% centrer la ligne de base du texte en (0 , - decalage_vertical)
warphalf neg decalage_vertical neg moveto                  
                        
warptxt true charpath   %% on cree le chemin

%% maintenant on y va
warpit                  %% on applique le pathforall
stroke                  %% puis on encre