| % | 
 | % 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 |