xiaofei@ACSU.BUFFALO.EDU (X. F. Wang) (06/02/91)
I wonder if there is an easier way to write things like [normal]T[subscript]lambda ? Or one has to write a ``T'' and then change position and font and write the lambda and then find position for next character? In TeX, one doesn't need to write about it, one simply writes $T_\lambda$. How do I select among 0.01 1.0E-2 1e-2 etc for show? I need them for labels. I used to program in FORTRAN and this is done by FORMAT control E5.2 F5.2 etc.
green@ohrd.uucp (Martin Green KR260_x7060) (06/04/91)
I wrote the following functions to provide flexible manipulation of complex text. The function xshow is used to do precise centering as would be required when marking points on a data plot. %! text.pro % Copyright (c) 1990 by M.A. Green, % Ontario Hydro Research Division, Toronto, CANADA % ---------------------------------------------------------------------- % Text manipulation functions including super- and sub-scripts, % multiple fonts and sizes, centering and right alignment, and % full justification. % Functions are also provided to permit printing of characters precisely % centred on the current point, such as would be required for marking % data points on a plot. % [string1 sups [string2 string3 subs string4] font2 string5] display % should print string1 with the current font % then go into superscript mode for string2 and string3 % then print string4 as a subscript to string3 % then return to the original font, followed by a change to font2 % and finally print string5. % The positioning and angle of the printed text are % determined by the /textalign and /textangle variables. % Font selection % To select Times-Roman 12 point font use: 12 TR % /TR {dup /PS exch def /Times-Roman findfont exch scalefont setfont} def /TB {dup /PS exch def /Times-Bold findfont exch scalefont setfont} def /TI {dup /PS exch def /Times-Itatic findfont exch scalefont setfont} def /TBI {dup /PS exch def /Times-BoldItalic findfont exch scalefont setfont} def /H {dup /PS exch def /Helvetica findfont exch scalefont setfont} def /HB {dup /PS exch def /Helvetica-Bold findfont exch scalefont setfont} def /HO {dup /PS exch def /Helvetica-Oblique findfont exch scalefont setfont} def /HBO {dup /PS exch def /Helvetica-BoldOblique findfont exch scalefont setfont} def /S {dup /PS exch def /Symbol findfont exch scalefont setfont} def /C {dup /PS exch def /Courier findfont exch scalefont setfont} def /STRING (a) type cvlit def /ARRAY [0] type cvlit def /LEFT -1 def /CENTRE 0 def /RIGHT 1 def /CENTER CENTRE def /fontstore 5 array def /vshift 5 array def /fontlevel 0 def /pushfont { fontstore exch [ exch PS ] fontlevel exch put /fontlevel fontlevel 1 add def } def /popfont { 0 vshift fontlevel get neg rmoveto vshift fontlevel 0 put /fontlevel fontlevel 1 sub def fontstore fontlevel get aload pop /PS exch def setfont } def /sups { % adjust position and reduce font size {currentfont dup pushfont .8 scalefont setfont vshift fontlevel PS .4 mul put 0 PS .4 mul rmoveto /PS PS .8 mul def} } def /subs { % adjust position and reduce font size {currentfont dup pushfont .8 scalefont setfont vshift fontlevel PS -.3 mul put 0 PS -.3 mul rmoveto /PS PS .8 mul def} } def /isstring { % return true if argument is a string type cvlit STRING eq } def /isarray { % return true if argument is an array type cvlit ARRAY eq } def /displaywidth { % compute width of complex text array /textwidth 0 def /textheight PS def /fontlevel 0 def /displevel 0 def { % step through array elements dup isstring { stringwidth pop /textwidth exch textwidth add def fontlevel displevel sub 1 eq {popfont} if } { dup xcheck { exec } { dup isarray { displaywidth2 fontlevel displevel sub 1 eq {popfont} if } { % error handler pop } ifelse } ifelse } ifelse } forall } def /displaywidth2 { /displevel displevel 1 add def { % step through array elements dup isstring { stringwidth pop /textwidth exch textwidth add def fontlevel displevel sub 1 eq {popfont} if } { dup xcheck { exec } { dup isarray { displaywidth2 fontlevel displevel sub 1 eq {popfont} if } { % error handler pop } ifelse } ifelse } ifelse } forall /displevel displevel 1 sub def } def /display { currentpoint 3 -1 roll /textwidth 0 def exactwidth 0 ne textalign LEFT ne or % compute dimensions if required {dup displaywidth} if % adjust starting position and angle 3 1 roll moveto textalign LEFT ne { textalign RIGHT eq { textwidth neg 0 rmoveto } { textwidth 2 div neg 0 rmoveto } ifelse } if % print text /fontlevel 0 def /displevel 0 def { dup isstring { show fontlevel displevel sub 1 eq {popfont} if } { dup xcheck { exec } { dup isarray { display2 fontlevel displevel sub 1 eq {popfont} if } { % error handler pop } ifelse } ifelse } ifelse } forall } def /display2 { /displevel displevel 1 add def { % step through array elements dup isstring { show fontlevel displevel sub 1 eq {popfont} if } { dup xcheck { exec } { dup isarray { display2 fontlevel displevel sub 1 eq {popfont} if } { % error handler pop } ifelse } ifelse } ifelse } forall /displevel displevel 1 sub def } def /xshow { dup pointdict exch known { pointdict begin load end currentpoint 3 -1 roll currentfont exch aload pop rmoveto exec show setfont moveto } { pop } ifelse } def /xsetup { % /name (string) {nn FF} xsetup pointdict begin 3 -1 roll [ 4 2 roll % /name [ ( ) { } dup exec 1 index % /name [ ( ) { } ( ) -- font set newpath 0 0 moveto false charpath flattenpath pathbbox 4 2 roll 2 copy 6 -2 roll 3 -1 roll sub -.5 mul 3 1 roll sub .5 mul % /name [ ( ) { } dy dx 4 -1 roll sub 3 1 roll exch sub ] def % /name [ ( ) { } dx dy ] def end } def /pointdict 50 dict def /. (\264) {12 TR} xsetup /a (a) {8 H} xsetup /b (b) {8 H} xsetup /c (c) {8 H} xsetup /d (d) {8 H} xsetup /e (e) {8 H} xsetup /f (f) {8 H} xsetup /*1 (1) {8 H} xsetup /*2 (2) {8 H} xsetup /*3 (3) {8 H} xsetup /*4 (4) {8 H} xsetup /*5 (5) {8 H} xsetup /*6 (6) {8 H} xsetup /*7 (7) {8 H} xsetup /*8 (8) {8 H} xsetup /*9 (9) {8 H} xsetup /x (x) {8 H} xsetup /o (o) {8 H} xsetup /O (O) {8 H} xsetup /+ (+) {10 H} xsetup /- (-) {10 S} xsetup /* (*) {10 S} xsetup /| (|) {8 H} xsetup /de (o) {5 H} xsetup /cix (\250) {8 H} xsetup /*D (D) {8 S} xsetup /diamond (\250) {8 S} xsetup /mu (\264) {8 S} xsetup /bu (\267) {8 S} xsetup /xci (\304) {8 S} xsetup /+ci (\305) {8 S} xsetup /opendiamond (\340) {8 S} xsetup /exactwidth 0 def /textalign CENTRE def /i {72 mul} def 4.25 i 6 i moveto 12 TR %[(test) subs [(double) subs (sub)] sups (sup) ( test2)] display %4.25 i 2 i moveto 0 2 i rlineto %3.25 i 3 i moveto 2 i 0 rlineto stroke %4.25 i 3 i moveto /x xshow %4.75 i 3.5 i moveto /. xshow /showx { isarray { st 1 blank putinterval currentpoint 3 -1 roll dup xshow 3 1 roll 2 copy exch 36 add exch 3 sub moveto 12 H 3 -1 roll ( ) cvs st exch 1 exch putinterval st show 13 sub moveto } {pop} ifelse } def /showmarkers { /st 18 string def st 0 (/) putinterval /blank ( ) def pointdict {showx} forall } def /markerpage { erasepage 4.25 i 10 i moveto 16 HB [(Data Markers For PSplot)] display /textalign LEFT def 1 i 9 i moveto 13 H (To print marker at current point use, for example: /+ci xshow) show 1 i 8.5 i moveto showmarkers showpage } def %------------------------------------------------------------------------ -- Martin Green UUCP : torsqnt!ohrd!green@cs.toronto.edu Ontario Hydro Research Division Tel. : (416)231-4111 Ext7060 800 Kipling Ave Toronto, Ontario, CANADA, M8Z5S4