DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download
Index: T p

⟦b78d926d3⟧ TextFile

    Length: 8455 (0x2107)
    Types: TextFile
    Names: »pathtext.ps«

Derivation

└─⟦060c9c824⟧ Bits:30007080 DKUUG TeX 2/12/89
    └─⟦this⟧ »./tex82/TeXgraphics/psfig/doc/figs/pathtext.ps« 
└─⟦52210d11f⟧ Bits:30007239 EUUGD2: TeX 3 1992-12
    └─⟦af5ba6c8e⟧ »unix3.0/DVIWARE.tar.Z« 
        └─⟦ca79c7339⟧ 
            └─⟦this⟧ »DVIware/laser-setters/dvi-to-ps/TeXPS/psfig/ps-ex/pathtext.ps« 
            └─⟦this⟧ »DVIware/laser-setters/mctex/psfig/figs/pathtext.ps« 

TextFile

%!
%%BoundingBox: 146 359 356 554
% Cookbook Example Program from First Printing, Revised 7 Jan 1985
% Program: Placing Text Along an Arbitrary Path     Number: 17
%-----------------------------------------------------------------------------
%
/pathtextdict 26 dict def                   % Local storage for the procedure
					    % ``pathtext.''
							   
/pathtext                                   % ``pathtext'' will place a string
  { pathtextdict begin                      % of text along any path. It takes
    /offset exch def                        % a string and starting offset
    /str exch def                           % distance from the beginning of
					    % the path as its arguments. Note
					    % that ``pathtext'' assumes that a
					    % path has already been defined
					    % and after it places the text
					    % along the path, it clears the
					    % current path like the ``stroke''
					    % and ``fill'' operators; it also
					    % assumes that a font has been
					    % set. ``pathtext'' begins placing
					    % the characters along the current
					    % path, starting at the offset
					    % distance and continuing until
					    % either the path length is
					    % exhausted or the entire string
					    % has been printed, whichever
					    % occurs first. The results will
					    % be more effective when a small
					    % point size font is used with
					    % sharp curves in the path.
								       
    /pathdist 0 def                         % Initialize the distance we have
					    % travelled along the path.
    /setdist offset def                     % Initialize the distance we have
					    % covered by setting characters.
    /charcount 0 def                        % Initialize the character count.
    gsave
      flattenpath                           % Reduce the path to a series of
					    % straight line segments. The
					    % characters will be placed along
					    % the line segments in the
					    % ``linetoproc.''
      {movetoproc} {linetoproc}             % The basic strategy is to process
	{curvetoproc} {closepathproc}       % the segments of the path,
	pathforall                          % keeping a running total of the
					    % distance we have travelled so
					    % far (pathdist). We also keep
					    % track of the distance taken up
					    % by the characters that have been
					    % set so far (setdist). When the
					    % distance we have travelled along
					    % the path is greater than the
					    % distance taken up by the set
					    % characters, we are ready to set
					    % the next character (if there are
					    % any left to be set). This
					    % process continues until we have
					    % exhausted the full length of the
					    % path.
    grestore
    newpath                                 % Clear the current path.
    end
  } def
       
pathtextdict begin
/movetoproc                                 % ``movetoproc'' is executed when
  { /newy exch def /newx exch def           % a moveto component has been
					    % encountered in the pathforall
					    % operation.
    /firstx newx def /firsty newy def       % Remember the ``first point'' in
					    % the path so that when we get a
					    % ``closepath'' component we can
					    % properly handle the text.
    /ovr 0 def
    newx newy transform
    /cpy exch def /cpx exch def             % Explicitly keep track of the
					    % current position in device
					    % space.
  } def
       
/linetoproc                                 % ``linetoproc'' is executed when
					    % a lineto component has been
					    % encountered in the pathforall
					    % operation.
  { /oldx newx def /oldy newy def           % Update the old point.
    /newy exch def /newx exch def           % Get the new point.
    /dx newx oldx sub def
    /dy newy oldy sub def
    /dist dx dup mul dy dup mul add         % Calculate the distance between
					    % the old and the new point.
      sqrt def
    /dsx dx dist div ovr mul def            % dsx and dsy are used to update
    /dsy dy dist div ovr mul def            % the current position to be just
					    % beyond the width of the previous
					    % character.
    oldx dsx add oldy dsy add transform
    /cpy exch def /cpx exch def             % Update the current position.
    /pathdist pathdist dist add def         % Increment the distance we have
					    % travelled along the path.
    { setdist pathdist le                   % Keep setting characters along
					    % this path segment until we have
					    % exhausted its length.
	{ charcount str length lt           % As long as there are still
	    {setchar} {exit} ifelse }       % characters left in the string,
					    % set them.
	{ /ovr setdist pathdist sub def     % Keep track of how much we have
	  exit }                            % overshot the path segment by
	ifelse                              % setting the previous character.
					    % This enables us to position the
					    % origin of the following
					    % characters properly on the path.
    } loop
  } def
       
/curvetoproc                                % ``curvetoproc'' is executed when
  { (ERROR: No curveto's after flattenpath!)% a curveto component has been
    print                                   % encountered in the pathforall
  } def                                     % operation. It prints an error
					    % message since there shouldn't be
					    % any curveto's in a path after
					    % the flattenpath operator has
					    % been executed.
							    
/closepathproc                              % ``closepathproc'' is executed
  { firstx firsty linetoproc                % when a closepath component has
    firstx firsty movetoproc                % been encountered in the
  } def                                     % pathforall operation. It
					    % simulates the action of the
					    % operator ``closepath'' by
					    % executing ``linetoproc'' with
					    % the coordinates of the most
					    % recent ``moveto'' and then
					    % executing ``movetoproc'' to the
					    % same point.
							 
/setchar                                    % ``setchar'' sets the next
  { /char str charcount 1 getinterval def   % character in the string along
					    % the path and then updates the
					    % amount of path we have
					    % exhausted.
    /charcount charcount 1 add def          % Increment the character count.
    /charwidth char stringwidth pop def     % Find the width of the character.
    gsave
      cpx cpy itransform translate          % Translate to the current
					    % position in user space.
      dy dx atan rotate                     % Rotate the x-axis to coincide
					    % with the current segment.
      0 0 moveto char show
      currentpoint transform
      /cpy exch def /cpx exch def           % Update the current position
    grestore                                % before we restore ourselves to
					    % the untransformed state.
    /setdist setdist charwidth add def      % Increment the distance we have
  } def                                     % covered by setting characters.
end


   
/Helvetica findfont 11.5 scalefont setfont  % Set up the font we wish to use.
									     
newpath                                     % Define the path along which we
					    % wish to place the text.
  200 500 50 0 270 arc
  200 80 add 500 50 270 180 arc
			       
(If my film makes one more person feel\
 miserable I'll feel I've done my job.\
 -- WOODY ALLEN) 40 pathtext                % Print the string along the path
					    % at an offset of 40 points.
									
newpath                                     % Draw an outline shape suggestive
					    % of a movie camera.
  165 360 moveto 315 360 lineto             % Draw the box part.
  315 430 lineto 165 430 lineto
  closepath
  315 390 moveto 355 375 lineto             % Draw the lens part.
  355 415 lineto 315 400 lineto
1.5 setlinewidth stroke
		       
					    % A PROBLEM FOR THE READER: This
					    % algorithm places characters
					    % along the path according to the
					    % origin of each character.
					    % Rewrite the algorithm so that
					    % the characters are placed
					    % according to the center of their
					    % width. This will yield better
					    % results around sharp curves and
					    % when larger point sizes are
					    % used.
showpage