|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T p
Length: 8455 (0x2107)
Types: TextFile
Names: »pathtext.ps«
└─⟦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«
%!
%%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