home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 5 Edit / 05-Edit.zip / elvis22g.zip / lib / elvis.ps < prev    next >
Text File  |  2002-04-10  |  9KB  |  240 lines

  1. % lib/elvis.ps
  2. %
  3. % This file is inserted into any PostScript generated by elvis.  It defines
  4. % the following symbols:
  5. %     ElvisN         push a 12-point normal font
  6. %     ElvisB         push a 12-point bold font
  7. %     ElvisI         push a 12-point italic font
  8. %     ElvisPage      translate & scale a page to fit the paper
  9. %     ElvisLeftPage  translate, rotate & scale to fit left half of paper
  10. %     ElvisRightPage translate, rotate & scale to fit right half of paper
  11. %     ElvisLeftEdge  CONSTANT offset to left edge of printable area
  12. %     ElvisTopEdge   CONSTANT offset to right edge of printable area
  13. %     ElvisWidth     CONSTANT width of printable area
  14. %     ElvisHeight    CONSTANT height of printable area
  15. %
  16. % In addition, elvis itself inserts some header information before this file,
  17. % in each PostScript output.  This includes the standard comments at the top
  18. % of the job, and also defines the following from elvis' options...
  19. %     ElvisPaper     CONSTANT name of the page size, such as (letter) or (a4)
  20. %     ElvisLines     CONSTANT lines per logical page
  21. %     ElvisColumns   CONSTANT columns per logical line
  22.  
  23. % Define the printing offsets.  These indicate where the *PRINTABLE* portion
  24. % of each page starts.  This is likely to vary from one printer to another.
  25. % The unit of measurement is a Point, approximately 1/72 of an inch.
  26. /ElvisLeftEdge 12 def
  27. /ElvisTopEdge 36 def
  28.  
  29. % Define the width and height of the printable area.  This will vary with
  30. % the type of paper.  The unit of measurement is a Point, ~ 1/72 of an inch.
  31. (letter) ElvisPaper eq {
  32.     /ElvisWidth 576 def
  33.     /ElvisHeight 720 def } if
  34. (legal) ElvisPaper eq {
  35.     /ElvisWidth 576 def
  36.     /ElvisHeight 936 def } if
  37. (executive) ElvisPaper eq {
  38.     /ElvisWidth 486 def
  39.     /ElvisHeight 634 def } if
  40. (a4) ElvisPaper eq {
  41.     /ElvisWidth 558 def
  42.     /ElvisHeight 770 def } if
  43. (a3) ElvisPaper eq {
  44.     /ElvisWidth 770 def
  45.     /ElvisHeight 1116 def } if
  46.  
  47. % Get the size of the print area, and its edge offsets
  48.  
  49. % The following should be true to enable the feature, or false to disable it
  50. /ElvisBar false def    % bar separating pages in two-up format
  51. /ElvisFrame true def    % frame around each page in two-up format
  52. /ElvisPunch false def    % increase left margin to leave room for a 3-hole punch
  53. /ElvisClip false def    % increase top margin for use with a clipboard
  54.  
  55. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  56. %%%%%%%%%%                                                         %%%%%%%%%%%%
  57. %%%%%%%%%%  You probably won't need to modify anything after this  %%%%%%%%%%%%
  58. %%%%%%%%%%                                                         %%%%%%%%%%%%
  59. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  60.  
  61. % If ElvisWidth/ElvisHeight undefined, use default values
  62. true userdict { pop /ElvisWidth eq { pop false } if } forall {
  63.     clippath pathbbox 4 2 roll
  64.         /ElvisTopEdge exch def
  65.         /ElvisLeftEdge exch def
  66.         /ElvisHeight exch ElvisTopEdge sub def
  67.         /ElvisWidth exch ElvisLeftEdge sub def
  68.     newpath
  69. } if
  70.  
  71. % Adjust for punch
  72. ElvisPunch ElvisLeftEdge 60 le and {
  73.     userdict /ElvisWidth ElvisWidth ElvisLeftEdge add 60 sub put
  74.     userdict /ElvisLeftEdge 60 put
  75. } if
  76.  
  77. %Adjust for clipboard
  78. ElvisClip ElvisTopEdge 72 le and {
  79.     userdict /ElvisHeight ElvisHeight ElvisTopEdge add 72 sub put
  80.     userdict /ElvisTopEdge 72 put
  81. } if
  82.  
  83. % The virtual width/height varies with the number of rows/columns.  For
  84. % 80 columns by 60 rows, it is always 576 by 720 regardless of the paper size.
  85. /ElvisVWidth ElvisColumns 80 div 576 mul def
  86. /ElvisVHeight ElvisLines 60 div 720 mul def
  87.  
  88. % Compute the desired width of a string, instead of its actual width
  89. /ElvisStringWidth
  90. {
  91.     length ElvisColumns div ElvisVWidth mul
  92. } def
  93.  
  94. % Draw a string with the width that it would have if it was fixed-pitch.
  95. /ElvisShow
  96. {
  97.     % {string}
  98.  
  99.     % Push two copies of the string.
  100.     dup dup
  101.  
  102.     % {string string string}
  103.  
  104.     % Compute the scaling factors -- x=desired/normal, y=1.
  105.     ElvisStringWidth exch stringwidth pop div 1
  106.  
  107.     % {string xscale yscale}
  108.  
  109.     % Change scaling factor, but only temporarily. {string}
  110.     gsave scale
  111.  
  112.     % {string}
  113.  
  114.     % Draw the text {}
  115.     show
  116.  
  117.     % Restore the scaling factor, leaving the currentpoint after text. {}
  118.     currentpoint grestore moveto
  119. } def
  120.  
  121. % This array lists the shapes of every Latin-1 character.
  122. /Latin1
  123. [/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
  124.  /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
  125.  /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
  126.  /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
  127.  /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quoteright
  128.  /parenleft /parenright /asterisk /plus /comma /minus /period /slash
  129.  /zero /one /two /three /four /five /six /seven
  130.  /eight /nine /colon /semicolon /less /equal /greater /question
  131.  /at /A /B /C /D /E /F /G
  132.  /H /I /J /K /L /M /N /O
  133.  /P /Q /R /S /T /U /V /W
  134.  /X /Y /Z /bracketleft /backslash /bracketright /asciicircum /underscore
  135.  /quoteleft /a /b /c /d /e /f /g
  136.  /h /i /j /k /l /m /n /o
  137.  /p /q /r /s /t /u /v /w
  138.  /x /y /z /braceleft /bar /braceright /asciitilde /space
  139.  /space /space /space /space /space /space /space /space
  140.  /space /space /space /space /space /space /space /space
  141.  /space /space /space /space /space /space /space /space
  142.  /space /space /space /space /space /space /space /space
  143.  /space /exclamdown /cent /sterling /currency /yen /brokenbar /section
  144.  /dieresis /copyright /ordfeminine /guillemotleft /logicalnot /hyphen /registered /macron
  145.  /degree /plusminus /twosuperior /threesuperior /acute /mu /paragraph /periodcentered
  146.  /cedilla /onesuperior /ordmasculine /guillemotright /onequarter /onehalf /threequarters /questiondown
  147.  /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla
  148.  /Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis
  149.  /Eth /Ntilde /Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply
  150.  /Oslash /Ugrave /Uacute /Ucircumflex /Udieresis /Yacute /Thorn /germandbls
  151.  /agrave /aacute /acircumflex /atilde /adieresis /aring /ae /ccedilla
  152.  /egrave /eacute /ecircumflex /edieresis /igrave /iacute /icurcumflex /idieresis
  153.  /eth /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /divide
  154.  /oslash /ugrave /uacute /ucircumflex /udieresis /yacute /thorn /ydieresis] def
  155.  
  156. % This procedure is passed two names - The name of a new font to create, and
  157. % the name of an existing font to create it from.  Upon completion, the
  158. % args have been removed from the stack and the new font is defined.  The
  159. % only difference between the two is that the new font uses the Latin-1
  160. % encoding.
  161. /DoTheLatinShuffle
  162. {
  163.     findfont
  164.     dup maxlength dict /Temp exch def
  165.     { exch dup dup /FID ne exch /UniqueID ne and
  166.         { exch Temp 3 1 roll put }
  167.         { pop pop }
  168.         ifelse
  169.     } forall
  170.     Temp dup /Encoding Latin1 put
  171.     definefont pop
  172. } def
  173.  
  174. % Derive 3 Latin-1 fonts from the existing fonts
  175. /Elvis-Normal /Courier DoTheLatinShuffle
  176. /Elvis-Bold /Courier-Bold DoTheLatinShuffle
  177. /Elvis-Italic /Courier-Oblique DoTheLatinShuffle
  178. /Elvis-Proportional-Normal /Times-Roman DoTheLatinShuffle
  179. /Elvis-Proportional-Bold /Times-Bold DoTheLatinShuffle
  180. /Elvis-Proportional-Italic /Times-Italic DoTheLatinShuffle
  181.  
  182. % Define symbolic names for the 12-point versions of those fonts
  183. /ElvisN /Elvis-Normal findfont 12 scalefont def
  184. /ElvisB /Elvis-Bold findfont 12 scalefont def
  185. /ElvisI /Elvis-Italic findfont 12 scalefont def
  186. /ElvisPN /Elvis-Proportional-Normal findfont 12 scalefont def
  187. /ElvisPB /Elvis-Proportional-Bold findfont 12 scalefont def
  188. /ElvisPI /Elvis-Proportional-Italic findfont 12 scalefont def
  189.  
  190. % Define the page-scaling functions
  191. /ElvisPage
  192. {
  193.     ElvisLeftEdge ElvisTopEdge translate
  194.     ElvisWidth ElvisVWidth div ElvisHeight ElvisVHeight div scale
  195. } def
  196. /ElvisLeftPage
  197. {
  198.     ElvisLeftEdge ElvisWidth add ElvisTopEdge translate
  199.     90 rotate
  200.     ElvisHeight ElvisVWidth 2 mul div ElvisWidth ElvisVHeight div scale
  201.     ElvisWidth 0.02 mul ElvisHeight 0.02 mul translate 0.94 0.96 scale
  202.  
  203.     0 setlinewidth
  204.  
  205.     % Draw a frame around page
  206.     ElvisFrame {
  207.         -5 -5 moveto
  208.         ElvisVWidth 10 add 0 rlineto
  209.         0 ElvisVHeight 10 add rlineto
  210.         ElvisVWidth 10 add neg 0 rlineto
  211.         closepath stroke
  212.     } if
  213. } def
  214. /ElvisRightPage
  215. {
  216.     % Draw a line between left & right pages
  217.     ElvisBar {
  218.         newpath
  219.         ElvisLeftEdge ElvisTopEdge ElvisHeight 2 div add moveto
  220.         ElvisWidth 0 rlineto
  221.         stroke
  222.     } if
  223.  
  224.     ElvisLeftEdge ElvisWidth add ElvisTopEdge ElvisHeight 2 div add translate
  225.     90 rotate
  226.     ElvisHeight ElvisVWidth 2 mul div ElvisWidth ElvisVHeight div scale
  227.     ElvisWidth 0.04 mul ElvisHeight 0.02 mul translate 0.94 0.96 scale
  228.  
  229.     0 setlinewidth
  230.  
  231.     % Draw a frame around page
  232.     ElvisFrame {
  233.         -5 -5 moveto
  234.         ElvisVWidth 10 add 0 rlineto
  235.         0 ElvisVHeight 10 add rlineto
  236.         ElvisVWidth 10 add neg 0 rlineto
  237.         closepath stroke
  238.     } if
  239. } def
  240.