|  | % | 
|  | % Stuff used to draw or set text along a baseline specified by parametric equations | 
|  | % for x and y. | 
|  | % | 
|  |  | 
|  | /left -1 def | 
|  | /center 0 def | 
|  | /right 1 def | 
|  |  | 
|  | /baselinedict 50 dict def | 
|  |  | 
|  | /newbaseline { | 
|  | baselinedict begin | 
|  | /g' exch bind def | 
|  | /f' exch bind def | 
|  | /g  exch bind def | 
|  | /f  exch bind def | 
|  |  | 
|  | counttomark 2 eq {/hoffset exch def} if | 
|  | /res exch def | 
|  |  | 
|  | /t 0 def | 
|  | /s 0 def | 
|  | /voffset false def | 
|  | cleartomark | 
|  | end | 
|  | } bind def | 
|  |  | 
|  | /drawfunnytext { | 
|  | baselinedict begin | 
|  | /t exch def | 
|  | /mode exch def | 
|  | /str exch def | 
|  |  | 
|  | mode left eq { | 
|  | /leftstring emptystring def | 
|  | /rightstring str def | 
|  | } if | 
|  |  | 
|  | mode right eq { | 
|  | /leftstring str reversestring def | 
|  | /rightstring emptystring def | 
|  | } if | 
|  |  | 
|  | mode center eq { | 
|  | str splitstring | 
|  | /rightstring exch def | 
|  | /leftstring exch reversestring def | 
|  | } if | 
|  |  | 
|  | gsave currentpoint translate leftstring left t baselineshow grestore | 
|  | gsave currentpoint translate rightstring right t baselineshow grestore | 
|  |  | 
|  | /t 0 def | 
|  | /s 0 def | 
|  | /voffset false def | 
|  | cleartomark | 
|  | end | 
|  | } bind def | 
|  |  | 
|  | /setfunnytext { | 
|  | baselinedict begin | 
|  | /vpos exch def | 
|  | /hpos exch def | 
|  | /str  exch def | 
|  |  | 
|  | voffset vpos ne { | 
|  | /voffset vpos def | 
|  | /t 0 def | 
|  | /s hoffset def | 
|  | } if | 
|  |  | 
|  | gsave | 
|  | hoffset voffset translate | 
|  | 0 0 moveto | 
|  | /ds hpos s sub def | 
|  | /dt ds t f' dup mul t g' dup mul add sqrt res mul div def | 
|  | /s s ds add def | 
|  | /t t dt add def | 
|  | str right t baselineshow | 
|  | grestore | 
|  | end | 
|  | } bind def | 
|  |  | 
|  | baselinedict begin | 
|  |  | 
|  | /f  {} bind def | 
|  | /g  {pop 0} bind def | 
|  | /f' {pop 1} bind def | 
|  | /g' {pop 0} bind def | 
|  |  | 
|  | /s 0 def | 
|  | /t 0 def | 
|  | /res 72 def | 
|  |  | 
|  | /onecharstring ( ) def | 
|  | /emptystring () def | 
|  |  | 
|  | /baselineshow { | 
|  | /t exch def | 
|  | /mode exch def | 
|  | /str exch def | 
|  |  | 
|  | gsave | 
|  | t f res mul t g res mul translate | 
|  | 0 0 moveto | 
|  | t g' t f' atan rotate | 
|  | { | 
|  | mode right eq {pop} if | 
|  | grestore gsave | 
|  | onecharstring 0 3 -1 roll put onecharstring stringwidth pop | 
|  | /ds exch mode mul def | 
|  | /dt ds t f' dup mul t g' dup mul add sqrt res mul div def | 
|  | /t t dt add def | 
|  | /s s ds add def | 
|  | t f res mul t g res mul translate | 
|  | 0 0 moveto | 
|  | t g' t f' atan rotate | 
|  | mode left eq {pop} if | 
|  | } str kshow | 
|  | grestore | 
|  | } bind def | 
|  |  | 
|  | /reversestring { | 
|  | /str1 exch def | 
|  |  | 
|  | /str2 str1 length string def | 
|  | /i 0 def | 
|  | /n str1 length 1 sub def | 
|  |  | 
|  | { | 
|  | str1 n get str2 exch i exch put | 
|  | /i i 1 add def | 
|  | /n n 1 sub def | 
|  | n 0 lt {exit} if | 
|  | } loop | 
|  | str2 | 
|  | } bind def | 
|  |  | 
|  | /splitstring { | 
|  | /str1 exch def | 
|  |  | 
|  | /len str1 stringwidth pop def | 
|  | /s 0 def | 
|  | /n 0 def | 
|  | str1 length { | 
|  | str1 n get onecharstring exch 0 exch put | 
|  | /s onecharstring stringwidth pop s add def | 
|  | s len 2 div ge {exit} if | 
|  | /n n 1 add def | 
|  | } repeat | 
|  | str1 0 n 1 add getinterval | 
|  | str1 n str1 length n sub getinterval | 
|  | } bind def | 
|  |  | 
|  | end |