PostScript-0.06/ 40755 1003 144 0 6754301570 12212 5ustar shawnusersPostScript-0.06/Document.pm100644 1003 144 17702 6754301435 14452 0ustar shawnusers# -*- Perl -*- # Document.pm # # This module allows for the easy construction of multi-page textual # reports with the PostScript::TextBlock module. # package PostScript::Document; use strict; use PostScript::TextBlock; use vars qw($VERSION); $VERSION = '0.06'; # Some standard paper sizes # my @papers = qw( Letter Legal Ledger Tabloid A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 Envelope10 EnvelopeC5 EnvelopeDL Folio Executive ); # Dimensions of standard papers # my %width = ( Letter => 612, Legal => 612, Ledger => 1224, Tabloid => 792, A0 => 2384, A1 => 1684, A2 => 1191, A3 => 842, A4 => 595, A5 => 420, A6 => 297, A7 => 210, A8 => 148, A9 => 105, B0 => 2920, B1 => 2064, B2 => 1460, B3 => 1032, B4 => 729, B5 => 516, B6 => 363, B7 => 258, B8 => 181, B9 => 127, B10 => 91, Envelope10 => 297, EnvelopeC5 => 461, EnvelopeDL => 312, Folio => 595, Executive => 522 ); my %height = ( Letter => 792, Legal => 1008, Ledger => 792, Tabloid => 1224, A0 => 3370, A1 => 2384, A2 => 1684, A3 => 1191, A4 => 842, A5 => 595, A6 => 420, A7 => 297, A8 => 210, A9 => 148, B0 => 4127, B1 => 2920, B2 => 2064, B3 => 1460, B4 => 1032, B5 => 729, B6 => 516, B7 => 363, B8 => 258, B9 => 181, B10 => 127, Envelope10 => 684, EnvelopeC5 => 648, EnvelopeDL => 624, Folio => 935, Executive => 756 ); # Valid attribute names # my @paramnames = qw( paper width height rmargin lmargin tmargin bmargin ); # Default values of document attributes # my %defaults = ( paper => 'Letter', width => $width{'Letter'}, height => $height{'Letter'}, rmargin => 36, # .5 inches lmargin => 36, tmargin => 36, bmargin => 36, ); sub new { # The constructor method # my $proto = shift; # allow use as a class or object method my $class = ref($proto) || $proto; # see perltoot man page my %params = (); # Allow a user to specify only a paper size and set the # width and height accordingly # if (defined ($params{'paper'})) { $params{'width'} = $width{$params{'paper'}} if defined($width{$params{'paper'}}); $params{'height'} = $height{$params{'paper'}} if defined($height{$params{'paper'}}); } # Use the default value if a value is not provided # foreach (@paramnames) { $params{$_} = $defaults{$_} unless (defined($params{$_})); } my $self = { content => new PostScript::TextBlock, header => new PostScript::TextBlock, footer => new PostScript::TextBlock, %params }; bless($self,$class); return $self; } # The addText() method will add an element of text with a given font, size, and # leading to the document. Because the document's content is a single TextBlock, # the addText() method simply calls the addText() method of the TextBlock. The # addHeader() and addFooter() methods add text to the document header and footer # in a similar fashion. sub addText { # Add text to the document # my $self = shift; my %params = @_; # Call the PostScript::TextBlock::addText method # $self->{'content'}->addText(%params); } sub addHeader { # Add a textual header to the document # my $self = shift; my %params = @_; $self->{'header'}->addText(%params); } sub addFooter { # Add a textual footer to the document # my $self = shift; my %params = @_; $self->{'footer'}->addText(%params); } # The Write() method will create the PostScript code for the document and return # it as a string. The method calls the Write() method for the TextBlock # representing the content and, if the block does not fit on one page, takes the # remainder, creates a new page and iteratively draws the text and create new # pages until there is no more text to draw. The Write() method will also print # appropriate structure comments in compliance with the Document Structuring # Conventions. The printHeader() and printFooter() methods are called to draw # the header and footer text with the creation of each new page. sub Write { # The Write() method is called without parameters. It # returns a string containing the complete PostScript code # for the Document. # my $self = shift; my $pages = 1; # Should follow the Document Structuring Conventions # my $returnval = "%!PS-Adobe-3.0\n". "%%Creator: The Perl PostScript Package\n". "%%Pages: (atend)\n". "%%BoundingBox: 0 0 $self->{'width'} $self->{'height'}\n". "%%EndComments\n". "%%BeginProlog\n". "%%EndProlog\n"; my $w = $self->{'width'} - $self->{'rmargin'} - $self->{'lmargin'}; my $h = $self->{'height'} - $self->{'tmargin'} - $self->{'bmargin'}; my $x = $self->{'lmargin'}; my $y = $h + $self->{'bmargin'}; $returnval .= "%%Page: 1\n"; $returnval .= $self->printHeader($pages); $returnval .= $self->printFooter($pages); my ($code, $remainder) = $self->{content}->Write($w, $h, $x, $y); $returnval .= $code; $returnval .= "showpage\n"; # Print the rest of the pages, if any # while ($remainder->numElements) { $pages++; $returnval .= "%%Page: $pages\n"; $returnval .= $self->printHeader($pages); $returnval .= $self->printFooter($pages); ($code, $remainder) = $remainder->Write($w, $h, $x, $y); $returnval .= $code; $returnval .= "showpage\n"; } $returnval .= "%%Trailer\n". "%%Pages: $pages\n". "%%EOF\n"; return $returnval; } sub printHeader { # Create the PostScript code to generate the header # Always starts .25 inches (18 pts) from the top edge of paper # my $self = shift; my $pagenum = shift; # Do a search for the ##Page meta string that specifies a page number # and replace it with the page number... # my $header = $self->{'header'}; foreach my $element (@$header) { $element->{'text'} =~ s/\#\#Page/$pagenum/g; } my ($code, $remainder) = $self->{'header'}->Write( $self->{'width'} - $self->{'rmargin'} -$self->{'lmargin'}, $self->{'tmargin'} - 18, $self->{'lmargin'}, $self->{'height'}-18 ); # We should put a save/restore pair around the code so that # it doesn't disrupt the current graphics state # return "/savedpage save def\n".$code."savedpage restore\n"; } sub printFooter { # Create the PostScript code to generate the footer # Always starts 2 pts from the bottom margin, otherwise same as header. # my $self = shift; my $pagenum = shift; my $footer = $self->{'footer'}; foreach my $element (@$footer) { print STDERR $pagenum; $element->{'text'} =~ s/\#\#Page/$pagenum/g; } my ($code, $remainder) = $self->{'footer'}->Write( $self->{'width'} - $self->{'rmargin'} - $self->{'lmargin'}, $self->{'bmargin'} - 18, $self->{'lmargin'}, $self->{'bmargin'} - 2 ); return "/savedpage save def\n".$code."savedpage restore\n"; } 1; PostScript-0.06/Elements.pm100644 1003 144 15240 6754301501 14435 0ustar shawnusers# -*- Perl -*- # PostScript::Elements.pm # An object for representing lines, circles, boxes, and images # such that they can be easily output as PostScript code. # # You may distribute this under the same terms as Perl # itself. # PostScript::Elements::VERSION = '0.06'; package PostScript::Elements; use strict; # @paramnames is the list of valid parameters, # %defaults is the hash of default values for those parameters. # my @paramnames = qw( type points linewidth linetint filltint ); my %defaults = ( linewidth => 1, # 1 pt filltint => -1, # -1 represents transparent linetint => 0, # 0 == black, 1 = white ); sub new { # The constructor method. # An Element object can be one or more lines, circles, # boxes or images. # my $class = shift; my $self = []; bless($self,$class); return $self; } sub addType { # A general routine for adding lines, circle, box, or # image objects to an Element. # my $self = shift; my %params = @_; # If a parameter is not specified, use the default... # foreach (@paramnames) { $params{$_} = $defaults{$_} unless (defined($params{$_})); }; # Add the object to the current element # push @$self, { type => $params{'type'}, points => $params{'points'}, linewidth => $params{'linewidth'}, filltint => $params{'filltint'}, linetint => $params{'linetint'}, }; } sub addArc { # Add an arc to the Element. # A points parameter is required, consisting of a reference to # list specifying the center coordinate, the radius # of the arc, and two numbers specifying the starting angle # and the ending angle describing the sweep of the arc. E.g.: # addArc(points=>[50,50,25,0,360]) # would add a complete circle centered at 50,50 with a radius of 25. # my $self = shift; $self->addType(type => 'arc', @_); } sub addBox { # Add a Box to the Element. # The points parameter should consist of the upper left coordinate # of the box, its width, and its height. # my $self = shift; $self->addType(type => 'box', @_); } sub addLine { # Add a Line to the Element. # The points parameter should contain the starting coordinate and # the end coordinate. # my $self = shift; $self->addType(type => 'line', @_); } sub Write() { # A method to create the PostScript code that will render the # objects in the Element. # my $self = shift; my $returnval = ""; my ($width, $height); foreach my $element (@$self) { # Generate the appropriate PostScript based on the # type attribute. # Arc: if ($element->{type} =~ /arc/i) { # First save the current path (if any), # then create the path of the arc # $returnval .= "gsave\n". $element->{'points'}->[0]." ". # x value $element->{'points'}->[1]." ". # y value $element->{'points'}->[2]." ". # radius $element->{'points'}->[3]." ". # start angle $element->{'points'}->[4]." ". # end angle "arc\n"; # Don't fill the arc if filltint attribute is -1 # otherwise fill the current path with the tint specified by # the filltint attribute. Save the path so it can be restored # after the fill and it can be used by the stroke function. # if ($element->{'filltint'} >= 0 ) { $returnval .= $element->{'filltint'}." setgray\n". "gsave \nfill \ngrestore\n"; } # Stroke the arc with the width indicated by linewidth # and a greyscale percentage specified by linetint # $returnval .= $element->{'linetint'}." setgray\n". $element->{'linewidth'}." setlinewidth\n". "stroke\n". "1 setgray\n". $defaults{'linewidth'}." setlinewidth\n". "grestore\n"; # Box: # } elsif ($element->{type} =~ /box/i) { # A box is described by the upper left corner, a width # and a height # $width = $element->{'points'}->[2]; $height = $element->{'points'}->[3]; $returnval .= "gsave\n"; $returnval .= $element->{'points'}->[0]." ". # x value $element->{'points'}->[1]." ". # y value "moveto\n". # now draw it clockwise... # "$width 0 rlineto\n". "0 ".(0-$height)." rlineto\n". (0-$width)." 0 rlineto\n". "0 $height rlineto\n". "closepath\n"; # Don't fill the box if filltint attribute is -1 # if ($element->{'filltint'} >= 0 ) { $returnval .= $element->{'filltint'}." setgray\n". "gsave \nfill \ngrestore\n"; } $returnval .= $element->{'linetint'}." setgray\n". $element->{'linewidth'}." setlinewidth\n". "stroke\n". "1 setgray\n". $defaults{'linewidth'}." setlinewidth\n". "grestore\n"; # Line: # } elsif ($element->{type} =~ /line/i) { $returnval .= "gsave\n"; $returnval .= $element->{'points'}->[0]." ". # start x $element->{'points'}->[1]." ". # start y "moveto\n". $element->{'points'}->[2]." ". # end x $element->{'points'}->[3]." ". # end y "lineto\n". $element->{'linetint'}." setgray\n". $element->{'linewidth'}." setlinewidth\n". "stroke\n". "1 setgray\n". $defaults{'linewidth'}." setlinewidth\n". "grestore\n"; } else { # Do nothing } } return ($returnval); } 1; __END__ =head1 NAME PostScript::Elements - Generate PostScript code for circles, boxes, lines =head1 DESCRIPTION An object for representing lines, circles, boxes, and images such that they can be easily output as PostScript code. =head1 SYNOPSIS =head1 AUTHOR =cut PostScript-0.06/MANIFEST100644 1003 144 114 6714213714 13412 0ustar shawnusersMANIFEST Makefile.PL README TextBlock.pm Metrics.pm Document.pm Elements.pm PostScript-0.06/Makefile.PL100644 1003 144 1652 6714215231 14257 0ustar shawnusersuse ExtUtils::MakeMaker; # See lib/ExtUtils/MakeMaker.pm for details of how to influence # the contents of the Makefile that is written. WriteMakefile( 'NAME' => 'PostScript::Document', 'VERSION' => '0.06', 'linkext' => { LINKTYPE=>'' }, # no link needed 'dist' => {'COMPRESS'=>'gzip -9f', 'SUFFIX' => 'gz'} ); WriteMakefile( 'NAME' => 'PostScript::Elements', 'VERSION' => '0.06', 'linkext' => { LINKTYPE=>'' }, # no link needed 'dist' => {'COMPRESS'=>'gzip -9f', 'SUFFIX' => 'gz'} ); WriteMakefile( 'NAME' => 'PostScript::TextBlock', 'VERSION' => '0.06', 'linkext' => { LINKTYPE=>'' }, # no link needed 'dist' => {'COMPRESS'=>'gzip -9f', 'SUFFIX' => 'gz'} ); WriteMakefile( 'NAME' => 'PostScript::Metrics', 'VERSION' => '0.06', 'linkext' => { LINKTYPE=>'' }, # no link needed 'dist' => {'COMPRESS'=>'gzip -9f', 'SUFFIX' => 'gz'} ); PostScript-0.06/Metrics.pm100644 1003 144 116767 6754301460 14333 0ustar shawnusers# -*- Perl -*- # Metrics.pm # You may distribute this under the same terms as Perl # itself. # # Thanks to Jay Gramlich # for providing a bunch of these metrics... # package PostScript::Metrics; use strict; use vars qw($VERSION); $VERSION = '0.06'; my %fonts = ( 'AvantGarde-Demi' => [ 280, 280, 360, 560, 560, 860, 680, 280, 380, 380, 440, 600, 280, 420, 280, 460, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 280, 280, 600, 600, 600, 560, 740, 740, 580, 780, 700, 520, 480, 840, 680, 280, 480, 620, 440, 900, 740, 840, 560, 840, 580, 520, 420, 640, 700, 900, 680, 620, 500, 320, 640, 320, 600, 500, 280, 660, 660, 640, 660, 640, 280, 660, 600, 240, 260, 580, 240, 940, 600, 640, 660, 660, 320, 440, 300, 600, 560, 800, 560, 580, 460, 340, 600, 340, 600, ], 'AvantGarde-DemiOblique' => [ 280, 280, 360, 560, 560, 860, 680, 280, 380, 380, 440, 600, 280, 420, 280, 460, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 280, 280, 600, 600, 600, 560, 740, 740, 580, 780, 700, 520, 480, 840, 680, 280, 480, 620, 440, 900, 740, 840, 560, 840, 580, 520, 420, 640, 700, 900, 680, 620, 500, 320, 640, 320, 600, 500, 280, 660, 660, 640, 660, 640, 280, 660, 600, 240, 260, 580, 240, 940, 600, 640, 660, 660, 320, 440, 300, 600, 560, 800, 560, 580, 460, 340, 600, 340, 600, ], 'AvantGarde-Book' => [ 277, 295, 309, 554, 554, 775, 757, 351, 369, 369, 425, 606, 277, 332, 277, 437, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 277, 277, 606, 606, 606, 591, 867, 740, 574, 813, 744, 536, 485, 872, 683, 226, 482, 591, 462, 919, 740, 869, 592, 871, 607, 498, 426, 655, 702, 960, 609, 592, 480, 351, 605, 351, 606, 500, 351, 683, 682, 647, 685, 650, 314, 673, 610, 200, 203, 502, 200, 938, 610, 655, 682, 682, 301, 388, 339, 608, 554, 831, 480, 536, 425, 351, 672, 351, 606, ], 'AvantGarde-BookOblique' => [ 277, 295, 309, 554, 554, 775, 757, 351, 369, 369, 425, 606, 277, 332, 277, 437, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 277, 277, 606, 606, 606, 591, 867, 740, 574, 813, 744, 536, 485, 872, 683, 226, 482, 591, 462, 919, 740, 869, 592, 871, 607, 498, 426, 655, 702, 960, 609, 592, 480, 351, 605, 351, 606, 500, 351, 683, 682, 647, 685, 650, 314, 673, 610, 200, 203, 502, 200, 938, 610, 655, 682, 682, 301, 388, 339, 608, 554, 831, 480, 536, 425, 351, 672, 351, 606, ], 'Bookman-Demi' => [ 340, 360, 420, 660, 660, 940, 800, 320, 320, 320, 460, 600, 340, 360, 340, 600, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 340, 340, 600, 600, 600, 660, 820, 720, 720, 740, 780, 720, 680, 780, 820, 400, 640, 800, 640, 940, 740, 800, 660, 800, 780, 660, 700, 740, 720, 940, 780, 700, 640, 300, 600, 300, 600, 500, 320, 580, 600, 580, 640, 580, 380, 580, 680, 360, 340, 660, 340, 1000, 680, 620, 640, 620, 460, 520, 460, 660, 600, 800, 600, 620, 560, 320, 600, 320, 600, ], 'Bookman-DemiItalic' => [ 340, 320, 380, 680, 680, 880, 980, 320, 260, 260, 460, 600, 340, 280, 340, 360, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 340, 340, 620, 600, 620, 620, 780, 720, 720, 700, 760, 720, 660, 760, 800, 380, 620, 780, 640, 860, 740, 760, 640, 760, 740, 700, 700, 740, 660, 1000, 740, 660, 680, 260, 580, 260, 620, 500, 320, 680, 600, 560, 680, 560, 420, 620, 700, 380, 320, 700, 380, 960, 680, 600, 660, 620, 500, 540, 440, 680, 540, 860, 620, 600, 560, 300, 620, 300, 620, ], 'Bookman-Light' => [ 320, 300, 380, 620, 620, 900, 800, 220, 300, 300, 440, 600, 320, 400, 320, 600, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 320, 320, 600, 600, 600, 540, 820, 680, 740, 740, 800, 720, 640, 800, 800, 340, 600, 720, 600, 920, 740, 800, 620, 820, 720, 660, 620, 780, 700, 960, 720, 640, 640, 300, 600, 300, 600, 500, 220, 580, 620, 520, 620, 520, 320, 540, 660, 300, 300, 620, 300, 940, 660, 560, 620, 580, 440, 520, 380, 680, 520, 780, 560, 540, 480, 280, 600, 280, 600, ], 'Bookman-LightItalic' => [ 300, 320, 360, 620, 620, 800, 820, 280, 280, 280, 440, 600, 300, 320, 300, 600, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 300, 300, 600, 600, 600, 540, 780, 700, 720, 720, 740, 680, 620, 760, 800, 320, 560, 720, 580, 860, 720, 760, 600, 780, 700, 640, 600, 720, 680, 960, 700, 660, 580, 260, 600, 260, 600, 500, 280, 620, 600, 480, 640, 540, 340, 560, 620, 280, 280, 600, 280, 880, 620, 540, 600, 560, 400, 540, 340, 620, 540, 880, 540, 600, 520, 360, 600, 380, 600, ], 'Courier-Bold' => [ 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, ], 'Courier-BoldOblique' => [ 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, ], 'Courier' => [ 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, ], 'Courier-Oblique' => [ 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, ], 'Helvetica-Bold' => [ 278, 333, 474, 556, 556, 889, 722, 278, 333, 333, 389, 584, 278, 333, 278, 278, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 333, 333, 584, 584, 584, 611, 975, 722, 722, 722, 722, 667, 611, 778, 722, 278, 556, 722, 611, 833, 722, 778, 667, 778, 722, 667, 611, 722, 667, 944, 667, 667, 611, 333, 278, 333, 584, 556, 278, 556, 611, 556, 611, 556, 333, 611, 611, 278, 278, 556, 278, 889, 611, 611, 611, 611, 389, 556, 333, 611, 556, 778, 556, 556, 500, 389, 280, 389, 584, ], 'Helvetica-Narrow-Bold' => [ 228, 273, 389, 456, 456, 729, 592, 228, 273, 273, 319, 479, 228, 273, 228, 228, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 273, 273, 479, 479, 479, 501, 800, 592, 592, 592, 592, 547, 501, 638, 592, 228, 456, 592, 501, 683, 592, 638, 547, 638, 592, 547, 501, 592, 547, 774, 547, 547, 501, 273, 228, 273, 479, 456, 228, 456, 501, 456, 501, 456, 273, 501, 501, 228, 228, 456, 228, 729, 501, 501, 501, 501, 319, 456, 273, 501, 456, 638, 456, 456, 410, 319, 230, 319, 479, ], 'Helvetica-BoldOblique' => [ 278, 333, 474, 556, 556, 889, 722, 278, 333, 333, 389, 584, 278, 333, 278, 278, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 333, 333, 584, 584, 584, 611, 975, 722, 722, 722, 722, 667, 611, 778, 722, 278, 556, 722, 611, 833, 722, 778, 667, 778, 722, 667, 611, 722, 667, 944, 667, 667, 611, 333, 278, 333, 584, 556, 278, 556, 611, 556, 611, 556, 333, 611, 611, 278, 278, 556, 278, 889, 611, 611, 611, 611, 389, 556, 333, 611, 556, 778, 556, 556, 500, 389, 280, 389, 584, ], 'Helvetica-Narrow-BoldOblique' => [ 228, 273, 389, 456, 456, 729, 592, 228, 273, 273, 319, 479, 228, 273, 228, 228, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 273, 273, 479, 479, 479, 501, 800, 592, 592, 592, 592, 547, 501, 638, 592, 228, 456, 592, 501, 683, 592, 638, 547, 638, 592, 547, 501, 592, 547, 774, 547, 547, 501, 273, 228, 273, 479, 456, 228, 456, 501, 456, 501, 456, 273, 501, 501, 228, 228, 456, 228, 729, 501, 501, 501, 501, 319, 456, 273, 501, 456, 638, 456, 456, 410, 319, 230, 319, 479, ], 'Helvetica' => [ 278, 278, 355, 556, 556, 889, 667, 222, 333, 333, 389, 584, 278, 333, 278, 278, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 278, 278, 584, 584, 584, 556, 1015, 667, 667, 722, 722, 667, 611, 778, 722, 278, 500, 667, 556, 833, 722, 778, 667, 778, 722, 667, 611, 722, 667, 944, 667, 667, 611, 278, 278, 278, 469, 556, 222, 556, 556, 500, 556, 556, 278, 556, 556, 222, 222, 500, 222, 833, 556, 556, 556, 556, 333, 500, 278, 556, 500, 722, 500, 500, 500, 334, 260, 334, 584, ], 'Helvetica-Narrow' => [ 228, 228, 291, 456, 456, 729, 547, 182, 273, 273, 319, 479, 228, 273, 228, 228, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 228, 228, 479, 479, 479, 456, 832, 547, 547, 592, 592, 547, 501, 638, 592, 228, 410, 547, 456, 683, 592, 638, 547, 638, 592, 547, 501, 592, 547, 774, 547, 547, 501, 228, 228, 228, 385, 456, 182, 456, 456, 410, 456, 456, 228, 456, 456, 182, 182, 410, 182, 683, 456, 456, 456, 456, 273, 410, 228, 456, 410, 592, 410, 410, 410, 274, 213, 274, 479, ], 'Helvetica-Oblique' => [ 278, 278, 355, 556, 556, 889, 667, 222, 333, 333, 389, 584, 278, 333, 278, 278, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 278, 278, 584, 584, 584, 556, 1015, 667, 667, 722, 722, 667, 611, 778, 722, 278, 500, 667, 556, 833, 722, 778, 667, 778, 722, 667, 611, 722, 667, 944, 667, 667, 611, 278, 278, 278, 469, 556, 222, 556, 556, 500, 556, 556, 278, 556, 556, 222, 222, 500, 222, 833, 556, 556, 556, 556, 333, 500, 278, 556, 500, 722, 500, 500, 500, 334, 260, 334, 584, ], 'Helvetica-Narrow-Oblique' => [ 228, 228, 291, 456, 456, 729, 547, 182, 273, 273, 319, 479, 228, 273, 228, 228, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 228, 228, 479, 479, 479, 456, 832, 547, 547, 592, 592, 547, 501, 638, 592, 228, 410, 547, 456, 683, 592, 638, 547, 638, 592, 547, 501, 592, 547, 774, 547, 547, 501, 228, 228, 228, 385, 456, 182, 456, 456, 410, 456, 456, 228, 456, 456, 182, 182, 410, 182, 683, 456, 456, 456, 456, 273, 410, 228, 456, 410, 592, 410, 410, 410, 274, 213, 274, 479, ], 'NewCenturySchlbk-Bold' => [ 287, 296, 333, 574, 574, 833, 852, 241, 389, 389, 500, 606, 278, 333, 278, 278, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 278, 278, 606, 606, 606, 500, 747, 759, 778, 778, 833, 759, 722, 833, 870, 444, 648, 815, 722, 981, 833, 833, 759, 833, 815, 667, 722, 833, 759, 981, 722, 722, 667, 389, 606, 389, 606, 500, 241, 611, 648, 556, 667, 574, 389, 611, 685, 370, 352, 667, 352, 963, 685, 611, 667, 648, 519, 500, 426, 685, 611, 889, 611, 611, 537, 389, 606, 389, 606, ], 'NewCenturySchlbk-BoldItalic' => [ 287, 333, 400, 574, 574, 889, 889, 259, 407, 407, 500, 606, 287, 333, 287, 278, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 287, 287, 606, 606, 606, 481, 747, 741, 759, 759, 833, 741, 704, 815, 870, 444, 667, 778, 704, 944, 852, 833, 741, 833, 796, 685, 722, 833, 741, 944, 741, 704, 704, 407, 606, 407, 606, 500, 259, 667, 611, 537, 667, 519, 389, 611, 685, 389, 370, 648, 389, 944, 685, 574, 648, 630, 519, 481, 407, 685, 556, 833, 574, 519, 519, 407, 606, 407, 606, ], 'NewCenturySchlbk-Roman' => [ 278, 296, 389, 556, 556, 833, 815, 204, 333, 333, 500, 606, 278, 333, 278, 278, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 278, 278, 606, 606, 606, 444, 737, 722, 722, 722, 778, 722, 667, 778, 833, 407, 556, 778, 667, 944, 815, 778, 667, 778, 722, 630, 667, 815, 722, 981, 704, 704, 611, 333, 606, 333, 606, 500, 204, 556, 556, 444, 574, 500, 333, 537, 611, 315, 296, 593, 315, 889, 611, 500, 574, 556, 444, 463, 389, 611, 537, 778, 537, 537, 481, 333, 606, 333, 606, ], 'NewCenturySchlbk-Italic' => [ 278, 333, 400, 556, 556, 833, 852, 204, 333, 333, 500, 606, 278, 333, 278, 606, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 278, 278, 606, 606, 606, 444, 747, 704, 722, 722, 778, 722, 667, 778, 833, 407, 611, 741, 667, 944, 815, 778, 667, 778, 741, 667, 685, 815, 704, 926, 704, 685, 667, 333, 606, 333, 606, 500, 204, 574, 556, 444, 611, 444, 333, 537, 611, 333, 315, 556, 333, 889, 611, 500, 574, 556, 444, 444, 352, 611, 519, 778, 500, 500, 463, 333, 606, 333, 606, ], 'Palatino-Bold' => [ 250, 278, 402, 500, 500, 889, 833, 278, 333, 333, 444, 606, 250, 333, 250, 296, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 250, 250, 606, 606, 606, 444, 747, 778, 667, 722, 833, 611, 556, 833, 833, 389, 389, 778, 611, 1000, 833, 833, 611, 833, 722, 611, 667, 778, 778, 1000, 667, 667, 667, 333, 606, 333, 606, 500, 278, 500, 611, 444, 611, 500, 389, 556, 611, 333, 333, 611, 333, 889, 611, 556, 611, 611, 389, 444, 333, 611, 556, 833, 500, 556, 500, 310, 606, 310, 606, ], 'Palatino-BoldItalic' => [ 250, 333, 500, 500, 500, 889, 833, 278, 333, 333, 444, 606, 250, 389, 250, 315, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 250, 250, 606, 606, 606, 444, 833, 722, 667, 685, 778, 611, 556, 778, 778, 389, 389, 722, 611, 944, 778, 833, 667, 833, 722, 556, 611, 778, 667, 1000, 722, 611, 667, 333, 606, 333, 606, 500, 278, 556, 537, 444, 556, 444, 333, 500, 556, 333, 333, 556, 333, 833, 556, 556, 556, 537, 389, 444, 389, 556, 556, 833, 500, 556, 500, 333, 606, 333, 606, ], 'Palatino-Roman' => [ 250, 278, 371, 500, 500, 840, 778, 278, 333, 333, 389, 606, 250, 333, 250, 606, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 250, 250, 606, 606, 606, 444, 747, 778, 611, 709, 774, 611, 556, 763, 832, 337, 333, 726, 611, 946, 831, 786, 604, 786, 668, 525, 613, 778, 722, 1000, 667, 667, 667, 333, 606, 333, 606, 500, 278, 500, 553, 444, 611, 479, 333, 556, 582, 291, 234, 556, 291, 883, 582, 546, 601, 560, 395, 424, 326, 603, 565, 834, 516, 556, 500, 333, 606, 333, 606, ], 'Palatino-Italic' => [ 250, 333, 500, 500, 500, 889, 778, 278, 333, 333, 389, 606, 250, 333, 250, 296, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 250, 250, 606, 606, 606, 500, 747, 722, 611, 667, 778, 611, 556, 722, 778, 333, 333, 667, 556, 944, 778, 778, 611, 778, 667, 556, 611, 778, 722, 944, 722, 667, 667, 333, 606, 333, 606, 500, 278, 444, 463, 407, 500, 389, 278, 500, 500, 278, 278, 444, 278, 778, 556, 444, 500, 463, 389, 389, 333, 556, 500, 722, 500, 500, 444, 333, 606, 333, 606, ], 'Symbol' => [ 250, 333, 713, 500, 549, 833, 778, 439, 333, 333, 500, 549, 250, 549, 250, 278, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 278, 278, 549, 549, 549, 444, 549, 722, 667, 722, 612, 611, 763, 603, 722, 333, 631, 722, 686, 889, 722, 722, 768, 741, 556, 592, 611, 690, 439, 768, 645, 795, 611, 333, 863, 333, 658, 500, 500, 631, 549, 549, 494, 439, 521, 411, 603, 329, 603, 549, 549, 576, 521, 549, 549, 521, 549, 603, 439, 576, 713, 686, 493, 686, 494, 480, 200, 480, 549, ], 'Times-Bold' => [ 250, 333, 555, 500, 500, 1000, 833, 333, 333, 333, 500, 570, 250, 333, 250, 278, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 333, 333, 570, 570, 570, 500, 930, 722, 667, 722, 722, 667, 611, 778, 778, 389, 500, 778, 667, 944, 722, 778, 611, 778, 722, 556, 667, 722, 722, 1000, 722, 722, 667, 333, 278, 333, 581, 500, 333, 500, 556, 444, 556, 444, 333, 500, 556, 278, 333, 556, 278, 833, 556, 500, 556, 556, 444, 389, 333, 556, 500, 722, 500, 500, 444, 394, 220, 394, 520, ], 'Times-BoldItalic' => [ 250, 389, 555, 500, 500, 833, 778, 333, 333, 333, 500, 570, 250, 333, 250, 278, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 333, 333, 570, 570, 570, 500, 832, 667, 667, 667, 722, 667, 667, 722, 778, 389, 500, 667, 611, 889, 722, 722, 611, 722, 667, 556, 611, 722, 667, 889, 667, 611, 611, 333, 278, 333, 570, 500, 333, 500, 500, 444, 500, 444, 333, 500, 556, 278, 278, 500, 278, 778, 556, 500, 500, 500, 389, 389, 278, 556, 444, 667, 500, 444, 389, 348, 220, 348, 570, ], 'Times-Roman' => [ 250, 333, 408, 500, 500, 833, 778, 333, 333, 333, 500, 564, 250, 333, 250, 278, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 278, 278, 564, 564, 564, 444, 921, 722, 667, 667, 722, 611, 556, 722, 722, 333, 389, 722, 611, 889, 722, 722, 556, 722, 667, 556, 611, 722, 722, 944, 722, 722, 611, 333, 278, 333, 469, 500, 333, 444, 500, 444, 500, 444, 333, 500, 500, 278, 278, 500, 278, 778, 500, 500, 500, 500, 333, 389, 278, 500, 500, 722, 500, 500, 444, 480, 200, 480, 541, ], 'Times-Italic' => [ 250, 333, 420, 500, 500, 833, 778, 333, 333, 333, 500, 675, 250, 333, 250, 278, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 333, 333, 675, 675, 675, 500, 920, 611, 611, 667, 722, 611, 611, 722, 722, 333, 444, 667, 556, 833, 667, 722, 611, 722, 611, 500, 556, 722, 611, 833, 611, 556, 556, 389, 278, 389, 422, 500, 333, 500, 500, 444, 500, 444, 278, 500, 500, 278, 278, 444, 278, 722, 500, 500, 500, 500, 389, 389, 278, 500, 444, 667, 444, 444, 389, 400, 275, 400, 541, ], 'Utopia-Bold' => [ 210, 278, 473, 560, 560, 887, 748, 252, 365, 365, 442, 600, 280, 392, 280, 378, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 280, 280, 600, 600, 600, 456, 833, 644, 683, 689, 777, 629, 593, 726, 807, 384, 386, 707, 585, 918, 739, 768, 650, 768, 684, 561, 624, 786, 645, 933, 634, 617, 614, 335, 379, 335, 600, 500, 252, 544, 605, 494, 605, 519, 342, 533, 631, 316, 316, 582, 309, 948, 638, 585, 615, 597, 440, 446, 370, 629, 520, 774, 522, 524, 483, 365, 284, 365, 600, ], 'Utopia-BoldItalic' => [ 210, 285, 455, 560, 560, 896, 752, 246, 350, 350, 500, 600, 280, 392, 280, 260, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 280, 280, 600, 600, 600, 454, 828, 634, 680, 672, 774, 622, 585, 726, 800, 386, 388, 688, 586, 921, 741, 761, 660, 761, 681, 551, 616, 776, 630, 920, 630, 622, 618, 350, 460, 350, 600, 500, 246, 596, 586, 456, 609, 476, 348, 522, 629, 339, 333, 570, 327, 914, 635, 562, 606, 584, 440, 417, 359, 634, 518, 795, 516, 489, 466, 340, 265, 340, 600, ], 'Utopia-Regular' => [ 225, 242, 458, 530, 530, 838, 706, 278, 350, 350, 412, 570, 265, 392, 265, 460, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 265, 265, 570, 570, 570, 389, 793, 635, 646, 684, 779, 606, 580, 734, 798, 349, 350, 658, 568, 944, 780, 762, 600, 762, 644, 541, 621, 791, 634, 940, 624, 588, 610, 330, 460, 330, 570, 500, 278, 523, 598, 496, 598, 514, 319, 520, 607, 291, 280, 524, 279, 923, 619, 577, 608, 591, 389, 436, 344, 606, 504, 768, 486, 506, 480, 340, 228, 340, 570, ], 'Utopia-Italic' => [ 225, 240, 402, 530, 530, 826, 725, 216, 350, 350, 412, 570, 265, 392, 265, 270, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 265, 265, 570, 570, 570, 425, 794, 624, 632, 661, 763, 596, 571, 709, 775, 345, 352, 650, 565, 920, 763, 753, 614, 753, 640, 533, 606, 794, 637, 946, 632, 591, 622, 330, 390, 330, 570, 500, 216, 561, 559, 441, 587, 453, 315, 499, 607, 317, 309, 545, 306, 912, 618, 537, 590, 559, 402, 389, 341, 618, 510, 785, 516, 468, 468, 340, 270, 340, 570, ], 'ZapfChancery-MediumItalic' => [ 220, 280, 220, 440, 440, 680, 780, 240, 260, 220, 420, 520, 220, 280, 220, 340, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 260, 240, 520, 520, 520, 380, 700, 620, 600, 520, 700, 620, 580, 620, 680, 380, 400, 660, 580, 840, 700, 600, 540, 600, 600, 460, 500, 740, 640, 880, 560, 560, 620, 240, 480, 320, 520, 500, 240, 420, 420, 340, 440, 340, 320, 400, 440, 240, 220, 440, 240, 620, 460, 400, 440, 400, 300, 320, 320, 460, 440, 680, 420, 400, 440, 240, 520, 240, 520, ], 'ZapfDingbats' => [ 278, 974, 961, 974, 980, 719, 789, 790, 791, 690, 960, 939, 549, 855, 911, 933, 911, 945, 974, 755, 846, 762, 761, 571, 677, 763, 760, 759, 754, 494, 552, 537, 577, 692, 786, 788, 788, 790, 793, 794, 816, 823, 789, 841, 823, 833, 816, 831, 923, 744, 723, 749, 790, 792, 695, 776, 768, 792, 759, 707, 708, 682, 701, 826, 815, 789, 789, 707, 687, 696, 689, 786, 787, 713, 791, 785, 791, 873, 761, 762, 762, 759, 759, 892, 892, 788, 784, 438, 138, 277, 415, 392, 392, 668, 668, ], 'NimbusSanL-Regu' => [ 278, 278, 355, 556, 556, 889, 667, 221, 333, 333, 389, 584, 278, 584, 278, 278, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 278, 278, 584, 584, 584, 556, 1015, 667, 667, 722, 722, 667, 611, 778, 722, 278, 500, 667, 556, 833, 722, 778, 667, 778, 722, 667, 611, 722, 667, 944, 667, 667, 611, 278, 278, 278, 469, 556, 222, 556, 556, 500, 556, 556, 278, 556, 556, 222, 222, 500, 222, 833, 556, 556, 556, 556, 333, 500, 278, 556, 500, 722, 500, 500, 500, 334, 260, 334, 584, ], 'NimbusSanL-Bold' => [ 278, 333, 474, 556, 556, 889, 722, 278, 333, 333, 389, 584, 278, 584, 278, 278, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 333, 333, 584, 584, 584, 611, 975, 722, 722, 722, 722, 667, 611, 778, 722, 278, 556, 722, 611, 833, 722, 778, 667, 778, 722, 667, 611, 722, 667, 944, 667, 667, 611, 333, 278, 333, 584, 556, 278, 556, 611, 556, 611, 556, 333, 611, 611, 278, 278, 556, 278, 889, 611, 611, 611, 611, 389, 556, 333, 611, 556, 778, 556, 556, 500, 389, 280, 389, 584, ], 'NimbusSanL-ReguItal' => [ 278, 278, 355, 556, 556, 889, 667, 222, 333, 333, 389, 584, 278, 584, 278, 278, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 278, 278, 584, 584, 584, 556, 1015, 667, 667, 722, 722, 667, 611, 778, 722, 278, 500, 667, 556, 833, 722, 778, 667, 778, 722, 667, 611, 722, 667, 944, 667, 667, 611, 278, 278, 278, 469, 556, 222, 556, 556, 500, 556, 556, 278, 556, 556, 222, 222, 500, 222, 833, 556, 556, 556, 556, 333, 500, 278, 556, 500, 722, 500, 500, 500, 334, 260, 334, 584, ], 'NimbusSanL-BoldItal' => [ 278, 333, 474, 556, 556, 889, 722, 278, 333, 333, 389, 584, 278, 584, 278, 278, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 333, 333, 584, 584, 584, 611, 975, 722, 722, 722, 722, 667, 611, 778, 722, 278, 556, 722, 611, 833, 722, 778, 667, 778, 722, 667, 611, 722, 667, 944, 667, 667, 611, 333, 278, 333, 584, 556, 278, 556, 611, 556, 611, 556, 333, 611, 611, 278, 278, 556, 278, 889, 611, 611, 611, 611, 389, 556, 333, 611, 556, 778, 556, 556, 500, 389, 280, 389, 584, ], 'URWGothicL-Book' => [ 277, 295, 309, 554, 554, 775, 757, 351, 369, 369, 425, 606, 277, 606, 277, 437, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 277, 277, 606, 606, 606, 591, 867, 740, 574, 813, 744, 536, 485, 872, 683, 226, 482, 591, 462, 919, 740, 869, 592, 871, 607, 498, 426, 655, 702, 960, 609, 592, 480, 351, 605, 351, 606, 500, 351, 683, 682, 647, 685, 650, 314, 673, 610, 200, 203, 502, 200, 938, 610, 655, 682, 682, 301, 388, 339, 608, 554, 831, 480, 536, 425, 351, 672, 351, 606, ], 'NimbusSanL-ReguCond' => [ 228, 228, 291, 456, 456, 729, 547, 182, 273, 273, 319, 479, 228, 479, 228, 228, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 228, 228, 479, 479, 479, 456, 832, 547, 547, 592, 592, 547, 501, 638, 592, 228, 410, 547, 456, 683, 592, 638, 547, 638, 592, 547, 501, 592, 547, 774, 547, 547, 501, 228, 228, 228, 385, 456, 182, 456, 456, 410, 456, 456, 228, 456, 456, 182, 182, 410, 182, 683, 456, 456, 456, 456, 273, 410, 228, 456, 410, 592, 410, 410, 410, 274, 213, 274, 479, ], 'URWGothicL-Demi' => [ 280, 280, 360, 560, 560, 860, 680, 280, 380, 380, 440, 600, 280, 600, 280, 460, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 280, 280, 600, 600, 600, 560, 740, 740, 580, 780, 700, 520, 480, 840, 680, 280, 480, 620, 440, 900, 740, 840, 560, 840, 580, 520, 420, 640, 700, 900, 680, 620, 500, 320, 640, 320, 600, 500, 280, 660, 660, 640, 660, 640, 280, 660, 600, 240, 260, 580, 240, 940, 600, 640, 660, 660, 320, 440, 300, 600, 560, 800, 560, 580, 460, 340, 600, 340, 600, ], 'NimbusSanL-BoldCond' => [ 228, 273, 389, 456, 456, 729, 592, 228, 273, 273, 319, 479, 228, 479, 228, 228, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 273, 273, 479, 479, 479, 501, 800, 592, 592, 592, 592, 547, 501, 638, 592, 228, 456, 592, 501, 683, 592, 638, 547, 638, 592, 547, 501, 592, 547, 774, 547, 547, 501, 273, 228, 273, 479, 456, 228, 456, 501, 456, 501, 456, 273, 501, 501, 228, 228, 456, 228, 729, 501, 501, 501, 501, 319, 456, 273, 501, 456, 638, 456, 456, 410, 319, 230, 319, 479, ], 'URWGothicL-BookObli' => [ 277, 295, 309, 554, 554, 775, 757, 351, 369, 369, 425, 606, 277, 606, 277, 437, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 277, 277, 606, 606, 606, 591, 867, 740, 574, 813, 744, 536, 485, 872, 683, 226, 482, 591, 462, 919, 740, 869, 592, 871, 607, 498, 426, 655, 702, 960, 609, 592, 480, 351, 605, 351, 606, 500, 351, 683, 682, 647, 685, 650, 314, 673, 610, 200, 203, 502, 200, 938, 610, 655, 682, 682, 301, 388, 339, 608, 554, 831, 480, 536, 425, 351, 672, 351, 606, ], 'NimbusSanL-ReguCondItal' => [ 228, 228, 291, 456, 456, 729, 547, 182, 273, 273, 319, 479, 228, 479, 228, 228, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 228, 228, 479, 479, 479, 456, 832, 547, 547, 592, 592, 547, 501, 638, 592, 228, 410, 547, 456, 683, 592, 638, 547, 638, 592, 547, 501, 592, 547, 774, 547, 547, 501, 228, 228, 228, 385, 456, 182, 456, 456, 410, 456, 456, 228, 456, 456, 182, 182, 410, 182, 683, 456, 456, 456, 456, 273, 410, 228, 456, 410, 592, 410, 410, 410, 274, 213, 274, 479, ], 'URWGothicL-DemiObli' => [ 280, 280, 360, 560, 560, 860, 680, 280, 380, 380, 440, 600, 280, 600, 280, 460, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 280, 280, 600, 600, 600, 560, 740, 740, 580, 780, 700, 520, 480, 840, 680, 280, 480, 620, 440, 900, 740, 840, 560, 840, 580, 520, 420, 640, 700, 900, 680, 620, 500, 320, 640, 320, 600, 500, 280, 660, 660, 640, 660, 640, 280, 660, 600, 240, 260, 580, 240, 940, 600, 640, 660, 660, 320, 440, 300, 600, 560, 800, 560, 580, 460, 340, 600, 340, 600, ], 'NimbusSanL-BoldCondItal' => [ 228, 273, 389, 456, 456, 729, 592, 228, 273, 273, 319, 479, 228, 479, 228, 228, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 273, 273, 479, 479, 479, 501, 800, 592, 592, 592, 592, 547, 501, 638, 592, 228, 456, 592, 501, 683, 592, 638, 547, 638, 592, 547, 501, 592, 547, 774, 547, 547, 501, 273, 228, 273, 479, 456, 228, 456, 501, 456, 501, 456, 273, 501, 501, 228, 228, 456, 228, 729, 501, 501, 501, 501, 319, 456, 273, 501, 456, 638, 456, 456, 410, 319, 230, 319, 479, ], 'URWBookmanL-Ligh' => [ 320, 300, 380, 620, 620, 900, 800, 220, 300, 300, 440, 600, 320, 600, 320, 600, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 320, 320, 600, 600, 600, 540, 820, 680, 740, 740, 800, 720, 640, 800, 800, 340, 600, 720, 600, 920, 740, 800, 620, 820, 720, 660, 620, 780, 700, 960, 720, 640, 640, 300, 600, 300, 600, 500, 220, 580, 620, 520, 620, 520, 320, 540, 660, 300, 300, 620, 300, 940, 660, 560, 620, 580, 440, 520, 380, 680, 520, 780, 560, 540, 480, 280, 600, 280, 600, ], 'NimbusRomNo9L-Regu' => [ 250, 333, 408, 500, 500, 833, 778, 333, 333, 333, 500, 564, 250, 564, 250, 278, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 278, 278, 564, 564, 564, 444, 921, 722, 667, 667, 722, 611, 556, 722, 722, 333, 389, 722, 611, 889, 722, 722, 556, 722, 667, 556, 611, 722, 722, 944, 722, 722, 611, 333, 278, 333, 469, 500, 333, 444, 500, 444, 500, 444, 333, 500, 500, 278, 278, 500, 278, 778, 500, 500, 500, 500, 333, 389, 278, 500, 500, 722, 500, 500, 444, 480, 200, 480, 541, ], 'URWBookmanL-DemiBold' => [ 340, 360, 420, 660, 660, 940, 800, 320, 320, 320, 460, 600, 340, 600, 340, 600, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 340, 340, 600, 600, 600, 660, 820, 720, 720, 740, 780, 720, 680, 780, 820, 400, 640, 800, 640, 940, 740, 800, 660, 800, 780, 660, 700, 740, 720, 940, 780, 700, 640, 300, 600, 300, 600, 500, 320, 580, 600, 580, 640, 580, 380, 580, 680, 360, 340, 660, 340, 1000, 680, 620, 640, 620, 460, 520, 460, 660, 600, 800, 600, 620, 560, 320, 600, 320, 600, ], 'NimbusRomNo9L-Medi' => [ 250, 333, 555, 500, 500, 1000, 833, 333, 333, 333, 500, 570, 250, 570, 250, 278, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 333, 333, 570, 570, 570, 500, 930, 722, 667, 722, 722, 667, 611, 778, 778, 389, 500, 778, 667, 944, 722, 778, 611, 778, 722, 556, 667, 722, 722, 1000, 722, 722, 667, 333, 278, 333, 581, 500, 333, 500, 556, 444, 556, 444, 333, 500, 556, 278, 333, 556, 278, 833, 556, 500, 556, 556, 444, 389, 333, 556, 500, 722, 500, 500, 444, 394, 220, 394, 520, ], 'URWBookmanL-LighItal' => [ 300, 320, 360, 620, 620, 800, 820, 280, 280, 280, 440, 600, 300, 600, 300, 600, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 300, 300, 600, 600, 600, 540, 780, 700, 720, 720, 740, 680, 620, 760, 800, 320, 560, 720, 580, 860, 720, 760, 600, 780, 700, 640, 600, 720, 680, 960, 700, 660, 580, 260, 600, 260, 600, 500, 280, 620, 600, 480, 640, 540, 340, 560, 620, 280, 280, 600, 280, 880, 620, 540, 600, 560, 400, 540, 340, 620, 540, 880, 540, 600, 520, 360, 600, 380, 600, ], 'NimbusRomNo9L-ReguItal' => [ 250, 333, 420, 500, 500, 833, 778, 333, 333, 333, 500, 675, 250, 675, 250, 278, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 333, 333, 675, 675, 675, 500, 920, 611, 611, 667, 722, 611, 611, 722, 722, 333, 444, 667, 556, 833, 667, 722, 611, 722, 611, 500, 556, 722, 611, 833, 611, 556, 556, 389, 278, 389, 422, 500, 333, 500, 500, 444, 500, 444, 278, 500, 500, 278, 278, 444, 278, 722, 500, 500, 500, 500, 389, 389, 278, 500, 444, 667, 444, 444, 389, 400, 275, 400, 541, ], 'URWBookmanL-DemiBoldItal' => [ 340, 320, 380, 680, 680, 880, 980, 320, 260, 260, 460, 600, 340, 600, 340, 360, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 340, 340, 620, 600, 620, 620, 780, 720, 720, 700, 760, 720, 660, 760, 800, 380, 620, 780, 640, 860, 740, 760, 640, 760, 740, 700, 700, 740, 660, 1000, 740, 660, 680, 260, 580, 260, 620, 500, 320, 680, 600, 560, 680, 560, 420, 620, 700, 380, 320, 700, 380, 960, 680, 600, 660, 620, 500, 540, 440, 680, 540, 860, 620, 600, 560, 300, 620, 300, 620, ], 'NimbusRomNo9L-MediItal' => [ 250, 389, 555, 500, 500, 833, 778, 333, 333, 333, 500, 570, 250, 606, 250, 278, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 333, 333, 570, 570, 570, 500, 832, 667, 667, 667, 722, 667, 667, 722, 778, 389, 500, 667, 611, 889, 722, 722, 611, 722, 667, 556, 611, 722, 667, 889, 667, 611, 611, 333, 278, 333, 570, 500, 333, 500, 500, 444, 500, 444, 333, 500, 556, 278, 278, 500, 278, 778, 556, 500, 500, 500, 389, 389, 278, 556, 444, 667, 500, 444, 389, 348, 220, 348, 570, ], 'CharterBT-Bold' => [ 291, 340, 339, 736, 581, 888, 741, 255, 428, 428, 500, 833, 289, 833, 289, 491, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 340, 340, 833, 833, 833, 487, 917, 651, 628, 638, 716, 596, 552, 710, 760, 354, 465, 650, 543, 883, 727, 752, 587, 752, 671, 568, 603, 705, 635, 946, 637, 610, 592, 443, 491, 443, 1000, 500, 255, 544, 577, 476, 596, 524, 341, 551, 597, 305, 297, 553, 304, 892, 605, 577, 591, 575, 421, 447, 358, 600, 513, 799, 531, 515, 495, 493, 500, 493, 833, ], 'NimbusMonL-Regu' => [ 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, ], 'CharterBT-BoldItalic' => [ 293, 340, 339, 751, 586, 898, 730, 261, 420, 420, 500, 833, 292, 833, 294, 481, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 346, 346, 833, 833, 833, 492, 936, 634, 628, 625, 702, 581, 539, 693, 747, 353, 474, 653, 529, 894, 712, 729, 581, 729, 645, 553, 584, 701, 617, 921, 608, 586, 572, 449, 481, 449, 1000, 500, 261, 572, 556, 437, 579, 464, 325, 517, 595, 318, 297, 559, 307, 883, 600, 550, 565, 562, 449, 403, 366, 599, 492, 768, 510, 494, 465, 487, 500, 487, 833, ], 'NimbusMonL-Bold' => [ 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, ], 'CharterBT-Roman' => [ 278, 338, 331, 745, 556, 852, 704, 201, 417, 417, 500, 833, 278, 833, 278, 481, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 319, 319, 833, 833, 833, 486, 942, 639, 604, 632, 693, 576, 537, 694, 738, 324, 444, 611, 520, 866, 713, 731, 558, 731, 646, 556, 597, 694, 618, 928, 600, 586, 586, 421, 481, 421, 1000, 500, 201, 507, 539, 446, 565, 491, 321, 523, 564, 280, 266, 517, 282, 843, 568, 539, 551, 531, 382, 400, 334, 569, 494, 771, 503, 495, 468, 486, 500, 486, 833, ], 'CharterBT-Italic' => [ 278, 338, 331, 745, 556, 852, 704, 201, 419, 419, 500, 833, 278, 833, 278, 481, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 319, 319, 833, 833, 833, 486, 942, 606, 588, 604, 671, 546, 509, 664, 712, 312, 447, 625, 498, 839, 683, 708, 542, 708, 602, 537, 565, 664, 590, 898, 569, 562, 556, 421, 481, 421, 1000, 500, 201, 525, 507, 394, 523, 424, 292, 481, 551, 287, 269, 514, 275, 815, 556, 502, 516, 512, 398, 370, 333, 553, 454, 713, 477, 475, 440, 486, 500, 486, 833, ], 'NimbusMonL-ReguObli' => [ 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, ], 'CenturySchL-Roma' => [ 278, 296, 389, 556, 556, 833, 815, 204, 333, 333, 500, 606, 278, 606, 278, 278, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 278, 278, 606, 606, 606, 444, 737, 722, 722, 722, 778, 722, 667, 778, 833, 407, 556, 778, 667, 944, 815, 778, 667, 778, 722, 630, 667, 815, 722, 981, 704, 704, 611, 333, 606, 333, 606, 500, 204, 556, 556, 444, 574, 500, 333, 537, 611, 315, 296, 593, 315, 889, 611, 500, 574, 556, 444, 463, 389, 611, 537, 778, 537, 537, 481, 333, 606, 333, 606, ], 'NimbusMonL-BoldObli' => [ 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, ], 'CenturySchL-Bold' => [ 287, 296, 333, 574, 574, 833, 852, 241, 389, 389, 500, 606, 278, 606, 278, 278, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 278, 278, 606, 606, 606, 500, 747, 759, 778, 778, 833, 759, 722, 833, 870, 444, 648, 815, 722, 981, 833, 833, 759, 833, 815, 667, 722, 833, 759, 981, 722, 722, 667, 389, 606, 389, 606, 500, 241, 611, 648, 556, 667, 574, 389, 611, 685, 370, 352, 667, 352, 963, 685, 611, 667, 648, 519, 500, 426, 685, 611, 889, 611, 611, 537, 389, 606, 389, 606, ], 'URWPalladioL-Roma' => [ 250, 278, 371, 500, 500, 840, 778, 278, 333, 333, 389, 606, 250, 606, 250, 606, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 250, 250, 606, 606, 606, 444, 747, 778, 611, 709, 774, 611, 556, 763, 832, 337, 333, 726, 611, 946, 831, 786, 604, 786, 668, 525, 613, 778, 722, 1000, 667, 667, 667, 333, 606, 333, 606, 500, 278, 500, 553, 444, 611, 479, 333, 556, 582, 291, 234, 556, 291, 883, 582, 546, 601, 560, 395, 424, 326, 603, 565, 834, 516, 556, 500, 333, 606, 333, 606, ], 'CenturySchL-Ital' => [ 278, 333, 400, 556, 556, 833, 852, 204, 333, 333, 500, 606, 278, 606, 278, 606, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 278, 278, 606, 606, 606, 444, 747, 704, 722, 722, 778, 722, 667, 778, 833, 407, 611, 741, 667, 944, 815, 778, 667, 778, 741, 667, 685, 815, 704, 926, 704, 685, 667, 333, 606, 333, 606, 500, 204, 574, 556, 444, 611, 444, 333, 537, 611, 333, 315, 556, 333, 889, 611, 500, 574, 556, 444, 444, 352, 611, 519, 778, 500, 500, 463, 333, 606, 333, 606, ], 'URWPalladioL-Bold' => [ 250, 278, 402, 500, 500, 889, 833, 278, 333, 333, 444, 606, 250, 606, 250, 296, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 250, 250, 606, 606, 606, 444, 747, 778, 667, 722, 833, 611, 556, 833, 833, 389, 389, 778, 611, 1000, 833, 833, 611, 833, 722, 611, 667, 778, 778, 1000, 667, 667, 667, 333, 606, 333, 606, 500, 278, 500, 611, 444, 611, 500, 389, 556, 611, 333, 333, 611, 333, 889, 611, 556, 611, 611, 389, 444, 333, 611, 556, 833, 500, 556, 500, 310, 606, 310, 606, ], 'CenturySchL-BoldItal' => [ 287, 333, 400, 574, 574, 889, 889, 259, 407, 407, 500, 606, 287, 606, 287, 278, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 287, 287, 606, 606, 606, 481, 747, 741, 759, 759, 833, 741, 704, 815, 870, 444, 667, 778, 704, 944, 852, 833, 741, 833, 796, 685, 722, 833, 741, 944, 741, 704, 704, 407, 606, 407, 606, 500, 259, 667, 611, 537, 667, 519, 389, 611, 685, 389, 370, 648, 389, 944, 685, 574, 648, 630, 519, 481, 407, 685, 556, 833, 574, 519, 519, 407, 606, 407, 606, ], 'URWPalladioL-Ital' => [ 250, 333, 500, 500, 500, 889, 778, 278, 333, 333, 389, 606, 250, 606, 250, 296, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 250, 250, 606, 606, 606, 500, 747, 722, 611, 667, 778, 611, 556, 722, 778, 333, 333, 667, 556, 944, 778, 778, 611, 778, 667, 556, 611, 778, 722, 944, 722, 667, 667, 333, 606, 333, 606, 500, 278, 444, 463, 407, 500, 389, 278, 500, 500, 278, 278, 444, 278, 778, 556, 444, 500, 463, 389, 389, 333, 556, 500, 722, 500, 500, 444, 333, 606, 333, 606, ], 'Dingbats' => [ 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, ], 'URWPalladioL-BoldItal' => [ 250, 333, 500, 500, 500, 889, 833, 278, 333, 333, 444, 606, 250, 606, 250, 315, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 250, 250, 606, 606, 606, 444, 833, 722, 667, 685, 778, 611, 556, 778, 778, 389, 389, 722, 611, 944, 778, 833, 667, 833, 722, 556, 611, 778, 667, 1000, 722, 611, 667, 333, 606, 333, 606, 500, 278, 556, 537, 444, 556, 444, 333, 500, 556, 333, 333, 556, 333, 833, 556, 556, 556, 537, 389, 444, 389, 556, 556, 833, 500, 556, 500, 333, 606, 333, 606, ], 'StandardSymL' => [ 250, 333, 250, 500, 250, 833, 778, 250, 333, 333, 250, 549, 250, 549, 250, 278, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 278, 278, 549, 549, 549, 444, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 333, 250, 333, 250, 500, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 480, 200, 480, 250, ], 'URWChanceryL-MediItal' => [ 220, 280, 220, 440, 440, 680, 780, 240, 260, 220, 420, 520, 220, 520, 220, 340, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 260, 240, 520, 520, 520, 380, 700, 620, 600, 520, 700, 620, 580, 620, 680, 380, 400, 660, 580, 840, 700, 600, 540, 600, 600, 460, 500, 740, 640, 880, 560, 560, 620, 240, 480, 320, 520, 500, 240, 420, 420, 340, 440, 340, 320, 400, 440, 240, 220, 440, 240, 620, 460, 400, 440, 400, 300, 320, 320, 460, 440, 680, 420, 400, 440, 240, 520, 240, 520, ], ); sub new { my $class = shift; my $self = {}; bless($self,$class); return $self; } sub stringwidth { my ($string, $fontname, $fontsize) = @_; my $returnval = 0; foreach my $char (unpack("C*",$string)) { $returnval+=$fonts{$fontname}->[$char-32]; } return ($returnval*$fontsize/1000); } sub listFonts { my @tmp = %fonts; my @returnval =(); while (@tmp) { push @returnval, shift(@tmp); shift @tmp; } return sort( {$a<=>$b;} @returnval); } 1; __END__ =head1 NAME PostScript::Metrics - helper module for PostScript::TextBlock =head1 SYNOPSIS Fix me. =head1 DESCRIPTION Fix me. =head1 AUTHOR Shawn Wallace (shawn@as220.org) =head1 SEE ALSO PostScript::TextBlock, PostScript::Element, PostScript::Document =cut PostScript-0.06/README100644 1003 144 1115 6754301557 13172 0ustar shawnusersReadme for the PostScript package... Version 0.06 8/10/99 REQUIRED COMPONENTS =================== Well, you really should have some sort of PostScript interpreter such as GhostScript, but it actually isn't necessary if you're just going to create PostScript files with this package. You just won't be able to look at them. NOTES ===== Documentation is contained within the individual modules in pod format; when you issue the installation commands, you should then be able to type: man PostScript::TextBlock or: perldoc PostScript::TextBlock Shawn Wallace shawn@as220.org PostScript-0.06/TextBlock.pm100644 1003 144 43231 6754301364 14570 0ustar shawnusers# -*- Perl -*- # TextBlock.pm # An object that may be used to construct a block of text in PostScript # package PostScript::TextBlock; use strict; use PostScript::Metrics; use vars qw($VERSION); $VERSION = '0.06'; # The valid text block attribute names # my @paramnames = ( 'text', 'font', 'size', 'leading'); # The default attribute values # my %defaults = ( text => '', font => 'CharterBT-Roman', size => 12, leading => 16 ); sub new { # The constructor method # my $proto = shift; # allow use as a class or object method my $class = ref($proto) || $proto; # see perltoot man page # A text block consists of a list of 'elements', # (not to be confused with the PostScript::Elements object) # my $self = []; return bless($self,$class); } sub addText { # Add an element of text to the TextBlock # my $self = shift; my %params = @_; $params{'text'} =~ s/(\(|\))/\\$1/g; # escape parentheses # Use the default values if an attribute is not given # foreach (@paramnames) { $params{$_} = $defaults{$_} unless ($params{$_}); } push @$self, { %params }; } sub numElements { # Returns the number of elements in the TextBlock # my $self = shift; return $#{@$self}+1; } sub Write { # The Write() method takes four parameters: w, h, x , and y, # where w and h are the width and height of the block (in points), # and x and y specify the upper left corner of the TextBlock (in the # PostScript coordinate system). This method returns a string containing # the PostScript code that generated the block, and a TextBlock object # the contains the portion that doesn't fit within the given bounds. # my $self = shift; my ($w, $h, $x, $y) = @_; my ($x1, $y1) = ($x, $y); my $returnval = ""; my @remainder = (); my ($maxlead, $wcount, $linebuffer) = (0, 0, ""); my ($line, $word, @words); my $wordwidth; $returnval .= "0 setgray\n"; my $element = {}; my $index = 0; $element = $self->[$index]; my $maxindex = $self->numElements; my $firstindex = 0; ELEMENT: while (($index < $maxindex) && ($y1 >= ($y-$h))) { $wcount = 0; ($line, $word) = (undef, undef); @words = (); $linebuffer = ""; $maxlead = 0; $firstindex = $index; # Loop until a complete line is formed, or # until we run out of elements # LINE: while (($index < $maxindex) && $wcount<=$w) { $linebuffer .= "/$element->{font} findfont\n"; $linebuffer .= "$element->{size} scalefont setfont\n"; # Calculate the maximum leading on this line # $maxlead = $element->{leading} if ($element->{leading} > $maxlead); @words = split /( +|\t|\n)/, $element->{text}; while (@words) { $word = shift @words; $wordwidth = PostScript::Metrics::stringwidth($word, $element->{font}, $element->{size}); # If the word is longer than the line, break by character. # Note that we could still have the problem of a single # character not fitting the width, which we will leave # as an exercise for the reader. # if ($wordwidth > $w) { unshift @words, split //, $word; $word = shift @words; $wordwidth = PostScript::Metrics::stringwidth($word, $element->{font}, $element->{size}); } $wcount += $wordwidth; # If we've gone over, push the word back on # for later processing. # if ( ($wcount>$w) || ($word =~ s/\n//) ) { if ($word =~ /^ /) { $word =~ s/^[ ]+//; } unshift @words, $word; last LINE; } $line .= $word; } $index++; $element = $self->[$index]; } # Show the line # if (defined($line)) { $linebuffer .= "($line) show\n"; } # Subtract the maximum leading from the current coordinate # $y1 -= $maxlead; # If this line doesn't fit, put the elements making up the line # back on for later processing... # if ($y1 < ($y-$h)) { for (my $i=$firstindex; $i < $maxindex; $i++) { push @remainder, $self->[$i]; } last ELEMENT; } else { # Put any remaining words back for later processing # if (@words) { $element->{text} = join '', @words; } else { $index++; $element = $self->[$index]; } $returnval .= "0 setgray $x1 $y1 moveto\n"; $returnval .= $linebuffer; } } return ($returnval, bless([@remainder], 'PostScript::TextBlock')); } sub FitToRegion { # The FitToRegion() method takes four parameters: w, h, x , and y, # where w and h are the width and height of the block (in points), # and x and y specify the upper left corner of the TextBlock (in the # PostScript coordinate system). This method returns a string containing # the PostScript code that generated the block, and a TextBlock object # the contains the portion that doesn't fit within the given bounds. # my $self = shift; my ($w, $h, $x, $y, $minimum_font_size) = @_; my ($x1, $y1) = ($x, $y); my $returnval = ""; my @remainder = (); my ($maxlead, $wcount, $linebuffer) = (0, 0, ""); my ($line, $word, @words); my $wordwidth; $returnval .= "0 setgray\n"; my $element = {}; my $index = 0; $element = $self->[$index]; my %original_element = {}; foreach (keys %$element) { $original_element{$_} = $self->[$index]->{$_}; } # foreach my $maxindex = $self->numElements; my $firstindex = 0; ELEMENT: while (($index < $maxindex) && ($y1 >= ($y-$h))) { $wcount = 0; ($line, $word) = (undef, undef); @words = (); $linebuffer = ""; $maxlead = 0; $firstindex = $index; # Loop until a complete line is formed, or # until we run out of elements # LINE: while (($index < $maxindex) && $wcount<=$w) { $linebuffer .= "/$element->{font} findfont\n"; $linebuffer .= "$element->{size} scalefont setfont\n"; # Calculate the maximum leading on this line # $maxlead = $element->{leading} if ($element->{leading} > $maxlead); @words = split /( +|\t|\n)/, $element->{text}; while (@words) { $word = shift @words; $wordwidth = PostScript::Metrics::stringwidth($word, $element->{font}, $element->{size}); # If the word is longer than the line, break by character. # Note that we could still have the problem of a single # character not fitting the width, which we will leave # as an exercise for the reader. # # if ($wordwidth > $w) { # unshift @words, split //, $word; # $word = shift @words; # $wordwidth = PostScript::Metrics::stringwidth($word, # $element->{font}, # $element->{size}); # } # if $wcount += $wordwidth; # If we've gone over, push the word back on # for later processing. # if (($wcount > $w) || ($word =~ s/\n//)) { unshift @words, $word; last LINE; } # if $line .= $word; } # while $index++; $element = $self->[$index]; } # while # Show the line # if (defined($line)) { $linebuffer .= "($line) show\n"; } # Subtract the maximum leading from the current coordinate # $y1 -= $maxlead; # If this line doesn't fit, put the elements making up the line # back on for later processing... # if ($y1 < ($y-$h)) { for (my $i=$firstindex; $i < $maxindex; $i++) { push @remainder, $self->[$i]; } last ELEMENT; } else { # Put any remaining words back for later processing # if (@words) { $element->{text} = join '', @words; } else { $index++; $element = $self->[$index]; } # if $returnval .= "0 setgray $x1 $y1 moveto\n"; $returnval .= $linebuffer; } # else } # while if (@remainder and ($original_element{size} - 1 >= $minimum_font_size)) { --$original_element{size}; if ($original_element{leading}) { --$original_element{leading}; } # if $self->[0] = { %original_element }; ($returnval, @remainder) = &FitToRegion($self, $w, $h, $x, $y, $minimum_font_size); } # if return ($returnval, bless([@remainder], 'PostScript::TextBlock')); # return $returnval; } # FitToRegion 1; # All Perl modules should return true __END__ =head1 NAME PostScript::TextBlock - An object that may be used to construct a block of text in PostScript. =head1 SYNOPSIS use PostScript::TextBlock; my $tb = new PostScript::TextBlock; $tb->addText( text => "Hullaballo in Hoosick Falls.\n", font => 'CenturySchL-Ital', size => 24, leading => 26 ); $tb->addText( text => "by Charba Gaspee.\n", font => 'URWGothicL-Demi', size => 12, leading => 14 ); print 'There are '.$tb->numElements.' elements in this object.'; open OUT, '>psoutput.ps'; my ($code, $remainder) = $tb->Write(572, 752, 20, 772); print OUT $code; =head1 DESCRIPTION The PostScript::TextBlock module implements four methods: =over 3 =item new() - Create a New PostScript::TextBlock object This method instantiates a new object of class PostScript::TextBlock. =item addText( text=>$text, [ font=>$font ], [ size=>$size ], [ leading=>$leading ] ) The addText() method will add a new 'text element' to the TextBlock object. A 'text element' can be thought of as a section of text that has the same characteristics, i.e. all the characters are the same font, size and leading. this representation allows you to include text rendered in multiple fonts at multiple sizes within the same text block by including them as separate elements. This method takes up to four attributes (note that the '[]' brackets above indicate that a parameter is optional, not an array reference): text The text attribute is required, though nothing bad will happen if you leave it out. This is simply the text to be rendered in the text block. Line breaks may be inserted by including a newline "\n". font The font attribute is a string indicating the name of the font to be used to render this element. The PS package uses an internal description of the Font Metrics of various fonts that is contained in the PostScript::Metrics module. As of this writing, the PostScript::Metrics module supports the following fonts (basically, the default GhostScript fonts that have AFM files): NimbusSanL-ReguCond URWGothicL-Book CenturySchL-Bold CharterBT-Italic URWBookmanL-Ligh CharterBT-BoldItalic NimbusRomNo9L-ReguItal URWBookmanL-DemiBoldItal CharterBT-Roman NimbusMonL-ReguObli NimbusSanL-ReguCondItal CenturySchL-Ital CenturySchL-BoldItal URWPalladioL-Roma URWBookmanL-LighItal CharterBT-Bold NimbusSanL-BoldCond NimbusMonL-BoldObli NimbusSanL-BoldCondItal URWGothicL-DemiObli NimbusSanL-Regu URWPalladioL-Bold NimbusMonL-Regu NimbusSanL-ReguItal URWGothicL-BookObli URWPalladioL-Ital You can get a list of the currently supported fonts with the following: use PostScript::Metrics; @okfonts = PostScript::Metrics->listFonts(); =over 10 NOTE: The font must be available to the PostScript interpreter that is used to render the page described by the program. If the interpreter cannot load the font, it will ususally attempt to substitute a similar font. If a font is substituted with a font with different metrics, lines of text may overrun the right margin of the text block. You have been warned. =over 3 It is very easy to create stylesheets for a document: # Define the styles # %body = ( font => 'URWGothicL-DemiObli', size => 12, leading => 16 ); %head1 = ( font => 'NimbusSanL-BoldCond', size => 24, leading => 36 ); %head2 = ( font => 'NimbusSanL-BoldCond', size => 18, leading => 30 ); # Use them where appropriate # $tb->addText(text => "Chapter 10\n", %head1); $tb->addText(text => "Spokane Sam and His Spongepants\n", %head2); $tb->addText(text => "It was a dark and stormy night and Spokane Sam\'s Spongepants were thirsty...", %body); =item numElements() Returns the number of elements in the text block object. An 'element' is created each time the addText() method is called. =item Write( $width, $height, $xoffset, $yoffset ) The Write() method will generate the PostScript code that will render the text on a page when passed to a PostScript interpreter such as Ghostscript. The four parameters are expressed in points (1/72 inch) and indicate the width and height of the box within which the text should be printed, and the x and y offset of the upper left corner of this box. Important: PostScript defines the orgin (0,0) as the lower left corner of the page! This *will* mess you up. Standard page sizes in points are: Paper Size Width, Height (in points) ......................... ......................... Letter 612, 792 Legal 612, 1008 Ledger 1224, 792 Tabloid 792, 1224 A0 2384, 3370 A1 1684, 2384 A2 1191, 1684 A3 842, 1191 A4 595, 842 A5 420, 595 A6 297, 420 A7 210, 297 A8 148, 210 A9 105, 148 B0 2920, 4127 B1 2064, 2920 B2 1460, 2064 B3 1032, 1460 B4 729, 1032 B5 516, 729 B6 363, 516 B7 258, 363 B8 181, 258 B9 127, 181 B10 91, 127 #10 Envelope 297, 684 C5 Envelope 461, 648 DL Envelope 312, 624 Folio 595, 935 Executive 522, 756 The write() method returns two values: a string consisting of the PostScript code (suitable for printing to a file), and a TextBlock object containing the elements (and partial elements) that did not fit within the specified area, if any. If the entire text block fits with the area, the remainder will be undef. The remainder can be used to layout multiple pages and columns, etc. in a similar manner to most modern desktop publishing programs. In general, the write() method should be called as in the following, which writes the PostScript code to a file called 'psoutput.ps': open OUT, '>psoutput.ps'; my ($code, $remainder) = $tb->Write(572, 752, 20, 772); print OUT $code; To print an entire text block that spans multiple pages, you could do something like this: (add enough text to the text block first..) open OUT, '>psoutput.ps'; my $pages = 1; # Create the first page # my ($code, $remainder) = $tb->Write(572, 752, 20, 772); print OUT "%%Page:$pages\n"; # this is required by the Adobe # Document Structuring Conventions print OUT $code; print OUT "showpage\n"; # Print the rest of the pages, if any # while ($remainder->numElements) { $pages++; print OUT "%%Page:$pages\n"; ($code, $remainder) = $remainder->Write(572, 752, 20, 772); print OUT $code; print OUT "showpage\n"; } However, if you use the PostScript::Document module to construct generic multi-page PostScript documents, you don't have to worry about this. =head1 A NOTE ABOUT FONT METRICS The write() method uses the module PostScript::Metrics to determine the width of each character; widths vary from font to font and character to character. If you were writing a stright PostScript program, you would let the PostScript interpreter do this for you, but in the case of this program, we need to know the width of each character in a font within the Perl script. The PostScript::Metrics module contains the font metrics (i.e., a list containing the width of each character in the font) for a bunch of fonts that are listed above under the description of the addText() method. This set started with the metrics for all of the default fonts with AFM files that came with GhostScript. It is slowly growing as more fonts are mapped. To add support for a new font, you must create the array with the metrics for that font and add it to the PostScript::Metrics module. For a font with an AFM file, the AFM file can be parsed with Gisle Aas' Font::AFM module, available on CPAN. Please send all PostScript::Metrics patches to the author at shawn@as220.org. =head1 TODO * better compliance with Adobe's Document Structuring Conventions * more font metrics descriptions * make font loading code smarter and more efficient for the interpreter * support a larger character set * it would be nice to add more functions, e.g. Clone() * how about settable defaults? =head1 AUTHOR Copyright 1998, 1999 Shawn Wallace. All rights reserved. Contact the author: shawn@as220.org http://www.as220.org/shawn Portions of code contributed by Dan Smeltz. This is free software. You may use, modify, and redistribute this package under the same terms as Perl itself. PostScript is a trademark of Adobe Systems. =cut PostScript-0.06/example.pl100644 1003 144 2211 6714213714 14271 0ustar shawnusers#!/usr/local/bin/perl -w use strict; use PostScript::TextBlock; my $tb = new PostScript::TextBlock; $tb->addText( text => "Hullaballo in Hoosick Falls.\n", font => 'CenturySchL-Ital', size => 24, leading => 100 ); $tb->addText( text => "by Charba Gaspee.\n", font => 'URWGothicL-Demi', size => 18, leading => 36 ); open I, "example.txt"; undef $/; my $text = ; $tb->addText( text => $text, font => 'URWGothicL-Demi', size => 14, leading => 24 ); open OUT, '>psoutput.ps'; my $pages = 1; # create the first page # my ($code, $remainder) = $tb->Write(572, 752, 20, 772); print OUT "%%Page:$pages\n"; # this is required by the Adobe # Document Structuring Conventions print OUT $code; print OUT "showpage\n"; # Print the rest of the pages, if any # while ($remainder->numElements) { $pages++; print OUT "%%Page:$pages\n"; ($code, $remainder) = $remainder->Write(572, 752, 20, 772); print OUT $code; print OUT "showpage\n"; } PostScript-0.06/example.txt100644 1003 144 12462 6714213714 14526 0ustar shawnusersIt started on day 2 of NH, at hotel, with my foot killing from a 6 mile hike and one bad shoe. We decided to relax and sit in the outdoor hottub. There were 2 other couple in there one guy was a drummer & ex navy guy, 52, drinking sangria with his 4th wife. The other guy was 6'4, nonstop michelob lights, his girlfriend kim was sleeping on a lounge chair and we were all talking shit and about the stock market, hi my name is Scott mine too, Juliet was with us. Went for a while about current events until it spun into OJ is guilty and some conspiracy stuff (the older guy was more wild ie the CIA is killing the Kennedys, etc, Scott usually balanced his statements with specific references. ("Not conspiracies - plans of action"-S.T.) Talked about economy -> Stock Market, scott was into mining/gold he worked out in colorado 1996 at a gold mining firm. He's currently fishing for a living and a major clinton hater. Says that fed is trying to do to RI what they did in alaska, which was the fed mandated a minimum hole size of 3" in the nets which eliminated the catch of certain species like calamari and whiting (which he said was fine if it was truly for population or environmental conerns) but it wasn't, because after the fisherman went out of business because of the new laws, Tyson Foods came in and bought the whole fleet for less than 10 cents on the dollar and a month later the federal regs (affecting only alaska BTW) were repealed. He says it worked so well that that Tyson (a major clinton/dem friend & donor) wants to do it again in RI and the whole country, killing independent fishing and raising the price of a McDonald's filet o' fish for example to $9 in the process. He said he was a writer, and had interest from penguin in his latest 20 chapter novel, which he says the crazy characters in it keep getting away from him and he may have to turn it into a screenplay. Anyway, juliet had me go out and get a case of beer and we drank for 4 hours in the hottub. More current events and india mentioned. Then he said he was in pakistan and afghanistan as a journalist and i asked 'is your last name Traudt'? Yeah! Hahaha we had already been talking for over an hour. then we talked about you & walrus and he asked about kim kazan & jill & mac (jp mcormick) so that was cool. FYI Trout said he really enjoyed "newport on 2 mics a day". Got pretty wasted as we went out to dinner and bars but i tried to brain dump below on some interesting topics: 1. On the Indian nuke scenario: Often talks with some friends from Afghanistan, who are now naturalized americans. Thinks this is the next really big war coming, and will spread to the middle east. Indians are scared shitless of china, who is fully nuke capable. India also has a constantly ongoing border war with Pakistan who made the news recently with its own nuclear program, which was supplied to pakistan by its ally china, india is effectively saying to china if you give pakistan one more nuke there will be trouble. The PM of pakistan was in china last week. India has been acquiring nuke equipment from Russia; they purchased two nuclear submarines capable of nuke sea launch and also rented the russian crew as a team to train the indian team which runs 2nd shift in the sub. The nuke technology he belives was delivered to india via a Loral-type deal involving -ready for this - microsoft, BG was in india 5 mos. ago. He said microsoft helped deliver some nuke and other hi-tech and has more but is using it as leverage in the antitrust case. 2. clinton scandal - he said you'd get a kick out of this: Amy Lehrman, former student body president uri, went to intern for clinton and 6 months later got a mysterious and sudden xfer to Ted kennedy's staff. She used to be Scott's old girlfriend & he got a postcard from her. Also a uri secretary named 'dee' went to work for clinton, same thing suddenly xferred to Ted Kennedy's staff. Thinks we'll hear Amy's name in another 30 days if clinton interns stay in the papers. He thinks some wierd quid pro quo is going on, try and locate the last 20 interns or so. One was shot and killed in a bar, and a journalist trying to dig into it got killed also. Also thinks BC behind the death of former CIA head who died in that mysterious canoe accident, because the head was stirring up dirt about what is now in the news as the Loral-China missle connection, also the Ron Brown crash because it killed 2 birds w/one stone - RBRown, who was being indicted and drawing attn to Tyson, and also all the heads of the oil companies on the way to oil rich bosnia, who the dems needed out 3. When talking about movies and 'Fear an Loathing', ST mentioned that Deb Doolittle of yankee travel in wakefield grew up with hunter s. thompson in colorado and knows him well. while he was last down there, she gave HST a couple copies of the great swamp gazette, which she said he really dug and then passed a few of them onto dennis hopper who read them on the film set of a movie (he can't remember the name but the explosion scenes for it were being filmed in colorado). Dennis Hopper also later got to read the "dennis hopper" tribute issue. Anyway I had a good time. I left him my # in PRV. His girlfriend Kim who joned us later for dinner & the bar works PT at the mews as a bartender and they live together in a condo complex which i think is across the street from Linden drive. small world, huh? PostScript-0.06/psoutput.ps100644 1003 144 27253 6754277151 14616 0ustar shawnusers%%Page:1 0 setgray 0 setgray 20 672 moveto /CenturySchL-Ital findfont 24 scalefont setfont (Hullaballo in Hoosick Falls.) show 0 setgray 20 572 moveto /CenturySchL-Ital findfont 24 scalefont setfont /URWGothicL-Demi findfont 18 scalefont setfont (by Charba Gaspee.) show 0 setgray 20 536 moveto /URWGothicL-Demi findfont 18 scalefont setfont /URWGothicL-Demi findfont 14 scalefont setfont (It started on day 2 of NH, at hotel, with my foot killing from a 6 mile hike and one ) show 0 setgray 20 512 moveto /URWGothicL-Demi findfont 14 scalefont setfont (bad shoe. We decided to relax and sit in the outdoor hottub. There were 2 other ) show 0 setgray 20 488 moveto /URWGothicL-Demi findfont 14 scalefont setfont (couple in there one guy was a drummer & ex navy guy, 52, drinking sangria with his ) show 0 setgray 20 464 moveto /URWGothicL-Demi findfont 14 scalefont setfont (4th wife. The other guy was 6'4, nonstop michelob lights, his girlfriend kim was ) show 0 setgray 20 440 moveto /URWGothicL-Demi findfont 14 scalefont setfont (sleeping on a lounge chair and we were all talking shit and about the stock market, ) show 0 setgray 20 416 moveto /URWGothicL-Demi findfont 14 scalefont setfont (hi my name is Scott mine too, Juliet was with us. Went for a while about current ) show 0 setgray 20 392 moveto /URWGothicL-Demi findfont 14 scalefont setfont (events until it spun into OJ is guilty and some conspiracy stuff \(the older guy was ) show 0 setgray 20 368 moveto /URWGothicL-Demi findfont 14 scalefont setfont (more wild ie the CIA is killing the Kennedys, etc, Scott usually balanced his ) show 0 setgray 20 344 moveto /URWGothicL-Demi findfont 14 scalefont setfont (statements with specific references. \("Not conspiracies - plans of action"-S.T.\) ) show 0 setgray 20 320 moveto /URWGothicL-Demi findfont 14 scalefont setfont (Talked about economy -> Stock Market, scott was into mining/gold he worked out ) show 0 setgray 20 296 moveto /URWGothicL-Demi findfont 14 scalefont setfont (in colorado 1996 at a gold mining firm. He's currently fishing for a living and a major ) show 0 setgray 20 272 moveto /URWGothicL-Demi findfont 14 scalefont setfont (clinton hater. Says that fed is trying to do to RI what they did in alaska, which was ) show 0 setgray 20 248 moveto /URWGothicL-Demi findfont 14 scalefont setfont (the fed mandated a minimum hole size of 3" in the nets which eliminated the catch ) show 0 setgray 20 224 moveto /URWGothicL-Demi findfont 14 scalefont setfont (of certain species like calamari and whiting \(which he said was fine if it was truly ) show 0 setgray 20 200 moveto /URWGothicL-Demi findfont 14 scalefont setfont (for population or environmental conerns\) but it wasn't, because after the fisherman) show 0 setgray 20 176 moveto /URWGothicL-Demi findfont 14 scalefont setfont (went out of business because of the new laws, Tyson Foods came in and bought the ) show 0 setgray 20 152 moveto /URWGothicL-Demi findfont 14 scalefont setfont (whole fleet for less than 10 cents on the dollar and a month later the federal regs ) show 0 setgray 20 128 moveto /URWGothicL-Demi findfont 14 scalefont setfont (\(affecting only alaska BTW\) were repealed. He says it worked so well that that ) show 0 setgray 20 104 moveto /URWGothicL-Demi findfont 14 scalefont setfont (Tyson \(a major clinton/dem friend & donor\) wants to do it again in RI and the ) show 0 setgray 20 80 moveto /URWGothicL-Demi findfont 14 scalefont setfont (whole country, killing independent fishing and raising the price of a McDonald's filet ) show 0 setgray 20 56 moveto /URWGothicL-Demi findfont 14 scalefont setfont (o' fish for example to $9 in the process. ) show 0 setgray 20 32 moveto /URWGothicL-Demi findfont 14 scalefont setfont () show showpage %%Page:2 0 setgray 0 setgray 20 748 moveto /URWGothicL-Demi findfont 14 scalefont setfont (He said he was a writer, and had interest from penguin in his latest 20 chapter novel,) show 0 setgray 20 724 moveto /URWGothicL-Demi findfont 14 scalefont setfont (which he says the crazy characters in it keep getting away from him and he may ) show 0 setgray 20 700 moveto /URWGothicL-Demi findfont 14 scalefont setfont (have to turn it into a screenplay. ) show 0 setgray 20 676 moveto /URWGothicL-Demi findfont 14 scalefont setfont () show 0 setgray 20 652 moveto /URWGothicL-Demi findfont 14 scalefont setfont (Anyway, juliet had me go out and get a case of beer and we drank for 4 hours in ) show 0 setgray 20 628 moveto /URWGothicL-Demi findfont 14 scalefont setfont (the hottub. More current events and india mentioned. Then he said he was in ) show 0 setgray 20 604 moveto /URWGothicL-Demi findfont 14 scalefont setfont (pakistan and afghanistan as a journalist and i asked 'is your last name Traudt'? ) show 0 setgray 20 580 moveto /URWGothicL-Demi findfont 14 scalefont setfont (Yeah! Hahaha we had already been talking for over an hour. then we talked about ) show 0 setgray 20 556 moveto /URWGothicL-Demi findfont 14 scalefont setfont (you & walrus and he asked about kim kazan & jill & mac \(jp mcormick\) so that ) show 0 setgray 20 532 moveto /URWGothicL-Demi findfont 14 scalefont setfont (was cool. FYI Trout said he really enjoyed "newport on 2 mics a day". Got pretty ) show 0 setgray 20 508 moveto /URWGothicL-Demi findfont 14 scalefont setfont (wasted as we went out to dinner and bars but i tried to brain dump below on some ) show 0 setgray 20 484 moveto /URWGothicL-Demi findfont 14 scalefont setfont (interesting topics:) show 0 setgray 20 460 moveto /URWGothicL-Demi findfont 14 scalefont setfont () show 0 setgray 20 436 moveto /URWGothicL-Demi findfont 14 scalefont setfont (1. On the Indian nuke scenario: Often talks with some friends from Afghanistan, who) show 0 setgray 20 412 moveto /URWGothicL-Demi findfont 14 scalefont setfont (are now naturalized americans. Thinks this is the next really big war coming, and will) show 0 setgray 20 388 moveto /URWGothicL-Demi findfont 14 scalefont setfont (spread to the middle east. Indians are scared shitless of china, who is fully nuke ) show 0 setgray 20 364 moveto /URWGothicL-Demi findfont 14 scalefont setfont (capable. India also has a constantly ongoing border war with Pakistan who made ) show 0 setgray 20 340 moveto /URWGothicL-Demi findfont 14 scalefont setfont (the news recently with its own nuclear program, which was supplied to pakistan by ) show 0 setgray 20 316 moveto /URWGothicL-Demi findfont 14 scalefont setfont (its ally china, india is effectively saying to china if you give pakistan one more nuke ) show 0 setgray 20 292 moveto /URWGothicL-Demi findfont 14 scalefont setfont (there will be trouble. The PM of pakistan was in china last week. India has been ) show 0 setgray 20 268 moveto /URWGothicL-Demi findfont 14 scalefont setfont (acquiring nuke equipment from Russia; they purchased two nuclear submarines ) show 0 setgray 20 244 moveto /URWGothicL-Demi findfont 14 scalefont setfont (capable of nuke sea launch and also rented the russian crew as a team to train the ) show 0 setgray 20 220 moveto /URWGothicL-Demi findfont 14 scalefont setfont (indian team which runs 2nd shift in the sub. The nuke technology he belives was ) show 0 setgray 20 196 moveto /URWGothicL-Demi findfont 14 scalefont setfont (delivered to india via a Loral-type deal involving -ready for this - microsoft, BG was ) show 0 setgray 20 172 moveto /URWGothicL-Demi findfont 14 scalefont setfont (in india 5 mos. ago. He said microsoft helped deliver some nuke and other hi-tech ) show 0 setgray 20 148 moveto /URWGothicL-Demi findfont 14 scalefont setfont (and has more but is using it as leverage in the antitrust case.) show 0 setgray 20 124 moveto /URWGothicL-Demi findfont 14 scalefont setfont () show 0 setgray 20 100 moveto /URWGothicL-Demi findfont 14 scalefont setfont (2. clinton scandal - he said you'd get a kick out of this: Amy Lehrman, former ) show 0 setgray 20 76 moveto /URWGothicL-Demi findfont 14 scalefont setfont (student body president uri, went to intern for clinton and 6 months later got a ) show 0 setgray 20 52 moveto /URWGothicL-Demi findfont 14 scalefont setfont (mysterious and sudden xfer to Ted kennedy's staff. She used to be Scott's old ) show 0 setgray 20 28 moveto /URWGothicL-Demi findfont 14 scalefont setfont (girlfriend & he got a postcard from her. Also a uri secretary named 'dee' went to ) show showpage %%Page:3 0 setgray 0 setgray 20 748 moveto /URWGothicL-Demi findfont 14 scalefont setfont (work for clinton, same thing suddenly xferred to Ted Kennedy's staff. Thinks we'll ) show 0 setgray 20 724 moveto /URWGothicL-Demi findfont 14 scalefont setfont (hear Amy's name in another 30 days if clinton interns stay in the papers. He thinks ) show 0 setgray 20 700 moveto /URWGothicL-Demi findfont 14 scalefont setfont (some wierd quid pro quo is going on, try and locate the last 20 interns or so. One ) show 0 setgray 20 676 moveto /URWGothicL-Demi findfont 14 scalefont setfont (was shot and killed in a bar, and a journalist trying to dig into it got killed also. Also ) show 0 setgray 20 652 moveto /URWGothicL-Demi findfont 14 scalefont setfont (thinks BC behind the death of former CIA head who died in that mysterious canoe ) show 0 setgray 20 628 moveto /URWGothicL-Demi findfont 14 scalefont setfont (accident, because the head was stirring up dirt about what is now in the news as the) show 0 setgray 20 604 moveto /URWGothicL-Demi findfont 14 scalefont setfont (Loral-China missle connection, also the Ron Brown crash because it killed 2 birds ) show 0 setgray 20 580 moveto /URWGothicL-Demi findfont 14 scalefont setfont (w/one stone - RBRown, who was being indicted and drawing attn to Tyson, and also) show 0 setgray 20 556 moveto /URWGothicL-Demi findfont 14 scalefont setfont (all the heads of the oil companies on the way to oil rich bosnia, who the dems ) show 0 setgray 20 532 moveto /URWGothicL-Demi findfont 14 scalefont setfont (needed out) show 0 setgray 20 508 moveto /URWGothicL-Demi findfont 14 scalefont setfont () show 0 setgray 20 484 moveto /URWGothicL-Demi findfont 14 scalefont setfont (3. When talking about movies and 'Fear an Loathing', ST mentioned that Deb ) show 0 setgray 20 460 moveto /URWGothicL-Demi findfont 14 scalefont setfont (Doolittle of yankee travel in wakefield grew up with hunter s. thompson in colorado ) show 0 setgray 20 436 moveto /URWGothicL-Demi findfont 14 scalefont setfont (and knows him well. while he was last down there, she gave HST a couple copies of) show 0 setgray 20 412 moveto /URWGothicL-Demi findfont 14 scalefont setfont (the great swamp gazette, which she said he really dug and then passed a few of ) show 0 setgray 20 388 moveto /URWGothicL-Demi findfont 14 scalefont setfont (them onto dennis hopper who read them on the film set of a movie \(he can't ) show 0 setgray 20 364 moveto /URWGothicL-Demi findfont 14 scalefont setfont (remember the name but the explosion scenes for it were being filmed in colorado\).) show 0 setgray 20 340 moveto /URWGothicL-Demi findfont 14 scalefont setfont (Dennis Hopper also later got to read the "dennis hopper" tribute issue.) show 0 setgray 20 316 moveto /URWGothicL-Demi findfont 14 scalefont setfont () show 0 setgray 20 292 moveto /URWGothicL-Demi findfont 14 scalefont setfont (Anyway I had a good time. I left him my # in PRV. His girlfriend Kim who joned us ) show 0 setgray 20 268 moveto /URWGothicL-Demi findfont 14 scalefont setfont (later for dinner & the bar works PT at the mews as a bartender and they live together ) show 0 setgray 20 244 moveto /URWGothicL-Demi findfont 14 scalefont setfont (in a condo complex which i think is across the street from Linden drive.) show 0 setgray 20 220 moveto /URWGothicL-Demi findfont 14 scalefont setfont () show 0 setgray 20 196 moveto /URWGothicL-Demi findfont 14 scalefont setfont (small world, huh?) show 0 setgray 20 172 moveto /URWGothicL-Demi findfont 14 scalefont setfont showpage