From: tvz@zandtwerk.Princeton.EDU (Timothy Van Zandt)
Newsgroups: comp.text.tex
Subject: Filling/outlining characters with PSTricks (experimental)
Date: 12 Nov 92 19:01:02 GMT
Organization: Princeton University
Originator: tvz@zandtwerk.Princeton.EDU

I don't know if I posted this already.

If you are using Rokicki's dvips, v45.487 or later, with PSTricks,
you might want to check out the file below. It lets you fill and
outline the character outlines of PostScript (outline) fonts.

Tim
---
Timothy Van Zandt   (609)258-4050  tvz@Princeton.EDU (NeXTMail)

FILES:
  pst-char.tex    : LaTeX file with macros and test run.
  pst-grad.tex    : Required for one of the examples.
  pst-char.ps     : My PostScript output.


%% FILE: pst-char.tex
%% This file contains an experimental macro for PSTricks.
%% It lets you fill character paths with PSTricks fill styles.
%% !!!! It works with dvips v5.490 and later, and probably not much else.
%% !!!! It has no effect with TeXview, even with NeXTTeX 3.0 (but it works
%%         with the dvips distributed with NeXTTeX 3.0).
%% !!!! It has an effect on outline fonts only (e.g., not metafont fonts).
%% !!!! Don't be surprised if this doesn't work.
%%
%% Comments are appreciated: tvz@Princeton.EDU
%%
%% The new macros are defined between \makeatletter and \makeatother
%% \input'ing pst-grad.tex, another experimental macro, is required for
%% one of the examples. Omit if desired.
%% You must have my npsfont.sty to set up the helvetical fonts for this
%% examples.
%%
\documentstyle[12pt,npsfont,pstricks]{article}

\newpsfamily[2]{helvetica}{
  {m}{n}{phvr},          %Helvetica
  {m}{it}{phvro},        %Helvetica-Oblique
  {m}{sl}{phvro},        %Helvetica-Oblique
  {bx}{n}{phvb},         %Helvetica-Bold
  {bx}{it}{phvbo},       %Helvetica-BoldOblique
  {bx}{sl}{phvbo}}       %Helvetica-BoldOblique
\def\rmdefault{helvetica}

\makeatletter
\input pst-grad.tex
%
% \begin{macro}{\pschar}
%    \begin{macrocode}
\def\tx@AltShow{%
  /@@show /show load def
  /show {
    dup gsave newpath 0 0 moveto true charpath pathbbox grestore
    3 -1 roll eq 3 1 roll eq and
    { @@show }
    { true charpath }
    ifelse }
  def }
\def\tx@RestoreShow{/show /@@show load def }
\def\pschar{\def\pst@par{}\pst@object{pschar}}
\def\pschar@i#1{%
  \begingroup
    \pst@makebox{#1}%
    \use@par
    \leavevmode\hbox{%
      \pstVerb{\tx@AltShow}%
       \box\pst@boxa
       \edef\pst@code{\pst@dict gsave \tx@STV
         \pst@number\pslinewidth SLW \use@color\psk@linecolor}%
       \def\pst@linetype{1}%
       \pst@fill\pst@stroke
       \pstVerb{\pst@code\space grestore CP newpath moveto
         end \tx@RestoreShow}}%
  \endgroup}
%    \end{macrocode}
% \end{macro}
\makeatother

\begin{document}

\begin{center}\Huge\bf

\pschar[linestyle=none,fillstyle=gradient]{Denis Girous}

\vskip 1in


\pschar[linestyle=none,fillstyle=gradient,Gangle=45,Gmidpoint=.5]{Denis Girous}

\vskip 1in


\pschar[linestyle=dotted]{Denis Girous}

\vskip 1in

\pschar[fillstyle=crosshatch]{Denis Girous}

\vskip 1in

\pschar[fillstyle=solid,fillcolor=red]{Denis Girous}

\end{center}
\end{document}
%% END pst-char.tex


%%%%%%%%%%%%%%%%%%%%%% pst-grad.tex / pst-grad.sty %%%%%%%%%%%%%%%%%%%%%%%
% 30 Oct. 1992
% This is experimental.
%
% Based on some EPS files by leeweyr!bill@nuchat.sccsi.com (W. R. Lee).
%
% This defines a new fill style, "gradient", for use with PSTricks,
% which has gradiated color. The following parameters are used:
%
%    Gbegin=red green blue    : Beginning rgb color spec.
%    Gend=red green blue      : Final rgb color spec.
%    Glines=int               : Number of lines to use.
%    Gmidpoint=num            : Gradient goes from beginning to end, and
%                                 and then back to beginning. Midpoint
%                                 is Gmidpoint from the top.
%                                 (0<=Gmidpoint<=1).
%    Gangle=angle             : Rotate image by angle.
%
% There is also a modification to frame macros with semcolor style option.
% The usual frame styles, scplain, scdouble, and scshaddow are defined,
% but now these only use the seminar.sty parameters \slideframewidth
% and \slideframesep. To further modify the framing, include parameter
% changes as an option first argument to \slideframe. E.g., for gradient
% fill:
%
%   \slideframe[framearc=.15,fillstyle=gradient]{scplain}
%
\edef\GradAtCode{\the\catcode`\@}
\catcode`\@=11
% \begin{macro}{\psset@Gbegin,\psset@Gend,\psset@Glines,
%  \psset@Gmidpoint,\psset@Gangle}
%    \begin{macrocode}
\def\psset@Gbegin#1{%
  \edef\pst@tempg{#1 }%
  \expandafter\@newrgbcolor\pst@tempg * * * *\@nil
  \edef\psk@Gbegin{\pst@tempg\space \pst@temph\space \pst@tempi\space}}
\def\psset@Gend#1{%
  \edef\pst@tempg{#1 }%
  \expandafter\@newrgbcolor\pst@tempg * * * *\@nil
  \edef\psk@Gend{\pst@tempg\space \pst@temph\space \pst@tempi\space}}
\def\psset@Glines#1{%
  \pst@cntg=#1\relax\edef\psk@Glines{\the\pst@cntg}}
\def\psset@Gmidpoint#1{\pst@checknum{#1}\psk@Gmidpoint}
\def\psset@Gangle#1{\pst@getangle{#1}\psk@Gangle}
\psset@Gbegin{0 .1 .95}
\psset@Gend{0 1 1}
\psset@Glines{500}
\psset@Gmidpoint{.9}
\psset@Gangle{0}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\tx@GradientFill}
% Syntax:
% \begin{Ex}
% \m{R0 G0 B0 R1 G1 B1 MidPoint NoLines Angle} GradientFill
% \end{Ex}
%    \begin{macrocode}
\def\tx@GradientFill{%
  rotate
  /MidPoint ED
  /NoLines ED
  /LastBlue ED
  /LastGreen ED
  /LastRed ED
  /FirstBlue ED
  /FirstGreen ED
  /FirstRed ED
  clip
  pathbbox           %leave llx,lly,urx,ury on stack
  /y ED /x ED
  2 copy translate
  y sub neg /y ED
  x sub neg /x ED
  /b {
    x 0 rlineto
    0 YSizePerLine rlineto
    x neg 0 rlineto
    closepath
  } def
  /MidLine NoLines 1 MidPoint sub mul abs cvi def
  MidLine NoLines gt { /Midline NoLines def } if
  /RedIncrement LastRed FirstRed sub MidLine div def
  /GreenIncrement LastGreen FirstGreen sub MidLine div def
  /BlueIncrement LastBlue FirstBlue sub MidLine div def
  /YSizePerLine y NoLines div def
  /CurrentY 0 def
  /Red FirstRed def
  /Green FirstGreen def
  /Blue FirstBlue def
  MidLine {
    0 CurrentY moveto b
    Red Green Blue setrgbcolor fill
    CurrentY YSizePerLine add /CurrentY exch def
    Blue BlueIncrement add dup 1 gt { pop 1 } if
      dup 0 lt { pop 0 } if /Blue exch def
    Green GreenIncrement add dup 1 gt { pop 1 } if
      dup 0 lt { pop 0 } if /Green exch def
    Red RedIncrement add dup 1 gt { pop 1 } if
      dup 0 lt { pop 0 } if /Red exch def
  } repeat
  Blue BlueIncrement sub /Blue exch def
  Green GreenIncrement sub /Green exch def
  Red RedIncrement sub /Red exch def
  /RedIncrement LastRed FirstRed sub NoLines MidLine sub div def
  /GreenIncrement LastGreen FirstGreen sub NoLines MidLine sub div def
  /BlueIncrement LastBlue FirstBlue sub NoLines MidLine sub div def
  Blue BlueIncrement sub /Blue exch def
  Green GreenIncrement sub /Green exch def
  Red RedIncrement sub /Red exch def
  NoLines MidLine sub {
    0 CurrentY moveto b
    Red Green Blue setrgbcolor fill
    CurrentY YSizePerLine add /CurrentY exch def
    Blue BlueIncrement sub dup 1 gt { pop 1 } if
      dup 0 lt { pop 0 } if /Blue exch def
    Green GreenIncrement sub dup 1 gt { pop 1 } if
      dup 0 lt { pop 0 } if /Green exch def
    Red RedIncrement sub dup 1 gt { pop 1 } if
      dup 0 lt { pop 0 } if /Red exch def
  } repeat}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\psfs@gradient}
%    \begin{macrocode}
\def\psfs@gradient{\addto@pscode{%
  \psk@Gbegin \psk@Gend
  \psk@Glines\space \psk@Gmidpoint\space \psk@Gangle\space
  \tx@GradientFill}}
%    \end{macrocode}
% \end{macro}

% Allow gradient to be used with semcolor style option with seminar.sty:
\def\semcolor@frame#1{\setbox\emb@slidebox=\hbox{%
  \psset{linewidth=\slideframewidth,framesep=\slideframesep}%
  \expandafter\psset\expandafter{\the\slide@frameops}%
  \def\pst@par{}%
  #1\emb@slidebox}}
\newtoks\slide@frameops
\def\slideframe{\@ifnextchar[{\@slideframe}{\@slideframe[]}}
\def\@slideframe[#1]#2{\@ifgoodsf{#2}%
  {\edef\slide@frame{#2}\slide@frameops{#1}}}
\@ifundefined{@ifgoodsf}{}{\slideframe[framearc=.15]{scplain}}

\catcode`\@=\GradAtCode
\endinput
%% END pst-grad.tex



%!PS-Adobe-2.0
%%Creator: dvips 5.491 Copyright 1986, 1992 Radical Eye Software
%%Title: pst-char.dvi
%%Pages: 1 1
%%BoundingBox: 0 0 612 792
%%DocumentFonts: Helvetica-Bold Helvetica
%%EndComments
%DVIPSCommandLine: dvips -Pport pst-char -o
%%BeginProcSet: tex.pro
%!
/TeXDict 250 dict def TeXDict begin /N{def}def /B{bind def}N /S{exch}N /X{S N}
B /TR{translate}N /isls false N /vsize 11 72 mul N /@rigin{isls{[0 -1 1 0 0 0]
concat}if 72 Resolution div 72 VResolution div neg scale isls{Resolution hsize
-72 div mul 0 TR}if Resolution VResolution vsize -72 div 1 add mul TR matrix
currentmatrix dup dup 4 get round 4 exch put dup dup 5 get round 5 exch put
setmatrix}N /@landscape{/isls true N}B /@manualfeed{statusdict /manualfeed
true put}B /@copies{/#copies X}B /FMat[1 0 0 -1 0 0]N /FBB[0 0 0 0]N /nn 0 N
/IE 0 N /ctr 0 N /df-tail{/nn 8 dict N nn begin /FontType 3 N /FontMatrix
fntrx N /FontBBox FBB N string /base X array /BitMaps X /BuildChar{
CharBuilder}N /Encoding IE N end dup{/foo setfont}2 array copy cvx N load 0 nn
put /ctr 0 N[}B /df{/sf 1 N /fntrx FMat N df-tail}B /dfs{div /sf X /fntrx[sf 0
0 sf neg 0 0]N df-tail}B /E{pop nn dup definefont setfont}B /ch-width{ch-data
dup length 5 sub get}B /ch-height{ch-data dup length 4 sub get}B /ch-xoff{128
ch-data dup length 3 sub get sub}B /ch-yoff{ch-data dup length 2 sub get 127
sub}B /ch-dx{ch-data dup length 1 sub get}B /ch-image{ch-data dup type
/stringtype ne{ctr get /ctr ctr 1 add N}if}B /id 0 N /rw 0 N /rc 0 N /gp 0 N
/cp 0 N /G 0 N /sf 0 N /CharBuilder{save 3 1 roll S dup /base get 2 index get
S /BitMaps get S get /ch-data X pop /ctr 0 N ch-dx 0 ch-xoff ch-yoff ch-height
sub ch-xoff ch-width add ch-yoff setcachedevice ch-width ch-height true[1 0 0
-1 -.1 ch-xoff sub ch-yoff .1 add]{ch-image}imagemask restore}B /D{/cc X dup
type /stringtype ne{]}if nn /base get cc ctr put nn /BitMaps get S ctr S sf 1
ne{dup dup length 1 sub dup 2 index S get sf div put}if put /ctr ctr 1 add N}
B /I{cc 1 add D}B /bop{userdict /bop-hook known{bop-hook}if /SI save N @rigin
0 0 moveto /V matrix currentmatrix dup 1 get dup mul exch 0 get dup mul add
.99 lt{/FV}{/RV}ifelse load def pop}N /eop{SI restore showpage userdict
/eop-hook known{eop-hook}if}N /@start{userdict /start-hook known{start-hook}
if /VResolution X /Resolution X 1000 div /DVImag X /IE 256 array N 0 1 255{IE
S 1 string dup 0 3 index put cvn put}for 65781.76 div /vsize X 65781.76 div
/hsize X}N /p{show}N /RMat[1 0 0 -1 0 0]N /BDot 260 string N /rulex 0 N /ruley
0 N /v{/ruley X /rulex X V}B /V{}B /RV statusdict begin /product where{pop
product dup length 7 ge{0 7 getinterval dup(Display)eq exch 0 4 getinterval
(NeXT)eq or}{pop false}ifelse}{false}ifelse end{{gsave TR -.1 -.1 TR 1 1 scale
rulex ruley false RMat{BDot}imagemask grestore}}{{gsave TR -.1 -.1 TR rulex
ruley scale 1 1 false RMat{BDot}imagemask grestore}}ifelse B /FV{gsave
transform round exch round exch itransform moveto rulex 0 rlineto 0 ruley neg
rlineto rulex neg 0 rlineto fill grestore}B /a{moveto}B /delta 0 N /tail{dup
/delta X 0 rmoveto}B /M{S p delta add tail}B /b{S p tail}B /c{-4 M}B /d{-3 M}
B /e{-2 M}B /f{-1 M}B /g{0 M}B /h{1 M}B /i{2 M}B /j{3 M}B /k{4 M}B /w{0
rmoveto}B /l{p -4 w}B /m{p -3 w}B /n{p -2 w}B /o{p -1 w}B /q{p 1 w}B /r{p 2 w}
B /s{p 3 w}B /t{p 4 w}B /x{0 S rmoveto}B /y{3 2 roll p a}B /bos{/SS save N}B
/eos{SS restore}B end
%%EndProcSet
%%BeginProcSet: pstricks.pro
%!
% PS prologue for pstricks.tex, v0.92, 92/10/02. Created 1992/10/8.
% For use with Rokicki's dvips.
/tx@Dict 200 dict def tx@Dict begin
/ADict 25 dict def /CM { matrix currentmatrix } def
/SLW { setlinewidth } def /CLW { currentlinewidth} def
/CP { currentpoint } def /ED { exch def } def
/STP { .996264 dup scale } def
/STV { SDict begin normalscale end STP  } def
/Setvmtrx { gsave matrix identmatrix setmatrix STV /vmtrx CM def grestore }
def
/Tr { Setvmtrx vmtrx transform translate } def
/Pyth { dup mul exch dup mul add sqrt } def
/PtoC { 2 copy cos mul 3 1 roll sin mul } def
/Div { dup 0 eq { pop } { div } ifelse } def
/Atan { /atan load stopped { pop pop 0 } if } def
/SD { 0 360 arc closepath fill } def
/SQ { /r ED r r moveto r r neg lineto r neg r neg lineto r neg r lineto
closepath fill } def
/ST { /y ED /x ED x y moveto x neg y lineto 0 x lineto closepath fill } def
/SP { /r ED gsave 0 r moveto 4 { 72 rotate 0 r lineto } repeat closepath fill
grestore } def
/NArray { aload length 2 div dup dup cvi eq not { exch pop } if /n exch cvi
def } def
/Dots { NArray n 1 gt { DotB /n n 2 sub def } { /n n 1 sub def } ifelse n {
@Dot } repeat n 0 ge { DotA } if } def
/Line { NArray n 0 eq not { n 1 eq { 0 0 /n 2 def } if ArrowA /n n 2 sub def n
{ Lineto } repeat CP 4 2 roll ArrowB lineto pop pop } if } def
/Arcto { /a [ 6 -2 roll ] cvx def a r /arcto load stopped { 5 } { 4 } ifelse {
pop } repeat a } def
/CheckClosed { dup n 2 mul 1 sub index eq 2 index n 2 mul 1 add index eq and {
pop pop /n n 1 sub def } if } def
/Polygon { NArray n 2 eq { 0 0 /n 3 def } if n 3 lt { n { pop pop } repeat } {
n 3 gt { CheckClosed } if n 2 mul -2 roll /y0 ED /x0 ED /y1 ED /x1 ED x1 y1
/x1 x0 x1 add 2 div def /y1 y0 y1 add 2 div def x1 y1 moveto /n n 2 sub def n
{ Lineto } repeat x1 y1 x0 y0 6 4 roll Lineto Lineto pop pop closepath }
ifelse } def
/CCA { /y ED /x ED 2 copy y sub /dy1 ED x sub /dx1 ED /l1 dx1 dy1 Pyth def }
def
/CC { /l0 l1 def /x1 x dx sub def /y1 y dy sub def /dx0 dx1 def /dy0 dy1 def
CCA /dx dx0 l1 c exp mul dx1 l0 c exp mul add def /dy dy0 l1 c exp mul dy1 l0
c exp mul add def /m dx0 dy0 Atan dx1 dy1 Atan sub 2 div cos abs b exp a mul
dx dy Pyth Div 2 div def /x2 x l0 dx mul m mul sub def /y2 y l0 dy mul m mul
sub def /dx l1 dx mul m mul neg def /dy l1 dy mul m mul neg def } def
/IC { /c c 1 add def c 0 lt { /c 0 def } { c 3 gt { /c 3 def } if } ifelse /a
a 2 mul 3 div 45 cos b exp div def CCA /dx 0 def /dy 0 def } def
/BOC { IC CC x2 y2 x1 y1 ArrowA CP 4 2 roll x y curveto } def
/NC { CC x1 y1 x2 y2 x y curveto } def
/EOC { x dx sub y dy sub 4 2 roll ArrowB 2 copy curveto } def
/BAC { IC CC x y moveto CC x1 y1 CP ArrowA } def
/NAC { x2 y2 x y curveto CC x1 y1 } def
/EAC { x2 y2 x y ArrowB curveto pop pop } def
/OpenCurve { NArray n 3 lt { n { pop pop } repeat } { BOC /n n 3 sub def n {
NC } repeat EOC } ifelse } def
/AltCurve { NArray n 4 lt { n { pop pop } repeat } { BAC /n n 4 sub def n {
NAC } repeat EAC } ifelse } def
/ClosedCurve { NArray n 3 lt { n { pop pop } repeat } { n 3 gt { CheckClosed }
if 6 copy n 2 mul 6 add 6 roll IC CC x y moveto n { NC } repeat closepath pop
pop } ifelse } def
/PathLength { flattenpath /z 0 def { /y1 ED /x1 ED /y2 y1 def /x2 x1 def } {
/y ED /x ED /z z y y1 sub dup mul x x1 sub dup mul add sqrt add def /y1 y def
/x1 x def } {} { /y y2 def /x x2 def /z z y y1 sub dup mul x x1 sub dup mul
add sqrt add def /y1 y def /x1 x def } pathforall z } def
/DashLine { dup 0 gt { /a .5 def PathLength exch div } { pop /a 1 def
PathLength } ifelse /b ED /x ED /y ED /z y x add def b a .5 sub 2 mul y mul
sub z Div round z mul a .5 sub 2 mul y mul add b exch Div dup /y exch y mul
def /x exch x mul def y x 2 array astore 1 a sub y mul setdash stroke } def
/DotLine { /b PathLength def /a ED /x ED /y CLW def /z y x add def a 0 gt { /b
b a div def } { a 0 eq { /b b y sub def } { a -3 eq { /b b y add def } if }
ifelse } ifelse /c b z Div round def b c z mul sub c Div x add y add 0 exch 2
array astore a 0 gt { 0 } { y 2 div a -2 gt { neg } if } ifelse setdash 1
setlinecap stroke } def
/LineFill { gsave clip /a ED pathbbox exch /x2 ED a Div ceiling exch a Div
floor dup a mul 0 exch translate sub 1 add cvi /y ED /x1 ED newpath 2
setlinecap y {x1 0 moveto x2 0 lineto stroke 0 a translate} repeat grestore }
def
/BeginArrow { ADict begin /y1 ED /x1 ED /y2 ED /x2 ED /dy y2 y1 sub def /dx x2
x1 sub def /mtrxa CM def gsave x1 y1 translate /angle dx neg dy Atan def angle
rotate newpath } def
/EndArrow { mtrxa setmatrix x2 y2 currentpoint grestore end } def
/Arrow { CLW mul add dup 2 div /w ED mul dup /h ED mul /a ED w neg h moveto 0
0 lineto w h lineto w neg a neg rlineto gsave fill grestore } def
/Tbar { CLW mul add 2 div /z ED pop z neg CLW 2 div moveto z 2 mul 0 rlineto
stroke 0 CLW moveto } def
/Bracket { CLW mul add dup CLW sub 2 div /z ED mul /a ED z neg a moveto z neg
CLW 2 div lineto z CLW 2 div lineto z a lineto stroke 0 CLW moveto } def
/RoundBracket { CLW mul add dup 2 div CLW 8 div sub /z ED mul CLW 2 div sub /a
ED a z lt { z dup mul a dup mul add a 2 mul Div dup a sub z exch Atan /a ED /z
ED } { /a 90 def } ifelse 0 z CLW 2 div add z 270 a sub 270 a add arc stroke 0
CLW moveto } def
/EndDot { { /z DS def } { /z 0 def } ifelse /b ED 0 z DS SD b { 0 z DS CLW sub
SD } if 0 DS z add CLW 4 div sub moveto } def
/Frame { /a .5 CLW mul def 3 -1 roll 2 copy gt { exch } if a sub /y2 ED a add
/y1 ED 2 copy gt { exch } if a sub /x2 ED a add /x1 ED x1 x2 eq y1 y2 eq or {
pop pop x1 y1 moveto x2 y2 lineto } { /b y1 y2 sub abs x1 x2 sub abs 2 copy gt
{exch pop} {pop} ifelse 2 div a sub def { b mul /b ED } { dup b lt { /b ED } {
pop } ifelse } ifelse x1 y1 y2 add 2 div moveto x1 y2 x1 x2 add 2 div y2 b
arcto 4 {pop} repeat x2 y2 x2 y1 y2 add 2 div b arcto 4 {pop} repeat x2 y1 x1
x2 add 2 div y1 b arcto 4 {pop} repeat x1 y1 x1 y1 y2 add 2 div b arcto 4
{pop} repeat closepath } ifelse } def
/Parab { /y0 exch def /x0 exch def /y1 exch def /x1 exch def /dx x0 x1 sub 3
div def /dy y0 y1 sub 3 div def x0 dx sub y0 dy add x1 y1 ArrowA x0 dx add y0
dy add x0 2 mul x1 sub y1 ArrowB curveto /Points [ x1 y1 x0 y0 x0 2 mul x1 sub
y1 ] def } def
/Grid { /a { (    ) } def /b ED /d ED /n ED cvi dup 1 lt { pop 1 } if /c ED c
div dup 0 eq { pop 1 } if /cy ED c div dup 0 eq { pop 1 } if /cx ED cy div cvi
/y ED cx div cvi /x ED cy div cvi /y2 ED cx div cvi /x2 ED cy div cvi /y1 ED
cx div cvi /x1 ED /h y2 y1 sub 0 gt { 1 } { -1 } ifelse def /w x2 x1 sub 0 gt
{ 1 } { -1 } ifelse def b 0 gt { /z1 b 4 div CLW 2 div add def /Helvetica
findfont b scalefont setfont /b b .95 mul CLW 2 div add def } if gsave n 0 gt
{ 1 setlinecap [ 0 cy n div ] 0 setdash } { 2 setlinecap } ifelse /c x1 def /i
500 w mul x1 add def /e y cy mul def /f y1 cy mul def /g y2 cy mul def x1 cx
mul 0 translate { newpath 0 e moveto b 0 gt { gsave d c a cvs dup stringwidth
pop /z2 ED w 0 gt {z1} {z1 z2 add neg} ifelse h 0 gt {b neg} {z1} ifelse
rmoveto show grestore } if 0 f moveto 0 g lineto stroke cx w mul 0 translate c
x2 eq c i eq or {exit} if /c c w add def } loop grestore gsave n 0 gt { 1
setlinecap [ 0 cx n div ] 0 setdash } { 2 setlinecap } ifelse /c y1 def /i 500
h mul y1 add def /e x cx mul def /f x1 cx mul def /g x2 cx mul def 0 y1 cy mul
translate { newpath e 0 moveto b 0 gt { gsave d c a cvs dup stringwidth pop
/z2 ED w 0 gt {z1 z2 add neg} {z1} ifelse h 0 gt {z1} {b neg} ifelse rmoveto
show grestore } if f 0 moveto g 0 lineto stroke 0 cy h mul translate c y2 eq c
i eq or {exit} if /c c h add def } loop grestore } def
/ArcArrow { /d ED /@b ED /a ED /TDict 2 dict def TDict begin /stroke { } def
/fill { } def gsave 0 1 0 0 @b grestore end c mul /e ED pop pop pop /f CLW 8
div c mul neg def r a e d PtoC r a PtoC @b pop pop pop pop a e d f d } def
/ArcPoints { /Points [ r 3 index PtoC 0 0 r 8 index PtoC ] def } def
/Ellipse { /b ED /a ED /y ED /x ED /y0 ED /x0 ED x0 y0 translate /mtrx CM def
x y scale 0 0 1 a b arc mtrx setmatrix /Points [ 0 0 ] def } def
/ScalePoints { /y ED /x ED counttomark dup dup cvi eq not { exch pop } if /m
exch def /n m 2 div cvi def n { y mul m 1 roll x mul m 1 roll } repeat } def
/Scale { CP CP translate 4 2 roll scale neg exch neg exch translate } def
/Rot { CP CP translate 3 -1 roll neg rotate neg exch neg exch translate } def
/ClipBox { /mtrx CM def STV /a ED /b ED /c ED 0 c neg rmoveto a 0 rlineto 0 b
c add rlineto a neg 0 rlineto closepath clip newpath mtrx setmatrix } def
/GetCoor { nodeA begin x y mtrxf transform CM itransform end nodeB begin x y
mtrxf transform CM itransform end } def
/GetAngle { GetCoor 3 -1 roll sub 3 1 roll sub neg Atan  } def
/GetDPos { angle 1 0 mtrxf dtransform CM idtransform exch atan sub dup sin
/@sin ED cos /@cos ED getpos y add exch x add exch mtrxf transform CM
itransform offset angle cos mul add exch offset angle sin mul sub exch } def
/GetPos { nodeA begin /angle angleA def /offset offsetA def /nodesep nodesepA
def GetDPos end /y1 ED /x1 ED nodeB begin /angle angleB def /offset offsetB
def /nodesep nodesepB def GetDPos end /y2 ED /x2 ED } def
/GetDist { x1 x2 sub y1 y2 sub Pyth  } def
/InitNode { gsave STV CP translate dict def load begin /mtrxf CM def } def
/InitPnode { /y ED /x ED /getpos { nodesep @cos mul nodesep @sin mul } def }
def
/InitCnode { /y ED /x ED /getpos { nodesep r add dup @cos mul exch @sin mul }
def } def
/GetRnodePos { @cos 0 gt { /dx r nodesep add def } { /dx l nodesep sub def }
ifelse @sin 0 gt { /dy u nodesep add def } { /dy d nodesep sub def } ifelse dx
@sin mul abs dy @cos mul abs gt { dy @cos mul @sin div dy } { dx dup @sin mul
@cos Div } ifelse } def
/InitRnode { /r ED r mul neg /l ED /r r l add def /x l neg def { neg /d ED /u
ED /y 0 def } { neg /y ED y sub /u ED u mul neg /d ED /u u d add def /y y d
sub def } ifelse /getpos { GetRnodePos } def } def
/GetOnodePos { /ww w nodesep add def /hh h nodesep add def @sin ww mul @cos hh
mul Atan dup cos ww mul exch sin hh mul } def
/InitNC { tx@Dict nodeA known tx@Dict nodeB known and dup { /nodeA nodeA load
def /nodeB nodeB load def } if } def
/LineMP { 4 copy 1 t sub mul exch t mul add 3 1 roll 1 t sub mul exch t mul
add exch 6 2 roll sub 3 1 roll sub Atan  } def
/NCLine { GetAngle /angleA ED /angleB angleA 180 add def GetPos x1 y1 x2 y2
ArrowB 4 2 roll ArrowA lineto /lvar [ x2 x1 y2 y1 ] cvx def /lpos { lvar
LineMP } def } def
/BezierMidpoint { /y3 ED /x3 ED /y2 ED /x2 ED /y1 ED /x1 ED /y0 ED /x0 ED /t
ED /cx x1 x0 sub 3 mul def /cy y1 y0 sub 3 mul def /bx x2 x1 sub 3 mul cx sub
def /by y2 y1 sub 3 mul cy sub def /ax x3 x0 sub cx sub bx sub def /ay y3 y0
sub cy sub by sub def ax t 3 exp mul bx t t mul mul add cx t mul add x0 add ay
t 3 exp mul by t t mul mul add cy t mul add y0 add 3 ay t t mul mul mul 2 by t
mul mul add cy add 3 ax t t mul mul mul 2 bx t mul mul add cx add atan } def
/GetArms { /x1a armA angleA cos mul x1 add def /y1a armA angleA sin mul y1 add
def /x2a armB angleB cos mul x2 add def /y2a armB angleB sin mul y2 add def }
def
/NCCurve { GetPos GetDist 2 div dup 3 -1 roll mul /armA ED mul /armB ED
GetArms x1a y1a x1 y1 ArrowA x2a y2a x2 y2 ArrowB curveto /lvar [ x1 y1 x1a
y1a x2a y2a x2 y2 ] cvx def /lpos { t lvar BezierMidpoint } def } def
/AnglesMP { lvar t 3 gt { /t t 3 sub def } { t 2 gt { /t t 2 sub def 10 -2
roll } { t 1 gt { /t t 1 sub def 10 -4 roll } { 10 4 roll } ifelse } ifelse }
ifelse 6 { pop } repeat 3 -1 roll exch LineMP  } def
/NCAngles { GetPos GetArms /mtrx angleA matrix rotate def x1a y1a mtrx
transform pop x2a y2a mtrx transform exch pop mtrx itransform /y0 ED /x0 ED [
armB 0 ne { x2 y2 } if x2a y2a x0 y0 x1a y1a armA 0 ne { x1 y1 } if ] Line
/lvar [ x2 y2 x2a y2a x0 y0 x1a y1a x1 y1 ] cvx def /lpos { AnglesMP } def }
def
/NCAngle { GetPos /x2a armB angleB cos mul x2 add def /y2a armB angleB sin mul
y2 add def /mtrx angleA matrix rotate def x2a y2a mtrx transform pop x1 y1
mtrx transform exch pop mtrx itransform /y0 ED /x0 ED [ armB 0 ne { x2 y2 } if
x2a y2a x0 y0 x1 y1 ] Line /lvar [ x2 y2 x2 y2 x2a y2a x0 y0 x1 y1 ] cvx def
/lpos { AnglesMP } def } def
/NCBar { GetPos GetArms /mtrx angleA matrix rotate def x1a y1a mtrx transform
pop x2a y2a mtrx transform pop sub dup 0 mtrx itransform 3 -1 roll 0 gt { /y2a
exch y2a add def /x2a exch x2a add def } { /y1a exch neg y1a add def /x2a exch
neg x2a add def } ifelse [ x2 y2 x2a y2a x1a y1a x1 y1 ] Line /lvar [ x2 y2 x2
y2 x2a y2a x1a y1a x1 y1 ] cvx def /lpos { lvar AnglesMP } def } def
/NCDiag { GetPos GetArms [ x2 y2 x2a y2a x1a y1a x1 y1] Line /lvar [ x2 y2 x2
y2 x2a y2a x1a y1a x1 y1] cvx def /lpos { AnglesMP } def } def
/NCDiagg { nodeA begin /angle angleA def /offset offsetA def /nodesep nodesepA
def GetDPos end /y1 ED /x1 ED /x1a armA angleA cos mul x1 add def /y1a armA
angleA sin mul y1 add def nodeB begin x y mtrxf transform CM itransform end
y1a sub exch x1a sub Atan 180 add /angleB ED nodeB begin /angle angleB def
/offset offsetB def /nodesep nodesepB def GetDPos end /y2 ED /x2 ED [ x2 y2
x1a y1a x1 y1] Line /lvar [ x2 y2 x2 y2 x2 y2 x1a y1a x1 y1] cvx def /lpos {
AnglesMP } def } def
/LPut { tx@Dict /lpos known { Setvmtrx lpos /langle ED vmtrx transform } {
/langle 0 def CP } ifelse } def
/BeginOL { dup (all) eq exch TheOL eq or { IfVisible not { CP OLUnit translate
moveto /IfVisible true def } if } { IfVisible { CP OLUnit neg exch neg exch
translate moveto /IfVisible false def } if } ifelse } def
/InitOL { Setvmtrx /OLUnit [ 2890.79999 dup vmtrx dtransform ] cvx def /BOL {
BeginOL } def /IfVisible true def } def
end
%%EndProcSet
%%BeginProcSet: texps.pro
%!
TeXDict begin /rf{findfont dup length 1 add dict begin{1 index /FID ne 2 index
/UniqueID ne and{def}{pop pop}ifelse}forall[1 index 0 6 -1 roll exec 0 exch 5
-1 roll VResolution Resolution div mul neg 0 0]/Metrics exch def dict begin
Encoding{exch dup type /integertype ne{pop pop 1 sub dup 0 le{pop}{[}ifelse}{
FontMatrix 0 get div Metrics 0 get div def}ifelse}forall Metrics /Metrics
currentdict end def[2 index currentdict end definefont 3 -1 roll makefont
/setfont load]cvx def}def /ObliqueSlant{dup sin S cos div neg}B /SlantFont{4
index mul add}def /ExtendFont{3 -1 roll mul exch}def /ReEncodeFont{/Encoding
exch def}def end
%%EndProcSet
%%BeginProcSet: special.pro
%!
TeXDict begin /SDict 200 dict N SDict begin /@SpecialDefaults{/hs 612 N /vs
792 N /ho 0 N /vo 0 N /hsc 1 N /vsc 1 N /ang 0 N /CLIP 0 N /rwiSeen false N
/rhiSeen false N /letter{}N /note{}N /a4{}N /legal{}N}B /@scaleunit 100 N
/@hscale{@scaleunit div /hsc X}B /@vscale{@scaleunit div /vsc X}B /@hsize{/hs
X /CLIP 1 N}B /@vsize{/vs X /CLIP 1 N}B /@clip{/CLIP 2 N}B /@hoffset{/ho X}B
/@voffset{/vo X}B /@angle{/ang X}B /@rwi{10 div /rwi X /rwiSeen true N}B /@rhi
{10 div /rhi X /rhiSeen true N}B /@llx{/llx X}B /@lly{/lly X}B /@urx{/urx X}B
/@ury{/ury X}B /magscale true def end /@MacSetUp{userdict /md known{userdict
/md get type /dicttype eq{userdict begin md length 10 add md maxlength ge{/md
md dup length 20 add dict copy def}if end md begin /letter{}N /note{}N /legal{
}N /od{txpose 1 0 mtx defaultmatrix dtransform S atan/pa X newpath clippath
mark{transform{itransform moveto}}{transform{itransform lineto}}{6 -2 roll
transform 6 -2 roll transform 6 -2 roll transform{itransform 6 2 roll
itransform 6 2 roll itransform 6 2 roll curveto}}{{closepath}}pathforall
newpath counttomark array astore /gc xdf pop ct 39 0 put 10 fz 0 fs 2
F/|______Courier fnt invertflag{PaintBlack}if}N /txpose{pxs pys scale ppr
aload pop por{noflips{pop S neg S TR pop 1 -1 scale}if xflip yflip and{pop S
neg S TR 180 rotate 1 -1 scale ppr 3 get ppr 1 get neg sub neg ppr 2 get ppr 0
get neg sub neg TR}if xflip yflip not and{pop S neg S TR pop 180 rotate ppr 3
get ppr 1 get neg sub neg 0 TR}if yflip xflip not and{ppr 1 get neg ppr 0 get
neg TR}if}{noflips{TR pop pop 270 rotate 1 -1 scale}if xflip yflip and{TR pop
pop 90 rotate 1 -1 scale ppr 3 get ppr 1 get neg sub neg ppr 2 get ppr 0 get
neg sub neg TR}if xflip yflip not and{TR pop pop 90 rotate ppr 3 get ppr 1 get
neg sub neg 0 TR}if yflip xflip not and{TR pop pop 270 rotate ppr 2 get ppr 0
get neg sub neg 0 S TR}if}ifelse scaleby96{ppr aload pop 4 -1 roll add 2 div 3
1 roll add 2 div 2 copy TR .96 dup scale neg S neg S TR}if}N /cp{pop pop
showpage pm restore}N end}if}if}N /normalscale{Resolution 72 div VResolution
72 div neg scale magscale{DVImag dup scale}if 0 setgray}N /psfts{S 65781.76
div N}N /startTexFig{/psf$SavedState save N userdict maxlength dict begin
/magscale false def normalscale currentpoint TR /psf$ury psfts /psf$urx psfts
/psf$lly psfts /psf$llx psfts /psf$y psfts /psf$x psfts currentpoint /psf$cy X
/psf$cx X /psf$sx psf$x psf$urx psf$llx sub div N /psf$sy psf$y psf$ury
psf$lly sub div N psf$sx psf$sy scale psf$cx psf$sx div psf$llx sub psf$cy
psf$sy div psf$ury sub TR /showpage{}N /erasepage{}N /copypage{}N /p 3 def
@MacSetUp}N /doclip{psf$llx psf$lly psf$urx psf$ury currentpoint 6 2 roll
newpath 4 copy 4 2 roll moveto 6 -1 roll S lineto S lineto S lineto closepath
clip newpath moveto}N /endTexFig{end psf$SavedState restore}N /@beginspecial{
SDict begin /SpecialSave save N gsave normalscale currentpoint TR
@SpecialDefaults count /ocount X /dcount countdictstack N}N /@setspecial{CLIP
1 eq{newpath 0 0 moveto hs 0 rlineto 0 vs rlineto hs neg 0 rlineto closepath
clip}if ho vo TR hsc vsc scale ang rotate rwiSeen{rwi urx llx sub div rhiSeen{
rhi ury lly sub div}{dup}ifelse scale llx neg lly neg TR}{rhiSeen{rhi ury lly
sub div dup scale llx neg lly neg TR}if}ifelse CLIP 2 eq{newpath llx lly
moveto urx lly lineto urx ury lineto llx ury lineto closepath clip}if
/showpage{}N /erasepage{}N /copypage{}N newpath}N /@endspecial{count ocount
sub{pop}repeat countdictstack dcount sub{end}repeat grestore SpecialSave
restore end}N /@defspecial{SDict begin}N /@fedspecial{end}B /li{lineto}B /rl{
rlineto}B /rc{rcurveto}B /np{/SaveX currentpoint /SaveY X N 1 setlinecap
newpath}N /st{stroke SaveX SaveY moveto}N /fil{fill SaveX SaveY moveto}N
/ellipse{/endangle X /startangle X /yrad X /xrad X /savematrix matrix
currentmatrix N TR xrad yrad scale 0 0 1 startangle endangle arc savematrix
setmatrix}N end
%%EndProcSet
TeXDict begin 40258431 52099146 1000 300 300 @start /Fa 206[55
49[{}1 100.000000 /Helvetica rf /Fb 138[126 1[115 80 2[126
126 4[57 3[115 29[161 2[149 68[{}9 207.333359 /Helvetica-Bold
rf end
%%EndProlog
%%BeginSetup
%%Feature: *Resolution 300dpi
TeXDict begin

%%EndSetup
%%Page: 1 1
0 bop 331 421 a
 /@@show /show load def /show { dup gsave newpath 0 0 moveto true charpath
pathbbox grestore 3 -1 roll eq 3 1 roll eq and { @@show } { true charpath
} ifelse } def
 Fb(Denis)58 b(Girous)1616 421 y
 tx@Dict begin gsave STV 0.8 SLW 0. setgray  0. 0.1 0.95 0. 1. 1. 500
0.9 0.  rotate /MidPoint ED /NoLines ED /LastBlue ED /LastGreen ED
/LastRed ED /FirstBlue ED /FirstGreen ED /FirstRed ED clip pathbbox
/y ED /x ED 2 copy translate y sub neg /y ED x sub neg /x ED /b { x
0 rlineto 0 YSizePerLine rlineto x neg 0 rlineto closepath } def /MidLine
NoLines 1 MidPoint sub mul abs cvi def MidLine NoLines gt { /Midline
NoLines def } if /RedIncrement LastRed FirstRed sub MidLine div def
/GreenIncrement LastGreen FirstGreen sub MidLine div def /BlueIncrement
LastBlue FirstBlue sub MidLine div def /YSizePerLine y NoLines div
def /CurrentY 0 def /Red FirstRed def /Green FirstGreen def /Blue FirstBlue
def MidLine { 0 CurrentY moveto b Red Green Blue setrgbcolor fill CurrentY
YSizePerLine add /CurrentY exch def Blue BlueIncrement add dup 1 gt
{ pop 1 } if dup 0 lt { pop 0 } if /Blue exch def Green GreenIncrement
add dup 1 gt { pop 1 } if dup 0 lt { pop 0 } if /Green exch def Red
RedIncrement add dup 1 gt { pop 1 } if dup 0 lt { pop 0 } if /Red exch
def } repeat Blue BlueIncrement sub /Blue exch def Green GreenIncrement
sub /Green exch def Red RedIncrement sub /Red exch def /RedIncrement
LastRed FirstRed sub NoLines MidLine sub div def /GreenIncrement LastGreen
FirstGreen sub NoLines MidLine sub div def /BlueIncrement LastBlue
FirstBlue sub NoLines MidLine sub div def Blue BlueIncrement sub /Blue
exch def Green GreenIncrement sub /Green exch def Red RedIncrement
sub /Red exch def NoLines MidLine sub { 0 CurrentY moveto b Red Green
Blue setrgbcolor fill CurrentY YSizePerLine add /CurrentY exch def
Blue BlueIncrement sub dup 1 gt { pop 1 } if dup 0 lt { pop 0 } if
/Blue exch def Green GreenIncrement sub dup 1 gt { pop 1 } if dup 0
lt { pop 0 } if /Green exch def Red RedIncrement sub dup 1 gt { pop
1 } if dup 0 lt { pop 0 } if /Red exch def } repeat grestore CP newpath
moveto end /show /@@show load def
 331 886 a
 /@@show /show load def /show { dup gsave newpath 0 0 moveto true charpath
pathbbox grestore 3 -1 roll eq 3 1 roll eq and { @@show } { true charpath
} ifelse } def
 Fb(Denis)g(Girous)
1616 886 y
 tx@Dict begin gsave STV 0.8 SLW 0. setgray  0. 0.1 0.95 0. 1. 1. 500
0.5 45.  rotate /MidPoint ED /NoLines ED /LastBlue ED /LastGreen ED
/LastRed ED /FirstBlue ED /FirstGreen ED /FirstRed ED clip pathbbox
/y ED /x ED 2 copy translate y sub neg /y ED x sub neg /x ED /b { x
0 rlineto 0 YSizePerLine rlineto x neg 0 rlineto closepath } def /MidLine
NoLines 1 MidPoint sub mul abs cvi def MidLine NoLines gt { /Midline
NoLines def } if /RedIncrement LastRed FirstRed sub MidLine div def
/GreenIncrement LastGreen FirstGreen sub MidLine div def /BlueIncrement
LastBlue FirstBlue sub MidLine div def /YSizePerLine y NoLines div
def /CurrentY 0 def /Red FirstRed def /Green FirstGreen def /Blue FirstBlue
def MidLine { 0 CurrentY moveto b Red Green Blue setrgbcolor fill CurrentY
YSizePerLine add /CurrentY exch def Blue BlueIncrement add dup 1 gt
{ pop 1 } if dup 0 lt { pop 0 } if /Blue exch def Green GreenIncrement
add dup 1 gt { pop 1 } if dup 0 lt { pop 0 } if /Green exch def Red
RedIncrement add dup 1 gt { pop 1 } if dup 0 lt { pop 0 } if /Red exch
def } repeat Blue BlueIncrement sub /Blue exch def Green GreenIncrement
sub /Green exch def Red RedIncrement sub /Red exch def /RedIncrement
LastRed FirstRed sub NoLines MidLine sub div def /GreenIncrement LastGreen
FirstGreen sub NoLines MidLine sub div def /BlueIncrement LastBlue
FirstBlue sub NoLines MidLine sub div def Blue BlueIncrement sub /Blue
exch def Green GreenIncrement sub /Green exch def Red RedIncrement
sub /Red exch def NoLines MidLine sub { 0 CurrentY moveto b Red Green
Blue setrgbcolor fill CurrentY YSizePerLine add /CurrentY exch def
Blue BlueIncrement sub dup 1 gt { pop 1 } if dup 0 lt { pop 0 } if
/Blue exch def Green GreenIncrement sub dup 1 gt { pop 1 } if dup 0
lt { pop 0 } if /Green exch def Red RedIncrement sub dup 1 gt { pop
1 } if dup 0 lt { pop 0 } if /Red exch def } repeat grestore CP newpath
moveto end /show /@@show load def
 331 1350 a
 /@@show /show load def /show { dup gsave newpath 0 0 moveto true charpath
pathbbox grestore 3 -1 roll eq 3 1 roll eq and { @@show } { true charpath
} ifelse } def
 Fb(Denis)g(Girous)1616 1350 y
 tx@Dict begin gsave STV 0.8 SLW 0. setgray  gsave 0.8 SLW 0. setgray
3.0  1 DotLine  grestore grestore CP newpath moveto end /show /@@show
load def
 331 1815
a
 /@@show /show load def /show { dup gsave newpath 0 0 moveto true charpath
pathbbox grestore 3 -1 roll eq 3 1 roll eq and { @@show } { true charpath
} ifelse } def
 Fb(Denis)g(Girous)1616 1815 y
 tx@Dict begin gsave STV 0.8 SLW 0. setgray  gsave 45.  rotate 0.8
 SLW 0. setgray 5.0  LineFill grestore gsave 90 rotate gsave 45.  rotate
0.8  SLW 0. setgray 5.0  LineFill grestore grestore gsave 0.8 SLW 0.
setgray 0 setlinecap stroke grestore grestore CP newpath moveto end
/show /@@show load def
 331 2279 a
 /@@show /show load def /show { dup gsave newpath 0 0 moveto true charpath
pathbbox grestore 3 -1 roll eq 3 1 roll eq and { @@show } { true charpath
} ifelse } def
 Fb(Denis)g(Girous)1616
2279 y
 tx@Dict begin gsave STV 0.8 SLW 0. setgray  gsave 1. 0. 0. setrgbcolor
 fill grestore gsave 0.8 SLW 0. setgray 0 setlinecap stroke grestore
grestore CP newpath moveto end /show /@@show load def
 946 2607 a Fa(1)p eop
%%Trailer
end
userdict /end-hook known{end-hook}if
%%EOF


-- 
Timothy Van Zandt   (609)258-4050  tvz@Princeton.EDU (NeXTMail)