[comp.lang.postscript] Underlining and character lengths

tomwest@utgpu.UUCP (10/27/87)

  I am adapting our word processor to a postscript engine.  However, I
am not sure how to handle underlines.  Is there any easy way to know where
or how to underline?  We use a mono-spaced font (for the most part).  Can
one just draw a horizontal line of the appropriate length with the same
vertical position as the characters?

   i.e.   100 100 moveto
	  (Hello) show			! Using Courier 10 cpi
	  100 100 moveto
	  136 100 lineto
	  stroke

  As well, if we decide to get sophisticated, we would want to use non-mono
fonts.  Is there anywhere that we can get the length of characters in the
standard fonts (Times, Helvetica and Symbols)?

   Thanks in advance.

-- 
				Tom West

BITNET:         tomwest@utorgpu.bitnet, tomwest@gpu.utcs.utoronto
Internet:       tomwest@gpu.utcs.toronto.edu 
UUCP:           tomwest@utgpu 

		utzoo, yetti, harpo, mnetor \
		cbosgd, deepthot, utoronto  -  !utgpu!tomwest
		ihnp4, lsuc, sfmin, vnr-vpa /

zaphod@deepthot.UUCP (10/28/87)

In article <1987Oct27.134058.23182@gpu.utcs.toronto.edu> tomwest@gpu.utcs.toronto.edu (Tom West) writes:
>
>  I am adapting our word processor to a postscript engine.  However, I
>am not sure how to handle underlines.  Is there any easy way to know where
>or how to underline?
	yes 
>  We use a mono-spaced font (for the most part).  Can
>one just draw a horizontal line of the appropriate length with the same
>vertical position as the characters?
	no, the line will "melt" into the letters

>
>  As well, if we decide to get sophisticated, we would want to use non-mono
>fonts.  Is there anywhere that we can get the length of characters in the
>standard fonts (Times, Helvetica and Symbols)?
	again, yes  the stringwidth operator
	gives you the x and y offsets if the string on the top of the
	stack were printed.  the y offset (for non-japanese letters)
	is usually 0 and therefore popped


this code will perform the trick.

/undershow
{   currentlinewidth exch
    dup show   currentpoint 3 2 roll
    stringwidth exch neg exch
    0 -2 rmoveto   rlineto 0.5 setlinewidth stroke
    moveto setlinewidth
} def

(string) undershow

the code works as follows.  

currentlinewidth is stored on the stack 
(string) is pushed onto the stack and undershow does the following:
top of stack is duplicated and shown.
the new currentpoint is saved, the roll tucks the currentpoint under the 
string-in-question. 
stringwidth gives us x and y displacements, exch to access the x value
negate the x value as we will be drawing BACK under the already shown string
exch to switch back the x and y values.  move down 2 dots.  I have found
this to be a good amount to avoid the line from melting into the letters.
now rlineto based on the x and y still on the stack.  the 0.5 linewidth
is arbitrary, again, i have found it to be nice. stroke, reset the linewidth
and moveto the stored currentpoint.

THis is the cleanest way.  a gsave/grestore combination could be used
to save currentpoint, but why store the entire graphics state for only
two values? 
>
>   Thanks in advance.

no problem, call me at 1-519-663-3787, i actually enjoy typesetting in raw
postscript and so have tackled many of the commen problems.
I also enjoy fixing postscript on third party wordprocessors (like
micro soft word) -- but i digress
>
-- 
humbly yours,  Lance Bailey 
               Univ. Western Ontario         |   Robart's Research Institute
               Dept. of Computer Science     |   Clinical Trials Unit
               Graduate Studies              |   PO Box 5015
               London, Canada                |   London, Canada
               N6A 5B7                       |   N6A 5K8

decvax!{utcs|utzoo|watmath}!deepthot!zaphod
		-or-  zaphod@deepthot.uucp

ted@mitre-bedford.ARPA (Edward J. Ede) (10/30/87)

In article <1987Oct27.134058.23182@gpu.utcs.toronto.edu> tomwest@gpu.utcs.toronto.edu (Tom West) writes:
>  I am adapting our word processor to a postscript engine.  However, I
>am not sure how to handle underlines.  Is there any easy way to know where
>or how to underline?  We use a mono-spaced font (for the most part).  Can
>one just draw a horizontal line of the appropriate length with the same
>vertical position as the characters?
>

No.  But you can get the from the AFM files provided by Adobe for you
driver or in Adobe's font dictionary for a postscript procedure.

In Adobe's font dictionaries, there is a dictionary called 'FontInfo'.
FontInfo contains about eight items, including 'UnderlinePosition' and
'UnderlineThickness'.  These are integer containing the number of
units from the baseline to draw a line (the number is negative) and
its width.  These numbers are in the character system coordinates
(1000 units to a point).  So divide the number by 1000 and multiply by
the current point size.  See the Red book, page 93 for more info.

>  As well, if we decide to get sophisticated, we would want to use non-mono
>fonts.  Is there anywhere that we can get the length of characters in the
>standard fonts (Times, Helvetica and Symbols)?

Again, you can use the AFM files available from Abobe or the
'stringwidth' operator.

Ted Ede -- ted@mitre-bedford.arpa -- The MITRE Corporation -- Burlington Road  
|       -- DDD: (617) 271-2545 -- Bedford MA, 10730 -- Mail Stop B015 --    |
|                   - this line intentionally left blank -                  |
+---------------------------------------------------------------------------+