From 1561025730401799ab38b5568fefdb44f3c7cd90 Mon Sep 17 00:00:00 2001 From: Reinhard Kotucha Date: Sun, 27 Apr 2008 12:21:15 +0000 Subject: tlpkg/tlgs: Update to gs 8.62. git-svn-id: svn://tug.org/texlive/trunk@7680 c570f23f-e606-0410-a88d-b1316a301751 --- Master/tlpkg/tlgs/lib/gslp.ps | 695 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 695 insertions(+) create mode 100644 Master/tlpkg/tlgs/lib/gslp.ps (limited to 'Master/tlpkg/tlgs/lib/gslp.ps') diff --git a/Master/tlpkg/tlgs/lib/gslp.ps b/Master/tlpkg/tlgs/lib/gslp.ps new file mode 100644 index 00000000000..c520be656d9 --- /dev/null +++ b/Master/tlpkg/tlgs/lib/gslp.ps @@ -0,0 +1,695 @@ +% Copyright (C) 1991, 1995, 1996, 1997, 1998, 1999 Aladdin Enterprises. All rights reserved. +% +% This software is provided AS-IS with no warranty, either express or +% implied. +% +% This software is distributed under license and may not be copied, +% modified or distributed except as expressly authorized under the terms +% of the license contained in the file LICENSE in this distribution. +% +% For more information about licensing, please refer to +% http://www.ghostscript.com/licensing/. For information on +% commercial licensing, go to http://www.artifex.com/licensing/ or +% contact Artifex Software, Inc., 101 Lucas Valley Road #110, +% San Rafael, CA 94903, U.S.A., +1(415)492-9861. + +% $Id: gslp.ps 6300 2005-12-28 19:56:24Z giles $ +% gslp.ps - format and print text + +% This utility provides functionality approximately equivalent to the Unix +% `enscript' program. It prints plain text files using a single font. +% It currently handles tabs and formfeeds, but not backspaces. +% It will line-wrap when using fixed-pitch fonts. +% It will also do kerning and width adjustment. +% Standard switches implemented: +% -12BclqRr -b
-f -F -L -p +% Sun switches implemented: +% -T set tab width +% Switches ignored: +% -GghKkmow -# -C -d -J -n -P -S -s -t -v +% Switches added: +% --add-to-space +% add the given number of 1/72" units to the width of each +% space (may be negative) +% --add-to-width +% add the given number of 1/72" units to the width of each +% character (may be negative) +% --columns +% print in columns +% --detect +% treat the file as PostScript if it starts with %! +% --first-page +% start printing at page +% --kern +% kern using information from the given .AFM file +% --last-page +% stop printing after page +% --(heading|footing)-(left|center|right) +% set the heading/footing fields; use -B first to clear +% --margin-(top|bottom|left|right) +% set a margin +% --no-eject-(file|formfeed) +% end-of-file/FF only starts a new column, not a new sheet +% --spacing +% use double (n=2), triple (n=3), etc. spacing +% Also, the string %# in a heading or footing is replaced with the page #. +/PageNumberString (%#) def + +/lpdict 150 dict def +lpdict begin + +% build iso-latin-1 version of a font +/font-to-iso-latin-1 { % font-to-iso-latin-1 + %% reencode for iso latin1; from the 2nd edition red book, sec 5.6.1 + dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding ISOLatin1Encoding def currentdict end + dup /FontName get 80 string cvs (-ISOLatin1) concatstrings cvn + exch definefont +} def + +/find-latin-font { % find-latin-font + findfont font-to-iso-latin-1 +} def + +% Define the initial values of the printing parameters. + +/AddToSpace 0 def +/AddToWidth 0 def +/BodyFont null def % use default + /defaultBodyFontPortrait + /Courier find-latin-font 10 scalefont def + /defaultBodyFontLandscape + /Courier find-latin-font 7 scalefont def + /defaultBodyFont + { Landscape { defaultBodyFontLandscape } { defaultBodyFontPortrait } ifelse } def +/Columns 1 def +/DetectFileType false def +/EjectEOF true def +/EjectFF true def +/Footers false def +/FootingLeft () def +/FootingCenter () def +/FootingRight () def +/Headers true def +/HeadingLeft () def +/HeadingCenter () def +/HeadingRight (page ) PageNumberString concatstrings def +/HeadingFont null def % use default + /defaultHeadingFont + /Courier-Bold find-latin-font 10 scalefont def +/Kern 0 dict def % no kerning +/Landscape false def +/MarginBottom 36 def % 1/2" +/MarginLeft 36 def % 1/2" +/MarginRight 36 def % 1/2" +/MarginTop 36 def % 1/2" +/MaxLines 9999 def % max lines per page +/Noisy true def % i.e., not quiet +/OutFile null def % null = write directly to device +/PageFirst 1 def +/PageLast 99999 def +/Spacing 1 def +/Tab 8 def +/Truncate false def % wrap long lines, don't truncate + +% When writing to a file, we want to write out PostScript; +% when writing to the printer, we want to execute it; +% some commands should be executed regardless. +% lpexec provides for all this. + +/lpdef { % lpdef - + /def 2 true lpexec +} def + +/lpexec { % ... lpexec - + OutFile null eq { + pop 1 add true + } { + /t exch def 1 add /n exch def cvx + n -1 roll dup wo + n 1 sub { n -1 roll dup wosp } repeat + (\n) ws n t + } ifelse + { pop load exec } + { { pop } repeat } + ifelse +} def + +/lpmoveto { % lpmoveto - + % Round the coordinates for smaller output. + 2 { + exch 100 mul round 100 div + dup dup cvi eq { cvi } if + } repeat + 1 index X eq { neg exch pop /V 1 } { neg /M 2 } ifelse true lpexec +} def +/lpshow { % lpshow - + dup length 0 ne { + addspace 0 ne { + addspace 0 32 + addwidth 0 ne { + addwidth 0 6 -1 roll /awidthshow 6 true lpexec + } { + 4 -1 roll /widthshow 4 true lpexec + } ifelse + } { + addwidth 0 ne { + addwidth 0 3 -1 roll /ashow 3 true lpexec + } { + OutFile null ne { + dup dup length =string length gt { + /show 1 false lpexec + } { + (S ) ws ws (\n) ws + } ifelse + } if show + } ifelse + } ifelse + } { + pop + } ifelse +} def +/lpsetmyfont { + dup load setfont + OutFile null ne { cvx /setfont 1 false lpexec } { pop } ifelse +} def + +% Define some utility procedures. + +/banner % ypos left center right + { /HFont lpsetmyfont + /addspace 0 def /addwidth 0 def + /pairkern 0 dict def + 3 -1 roll bannerstring pop 0 4 index pwidth showline2 pop + exch bannerstring pwidth exch sub 2 div 3 index pwidth showline2 pop + bannerstring + % Prevent the last character of the heading from grazing + % the right margin. + % ****** WHY DOES IT REQUIRE SO MUCH PADDING? ****** + ( ) stringwidth pop 2 mul add + pwidth exch sub + 3 -1 roll pwidth showline2 pop + } def + +/bannerstring % string -> string width + { PageNumberString search + { exch pop pindex 4 string cvs concatstrings exch concatstrings + } + if dup stringwidth pop + } def + +/beginpage + { /lindex 0 def + /skipping pindex PageFirst ge pindex PageLast le and not def + pagex pagey Landscape {/BL} {/B} ifelse 2 true lpexec + /pagesave exch def + skipping { nulldevice /OutFile null def } if + Headers + { lheight hdescent add + HeadingLeft HeadingCenter HeadingRight banner + } if + /BFont lpsetmyfont + /pairkern Kern def + /addspace AddToSpace def /addwidth AddToWidth def + pairkern length 0 ne { + /addspace AddToSpace lpdef /addwidth AddToWidth lpdef + } if + } def + +/endpage { + lindex 0 ne { + Footers { + topskip plength sub hdescent add + FootingLeft FootingCenter FootingRight banner + } if + /E + } { + /restore + } ifelse + pagesave exch 0 true lpexec + /pindex pindex 1 add def +} def + +/endcolumn + { lindex colines 1 sub add colines idiv colines mul + dup llength ge { pop endpage beginpage } { /lindex exch def } ifelse + } def + +/fontheight % fontheight + { gsave setfont + newpath 0 0 moveto + (|^_j) false charpath + pathbbox exch pop dup 2 index sub 4 -2 roll pop pop + grestore exch 1.25 mul exch 1.25 mul + } def + +/wdict { + dup length wosp ( dict\n) ws + { (dup) ws exch wosp wosp ( put\n) ws } forall +} def +/wosp { ( ) ws wo } def +/wo { + dup type /dicttype eq { wdict } { OutFile exch write==only } ifelse +} def +/ws { + OutFile exch writestring +} def + +/outfont { % outfont - + OutFile null ne { + exch wo + dup /FontName get + dup wosp (-ISOLatin1) ws wosp ( RE) ws + /FontMatrix get 0 get 1000 mul round cvi wosp + ( scalefont def\n) ws + } { + pop pop + }ifelse +} def + +/StringFF (\f) def +/CharFF StringFF 0 get def +/StringTAB (\t) def +/CharTAB StringTAB 0 get def + +/showline % line -> leftover_line (handles \f) + { { showline1 dup length 0 eq { exit } if + dup 0 get CharFF ne { exit } if + EjectFF { endpage beginpage } { endcolumn } ifelse + skip1 + } + loop + } def + +/showline1 % line -> leftover_line (handles page break) + { lindex llength eq { endpage beginpage } if + lindex colines idiv cowidth mul % x + lindex colines mod 1 add lheight mul neg fascent sub % y + 1 index cowidth add + showline2 + /lindex lindex 1 add def + } def + +/setxy { + /ty exch def /tx exch def +} def + +/showline2 { % string x y xlimit -> leftover_string (handles tabs) + 2 index exch 5 2 roll setxy { + % Stack: xinit xlimit string + showline3 dup length 0 eq { exit } if + dup 0 get CharTAB ne { exit } if + tx 3 index sub tabwx div + 0.05 add ceiling tabwx mul 3 index add ty setxy + skip1 + tx 2 index ge { exit } if + } loop exch pop exch pop +} def + +/showline3 { % xlimit string -> xlimit leftover_string + % (finds line break / tab / formfeed) + 1 index tx sub + cwx div 0.1 add cvi 0 .max 1 index length .min + 1 index 0 3 -1 roll getinterval + % look for \f or \t + StringFF search { exch pop exch pop } if + StringTAB search { exch pop exch pop } if + dup length 0 ne { + tx ty lpmoveto + dup pairkern length 0 eq { + lpshow + } { + { kproc } exch /kshow 2 true lpexec + } ifelse + currentpoint setxy + } if + length dup 2 index length exch sub getinterval +} def + +/kproc { % kproc - + pairkern currentfont /Encoding get 3 index get + 2 copy known { + get currentfont /Encoding get 2 index get + 2 copy known { + get currentfont /FontMatrix get 0 get mul + } { + pop pop 0 + } ifelse + } { + pop pop 0 + } ifelse + addwidth add 2 index 32 eq { addspace add } if + dup 0 eq { pop } { 0 rmoveto } ifelse + pop pop +} def + +/skip1 + { dup length 1 sub 1 exch getinterval + } def + +/e== { % e== - -- print an object to stderr + (%stderr) (w) file dup 3 -1 roll write==only flushfile +} def + +/eprint { % eprint - -- print a string to stderr + (%stderr) (w) file dup 3 -1 roll writestring flushfile +} def + +% Read kerning information from a .AFM file. + +/readkern { % readkern + /mfilename 1 index def + (r) file /mfile exch def + mfile =string readline pop + (StartFontMetrics ) anchorsearch { + pop pop + /kdict 256 dict def + { mfile =string readline pop + (EndFontMetrics) anchorsearch { pop pop exit } if + (KPX ) anchorsearch { + pop token pop cvlit /char1 exch def + token pop cvlit /char2 exch def + token pop /kern exch def pop + kdict char1 .knownget not { + 5 dict kdict char1 2 index .growput + } if + char2 kern .growput + } { + pop + } ifelse + } loop kdict + } { + pop + mfilename eprint ( does not begin with StartFontMetrics.\n) eprint + 0 dict + } ifelse + mfile closefile +} def + +% The main printing procedure + +/doFirst true def +/prevBFont null def +/prevHFont null def + +/lpfirst { % - lpfirst - +% Define some abbreviating procedures. + /B {save 3 1 roll translate /X 0 def} lpdef + /BL {save 3 1 roll 90 rotate translate /X 0 def} lpdef + /E {showpage restore} lpdef + /V {neg X exch moveto} lpdef + /M {/X 2 index def neg moveto} lpdef + /S {currentfile =string readline pop show} lpdef + /RE { % RE + findfont + %% reencode for iso latin1; from the 2nd edition red book, sec 5.6.1 + dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall + /Encoding ISOLatin1Encoding def currentdict end + definefont + } lpdef +} def + +/lp { % file initial_chars -> + /lpline exch def + /lpfile exch def + + doFirst { lpfirst /doFirst false def } if + +% Initialize the device and fonts. + /BFont + BodyFont null eq { defaultBodyFont } { BodyFont } ifelse def + BFont prevBFont ne { + /BFont BFont outfont + /prevBFont BFont def + } if + Headers Footers or { + /HFont + HeadingFont null eq { defaultHeadingFont } { HeadingFont } ifelse def + HFont prevHFont ne { + /HFont HFont outfont + /prevHFont HFont def + } if + } if + save + +% Get the layout parameters. + clippath + gsave % for possible rotation + Landscape { 90 rotate } if + BFont setfont ( ) stringwidth pop /cwx exch def + cwx Tab mul /tabwx exch def + BFont fontheight /fheight exch def /fascent exch def + Headers Footers or { HFont fontheight } { 0 0 } ifelse + /hheight exch def /hascent exch def + /hdescent hheight hascent sub def + fheight Spacing mul /lheight exch def + Headers { hheight lheight add } { 0 } ifelse + /topskip exch def + Footers { hheight lheight add } { 0 } ifelse + /botskip exch def + /pskip topskip botskip add def + % Translate the page so that (0,0) corresponds to + % the top of the topmost body line. + pathbbox + 2 index sub MarginBottom MarginTop add sub /plength exch def + 2 index sub MarginLeft MarginRight add sub /pwidth exch def + pwidth Columns div /cowidth exch def + exch MarginLeft add + exch MarginBottom add plength add topskip sub + /pagey exch def /pagex exch def + plength pskip sub lheight div cvi MaxLines .min + dup /colines exch def + Columns mul /llength exch def + grestore + OutFile null ne { nulldevice } if + +% Print layout + Noisy + { (Page height = ) eprint llength e== + (.\n) eprint flush + } if + +% Write the kerning table, if relevant. + OutFile null ne Kern length 0 ne and { + (/kproc) ws /kproc load wosp ( def\n) ws + (/pairkern) ws Kern wosp ( def\n) ws + } if + +% Disable stack recording so we can use stopped with readline. + $error /recordstacks false put + +% Initialize for the first page. + /lbuf 64000 string def + /pindex 1 def + beginpage + +% Iterate through the file. + lpline + { dup length /pos exch def + lbuf exch 0 exch putinterval + { lpfile lbuf pos lbuf length pos sub getinterval readline } stopped + { % Filled the line before a CR or EOF. + exch pop showline + } + { % Reached CR and/or EOF first. + exch length pos add lbuf exch 0 exch getinterval + 1 index { showline } if % omit final empty line + { dup length 0 eq Truncate or { pop () exit } if + showline + } + loop + exch not { exit } if + } + ifelse + pindex PageLast gt { exit } if + } loop + pop + +% Wrap up. +%**************** WHY IS THIS COMMENTED OUT? **************** +% EjectEOF { endpage } { endcolumn } ifelse + endpage + restore + +} def + +end + +% Usage: lp +% prints using the current parameter settings. +% Usage: [ ... ] lpcommand +% interprets args like a command line. + +/lp { save lpdict begin () lp end restore } def + +lpdict begin + +/splitfn % (FontNN.NN) -> + { dup /arg exch def length + { dup 0 le { exit } if + dup 1 sub arg exch get dup 48 ge 1 index 59 le and exch 46 eq or not { exit } if + 1 sub + } loop + arg exch 0 exch getinterval dup cvn find-latin-font + exch arg exch anchorsearch pop pop cvr scalefont + } def + +% Parse the command line switches. + +/doswitch % argn ... arg1 (-?) restofswitch -> + { exch dup cvn lpdict exch known + { cvn load exec } + { exch pop (Unknown switch: ) eprint eprint (\n) eprint } + ifelse + } def + +/more % argn ... arg1 restofswitch -> + { dup length 0 ne + { (- ) dup 1 3 index 0 get put + exch dup length 1 sub 1 exch getinterval + doswitch + } + { pop + } + ifelse + } def + +/-- { (--) exch concatstrings + dup cvn lpdict exch known + { cvn load exec } + { (Unknown switch: ) eprint eprint (\n) eprint } + ifelse + } def +/--add-to-space { cvr /AddToSpace exch def } def +/--add-to-width { cvr /AddToWidth exch def } def +/--columns { cvi 1 .max /Columns exch def } def +/--detect { /DetectFileType true def } def +/--first-page { cvi /PageFirst exch def } def +/--footing-center { /FootingCenter exch def /Footers true def } def +/--footing-left { /FootingLeft exch def /Footers true def } def +/--footing-right { /FootingRight exch def /Footers true def} def +/--heading-center { /HeadingCenter exch def /Headers true def } def +/--heading-left { /HeadingLeft exch def /Headers true def } def +/--heading-right { /HeadingRight exch def /Headers true def } def +/--kern { readkern /Kern exch def } def +/--last-page { cvi /PageLast exch def } def +/--margin-bottom { cvr 72.0 mul /MarginBottom exch def } def +/--margin-left { cvr 72.0 mul /MarginLeft exch def } def +/--margin-right { cvr 72.0 mul /MarginRight exch def } def +/--margin-top { cvr 72.0 mul /MarginTop exch def } def +/--no-eject-file { /EjectEOF false def } def +/--no-eject-formfeed { /EjectFF false def } def +/--spacing { cvr /Spacing exch def } def + +/-# { pop } def % ignore +/-+ { -- } def +(-1)cvn { /Columns 1 def more } def +(-2)cvn { /Columns 2 def more } def +/-b { /HeadingLeft exch def /HeadingCenter () def /HeadingRight PageNumberString def + /Headers true def + /break true def + } def +/-B { /HeadingLeft () def /HeadingCenter () def /HeadingRight () def + /Headers false def + /FootingLeft () def /FootingCenter () def /FootingRight () def + /Footers false def + /break true def + more + } def +/-C { pop } def % ignore +/-c { /Truncate true def more } def +/-d { pop } def % ignore +/-f { splitfn /BodyFont exch def } def +/-F { splitfn /HeadingFont exch def } def +/-G { more } def % ignore +/-g { more } def % ignore +/-h { more } def % ignore +/-J { pop } def % ignore +/-K { more } def % ignore +/-k { more } def % ignore +/-l { 66 -L -B } def +/-L { cvi /MaxLines exch def } def +/-m { more } def % ignore +/-n { pop } def % ignore +/-o { more } def % ignore +/-p { (w) file /OutFile exch def OutFile (%!\n) writestring } def +/-P { pop } def % ignore +/-q { /Noisy false def more } def +/-r { /Landscape true def more } def +/-R { /Landscape false def more } def +/-S { pop } def % ignore +/-s { pop } def % ignore +/-T { cvi /Tab exch def } def +/-v { pop } def % ignore +/-w { more } def % ignore + +/lp1 % filename -> + { break not { dup /HeadingLeft exch def } if + Noisy + { (Printing ) eprint dup eprint (\n) eprint + } if + (r) file + % If requested, check for a PostScript file. + DetectFileType + { dup 2 string readstring pop dup (%!) eq + { % Yes, it's a PostScript file. + pop dup 80 string readline pop pop cvx exec + } + { lp + } + ifelse + } + { () lp + } + ifelse + } bind def + +/lpcstring 8192 string def + +end + +/lpcommand % <[arg1 ... argn]> lpcommand + { % Push the commands on the stack in reverse order + mark exch + dup length 1 sub -1 0 { 1 index exch get exch } for pop + lpdict begin + /any false def + /break false def + { dup mark eq { pop exit } if + dup length 2 ge { dup 0 get (-) 0 get eq } { false } ifelse + { dup 0 2 getinterval + exch dup length 2 sub 2 exch getinterval + doswitch + } + { dup /matched false def + { /matched true def /any true def lp1 } lpcstring filenameforall + matched { pop } { lp1 } ifelse % let the error happen + } + ifelse + } loop + OutFile null ne + { OutFile (%stdout) (w) file ne { OutFile closefile } if + /OutFile null def + } if + any + end + } def + +[ shellarguments + { ] dup length 0 ne { lpcommand } { false } ifelse not + { (%stderr) (w) file + [ (Usage: ) + /PROGNAME where { pop PROGNAME } { (gslp) } ifelse + ( [-12BclqRr] [-b
] [-f] [-F]\n) + ( [-L] [-p] [-T]\n) + ( [--add-to-(space|width) ] [--columns ]\n) + ( [--detect] [--first-page ] [--last-page ]\n) + ( [--(heading|footing)-(left|right|center) ]\n) + ( [--kern ] [--margin-(top|bottom|left|right) ]\n) + ( [--no-eject-(file|formfeed)] [--spacing ] file1 ... filen\n) + ] { 2 copy writestring pop } forall dup flushfile closefile + } + if + } + { pop } +ifelse -- cgit v1.2.3