/[MITgcm]/mitgcm.org/devel/buildweb/pkg/swish-e/doc/bin/html2ps
ViewVC logotype

Annotation of /mitgcm.org/devel/buildweb/pkg/swish-e/doc/bin/html2ps

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.1 - (hide annotations) (download)
Fri Sep 20 19:47:29 2002 UTC (22 years, 10 months ago) by adcroft
Branch point for: Import, MAIN
Initial revision

1 adcroft 1.1 : # Use perl
2     eval 'exec perl -S $0 "$@"'
3     if $running_under_some_shell;
4    
5     #######################################################################
6     # Sun Jun 4 00:35:58 IDT 2000
7     # Comments by Stas Bekman <stas@stason.org>:
8     #
9     # This package was last seen at http://www.tdb.uu.se/~jan/html2ps.html.
10     # The software wasn't developed anymore, none of my patches were accepted
11     # therefore I've forked it and add all the patches to this version.
12     #
13     # Currently it's distributed as a component of the bigger package under
14     # the same license as Perl or GNU GPL, whichever you prefer.
15     #
16     # The original header/license is present on the next lines
17     #######################################################################
18    
19     #######################################################################
20     # This is html2ps version 1.0 beta1, an HTML-to-PostScript converter.
21     # Copyright (C) 1995-1997 Jan Karrman.
22     #
23     # This program is free software; you can redistribute it and/or modify
24     # it under the terms of the GNU General Public License as published by
25     # the Free Software Foundation; either version 2 of the License, or
26     # (at your option) any later version.
27     #
28     # This program is distributed in the hope that it will be useful,
29     # but WITHOUT ANY WARRANTY; without even the implied warranty of
30     # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
31     # GNU General Public License for more details.
32     #
33     # You should have received a copy of the GNU General Public License
34     # along with this program; if not, write to the Free Software
35     # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
36     #
37     # Author: Jan Karrman, Dept. of Scientific Computing, Uppsala University,
38     # Sweden, e-mail: jan@tdb.uu.se.
39     #######################################################################
40    
41    
42     # Set the name of the global configuration file. See the installation notes
43     # and manual page for more details on configuration files.
44    
45     use FindBin qw($Bin);
46     use lib $Bin;
47    
48     $globrc="$Bin/html2ps-global.conf";
49    
50     $conf=<<'EOR';
51     @html2ps {
52     package {
53     PerlMagick: 0;
54     ImageMagick: 0;
55     pbmplus: 0;
56     netpbm: 0;
57     djpeg: 0;
58     Ghostscript: 0;
59     TeX: 0;
60     dvips: 0;
61     libwww-perl: 0;
62     jfriedl: 0;
63     geturl: "";
64     check: "";
65     path: "";
66     }
67     paper {
68     type: A4;
69     height: "";
70     width: "";
71     }
72     option {
73     twoup: 0;
74     base: "";
75     check: 0;
76     toc: "";
77     debug: 0;
78     DSC: 0;
79     encoding: "ISO-8859-1";
80     rcfile: "";
81     frame: 0;
82     grayscale: 0;
83     help: 0;
84     hyphenate: 0;
85     scaleimage: 1;
86     language: "";
87     landscape: 0;
88     scalemath: 1;
89     number: 0;
90     startno: "";
91     output: "";
92     original: 0;
93     rootdir: "";
94     xref: 0;
95     scaledoc: 1;
96     style: "";
97     text: 0;
98     underline: 0;
99     colour: 0;
100     version: 0;
101     web: "";
102     duplex: "";
103     }
104     margin {
105     left: 2.5cm;
106     right: 2.5cm;
107     top: 3cm;
108     bottom: 3cm;
109     middle: 2cm;
110     }
111     xref {
112     text: "[p $N]";
113     passes: 1;
114     }
115     quote {
116     en {
117     open: "&ldquo;";
118     close: "&rdquo;";
119     open2: "`";
120     close2: "'";
121     }
122     sv {
123     open: "&rdquo;";
124     close: "&rdquo;";
125     open2: "'";
126     close2: "'";
127     }
128     da {
129     open: "&raquo;";
130     close: "&laquo;";
131     }
132     no {
133     open: "&laquo;";
134     close: "&raquo;";
135     }
136     fr {
137     open: "&laquo;&nbsp;";
138     close: "&nbsp;&raquo;";
139     }
140     de {
141     open: "&bdquo;";
142     close: "&ldquo;";
143     open2: "&sbquo;";
144     close2: "`";
145     }
146     fi: sv;
147     es: en;
148     it: no;
149     }
150     toc {
151     heading: "<H1>$T</H1>
152     <H2>Table of Contents</H2>";
153     level: 6;
154     indent: 1em;
155     extrapage: 1;
156     }
157     font {
158     times {
159     names: "Times-Roman
160     Times-Italic
161     Times-Bold
162     Times-BoldItalic";
163     }
164     new-century-schoolbook {
165     names: "NewCenturySchlbk-Roman
166     NewCenturySchlbk-Italic
167     NewCenturySchlbk-Bold
168     NewCenturySchlbk-BoldItalic";
169     }
170     helvetica {
171     names: "Helvetica
172     Helvetica-Oblique
173     Helvetica-Bold
174     Helvetica-BoldOblique";
175     }
176     helvetica-narrow {
177     names: "Helvetica-Narrow
178     Helvetica-Narrow-Oblique
179     Helvetica-Narrow-Bold
180     Helvetica-Narrow-BoldOblique";
181     }
182     palatino {
183     names: "Palatino-Roman
184     Palatino-Italic
185     Palatino-Bold
186     Palatino-BoldItalic";
187     }
188     avantgarde {
189     names: "AvantGarde-Book
190     AvantGarde-BookOblique
191     AvantGarde-Demi
192     AvantGarde-DemiOblique";
193     }
194     bookman {
195     names: "Bookman-Light
196     Bookman-LightItalic
197     Bookman-Demi
198     Bookman-DemiItalic";
199     }
200     courier {
201     names: "Courier
202     Courier-Oblique
203     Courier-Bold
204     Courier-BoldOblique";
205     }
206     }
207     hyphenation {
208     min: 8;
209     start: 4;
210     end: 3;
211     en {
212     file: "";
213     extfile: "";
214     }
215     }
216     header {
217     left: "";
218     center: "";
219     right: "";
220     odd-left: "";
221     odd-center: "";
222     odd-right: "";
223     even-left: "";
224     even-center: "";
225     even-right: "";
226     font-family: Helvetica;
227     font-size: 8pt;
228     font-style: normal;
229     font-weight: normal;
230     color: black;
231     alternate: 1;
232     }
233     footer {
234     left: "";
235     center: "";
236     right: "";
237     odd-left: "";
238     odd-center: "";
239     odd-right: "";
240     even-left: "";
241     even-center: "";
242     even-right: "";
243     font-family: Helvetica;
244     font-size: 8pt;
245     font-style: normal;
246     font-weight: normal;
247     color: black;
248     alternate: 1;
249     }
250     frame {
251     width: 0.6pt;
252     margin: 0.5cm;
253     color: black;
254     }
255     justify {
256     word: 15pt;
257     letter: 0pt;
258     }
259     draft {
260     text: DRAFT;
261     print: "";
262     dir: 0;
263     font-family: Helvetica;
264     font-style: normal;
265     font-weight: bold;
266     color: F0F0F0;
267     }
268     colour {
269     black: 000000;
270     green: 008000;
271     silver: C0C0C0;
272     lime: 00FF00;
273     gray: 808080;
274     olive: 808000;
275     white: FFFFFF;
276     yellow: FFFF00;
277     maroon: 800000;
278     navy: 000080;
279     red: FF0000;
280     blue: 0000FF;
281     purple: 800080;
282     teal: 008080;
283     fuchsia: FF00FF;
284     aqua: 00FFFF;
285     }
286     html2psrc: "$HOME/.html2psrc";
287     imgalt: "[IMAGE]";
288     datefmt: "%e %b %Y %R";
289     locale: "";
290     doc-sep: "<!--NewPage-->";
291     ball-radius: 0.25em;
292     numbstyle: 0;
293     showurl: 0;
294     seq-number: 0;
295     forms: 1;
296     textarea-data: 1;
297     page-break: 1;
298     expand-acronyms: 0;
299     collapse-br: 1;
300     spoof: "";
301     }
302    
303     BODY {
304     font-family: Times;
305     font-size: 11pt;
306     text-align: left;
307     background: white;
308     }
309    
310     H1, H2, H3, H4, H5, H6 {
311     font-weight: bold;
312     margin-top: 0.8em;
313     margin-bottom: 0.5em;
314     }
315     H1 { font-size: 19pt }
316     H2 { font-size: 17pt }
317     H3 { font-size: 15pt }
318     H4 { font-size: 13pt }
319     H5 { font-size: 12pt }
320     H6 { font-size: 11pt }
321    
322     P, OL, UL, DL, BLOCKQUOTE, PRE {
323     margin-top: 1em;
324     margin-bottom: 1em;
325     }
326    
327     P {
328     line-height: 1.2em;
329     text-indent: 0;
330     }
331    
332     OL, UL, DD { margin-left: 2em }
333    
334     TT, KBD, PRE { font-family: Courier }
335    
336     PRE { font-size: 9pt }
337    
338     BLOCKQUOTE {
339     margin-left: 1em;
340     margin-right: 1em;
341     }
342    
343     ADDRESS {
344     margin-top: 0.5em;
345     margin-bottom: 0.5em;
346     }
347    
348     TABLE {
349     margin-top: 1.3em;
350     margin-bottom: 1em;
351     }
352    
353     DEL { text-decoration: line-through }
354    
355     A:link, HR { color: black }
356    
357     EOR
358    
359     require POSIX;
360     %extend=('quote',1, 'font',1, 'colour',1, 'hyphenation',1);
361     %fal=("serif","times", "sans_serif","helvetica", "monospace","courier");
362     @fo=("p","pre","h1","h2","h3","h4","h5","h6","i","b","tt","kbd","cite","samp",
363     "address","blockquote","ol","ul","dl","dt","dd","table","header","footer");
364     %quote=('','en');
365     %valid=('font',1, 'font_files',1);
366     %cm=('cm',1, 'mm',0.1, 'in',2.54, 'pt',2.54/72, 'pc',2.54/6);
367     %pt=('cm',72/2.54, 'mm',72/25.4, 'in',72, 'pt',1, 'pc',12);
368     %space=('thinsp',6, '#8201',6, 'ensp',2, '#8194',2, 'emsp',1, '#8195',1);
369     $space=join('|',keys %space);
370     %vars=("T","Ti", "N","Pn", "U","UR", "H","h", "A","Au");
371     %height=("letter",27.9, "legal",35.6, "arche",121.9, "archd",91.4, "archc",61,
372     "archb",45.7, "archa",30.5, "flsa",33, "flse",33, "halfletter",21.6,
373     "11x17",43.2, "ledger",27.9);
374     %width=("letter",21.6, "legal",21.6, "arche",91.4, "archd",61, "archc",45.7,
375     "archb",30.5, "archa",22.9, "flsa",21.6, "flse",21.6, "halfletter",14,
376     "11x17",27.9, "ledger",43.2);
377    
378     $version="html2ps version 1.0 beta1";
379     $opts="2|b:|c|C:|d|D|e:|f:|F|g|h|H|i:|l:|L|m:|n|N:|o:|O|r:|R|s:|S:|T|u|U|v|W:|"
380     ."x:";
381     %optalias=( 'twoup','2', 'base','b', 'check','c', 'toc','C', 'debug','d',
382     'DSC','D', 'encoding','e', 'rcfile','f', 'frame','F', 'grayscale','g',
383     'help','h', 'hyphenate','H', 'scaleimage','i', 'language','l',
384     'landscape','L', 'scalemath','m', 'number','n', 'startno','N', 'output','o',
385     'original','O', 'rootdir','r', 'xref','R', 'scaledoc','s', 'style','S',
386     'text','T', 'underline','u', 'colour','U', 'version','v', 'web','W',
387     'duplex','x');
388     %type=( 'paper,height',2, 'paper,width',2, 'option,i',3, 'option,m',3,
389     'option,N',4, 'option,s',3, 'option,x',4, 'xref,passes',4, 'draft,print',5);
390    
391     $usage=<<EOU;
392     Usage:
393     html2ps [-2cdDFghHLnORTuUv] [-b URL] [-C string] [-e encoding]
394     [-f file[:file[:...]]] [-i num] [-l lang] [-m num] [-N num] [-o file]
395     [-r path] [-s num] [-S string] [-W string] [-x num]
396     [file|URL [file|URL [...]]]
397    
398     EOU
399    
400     $args="@ARGV";
401     &Getopts($opts) || die $usage;
402    
403     if($opt_d) {
404     open(DBG,">html2ps.dbg") || die "Error opening debug file: html2ps.dbg\n";
405     print DBG "***** $version\n***** Command: $0 $args\n***** Perl: $]\n";
406     print DBG "***** HTML2PSPATH=$ENV{'HTML2PSPATH'}\n";
407     }
408     undef $/;
409     $user=0;
410     $V='(-?\d+\.?\d*|-?\d*\.?\d+)';
411     &getconf($conf);
412     for(@fo,"draft") {
413     eval "\$deffnt{'$_'}=defined \$$_\{'font-family'\}?"
414     ."\$$_\{'font-family'\}:\$body{'font-family'}";
415     }
416     $user=1;
417     if(open(RC,$globrc)) {
418     $conf=<RC>;
419     print DBG "***** Global file $globrc:\n$conf" if($opt_d);
420     &getconf($conf);
421     close RC;
422     } else {
423     # stas: temporarily commented out, since I don't know where this file
424     # will be installed on user's system. -- should solve this.
425     # &dbg("Warning: cannot open the global resource file: $globrc\n") if($globrc);
426     }
427     $html2psrc=~s/^(~|\$HOME)/$ENV{"HOME"}/;
428     $prc=$html2psrc;
429     if($opt_f) {
430     ($prc=$opt_f)=~s/^:/$html2psrc:/;
431     $prc=~s/:$/:$html2psrc/;
432     $prc=~s/::/:$html2psrc:/;
433     }
434     $cwd=POSIX::getcwd();
435     opendir(DIR,$cwd);
436     @local=readdir DIR;
437     closedir DIR;
438     $globrc=~/html2psrc/;
439     $gdir=$`;
440     $hpath=$ENV{"HTML2PSPATH"}?$ENV{"HTML2PSPATH"}:".:";
441     $hpath=~s/^:/$gdir:/;
442     $hpath=~s/:$/:$gdir/;
443     $hpath=~s/::/:$gdir:/;
444     $cur=$hpath=~s/(^|:)\.($|:)/$1$cwd$2/;
445     @hpath=split(/:/,$hpath);
446     for(@hpath) {
447     if(opendir(DIR,$_)) {
448     @files=readdir DIR;
449     $files{$_}=" @files ";
450     closedir DIR;
451     }
452     }
453     @rc=split(/:/,$prc);
454     for $rc (@rc) {
455     $found=0;
456     S:for $dir (@hpath) {
457     if(-r $rc && !grep(/^$rc$/,@local) || $files{$dir}=~/ $rc /) {
458     chdir $dir if($files{$dir}=~/ $rc /);
459     if(open(RC,$rc)) {
460     $conf=<RC>;
461     print DBG "***** Personal file $rc:\n$conf" if($opt_d);
462     &getconf($conf);
463     close RC;
464     $found=1;
465     }
466     last S;
467     }
468     }
469     &dbg("Error opening resource file: $rc\n") if($opt_f && !$found);
470     }
471     chdir $cwd;
472     $user=2;
473     &getconf($opt_S) if($opt_S);
474     print DBG "*****\n" if($opt_d);
475    
476     require Image::Magick if($package{'PerlMagick'});
477     $geturl=$package{'geturl'};
478     $ulanch="f";
479     $f=72/2.54;
480     $giftopm="giftopnm" if($package{'netpbm'});
481     $giftopm="giftoppm" if($package{'pbmplus'});
482    
483     for(keys %option){eval "\$opt_$_='$option{$_}' if(!defined \$opt_$_)"};
484     ($scr=POSIX::tmpnam())=~/\w+$/;
485     $tempdir=$`;
486     die $usage if $opt_h;
487     &dbg("$version\n") if ($opt_v||$opt_d);
488     for ('left','right','top','bottom') {
489     $body{"margin-$_"}=$margin{$_} if(!defined $body{"margin-$_"});
490     }
491     if($opt_u) {$ulanch="t"};
492     if(defined $opt_x && $opt_x!~/^[0-2]$/) {
493     die "Illegal duplex value: $opt_x\n";
494     }
495     $V='(-?\d+\.?\d*|-?\d*\.?\d+)';
496     for $o ($opt_s,$opt_i,$opt_m,$opt_N) {
497     die "Non numeric: $o\n" if(defined($o) && $o!~/^$V$/);
498     }
499    
500     $twoup=$opt_2?"t":"f";
501     $xp=$toc{'extrapage'}?"t":"f";
502    
503     die "Invalid option: -W $opt_W\n" if($opt_W!~/^[abflprsL\d]*$/);
504     $tocdoc=$opt_C=~/[ft]/;
505     if($tocdoc && !defined $opt_W) {$opt_W=4};
506     $mult=$#ARGV>0 || $opt_W;
507     $maxlev=$opt_W=~/(\d+)/?$1:4;
508     $link=$opt_W=~/l/;
509     $local=$opt_W=~/s/;
510     $rel=$opt_W=~/r/;
511     $below=$opt_W=~/b/;
512     $layer=$opt_W=~/L/;
513     $prompt=$opt_W=~/p/;
514    
515     if($opt_C && $opt_C!~/^(b?[ft]|[ft]b?|b?h|hb?)$/)
516     {die "Invalid option: -C $opt_C\n"};
517     $tc=$opt_C?"t":"f";
518     $rev=$opt_C=~/t/;
519     $first=$opt_C=~/b/ || $opt_R;
520     $th=$tocdoc?"f":"t";
521     $oeh=0;
522     $oef=0;
523    
524     @now=localtime;
525     POSIX::setlocale(&POSIX::LC_TIME,$locale);
526     $R='(\s*>|[^a-zA-Z0-9>][^>]*>)';
527     $S='([\w.:/%-]+)|"([^"]*)"|\'([^\']*)\'';
528     $X='[\da-fA-F]';
529     $IM='(gif|jpeg|jpg|png|xbm|xpm|ps|eps)';
530    
531     for('odd-left','odd-center','odd-right','even-left','even-center','even-right')
532     {
533     $oeh=1 if defined $header{$_};
534     $oef=1 if defined $footer{$_};
535     }
536     for $a ('left','center','right') {
537     if(defined $header{"odd-$a"} || defined $header{"even-$a"}) {
538     $oeh=1;
539     }
540     if(defined $footer{"odd-$a"} || defined $footer{"even-$a"}) {
541     $oef=1;
542     }
543     for('','odd-','even-') {
544     $apa=$header{$_.$a};
545     $numb=1 if($apa=~/(^|[^\$])\$N/);
546     $header{$_.$a}="($apa)";
547     $apa=$footer{$_.$a};
548     $numb=1 if($apa=~/(^|[^\$])\$N/);
549     $footer{$_.$a}="($apa)";
550     &varsub($header{$_.$a},$footer{$_.$a});
551     }
552     }
553     if($oeh) {
554     $yz="/YY [[{$header{'odd-left'}}{$header{'even-left'}}]"
555     ."[{$header{'odd-right'}}{$header{'even-right'}}]"
556     ."[{$header{'odd-center'}}{$header{'even-center'}}]] D\n";
557     } else {
558     $ind=$header{'alternate'};
559     $yz="/YY [[{$header{'left'}}$ind][{$header{'right'}}".(1-$ind)
560     ."][{$header{'center'}}2]] D\n";
561     }
562     if($oef) {
563     $yz.="/ZZ [[{$footer{'odd-left'}}{$footer{'even-left'}}]"
564     ."[{$footer{'odd-right'}}{$footer{'even-right'}}]"
565     ."[{$footer{'odd-center'}}{$footer{'even-center'}}]] D";
566     } else {
567     $ind=$footer{'alternate'};
568     $yz.="/ZZ [[{$footer{'left'}}$ind][{$footer{'right'}}".(1-$ind)
569     ."][{$footer{'center'}}2]] D";
570     }
571     $number=$opt_n || !$numb && ($opt_C || $opt_N || $opt_R)?"t":"f";
572    
573     for ($imgalt,$xref{'text'},$toc{'heading'},$draft{'text'}) {&spec($_)};
574    
575     for ($paper{'height'},$paper{'width'},$body{'margin-left'},
576     $body{'margin-right'},$body{'margin-top'},$body{'margin-bottom'},
577     $margin{'middle'},$frame{'margin'}) {
578     &getval($_,1);
579     }
580     $opt_s*=0.65 if($opt_2 && $opt_L);
581     $opt_N=1 if(!defined $opt_N);
582     $opt_N=int($opt_N-1);
583     $mm=int($margin{'middle'}*$f);
584     $is=0.8*$opt_i;
585     $msc=1/$opt_s;
586     $mag=1200*$opt_m*$opt_s;
587     $xref=$opt_R?"t":"f";
588     $xref{'text'}=~s/\$N/) WB pN WB (/g;
589    
590     $d=int($f*$frame{'margin'});
591     $ml=$body{'margin-left'};
592     $mr=$body{'margin-right'};
593     $mt=$body{'margin-top'};
594     $mb=$body{'margin-bottom'};
595     for (0..10) {
596     $temp=2**(-$_/2);
597     $width{"a$_"}=int($temp*2**(-1/4)*1000+.5)/10;
598     $height{"a$_"}=int($temp*2**(1/4)*1000+.5)/10;
599     $width{"b$_"}=int($temp*1000+.5)/10;
600     $height{"b$_"}=int($temp*2**(1/2)*1000+.5)/10;
601     }
602     if($width{"\L$paper{'type'}"}) {
603     $paper{'height'}=$height{"\L$paper{'type'}"} if(!defined $paper{'height'});
604     $paper{'width'}=$width{"\L$paper{'type'}"} if(!defined $paper{'width'});
605     } elsif($paper{'type'}) {
606     &dbg("Unknown paper type: $paper{'type'}\n");
607     }
608     if($opt_L) {
609     $width=$paper{'height'}-$ml-$mr;
610     $hight=$paper{'width'}-$mt-$mb;
611     $xc=int($mt*$f+.5);
612     $yc=int($ml*$f+.5);
613     $rot=" 90 rotate";
614     } else {
615     $width=$paper{'width'}-$ml-$mr;
616     $hight=$paper{'height'}-$mt-$mb;
617     $xc=int($ml*$f+.5);
618     $yc=int(($paper{'height'}-$mt)*$f+.5);
619     $rot="";
620     }
621     $width=($width-$margin{'middle'})/2 if($opt_2);
622     $w=int($width*$f);
623     $l=int($hight*$f);
624     $pag=int($paper{'height'}*72/2.54+.5);
625     $fe=$opt_F?"t":"f";
626     $xr=int($w/$opt_s+.5)+$d;
627     $yb=-int($l/$opt_s+.5)-$d;
628     $cf=$opt_U?"t":"f";
629     $rm=$numbstyle?"t":"f";
630     $pa=$showurl?"t":"f";
631     $nh=$seq_number?"t":"f";
632     $ea=$expand_acronyms?"t":"f";
633     $latin1=$opt_e=~/ISO-8859-1/i;
634     $lt=$del{'text-decoration'}=~/^line-through$/i?"SE":"WB";
635     if(!$opt_x && defined $opt_x) {
636     $dupl="[{false statusdict/setduplexmode get exec} stopped cleartomark";
637     }
638     if($opt_x) {
639     $dupl="[{true statusdict/setduplexmode get exec} stopped cleartomark";
640     }
641     if($opt_x==2) {
642     $dupl.="\n[{true statusdict/settumble get exec} stopped cleartomark";
643     }
644    
645     %head=("html",1, "head",1, "title",1, "base",1, "meta",1, "link",1, "style",1,
646     "script",1, "isindex",1);
647     %algn=("left",1, "center",2, "right",3, "justify",4, "char",5);
648     %f=("void",1, "above",2, "below",3, "hsides",4, "lhs",5, "rhs",6, "vsides",7,
649     "box",8, "border",9);
650     %r=("none",1, "groups",2, "rows",3, "cols",4, "all",5);
651     %v=("top",1, "middle",2, "bottom",3, "baseline",4);
652     %it=("radio",0, "checkbox",1, "text",2, "password",2, "image",3);
653     %ssy=(200,"\\", 201, "(", 202, ")");
654     %lity=("I",0, "i",1, "A",2, "a",3, "1",4, "disc",5, "square",6, "circle",7);
655     $ltr=join('|',keys %lity);
656     %tex=('`a',"\340", '\^a',"\342", '`e',"\350", '`e',"\350", 'c\{c\}',"\347",
657     "'e","\351", '\^e',"\352", '"e',"\353", '\^i',"\356", '"i',"\357",
658     '\^o',"\364", '`u',"\371", '\^u',"\373", '"u',"\374", '"y',"\377",
659     'aa',"\345", '"a',"\344", '"o',"\366", 'ae',"\346", 'oe',"\225");
660     @hind=(0,0,0,0,0,0);
661     $ltrs='A-Za-z\222-\226\300-\377';
662     %ent=(
663     "lsquo|#8216",96,
664     "rsquo|#8217",39,
665     "circ|#710",141,
666     "tilde|#732",142,
667     "permil|#8240",143,
668     "dagger|#8224",144,
669     "Dagger|#8225",145,
670     "Yuml|#376",146,
671     "scaron|#353",147,
672     "Scaron|#352",148,
673     "oelig|#339",149,
674     "OElig|#338",150,
675     "lsaquo|#8249",151,
676     "rsaquo|#8250",152,
677     "sbquo|#8218",153,
678     "bdquo|#8222",154,
679     "ldquo|#8220",155,
680     "rdquo|#8221",156,
681     "ndash|#8211",157,
682     "mdash|#8212",158,
683     "trade|#8482",159,
684     "nbsp",160,
685     "iexcl",161,
686     "cent",162,
687     "pound",163,
688     "curren",164,
689     "yen",165,
690     "brvbar",166,
691     "sect",167,
692     "uml",168,
693     "copy",169,
694     "ordf",170,
695     "laquo",171,
696     "not",172,
697     "reg",174,
698     "macr",175,
699     "deg",176,
700     "plusmn",177,
701     "sup2",178,
702     "sup3",179,
703     "acute",180,
704     "micro",181,
705     "para",182,
706     "middot",183,
707     "cedil",184,
708     "sup1",185,
709     "ordm",186,
710     "raquo",187,
711     "frac14",188,
712     "frac12",189,
713     "frac34",190,
714     "iquest",191,
715     "Agrave",192,
716     "Aacute",193,
717     "Acirc",194,
718     "Atilde",195,
719     "Auml",196,
720     "Aring",197,
721     "AElig",198,
722     "Ccedil",199,
723     "Egrave",200,
724     "Eacute",201,
725     "Ecirc",202,
726     "Euml",203,
727     "Igrave",204,
728     "Iacute",205,
729     "Icirc",206,
730     "Iuml",207,
731     "ETH",208,
732     "Ntilde",209,
733     "Ograve",210,
734     "Oacute",211,
735     "Ocirc",212,
736     "Otilde",213,
737     "Ouml",214,
738     "times",215,
739     "Oslash",216,
740     "Ugrave",217,
741     "Uacute",218,
742     "Ucirc",219,
743     "Uuml",220,
744     "Yacute",221,
745     "THORN",222,
746     "szlig",223,
747     "agrave",224,
748     "aacute",225,
749     "acirc",226,
750     "atilde",227,
751     "auml",228,
752     "aring",229,
753     "aelig",230,
754     "ccedil",231,
755     "egrave",232,
756     "eacute",233,
757     "ecirc",234,
758     "euml",235,
759     "igrave",236,
760     "iacute",237,
761     "icirc",238,
762     "iuml",239,
763     "eth",240,
764     "ntilde",241,
765     "ograve",242,
766     "oacute",243,
767     "ocirc",244,
768     "otilde",245,
769     "ouml",246,
770     "divide",247,
771     "oslash",248,
772     "ugrave",249,
773     "uacute",250,
774     "ucirc",251,
775     "uuml",252,
776     "yacute",253,
777     "thorn",254,
778     "yuml",255);
779     %symb=(
780     "alpha|#945",141,
781     "beta|#946",142,
782     "gamma|#947",147,
783     "delta|#948",144,
784     "epsilon|#949",145,
785     "zeta|#950",172,
786     "eta|#951",150,
787     "theta|#952",161,
788     "thetasym|#977",112,
789     "iota|#953",151,
790     "kappa|#954",153,
791     "lambda|#955",154,
792     "mu|#956",155,
793     "nu|#957",156,
794     "xi|#958",170,
795     "pi|#960",160,
796     "piv|#982",166,
797     "omicron|#959",157,
798     "rho|#961",162,
799     "sigma|#963",163,
800     "sigmaf|#962",126,
801     "tau|#964",164,
802     "upsilon|#965",165,
803     "upsih|#978",241,
804     "phi|#966",146,
805     "phiv",152,
806     "chi|#967",143,
807     "psi|#968",171,
808     "omega|#969",167,
809     "Alpha|#913",101,
810     "Beta|#914",102,
811     "Gamma|#915",107,
812     "Delta|#916",104,
813     "Epsilon|#917",105,
814     "Zeta|#918",132,
815     "Eta|#919",110,
816     "Theta|#920",121,
817     "Iota|#921",111,
818     "Kappa|#922",113,
819     "Lambda|#923",114,
820     "Mu|#924",115,
821     "Nu|#925",116,
822     "Xi|#926",130,
823     "Omicron|#927",117,
824     "Pi|#928",120,
825     "Rho|#929",122,
826     "Sigma|#931",123,
827     "Tau|#932",124,
828     "Upsilon|#933",125,
829     "Phi|#934",106,
830     "Chi|#935",103,
831     "Psi|#936",131,
832     "Omega|#937",127,
833     "fnof|#402",246,
834     "perp|#8869",136,
835     "plusmn|#177",261,
836     "cdot|#183",327,
837     "or|#8744",332,
838     "and|#8743",331,
839     "le|#8804",243,
840     "ge|#8805",263,
841     "equiv|#8801",272,
842     "cong|#8773",100,
843     "asymp|#8776",273,
844     "ne|#8800",271,
845     "sub|#8834",314,
846     "sube|#8838",315,
847     "sup|#8835",311,
848     "supe|#8839",312,
849     "isin|#8712",316,
850     "larr|#8592",254,
851     "rarr|#8594",256,
852     "uarr|#8593",255,
853     "darr|#8595",257,
854     "harr|#8596",253,
855     "lArr|#8656",334,
856     "rArr|#8658",336,
857     "uArr|#8657",335,
858     "dArr|#8659",337,
859     "hArr|#8660",333,
860     "forall|#8704","042",
861     "exist|#8707","044",
862     "infin|#8734",245,
863     "nabla|#8711",321,
864     "part|#8706",266,
865     "hellip|#8230",274,
866     "int|#8747",362,
867     "sum|#8721",345,
868     "prod|#8719",325,
869     "real|#8476",302,
870     "image|#8465",301,
871     "bull|#8226",267,
872     "prime|#8242",242,
873     "Prime|#8243",262,
874     "oline|#8254",140,
875     "frasl|#8260",244,
876     "weierp|#8472",303,
877     "alefsym|#8501",300,
878     "crarr|#8629",277,
879     "empty|#8709",306,
880     "notin|#8713",317,
881     "ni|#8715","047",
882     "minus|#8722","055",
883     "lowast|#8727","052",
884     "radic|#8730",326,
885     "prop|#8733",265,
886     "ang|#8736",320,
887     "cap|#8745",307,
888     "cup|#8746",310,
889     "sim|#8764",176,
890     "nsub|#8836",313,
891     "oplus|#8853",305,
892     "otimes|#8855",304,
893     "sdot|#8901",327,
894     "lceil|#8968",351,
895     "rceil|#8969",371,
896     "lfloor|#8970",353,
897     "rfloor|#8971",373,
898     "lang|#9001",341,
899     "rang|#9002",361,
900     "spades|#9824",252,
901     "clubs|#9827",247,
902     "hearts|#9829",251,
903     "diams|#9830",250,
904     "loz|#9674",340);
905    
906     $pc=')WB NL NP(';
907     $nimg=-1;
908     $nm=-1;
909     &Subst($doc_sep);
910     &Subst($toc{'heading'});
911     $toc{'heading'}=~s/ H\(/ -1 H(/g;
912     @font=();
913     @size=();
914     @styl=();
915     @alig=();
916     @colr=();
917     @topm=();
918     @botm=();
919     @lftm=();
920     @rgtm=();
921     @z1=();
922     @z2=();
923     @z3=();
924     $nfont=0;
925     $mi=0;
926     for (@fo) {&setel($_)};
927     %arr=%draft;
928     &fs("draft");
929    
930     if(!$latin1 && !defined $fontid{"times"}) {
931     $fontid{"times"}=$nfont++;
932     @docfonts=(@docfonts,split(/\s+/,$font_names{"times"}));
933     }
934     $wind=0;
935     $wf="t";
936     if(!$latin1) {
937     $wind=$fontid{"times"};
938     $wf="f";
939     }
940    
941     for $k (keys %font_files){
942     @ff=split(/\s+/,$font_files{$k});
943     @fn=split(/\s+/,$font_names{$k});
944     for (0..3) {
945     if($ff[$_]) {
946     $ff{$fn[$_]}=$ff[$_];
947     } elsif(!$ff{$fn[$_]}) {
948     $ff{$fn[$_]}=$ff[0];
949     }
950     $fr{$fn[$_]}=$k;
951     }
952     }
953     $pta=defined $p{"text-align"}?$p{"text-align"}:$body{"text-align"};
954     $pal=0;
955     $pal=1 if($pta=~/^c/i);
956     $pal=2 if($pta=~/^r/i);
957     $pal=3 if($pta=~/^j/i);
958     $bgcol=&col2rgb($body{"background"});
959     if(!$bgcol) {$bgcol="[16#FF 16#FF 16#FF]"};
960     if(!$p{"color"}) {$p{"color"}="black"};
961     $tcol=&col2rgb($p{"color"});
962     $lcol=&col2rgb($a__link{"color"});
963     if($lcol) {
964     $Lc="/Lc t D\n/Dl $lcol D\n";
965     $Lc.=$tcol ne $lcol?"/LX t D":"/LX f D";
966     } else {
967     $Lc="/Lc f D\n/LX f D";
968     }
969     $pcol=&col2rgb($pre{"color"});
970     if(!$pcol) {$pcol="[0 0 0]"};
971     $deftbg=&col2rgb($table{"background"});
972     $hc=&col2rgb($hr{"color"});
973     if(!$hc) {$hc="[0 0 0]"};
974     $fcol=&col2rgb($frame{"color"});
975     if(!$fcol) {$fcol="[0 0 0]"};
976     for ($p{"font-size"},$pre{"font-size"},$header{"font-size"},$frame{'width'},
977     $footer{"font-size"},$justify{'letter'},$justify{'word'}) {
978     &getval($_,2);
979     }
980     for ($p{"line-height"},$p{"text-indent"},$p{"margin-top"},$toc{'indent'},
981     $ball_radius) {
982     &getval($_,0);
983     }
984     $fl="/FL [/".join("\n/",@docfonts)."] D";
985     for $k (keys %ff) {
986     $f=$ff{$k};
987     if(defined $fontid{$fr{$k}} && !defined($cont{$f})) {
988     open(FONT,$f) || &dbg("Error opening fontfile $f\n");
989     ($cont{$f}=<FONT>)=~s/(^|\r?\n|\r)%.*//g;
990     close FONT;
991     }
992     }
993     $fontdef="";
994     for (keys %cont) {
995     $fontdef.=$cont{$_};
996     }
997     &ent($yz);
998     &ent($xref{'text'});
999     &ent($draft{'text'});
1000    
1001     $lnum=0;
1002     for (keys %quote_open) {
1003     $lid{$_}=$lnum++;
1004     if(!defined $quote_close{$_}) {$quote_close{$_}=$quote_open{$_}};
1005     if(!defined $quote_open2{$_}) {$quote_open2{$_}=$quote_open{$_}};
1006     if(!defined $quote_close2{$_}) {$quote_close2{$_}=$quote_close{$_}};
1007     &ent($quote_open{$_});
1008     &ent($quote_close{$_});
1009     &ent($quote_open2{$_});
1010     &ent($quote_close2{$_});
1011     push(@qo,$quote_open{$_});
1012     push(@qc,$quote_close{$_});
1013     push(@qo2,$quote_open2{$_});
1014     push(@qc2,$quote_close2{$_});
1015     }
1016     $qo=join(')(',@qo);
1017     $qc=join(')(',@qc);
1018     $qo2=join(')(',@qo2);
1019     $qc2=join(')(',@qc2);
1020     $hyphenation_file{''}=$hyphenation_file{'en'};
1021     $br=$collapse_br?"f":"t";
1022     $gd=0;
1023     $ddr=defined $draft{'print'};
1024     if($ddr) {
1025     if($draft{'print'}==0) {
1026     $draft="f";
1027     } else {
1028     $gd=1;
1029     $draft="t";
1030     }
1031     }
1032     $gb=$gs_bug?"t":"f";
1033     for (keys %quote) {$lid{$_}=$lid{$quote{$_}}};
1034     $ENV{'PATH'}.=":$package{'path'}" if($package{'path'});
1035     $delim="%-- End of variable part --";
1036     $cd="/Cd {aload length 2 idiv dup dict begin {D} repeat currentdict end} D";
1037     $P0=<<EOC;
1038     %%Creator: $version
1039     %%EndComments
1040     save
1041     2000 dict begin
1042     /d {bind def} bind def
1043     /D {def} d
1044     /t true D
1045     /f false D
1046     $fl
1047     /WF $wf D
1048     /WI $wind D
1049     /F $opt_s D
1050     /IW $w F div D
1051     /IL $l F div D
1052     /PS $pag D
1053     /EF [@font] D
1054     /EZ [@size] D
1055     /Ey [@styl] D
1056     /EG [@alig] D
1057     /Tm [@topm] D
1058     /Bm [@botm] D
1059     /Lm [@lftm] D
1060     /Rm [@rgtm] D
1061     /EU [@colr] D
1062     /NO $number D
1063     $yz
1064     /Ts EZ 0 get D
1065     /TU $twoup D
1066     /Xp $xp D
1067     /AU $ulanch D
1068     /SN $opt_N D
1069     /Cf $cf D
1070     /Fe $fe D
1071     /TI $toc{'indent'} Ts mul D
1072     /FE {newpath -$d $d M CP BB $xr $d L $xr $yb L CP BB -$d $yb L closepath} D
1073     /LA {TU PM 0 eq and{IW $mm F div add SA{Sf div}if 0 translate}
1074     {$xc $yc translate$rot F SA{Sf mul}if dup scale
1075     CS CF FS Cf{CA CL get VC}if /Bb f D}ie 0 0 M TF not Tc or
1076     {Cf{gsave SA{1 Sf div dup scale}if Cb VC FE fill grestore}if Df{Sd}if}if} D
1077     /Pi $p{"text-indent"} Ts mul D
1078     /SG [$is $opt_i $msc] D
1079     /Ab $justify{'word'} D
1080     /J $justify{'letter'} D
1081     /Tc $tc D
1082     /NH $toc{'level'} D
1083     /Nf $nh D
1084     /Pa $pa D
1085     /LH $p{"line-height"} D
1086     /XR $xref D
1087     /Xr {/pN E D ( $xref{'text'} )WB} D
1088     /Db $bgcol D
1089     /Dt $tcol D
1090     /eA $ea D
1091     $Lc
1092     /Br $ball_radius D
1093     /IA ($imgalt) D
1094     /DS {/PF f D($doc_sep)pop RC ZF} D
1095     /Gb $gb D
1096     /Mb $br D
1097     /Hc $hc D
1098     /Bl 3 D
1099     /MI -$mi D
1100     /DX ($draft{'text'}) D
1101     /Di $draft{'dir'} D
1102     /FD $fontid{"\L$font"} D
1103     /Dy $styl D
1104     /cD $col D
1105     /FW $frame{'width'} D
1106     /FU $fcol D
1107     /ET {/RM $rm D /A0 $pal D /PN SN D /OU t D /Ou t D /W IW D /LL W D D1
1108     Ms not TP and{Ip}if /TF f D} D
1109     $dupl
1110     $delim
1111     EOC
1112    
1113     $reenc=<<EOD;
1114     WF{FL{reencodeISO D}forall}{4 1 FL length 1 sub{FL E get reencodeISO D}for}ie
1115     /Symbol dup dup findfont dup length dict begin
1116     {1 index /FID ne{D}{pop pop}ie}forall /Encoding [Encoding aload pop]
1117     dup 128 /therefore put D currentdict end definefont D
1118     EOD
1119     $defs=<<EOD;
1120     /reencodeISO {
1121     dup dup findfont dup length dict begin{1 index /FID ne{D}{pop pop}ie}forall
1122     /Encoding ISOLatin1Encoding D currentdict end definefont} D
1123     /ISOLatin1Encoding [
1124     /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
1125     /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
1126     /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
1127     /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
1128     /space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright
1129     /parenleft/parenright/asterisk/plus/comma/hyphen/period/slash
1130     /zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon
1131     /less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N
1132     /O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright
1133     /asciicircum/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m
1134     /n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright/asciitilde
1135     /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
1136     /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
1137     /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
1138     /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
1139     /.notdef/space/exclamdown/cent/sterling/currency/yen/brokenbar
1140     /section/dieresis/copyright/ordfeminine/guillemotleft/logicalnot
1141     /hyphen/registered/macron/degree/plusminus/twosuperior/threesuperior
1142     /acute/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine
1143     /guillemotright/onequarter/onehalf/threequarters/questiondown
1144     /Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla
1145     /Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex
1146     /Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis
1147     /multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute
1148     /Thorn/germandbls/agrave/aacute/acircumflex/atilde/adieresis
1149     /aring/ae/ccedilla/egrave/eacute/ecircumflex/edieresis/igrave
1150     /iacute/icircumflex/idieresis/eth/ntilde/ograve/oacute/ocircumflex
1151     /otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex/udieresis
1152     /yacute/thorn/ydieresis
1153     ] D
1154     [128/backslash 129/parenleft 130/parenright 141/circumflex 142/tilde
1155     143/perthousand 144/dagger 145/daggerdbl 146/Ydieresis 147/scaron 148/Scaron
1156     149/oe 150/OE 151/guilsinglleft 152/guilsinglright 153/quotesinglbase
1157     154/quotedblbase 155/quotedblleft 156/quotedblright 157/endash 158/emdash
1158     159/trademark]
1159     aload length 2 idiv 1 1 3 -1 roll{pop ISOLatin1Encoding 3 1 roll put}for
1160     /colorimage where{pop}{
1161     /colorimage {
1162     pop pop /Pr E D {/Cv Pr D /Gr Cv length 3 idiv string D 0 1 Gr length 1 sub
1163     {Gr E dup /i E 3 mul D Cv i get 0.299 mul Cv i 1 add get 0.587 mul add
1164     Cv i 2 add get 0.114 mul add cvi put}for Gr} image} D
1165     }ie
1166     /pdfmark where{pop}{userdict /pdfmark /cleartomark load put}ie
1167     EOD
1168    
1169     $P1=<<EOT;
1170     $cd
1171     /EX {EC cvx exec} D
1172     /DU {} d
1173     /BB {pop pop}d
1174     /ie {ifelse} d
1175     /E {exch} d
1176     /M {moveto} d
1177     /R {rmoveto} d
1178     /L {lineto} d
1179     /RL {rlineto} d
1180     /CP {currentpoint} d
1181     /SW {stringwidth} d
1182     /GI {getinterval} d
1183     /PI {putinterval} d
1184     /Sg {setgray} d
1185     /LW {setlinewidth} d
1186     /S {dup () ne OU and{0 Co R AT 3 eq LB and HF not and A1 0 ne A2 0 ne or and
1187     {A2 0 32 A1 0 6 -1 roll awidthshow}{show}ie 0 Co neg R}{pop}ie
1188     OU PH 3 eq or{/Ms t D}if} D
1189     /U {OU{gsave CP currentfont /FontInfo get /UnderlinePosition get
1190     0 E currentfont /FontMatrix get dtransform E pop add newpath M dup SW pop
1191     CJ 0 RL stroke grestore}if} D
1192     /B {OU Br 0 gt and{CP Ts neg Ts .33 mul R gsave 0 Sg
1193     CP newpath Ts Br mul 0 360 arc closepath UI 2 mod 0 eq{stroke}{fill}ie
1194     grestore M CP E Ts Br 1 add mul sub E BB /Ms t D}if}D
1195     /NP {Ms TP not or PA and OU and{TP{OR}if f1{mF k2 /mF E D /YC 0 D}if
1196     TP TU not PM 0 eq or and{showpage}if DU Ip TE not{LA}if 0.6 LW
1197     /CI 0 D /TP t D /Hs f D /hl 6 D /hL 6 D /HI hi D /Ms f D}if Bs XO BO M} D
1198     /Np {LE sub CP E pop gt PL 0 eq and{NP}if}D
1199     /Ip {/PN PN 1 add D /Pn RM{1}{4}ie PN Ns D /PM PN SN sub 2 mod D} D
1200     /GP {E dup 3 -1 roll get PN 1 add 2 mod get dup type /integertype eq
1201     {get 0 get}{E pop}ie}d
1202     /Fc {dup 2 GP exec SW pop /S1 E D dup 1 GP exec SW pop /S2 E D 0 GP exec SW
1203     pop /S3 E D S1 0 gt{S2 2 mul S1 add S3 2 mul S1 add 2 copy lt{E}if pop}{0}ie
1204     S2 S3 add 2 copy lt{E}if pop IW .9 mul div dup 1 gt{1 E div}{pop 1}ie}D
1205     /OR {gsave SA{1 Sf div dup scale}if Fe{Cf{FU VC}if FW LW 1 setlinejoin
1206     FE stroke}if /YO {60 F div dup 40 gt{pop 40}if}D /cs CS D /cf CF D /CF 0 D
1207     /pf PF D /PF f D /Fn FN D /At AT D /AT 0 D /FN EF Hf 1 add get D Fz Fs FS ZZ
1208     Fc Fz mul Fs FS EU Hf 1 add get dup type /arraytype eq Cf and{VC}{pop 0 Sg}ie
1209     IW IL neg YO sub M ZZ 1 GP exec dup SW pop neg 0 R Sh 0 IL neg YO sub M
1210     ZZ 0 GP exec Sh ZZ 2 GP exec dup SW pop IW E sub 2 div IL neg YO sub M Sh
1211     Fz Fs FS NO{/AW IW Pn SW pop sub D AW 2 div IL neg YO sub
1212     S1 0 gt S2 AW .45 mul gt or S3 AW .45 mul gt or{Fz 2 mul sub}if M Pn Sh}if
1213     EU Hf get dup type /arraytype eq Cf and{VC}{pop 0 Sg}ie
1214     YY Fc /FN EF Hf get D Hz mul HS FS IW YO M YY 1 GP exec dup SW pop neg 0 R Sh
1215     0 YO M YY 0 GP exec Sh YY 2 GP exec dup SW pop IW E sub 2 div YO M Sh
1216     /FN Fn D /AT At D t Pb XO SZ SL get neg R /PF pf D grestore /CF 0 D cs cf FS}D
1217     /Sh {dup () ne{CP Hz 4 div sub BB show CP CS add BB}{pop}ie}D
1218     /Pb {/OU E D /Ou OU D /PB t D 0 0 M Ba{/Sa save D /BP t D /Fl t D RC /PL 0 D
1219     /PH 0 D /W IW D /LE IL .7 mul D /EO 0 D SI ZF /YA 0 D /BO 0 D /C1 () D
1220     BA 0 Ts neg R Bb{Xl Yl Xh Yh}if Bb CP Sa restore M
1221     {/Yh E D /Xh E D /Yl E D /Xl E D}if /Fl t D}if
1222     BL /OU t D /HM f D /Ou t D /PB f D} D
1223     /Bs {/BP Ba not D}D
1224     $defs$fontdef$reenc
1225     /SF {/CS E D SZ SL CS put FO SL FN put /YI CS LH neg mul D dup ST cvs ( ) join
1226     CS ST cvs join C1 E join ( NF ) join /C1 E D CS NF /Wf WF FN 0 gt or D
1227     /BW Wf{( ) SW pop}{0}ie D}D
1228     /NF {/cS E D /cF E D cF 0 ge{FL cF get}{/Symbol}ie
1229     findfont cS scalefont setfont} D
1230     /FS {CF or /CF E D FR SL CF put CF CF 0 ge{FN 4 mul add}if E SF} D
1231     /PC {SH /BP f D fin not GL not and{NL}if /HM t D /LL LS D} D
1232     /BS {/TX E D Wf{/fin f D /CW 0 D /LK 0 D /SC 0 D
1233     /RT TX D {RT ( ) search{/NW E D pop /RT E D /WH NW SW pop D CW WH add LL gt
1234     {TX SC LK SC sub 1 sub NN GI GL{SH cF cS OC
1235     2 copy cS ne E cF ne or{NF}{pop pop}ie}{PC /CW WH BW add D}ie
1236     /SC LK D}
1237     {GL{JC}if
1238     /CW CW WH add BW add D /HM t D}ie /GL f D /Ph f D
1239     /LK LK NW length 1 add add D}{pop exit}ie}loop
1240     /fin t D TX SC LK SC sub GI SH RT () ne{GL not{CC}if}if
1241     /LC TX length D /WH RT SW pop D CW WH add Hy{HC SW pop add}if LL gt
1242     {RT GL{SH cF cS OC 2 copy cS ne E cF ne or{NF}{pop pop}ie
1243     Hy{/Ph t D}if /LL LS D}{NL /LL LS D SH}ie}
1244     {RT PC Hy{CC}if /Ph Ph Hy or D}ie RT () ne{/GL t D /HM t D}if}
1245     {TX SW pop LL le{TX SH}{/NW () D 0 2 TX length 1 sub
1246     {/CW E D TX 0 CW GI dup SW pop LL gt{pop NW SH /HM t D NL/LL W XO sub MR sub D
1247     /CW CW 2 sub NN D /TX TX CW TX length CW sub GI D TX BS exit}
1248     {/NW E D}ie}for}ie}ie /HM t D}D
1249     /CC {C0 length 0 gt{JC}if /C0 [C1 L1 YA YB Mf NS NB TB AF Bw] D
1250     /C1 () D /L0 L1 D /YA 0 D /YB 0 D /Mf 0 D /NS 0 D /NB 0 D}D
1251     /JC {C0 aload length 0 gt{pop pop pop NB add /NB E D NS add /NS E D
1252     dup Mf gt{/Mf E D}{pop}ie dup YB gt{/YB E D}{pop}ie
1253     dup YA gt{/YA E D}{pop}ie pop C1 join /C1 E D /C0 [] D}if}D
1254     /OC {C0 length 0 gt{C1 L1 L0 sub YA YB Mf NS NB TB AF Bw GL C0 aload pop
1255     /Bw E D /AF E D /TB E D /NB E D /NS E D /Mf E D /YB E D /YA E D /C0 [] D
1256     /L1 E D /C1 E D Ph{HC SH}if NL /GL E D /Bw E D /AF E D /TB E D /NB E D /NS E D
1257     /Mf E D /YB E D /YA E D /L1 E D /LL W L1 sub XO sub MR sub WH sub D /CW 0 D
1258     C1 E join /C1 E D}if}D
1259     /BT {/LB t D dup length string copy RS dup dup () ne E ( ) ne and
1260     {/CI 0 D /LS LL D /LL W L1 sub XO sub MR sub D BS}
1261     {dup ( ) eq{/GL f D}if dup () eq L1 0 eq or{pop}{SH /BP f D /Ph f D}ie}ie
1262     /LB f D} D
1263     /BL {CP E pop XO E M} D
1264     /NL {JC /GL f D /SK W XO sub MR sub L1 sub TB{Bw add}if D
1265     /YA LF{Mf HM Fl not and PF or{LH mul}if}{0 /LF t D}ie YA 2 copy lt{E}if pop D
1266     C1 () ne{/FB YB Mf SA{Sf mul}if 4 div 2 copy lt{E}if pop D}if Fl{/Ya YA D}if
1267     CP E pop YA sub YB sub LE neg lt Fl not and PB not and{NP}if NT TL BL
1268     OU PF not and PB or{/RE L1 TB{Bw sub}if
1269     W XO sub MR sub div YA YB add LE BO add div 2 copy lt{E}if pop D
1270     RE 1 gt{BL 1 RE div dup scale}if}if
1271     AT 2 le{SK AT mul 2 div YA neg R}if
1272     AT 3 eq{0 YA neg R TB{/NB NB 1 sub D /NS NS 1 sub D}if /NB NB 1 sub NN D
1273     /A3 NS 6 mul NB add D NS NB add 0 eq
1274     {/A1 0 D /A2 0 D}
1275     {NS 0 eq{/A1 SK NB div dup J gt{pop 0}if D /A2 0 D}{J A3 mul SK lt
1276     {/A1 J D /A2 SK J NB mul sub NS div dup Ab gt{/A1 0 D pop 0}if D}
1277     {/A1 SK A3 div D /A2 A1 6 mul D}ie}ie}ie /A1 A1 NN D /A2 A2 NN D}if
1278     AT 4 eq{0 YA neg R PH 2 le{PD 0 lt{/PD L1 D}if PD M1 gt{/M1 PD D}if
1279     L1 PD sub M2 gt{/M2 L1 PD sub D}if}{DV ID 1 sub get 0 ge{Lo 0 R}if}ie}if
1280     F0 cF ne Cs cS ne or{F0 Cs NF}if
1281     /ms Ms D /Ms f D CP FB sub
1282     C1 cvx exec XO EO sub L1 add TB{BW sub}if dup LM gt{/LM E D}{pop}ie
1283     PH 0 eq PH 4 eq or Ms and{HF not{/PO t D /AH t D}if
1284     BB CP YA add E AT 3 eq LB and{A1 sub}if TB{BW sub}if E BB}
1285     {pop pop}ie Ms HM PH 3 eq and or{/BP f D /Fl f D}if
1286     /Lo 0 D /L1 0 D /F0 cF D /Cs cS D BP not{0 YB NN neg R}if
1287     OU f1 and mF not and{k2 /f1 f D}if
1288     OU PF not and PB or{RE 1 gt{RE dup scale}if}if /Ms ms Ms or D
1289     /C1 AF{(Cp )}{()}ie D /YA 0 D /YB 0 D BL
1290     AT 4 eq LB not and PH 3 ge and
1291     {ID DV length lt{DV ID get dup 0 ge{DO E sub /Lo E D /L1 Lo D}{pop}ie
1292     /ID ID 1 add D}if}if /T t D CD{/LN LN 1 add D PD}if
1293     /PD -1 D /NS 0 D /NB 0 D /TB f D /Ph f D /Mf 0 D /HM f D} D
1294     /RS {/TM E D /CN 0 D TM{10 eq{TM CN ( ) PI}if /CN CN 1 add D}forall
1295     /CN 0 D /BK HM EN and{0}{1}ie D TM
1296     {dup 32 ne{TM CN 3 2 roll put /CN CN 1 add D /BK 0 D}
1297     {pop BK 0 eq{TM CN 32 put /CN CN 1 add D}if /BK 1 D}ie}forall
1298     TM 0 CN GI dup dup () ne E ( ) ne and
1299     {dup CN 1 sub get 32 eq{/EN f D}{/EN t D}ie}if} D
1300     /join {2 copy length E length add string dup 4 2 roll 2 index 0 3 index
1301     PI E length E PI}d
1302     /WR {(\\n) search{dup () ne BP not or
1303     {Li 4 le CP E pop YI Li mul add LE add 0 lt and PL 0 eq and{NP}if
1304     SH NL pop /Li Li 1 sub D WR}{pop pop WR}ie}{SH}ie /CI 0 D /BP f D} D
1305     /SH {dup dup () ne E ( ) ne and PF or CS Mf gt and{/Mf CS D}if
1306     T not Wf and{( ) E join /T t D}if dup BP{/MF CS D}if
1307     AT 3 eq{2 copy length dup 0 gt{/NB E NB add D
1308     {( ) search{/NS NS 1 add D pop pop}{pop exit}ie}loop}{pop pop}ie}if
1309     CD PD 0 lt and{dup DC search{SW pop /PD E L1 add D pop pop}{pop}ie}if
1310     0 Np dup SW pop L1 add /L1 E D dup () ne
1311     {C1 (\\() join E join (\\)) join AU AF and UF or Wf and{( U ) join}if
1312     sF{( s ) join}if ( S ) join
1313     /C1 E D dup length 1 sub get 32 eq /TB E D /Bw BW D}{pop pop}ie} D
1314     /BG {AI LG BC add add 0 eq} D
1315     /ON {OU{Ty AR AI NN get dup 1 add Ln Ns Ty 2 mod 0 eq{(. )}{(\\) )}ie join
1316     dup SW pop neg 0 R CP E 0 lt{0 E M}{pop}ie CP BB show /Ms t D}if} D
1317     /Ln {AR AI 3 -1 roll put}D
1318     /SP {dup CI lt BP not and{dup CI sub 0 E R /CI E D}{pop}ie} D
1319     /BN {PF{WR /HM f D}{BT NL}ie} D
1320     /NN {dup 0 lt{pop 0}if} D
1321     /h {HI 0 gt{(h) HI ST cvs join cvx exec dup 1 get E
1322     Nf{0 get E join}{pop}ie}{()}ie} D
1323     /H {/fn FN D /Hi E 1 add D 1 sub /HL E D /H2 HL 2 add D /GS EZ H2 get D
1324     E Tm H2 get GS mul BE dup 0 gt{1 sub}{pop EG H2 get dup 0 lt{pop AT}if}ie NA
1325     WW Np /SL SL 1 add D /FN EF H2 get D GS Ey H2 get FS
1326     EU H2 get Sc Hs not HL Hl lt and Hs HL hl lt and or Hi 0 eq or
1327     {/HI Hi D /Hs t D /hl HL D /hL HL D}if HL Hl lt{/hi Hi D}if
1328     Nf HI 0 gt and{(h) Hi ST cvs join cvx exec 0 get WB}if
1329     /HF t D /AH f D /PO f D} D
1330     /EH {Bm H2 get GS mul BE OA /SL SL 1 sub NN D /CF 0 D /FN fn D
1331     SZ SL get FR SL get FS /HF f D /GS Ts D ()Ec} D
1332     /P {E PF{WR}{PO{EP}{BN}ie Ts 4 mul Np AE not{Tm 0 get Ts mul neg SP}if
1333     dup 0 ge AH and{Pi Pd}if}ie 1 sub dup 0 lt{pop AV AL get}if /AT E D /PO t D} D
1334     /EP {PF{WR}{BN Ts 4 mul Np}ie AE not{Bm 0 get Ts mul neg SP}if
1335     /AT AV AL get D /PO f D} D
1336     /BE {E PO{EP}{BN}ie Ts 4 mul Np neg SP} D
1337     /HR {/Aw W EO sub D /RW E dup 0 gt{Aw mul}{neg}ie dup Aw gt{pop Aw}if D /RZ E D
1338     E BN Ts neg SP 1 sub 2 div Aw RW sub mul EO add CP E pop M PF{0 Ps neg R}if
1339     0 Np OU{gsave RZ LW Cf{Hc VC}{0 Sg}ie CP BB RW 0 RL CP BB stroke grestore}if
1340     /CI 0 D /BP f D PF not{Ts neg SP}if /Ms t D} D
1341     /AD {I NL EG 14 get dup 0 lt{pop AT}if NA /AE t D Tm 14 get Ts mul neg SP
1342     Cf{EU 14 get dup -1 eq{pop CA CL get}if Sc}if} D
1343     /DA {BN ()ES OA /AE f D ()Ec Bm 14 get Ts mul neg SP} D
1344     /PR {/MW E D /Li E D Tm 1 get Ps mul BE 0 NA /FN Fp D /PF t D SI /SL SL 1 add D
1345     /CF 0 D Ps CS mul Ts div MW WC mul CS mul Ts div dup LL gt PL 0 eq and
1346     {LL div div}{pop}ie Ey 1 get FS CP E pop LE add YI neg div cvi dup Li lt
1347     AH and{4 lt YI Li mul 5 mul LE add 0 gt or PL 0 eq and{NP}if}{pop}ie
1348     EU 1 get Sc /GS Ps D}D
1349     /RP {WR NL () /PF f D SI /FN 0 D ES Bm 1 get Ps mul neg SP OA /GS Ts D} D
1350     /SI {/XO Lm 15 get BC NN mul Lm 16 get AI UI sub NN mul add
1351     Lm 17 get UI NN mul add Lm 20 get LG NN mul add Ts mul
1352     PF{Lm 1 get Ps mul add}if EO add D
1353     /MR Rm 15 get BC NN mul Rm 16 get AI UI sub NN mul add
1354     Rm 17 get UI NN mul add Rm 20 get LG NN mul add Ts mul
1355     PF{Rm 1 get Ps mul add}if D /LL W XO sub MR sub D} D
1356     /DT {BN /LG LG 1 sub D SI /LG LG 1 add D WW 2 div Np BL} D
1357     /DD {WB Cc 0 eq L1 0 eq or Lm 20 get Ts mul L1 sub TB{BW add}if Ts 2 div lt or
1358     NL /LF E D SI BL} D
1359     /DL {Dc LG Cc put /Cc E D BG{Tm 18 get Ts mul BE}{BN}ie /LG LG 1 add D BL} D
1360     /LD {BN LG 0 gt{/LG LG 1 sub D}if /Cc Dc LG get D SI
1361     BG{()Bm 18 get Ts mul BE}if BL} D
1362     /UL {BG{Tm 17 get Ts mul BE}{BN}ie NR AI NN 0 put /UI UI 1 add D
1363     /AI AI 1 add D SI BL} D
1364     /LU {BN /UI UI 1 sub D /AI AI 1 sub D SI BG{()Bm 17 get Ts mul BE}if BL} D
1365     /OL {E BG{Tm 16 get Ts mul BE}{BN}ie TR AI NN Ty put /Ty E D NR AI NN 1 put
1366     /AI AI 1 add D SI BL 1 Ln} D
1367     /LO {BN /AI AI 1 sub D /Ty TR AI get D SI BG{()Bm 16 get Ts mul BE}if BL} D
1368     /LI {E BN -1 SP /BP f D /CI 0 D 0 Np NR AI 1 sub NN get 1 eq
1369     {dup dup 0 gt E 4 le and{/Ty E D}{pop}ie
1370     /L1 L1 Ty AR AI NN get Ns SW pop XO sub dup 0 lt{pop 0}if add D ( ON )}
1371     {pop ( B )}ie C1 E join /C1 E D CS Mf gt{/Mf CS D}if BL} D
1372     /BQ {Tm 15 get Ts mul BE /BC BC 1 add D SI BL} D
1373     /QB {Bm 15 get Ts mul BE /BC BC 1 sub D SI BL} D
1374     /Al {E EP 1 sub dup 0 lt{pop AV AL get}if NA} D
1375     /Ea {EP OA} D
1376     /WB {PF{WR}{BT}ie} D
1377     /F1 {WB /FN 0 D CS 0 FS} D
1378     /F2 {WB /FN WI D CS 0 FS} D
1379     /HY {/Hy t D WB /Hy f D} D
1380     /YH {WB} D
1381     /A {/LT E D LT 1 eq{/RN E D}if /Lh E D WB /AF t D /C1 C1 ( Cp ) join D
1382     Lc{Cl Sc}if} D
1383     /EA {Lc AF and{Ec}{WB}ie TL Pa AF and Lh 0 ne and
1384     {( \\() Lh join (\\)) join /AF f D WB}if /AF f D} D
1385     /TL {C1 ( Tl ) apa /C1 E D} d
1386     /apa {AF OU and Lh 0 ne LT 1 eq or and{LT 1 eq{RN ( /) E ST cvs join}
1387     {(\\() Lh join (\\)) join}ie E join join}{pop}ie} d
1388     /Cp {/Xc CP /Yc E D D} D
1389     /SS {Cf{dup 0 ge{EU E get dup -1 eq{pop CA CL get}if}{pop CA CL get}ie Sc}
1390     {pop}ie SZ SL get /SL SL 1 add D} D
1391     /I {WB 8 SS 1 FS} D
1392     /EM {WB 8 SS /CF CF 1 xor D 0 FS} D
1393     /BD {WB 9 SS 2 FS} D
1394     /TT {WB 10 SS /FN Fp D 0 FS} D
1395     /KB {WB 11 SS /FN Fp D 2 FS} D
1396     /CT {WB 12 SS 1 FS} D
1397     /SM {WB 13 SS /FN Fp D 0 FS} D
1398     /Q {/QL QL 1 add D QO QL 2 mod get La get join WB} D
1399     /EQ {QC QL 2 mod get La get join WB /QL QL 1 sub D} D
1400     /RO {WB -1 SS /CF 0 D 0 FS} D
1401     /SY {WB -1 SS -1 FS} D
1402     /ES {WB /SL SL 1 sub NN D /CF 0 D /FN FO SL get D SZ SL get FR SL get FS ()Ec}D
1403     /FZ {3 sub 1.2 E exp GS mul E WB TL /C1 C1 ( Cp ) join D /SL SL 1 add D 0 FS} D
1404     /Ef {WB TL ()ES /C1 C1 ( Cp ) join D} D
1405     /BZ {dup /Bf E D FZ}D
1406     /Sc {dup -1 ne Cf and{/CL CL 1 add D dup 0 eq{pop [0 0 0]}if
1407     dup CA E CL E put VS ( VC ) join C1 E join /C1 E D}{pop}ie} D
1408     /Ec {WB Cf{/CL CL 1 sub NN D CA CL get VS ( VC ) join C1 E join /C1 E D}if} D
1409     /VS {dup type /arraytype eq{([) E {ST cvs join ( ) join}forall (]) join}if} D
1410     /VC {{255 div}forall setrgbcolor} D
1411     /Sl {dup type /integertype ne{Ds}if /La E D WB}d
1412     /UN {WB /UF t D} D
1413     /NU {WB /UF f D} D
1414     /SE {WB /sF t D} D
1415     /XE {WB /sF f D} D
1416     /sM {/C1 C1 ( k1 ) join D}d
1417     /eM {/C1 C1 ( k2 ) join D}d
1418     /k1 {/YC CP E pop Ts add D /mF t D /f1 t D}d
1419     /k2 {gsave 3 LW -9 CP E pop Ts 0.2 mul sub M -9 YC L stroke grestore /mF f D}d
1420     /Ac {/AC E D WB}d
1421     /Ca {eA{( \\()join AC join(\\) )join}if WB}d
1422     /s {OU{gsave 0 CS .25 mul R dup SW pop CJ 0 RL stroke grestore}if}D
1423     /CJ {AT 3 eq LB and{E dup dup length 1 sub A1 mul E
1424     {( ) search{pop pop E A2 add E}{pop exit}ie}loop 3 -1 roll add
1425     W CP pop sub 2 copy gt{E}if pop}if}D
1426     /So {/Co E D} D
1427     /SO {C1 Yo ST cvs join ( So ) join /C1 E D (j) SW pop 2 div Pd} D
1428     /Se {E WB CS E div Pd}D
1429     /Pd {dup type /stringtype eq{SW pop}if dup /L1 E L1 add D
1430     ST cvs ( 0 R ) join C1 E join /C1 E D} D
1431     /Sp {0.35 CO} D
1432     /Sb {-0.2 CO} D
1433     /CO {OV Io Yo put /Yo E CS mul Yo add D /Io Io 1 add D -1.5 Io mul 3 add FZ SO
1434     CS Yo add dup YA gt{/YA E D}{pop}ie
1435     Yo neg dup YB gt{/YB E D}{pop}ie} D
1436     /Es {ES /Io Io 1 sub NN D /Yo OV Io get D SO} D
1437     /SB {/N2 0 D 0 1 NI{/N E D{IX N2 get 0 lt{/N2 N2 1 add D}{exit}ie}loop
1438     /K WS N get FC N get mul D /NY AY N2 get D /BV NY array D
1439     0 1 NY 1 sub{/TM K string D currentfile TM readhexstring pop pop BV E TM put}
1440     for BM N BV put /N2 N2 1 add D}for} D
1441     /IC [{/MA E D /MB 0 D}{2 div /MA E D /MB MA D}{/MB E CS sub D /MA CS D}
1442     {pop /MA YS AB mul D /MB 1 AB sub YS mul D}{pop /MA 0 D /MB 0 D}] D
1443     /IP {BV N get /N N 1 add D} D
1444     /II {/K E D IX K get 0 lt{/EC E D}if /TY E D
1445     TY 4 eq{/Y E D /X E D}if TY 3 eq{/AB E D}if
1446     /XW AX K get D /YW AY K get D /IS SG IT K get get D /XS XW IS mul D
1447     /YS YW IS mul D YS IC TY get exec /MA MA Fl not{3 add}if D} D
1448     /IM {II /ty TY D /xs XS D /ys YS D /ya YA D /yb YB D /ma MA D /mb MB D /k K D
1449     /ec EC D /BP f D /CI 0 D WB TL L1 xs add dup XO add MR add W gt
1450     {pop /ma ma Fl{3 add}if D NL /YA ma D /YB mb D /YS ys D /L1 xs D}
1451     {/L1 E D ma YA gt{/YA ma D}if mb YB gt{/YB mb D}if}ie /TB f D
1452     OU{CP E pop YS sub LE neg lt Fl not and PB not and{NP /YA ma D /YB mb D}if
1453     /BP f D ty ST cvs ( ) join IX k get 0 lt{(\\() join ec join (\\) ) join}if
1454     k ST cvs join ty 3 eq{AB ST cvs ( ) join E join}if
1455     ty 4 eq{X ST cvs ( ) join Y ST cvs join ( ) join E join}if C1 E join
1456     ( DI ) join FP 2 eq FP 1 eq AF and or{( FM ) join}if
1457     ( Il Cp ) apa /C1 E D /EN f D}if /HM t D /T f D} D
1458     /DI {II /Xc CP /Yc E D D /YN YW neg D /HM t D /CI 0 D /K2 IX K get D gsave
1459     TY 4 eq{OX X IS mul add OY FY add YS sub Y IS mul sub}
1460     {/FY YS D CP MB sub 2 copy /OY E D /OX E D}ie
1461     translate K2 0 ge{/DP AZ K2 get D /BV BM K2 get D XS YS scale /N 0 D XW YW DP
1462     [XW 0 0 YN 0 YW] {IP} FC K2 get 1 eq{image}{f 3 colorimage}ie}
1463     {EX}ie grestore XS 0 R /Ms t D} D
1464     /FM {gsave 0 Sg CP MB sub translate XS neg 0 M 0 YS RL XS 0 RL 0 YS neg RL
1465     XS neg 0 RL stroke grestore} D
1466     /NA {/AT E D /AL AL 1 add D AV AL AT put} D
1467     /OA {AL 0 gt{/AL AL 1 sub D /AT AV AL get D}if} D
1468     /D1 {/BR {CP E pop E BN Mb{CP E pop eq{0 YI R}if}{pop}ie} D
1469     /Sn {OU{C1 E ST cvs join ( Ld ) join /C1 E D}{pop}ie} D} D
1470     /D1 {/BR {BN} D /Sn {OU {C1 E ST cvs join ( Ld ) join /C1 E D} {pop} ie} D} D
1471     /TC {/TF t D /ML 0 D HN{SW pop dup ML gt{/ML E D}{pop}ie}forall NP /RM RM not D
1472     RC /OU Tc D Ep /PN 0 D Ms not TP and{Ip}if /W IW ML sub Ts sub D
1473     /A0 0 D TH{/BR {( ) join BT} D /Sn {pop} D /Ti () D /Au () D}if} D
1474     /TN {0 eq{E EA PF HF or not XR and{HN E get Xr}{pop}ie}
1475     {OU{Tn 0 ge{() BN}if /Tn E D}{pop}ie WB}ie} D
1476     /NT {OU LB not and Tn 0 ge and{PL 0 eq{Ms not{CS CF FS}if CP dup
1477     /y E YA sub D W 9 sub CS -1.8 mul XO L1 add 2 add{y M (.) show}for
1478     HN Tn get dup SW pop IW E sub y M show CP BB M}if /Tn -1 D}if} D
1479     /Ld {/DN E D HN DN Pn put [/View [/XYZ -4 Fl{PS}{CP YA add US E pop}ie null]
1480     /Dest DN ST cvs cvn /DEST pdfmark} D
1481     /C {ND 1 eq{1 sub}if TI mul /XO E D NL Nf not{pop()}if 0 3 -1 roll 1 A} D
1482     /OP {BP not{NP}if PN 2 mod 0 eq{NP}if}D
1483     /Ep {Xp PN 2 mod 0 eq and{/Pn (-) D showpage /PM 1 D LA}if}D
1484     /Dg [73 86 88 76 67 68 77] D
1485     /Rd [0 [1 1 0][2 1 0][3 1 0][2 1 1][1 1 1][2 2 1][3 3 1][4 4 1][2 1 2]] D
1486     /Ns {/m E D /c E 32 mul D /j m 1000 idiv D /p j 12 add string D
1487     c 96 le m 0 gt and{c 32 le {/i 0 D /d 77 D /l 100 D /m m j 1000 mul sub D
1488     j -1 1 {pop p i d c add put /i i 1 add D}for
1489     4 -2 0 {/j E D /n m l idiv D /m m n l mul sub D /d Dg j get D
1490     n 0 gt {/x Rd n get D x 0 get -1 1 {pop p i d c add put /i i 1 add D}for
1491     p i x 1 get sub Dg x 2 get j add get c add put}if /l l 10 idiv D
1492     }for p 0 i GI}
1493     {/i ST length 1 sub D m {1 sub dup 0 ge{dup 26 mod c add 1 add
1494     ST i 3 -1 roll put 26 idiv dup 0 eq{pop exit}if}if /i i 1 sub D}loop
1495     ST i ST length i sub GI}ie}
1496     {m p cvs}ie} D
1497     /US {matrix currentmatrix matrix defaultmatrix matrix invertmatrix
1498     matrix concatmatrix transform} D
1499     /GB {Gb{US}if}D
1500     /Tl {/Rn E D Xc CP pop ne{
1501     [/Rect [Xc 1 sub Yc cS 0.25 mul sub GB CP E 1 add E cS 0.85 mul add GB]
1502     /Subtype /Link /Border [0 0 Cf Lc and LX and AU or{0}{1}ie] Rn type
1503     /nametype eq {/Dest Rn}{/Action [/Subtype /URI /URI Rn] Cd}ie
1504     /ANN pdfmark}if} D
1505     /Il {/Rn E D [/Rect [Xc Yc GB Xc XS add Yc YS add GB] /Subtype /Link
1506     /Border [0 0 0] Rn type /nametype eq{/Dest Rn}
1507     {/Action [/Subtype /URI /URI Rn] Cd}ie /ANN pdfmark} D
1508     /XP {[{/Z Bz 2 div D Z 0 R Z Z RL Z neg Z RL Z neg Z neg RL Z Z neg RL}
1509     {Bz 0 RL 0 Bz RL Bz neg 0 RL 0 Bz neg RL}
1510     {0 -5 R Bz 0 RL 0 21 RL Bz neg 0 RL 0 -21 RL}]} D
1511     /MS {/Sm E D WB}D
1512     /O {BN()Sm BX} D
1513     /BX {/Bt E D Bt 2 lt{CS 0.8 mul}{11 mul}ie W XO sub MR sub 2 copy gt{E}if pop
1514     /HZ E D WB Bt 2 eq{HZ ST cvs ( ) join}{()}ie
1515     Bt ST cvs join ( Bx ) join HM{( ) Pd}if
1516     L1 HZ add XO add MR add W gt{NL}if C1 E join /C1 E D /L1 L1 HZ add D /T f D
1517     ( ) WB Bt 2 lt{YA CS .8 mul lt{/YA CS .8 mul D}if}
1518     {YB 5 lt{/YB 5 D}if YA 21 lt{/YA 21 D}if}ie /CI 0 D} D
1519     /Bx {dup 2 eq{E /Bz E D}{/Bz CS .8 mul D}ie
1520     OU {gsave 0 Sg XP E get exec stroke grestore}{pop}ie Bz 0 R /Ms t D} D
1521     /SD {FD 4 mul Dy add DZ NF newpath 0 0 M DX t charpath pathbbox
1522     3 -1 roll sub /DY E D E dup /X1 E D sub WM mul WX DY mul add WM DG mul E div
1523     /DF E D /DR WX DF mul DY mul WM div 2 div D} d
1524     /Sd {gsave 0 IL Di mul neg translate IL IW atan Di 0 eq{neg}if rotate
1525     FD 4 mul Dy add DZ NF DR X1 sub DY 2 div neg M cD VC DX show grestore} d
1526     /RC {/AI 0 D /LG 0 D /BC 0 D /UI 0 D /PF f D /Cc 0 D /Dc 10 array D
1527     /NR [0 1 9{pop 0}for] D /La Ds D /AR 10 array D /TR 10 array D /AV 30 array D
1528     SI /AL -1 D /AT A0 D AT NA /OV 9 array D /Yo 0 D /Co 0 D /Io 0 D /Hy f D
1529     /Ph f D /CL -1 D Ct Sc}D
1530     /ZF {/FR [0 1 30{pop 0}for] D /SZ [0 1 30{pop 0}for] D /FO [0 1 30{pop 0}for] D
1531     /SL 0 D /CF 0 D /FN 0 D 0 Ts SF}D
1532     /QO [[($qo)][($qo2)]] D
1533     /QC [[($qc)][($qc2)]] D
1534     /Hf EF length 2 sub D
1535     /Hz EZ Hf get D
1536     /HS Ey Hf get D
1537     /Fz EZ Hf 1 add get D
1538     /Fs Ey Hf 1 add get D
1539     /LE IL D
1540     /Ps EZ 1 get D
1541     /Fp EF 1 get D
1542     /XO 0 D
1543     /YI 0 D
1544     /CI 0 D
1545     /FP 0 D
1546     /WW Ts 7 mul D
1547     /Mf 0 D
1548     /YA 0 D
1549     /YB 0 D
1550     /Cs Ts D
1551     /GS Ts D
1552     /F0 0 D
1553     /NS 0 D
1554     /NB 0 D
1555     /N 0 D
1556     /C0 [] D
1557     /C1 () D
1558     /Lo 0 D
1559     /L1 0 D
1560     /LM 0 D
1561     /PH 0 D
1562     /EC 0 D
1563     /Lh 0 D
1564     /LT 0 D
1565     /CH 1 string D
1566     /ST 16 string D
1567     /CA 9 array D
1568     /HC (\\255) D
1569     /HM f D
1570     /PF f D
1571     /EN f D
1572     /TB f D
1573     /UF f D
1574     /sF f D
1575     /AE f D
1576     /AF f D
1577     /BP t D
1578     /CD f D
1579     /PA t D
1580     /GL f D
1581     /T t D
1582     /HF f D
1583     /AH f D
1584     /SA f D
1585     /PB f D
1586     /f1 f D
1587     /mF f D
1588     /OX 0 D
1589     /OY 0 D
1590     /FY 0 D
1591     /EO 0 D
1592     /FB 0 D
1593     /PL 0 D
1594     /Bw 0 D
1595     /PD -1 D
1596     /TP f D
1597     /TH $th D
1598     /Ty 4 D
1599     /Tn -1 D
1600     /Fl t D
1601     /LB t D
1602     /PM 1 D
1603     /Ms f D
1604     /Ba f D
1605     /Bb f D
1606     /Hl 3 D
1607     /hl 6 D
1608     /hL 6 D
1609     /Hs f D
1610     /HI 0 D
1611     /hi 0 D
1612     /PO t D
1613     /TE f D
1614     /LF t D
1615     /BO 0 D
1616     /Sm 1 D
1617     /Bf 3 D
1618     /A1 0 D
1619     /A2 0 D
1620     /Ds $lid{'en'} D
1621     /QL -1 D
1622     /Cb Db D
1623     /Ct Dt D
1624     /Cl Dl D
1625     EOT
1626    
1627     $tbl=<<EOT;
1628     /TS {
1629     tables E get /table E D
1630     table aload pop /rdesc E D /cdesc E D /tdesc E D
1631     tdesc aload pop /capalg E D /caption E D /rules E D /frame E D /nfoot E D
1632     /nhead E D /ncol E D /nrow E D /border E D /twid E D /units E D /talign E D
1633     /flow E D /clear E D /tclass E D pop pop
1634     /w W D /eps 0.1 D /OU f D /PL 1 D
1635     /FN EF 21 get D EZ 21 get Ey 21 get FS
1636     0 1 1{
1637     /pass E D
1638     0 1 nrow{
1639     /irow E D
1640     /cells rdesc irow get 6 get D
1641     0 1 ncol{
1642     /icol E D
1643     /cell cells icol get D
1644     cell 0 ne{
1645     cell aload pop /CB E D pop pop pop
1646     /DV E D /bot E D /top E D /right E D /left E D /nowrap E D /valign E D
1647     /dp E D /align E D /rspan E D /cspan E D /cclass E D /ctype E D /cmax E D
1648     /cmin E D /proc E D
1649     rspan 0 eq{/rspan nrow irow sub 1 add D}if
1650     cspan 0 eq{/cspan ncol icol sub 1 add D}if
1651     pass 0 eq cspan 1 eq and pass 1 eq cspan 1 gt and or{
1652     /W 1e5 D /LL W D /PH 1 D
1653     ctype 1 eq{() BD}if
1654     RC align NA
1655     AT 4 eq{/CD t D /DC dp D /LN 0 D /M1 0 D /M2 0 D}{/CD f D}ie
1656     0 0 M /LM 0 D proc exec BN
1657     AT 4 eq{
1658     LN array astore cell 15 3 -1 roll put
1659     cdesc icol get dup dup 5 get M1 lt{5 M1 put}{5 get /M1 E D}ie
1660     dup 6 get M2 lt{6 M2 put}{6 get /M2 E D}ie
1661     /LM M1 M2 add D
1662     }if
1663     /CD f D
1664     /thiswid LM left add right add eps add D
1665     /oldmin 0 D /oldmax 0 D
1666     0 1 cspan 1 sub{
1667     icol add cdesc E get dup 2 get /oldmax E oldmax add D
1668     1 get /oldmin E oldmin add D
1669     }for
1670     thiswid oldmax ge{
1671     0 1 cspan 1 sub{
1672     icol add cdesc E get dup 2 E 2 get oldmax 0 eq
1673     {pop thiswid cspan div}{thiswid mul oldmax div}ie
1674     put
1675     }for
1676     }if
1677     nowrap 1 eq{
1678     thiswid oldmin ge{
1679     0 1 cspan 1 sub{
1680     icol add cdesc E get dup 1 E 1 get oldmin 0 eq
1681     {pop thiswid cspan div}{thiswid mul oldmin div}ie
1682     put
1683     }for
1684     }if
1685     }{
1686     /W 0 D /LL W D /PH 2 D
1687     ctype 1 eq{() ES () BD}if
1688     0 0 M /LM 0 D RC proc exec BN
1689     /thiswid LM left add right add eps add D
1690     thiswid oldmin ge{
1691     0 1 cspan 1 sub{
1692     icol add cdesc E get dup 1 E 1 get oldmin 0 eq
1693     {pop thiswid cspan div}{thiswid mul oldmin div}ie
1694     put
1695     }for
1696     }if
1697     }ie
1698     ctype 1 eq{() ES}if
1699     }if
1700     }if
1701     }for
1702     }for
1703     }for
1704     /tmin 0 D /tmax 0 D
1705     0 1 ncol{
1706     cdesc E get dup 1 get E 2 get 2 copy gt{pop dup}if
1707     tmax add /tmax E D tmin add /tmin E D
1708     }for
1709     twid 0 lt{twid neg IW gt{IW neg}{twid}ie /twid E D}if
1710     tdesc 0 twid neg tmin 2 copy lt{E}if pop put
1711     tdesc 1 twid neg tmax 2 copy lt{E}if pop put
1712     /W w D /LL W D /OU t D /PH 0 D /PL 0 D
1713     } D
1714     /PT {
1715     /PL PL 1 add D
1716     tables E get /table E D Tm 21 get Ts mul BE
1717     PL 2 ge{save}if
1718     /SL SL 1 add D /FN EF 21 get D EZ 21 get Ey 21 get FS
1719     table aload pop /rdesc E D /cdesc E D /tdesc E D
1720     tdesc aload pop /capalg E D /caption E D /rules E D /frame E D /nfoot E D
1721     /nhead E D /ncol E D /nrow E D /border E D /twid E D /units E D /talign E D
1722     /flow E D /clear E D /tclass E D /tmax E D /tmin E D
1723     /w W D /xo XO D /mr MR D /ll LL D /lg LG D /ai AI D /bc BC D /nr NR D /ar AR D
1724     /tr TR D /ui UI D /ph PH D /a0 A0 D /pf PF D /at AT D /av AV D /al AL D
1725     /Le LE D /la La D
1726     talign 0 lt{/talign AL 0 gt{AV AL get}{A0 2 le{A0}{0}ie}ie D}if
1727     ph 1 eq ph 2 eq or{
1728     NL ph 1 eq{tmax}{tmin}ie dup XO add LM gt{/LM E XO add D}{pop}ie LM E
1729     }{
1730     /PH 3 D /LE 1e5 D RC %ZF
1731     border 0 gt{/border 1 D}if
1732     /twidth 0 D /avail W xo sub D
1733     twid 0 eq{0 1 ncol{cdesc E get dup 2 get E 3 get dup 0 gt{div neg dup twid lt
1734     {/twid E D}{pop}ie}{pop pop}ie}for}if
1735     /twid twid dup 0 lt{neg avail 2 copy gt{E}if pop}{avail mul}ie D
1736     /OK t D 0 1 ncol{cdesc E get dup 1 get E 3 get twid mul gt{/OK f D}if}for
1737     0 1 ncol{
1738     cdesc E get dup 1 get /colmin E D dup 3 get /cwid E twid mul D dup
1739     tmax avail le{2 get}if
1740     tmin avail le tmax avail gt and{
1741     dup 2 get E 1 get dup 3 1 roll sub avail tmin sub mul tmax tmin sub div add
1742     }if
1743     tmin avail gt{1 get}if
1744     0 E colmin cwid lt OK and{pop cwid}if dup /twidth E twidth add D put
1745     }for
1746     /OU f D CP
1747     tmin twid le{
1748     0 1 ncol{cdesc E get dup 0 get twidth div twid mul 0 E put}for
1749     /twidth twid D
1750     }if
1751     CP printcap CP E pop sub /caphig E D pop
1752     0 1 1{
1753     /pass E D
1754     0 1 nrow{
1755     /irow E D
1756     /cells rdesc irow get 6 get D
1757     0 1 ncol{
1758     /icol E D
1759     /cell cells icol get D
1760     cell 0 ne{
1761     cell aload pop /CB E D pop pop pop
1762     /DV E D /bot E D /top E D /right E D /left E D /nowrap E D /valign E D
1763     /dp E D /align E D /rspan E D /cspan E D /cclass E D /ctype E D /cmax E D
1764     /cmin E D /proc E D
1765     rspan 0 eq{/rspan nrow irow sub 1 add D}if
1766     cspan 0 eq{/cspan ncol icol sub 1 add D}if
1767     /W 0 D
1768     0 1 cspan 1 sub{icol add cdesc E get 0 get /W E W add D}for
1769     pass 0 eq rspan 1 eq and pass 1 eq rspan 1 gt and or{
1770     ctype 1 eq{() BD}if
1771     /W W left sub right sub D /XO 0 D /EO 0 D SI
1772     /A0 align D RC align NA
1773     AT 4 eq{
1774     /DC dp D /DO 0 D /ID 1 D
1775     0 1 DV length 1 sub{DV E get dup DO gt{/DO E D}{pop}ie}for
1776     /Lo DO DV 0 get sub D /L1 Lo D
1777     }if
1778     0 0 M /BP t D /Fl t D /MF 0 D /FB 0 D
1779     proc exec T not{/CI 0 D}if BN 0 FB neg R MF 0 eq{/MF CS D}if
1780     CP /thishig E neg bot add top add CI add D pop
1781     cell 16 MF put cell 17 Ya put cell 18 thishig put
1782     valign 4 eq{
1783     /below thishig Ya sub D
1784     rdesc irow get dup dup 4 get Ya lt
1785     {4 Ya put}{4 get /Ya E D}ie
1786     dup 5 get below lt{5 below put}{5 get /below E D}ie
1787     /thishig Ya below add D
1788     }if
1789     ctype 1 eq{()ES}if
1790     /oldhig 0 D
1791     0 1 rspan 1 sub{
1792     irow add rdesc E get 0 get /oldhig E oldhig add D
1793     }for
1794     thishig oldhig ge{
1795     0 1 rspan 1 sub{
1796     irow add rdesc E get dup 0 E 0 get oldhig 0 eq
1797     {pop thishig rspan div}{thishig mul oldhig div}ie
1798     put
1799     }for
1800     }if
1801     }if
1802     }if
1803     }for
1804     }for
1805     }for M RC %ZF
1806     /thight 0 D /racc 0 D /maxh 0 D /brk 0 D /rbeg nhead nfoot add D
1807     rbeg 1 nrow{
1808     rdesc E get dup 0 get dup /thight E thight add D
1809     brk 0 eq{/racc E D}{/racc E racc add D}ie
1810     racc maxh gt{/maxh racc D}if 2 get /brk E D
1811     }for
1812     ph 3 ge{thight caphig add E}if
1813     ph 0 eq ph 4 eq or{
1814     /PH 4 D /LE Le D /OU Ou D /yoff 0 D /headsz 0 D
1815     0 1 nhead 1 sub{rdesc E get 0 get headsz add /headsz E D}for
1816     /footsz 0 D
1817     0 1 nfoot 1 sub{rdesc E nhead add get 0 get footsz add /footsz E D}for
1818     /ahig LE BO add MI add D /maxh maxh headsz add footsz add D
1819     /thight thight headsz add footsz add D
1820     tmin avail gt maxh ahig gt or
1821     {/Sf avail tmin div dup ahig maxh div gt{pop ahig maxh div}if D /SA t D}
1822     {/Sf 1 D}ie
1823     tclass 1 eq thight LE 15 sub gt and
1824     {/SA t D LE 15 sub thight div dup Sf lt{/Sf E D}{pop}ie}if
1825     SA{Sf Sf scale /ll ll Sf div D /xo xo Sf div D /LE LE Sf div D
1826     /mr mr Sf div D /BO BO Sf div D /ahig ahig Sf div D}if
1827     nhead nfoot add getwid
1828     LE CP E pop add capalg 0 eq{caphig sub}if dup headsz sub footsz sub rwid lt
1829     E thight lt thight ahig lt and or{NP}if
1830     capalg 0 eq{printcap -8 SP}if
1831     CP /ycur E D pop
1832     printhead
1833     rbeg 1 nrow{/row E D row
1834     getwid
1835     ycur yoff add rwid sub footsz sub LE add 0 lt
1836     {nfoot 0 gt{printfoot}if Tf NP /rbeg irow1 D
1837     Ba{MI /MI MI SA{Sf div}if D MI SP /MI E D}if
1838     CP /ycur E D pop /yoff 0 D printhead}if
1839     irow1 printrow
1840     }for
1841     printfoot /row row 1 add D Tf
1842     0 ycur yoff add M
1843     capalg 1 eq{/EO 0 D SI -3 SP printcap}if
1844     Sf 1 lt{1 Sf div dup scale /ll ll Sf mul D /xo xo Sf mul D /LE LE Sf mul D
1845     /mr mr Sf mul D /BO BO Sf mul D /SA f D}if
1846     /EO 0 D
1847     }if
1848     }ie
1849     /W w D /XO xo D /MR mr D /LL ll D /LG lg D /AI ai D /BC bc D /NR nr D /AR ar D
1850     /TR tr D /UI ui D /PH ph D /A0 a0 D /PF pf D /AT at D /AV av D /AL al D
1851     /La la D
1852     /SL SL 1 sub NN D /CF 0 D /FN 0 D SZ SL get FR SL get FS Wf not{()F2}if
1853     PL 2 ge{Ms E restore Ms or /Ms E D PH 1 eq PH 2 eq or
1854     {/LM E D}if PH 3 ge{/CI 0 D NL 0 E neg R}if
1855     }if
1856     /PL PL 1 sub D /CI 0 D /BP f D /PO f D () Bm 21 get Ts mul BE BL %CF CS SF
1857     } D
1858     /printcap{
1859     capalg 0 ge{
1860     SA{/W w Sf div D}
1861     {talign 1 eq{/XO xo ll twidth sub 2 div add D}if
1862     talign 2 eq{/XO xo ll twidth sub add D}if
1863     /W XO twidth add D
1864     }ie /XO xo D /LL W XO sub MR sub D
1865     /PA f D /Fl capalg 0 eq D
1866     1 NA BL caption exec BN OA /PA t D
1867     }if
1868     } D
1869     /getwid{
1870     /irow1 E D
1871     /irow2 irow1 D
1872     /rwid 0 D
1873     {rdesc irow2 get dup 0 get rwid add /rwid E D 2 get 0 eq
1874     {exit}{/irow2 irow2 1 add D}ie
1875     }loop
1876     } D
1877     /printrow{
1878     /xoff ll twidth PL 2 ge{Sf div}if sub talign mul 2 div D
1879     /xleft xoff xo add D
1880     /irow E D
1881     /cells rdesc irow get 6 get D
1882     0 1 ncol{
1883     /icol E D
1884     /cell cells icol get D
1885     cell 0 ne{
1886     cell aload pop /CB E D /cvsize E D /above E D /fontsz E D
1887     /DV E D /bot E D /top E D /right E D /left E D /nowrap E D /valign E D
1888     /dp E D /align E D /rspan E D /cspan E D /cclass E D /ctype E D /cmax E D
1889     /cmin E D /proc E D
1890     rspan 0 eq{/rspan nrow irow sub 1 add D}if
1891     cspan 0 eq{/cspan ncol icol sub 1 add D}if
1892     /width 0 D
1893     0 1 cspan 1 sub{icol add cdesc E get 0 get /width E width add D}for
1894     /rhight rdesc irow get 0 get D
1895     /hight rhight D
1896     1 1 rspan 1 sub{irow add rdesc E get 0 get /hight E hight add D}for
1897     /W xo xoff add width add right sub D
1898     /EO xo xoff add left add D SI
1899     Cf{
1900     gsave CB VC xo xoff add ycur yoff add M
1901     0 hight neg RL width 0 RL 0 hight RL width neg 0 RL fill
1902     grestore
1903     }if
1904     ctype 1 eq{() BD}if
1905     /A0 align D RC
1906     AT 4 eq{
1907     /DC dp D /ID 1 D /DO cdesc icol get 5 get D /Lo DO DV 0 get sub D /L1 Lo D
1908     }if
1909     valign 3 le{0 ycur yoff add top sub
1910     hight cvsize sub valign 1 sub mul 2 div sub M}
1911     {0 ycur yoff add top sub above add rdesc irow get 4 get sub M}ie
1912     /PA f D /BP t D /Fl t D
1913     BL proc exec BN
1914     /PA t D
1915     ctype 1 eq{() ES}if
1916     }if
1917     /xoff xoff cdesc icol get 0 get add D
1918     }for
1919     /yoff yoff rhight sub D
1920     } D
1921     /printhead {0 1 nhead 1 sub{printrow}for} D
1922     /printfoot {nhead 1 nhead nfoot add 1 sub{printrow}for} D
1923     /Tf {
1924     OU{rules 2 ge{/yoff 0 D
1925     gsave 0 Sg
1926     [0 1 nhead 1 sub{}for rbeg 1 row 1 sub{}for nhead 1 nhead nfoot add 1 sub{}for]{
1927     /irow E D
1928     /xoff ll twidth PL 2 ge{Sf div}if sub talign mul 2 div D
1929     /cells rdesc irow get 6 get D
1930     0 1 ncol{
1931     /icol E D
1932     /cell cells icol get D
1933     cell 0 ne{
1934     /rspan cell 6 get D
1935     /cspan cell 5 get D
1936     rspan 0 eq{/rspan nrow irow sub 1 add D}if
1937     cspan 0 eq{/cspan ncol icol sub 1 add D}if
1938     /width 0 D
1939     0 1 cspan 1 sub{icol add cdesc E get 0 get /width E width add D}for
1940     /rhight rdesc irow get 0 get D
1941     /hight rhight D
1942     1 1 rspan 1 sub{irow add rdesc E get 0 get /hight E hight add D}for
1943     xo xoff add width add ycur yoff add M
1944     0 hight neg icol cspan add 1 sub ncol lt
1945     {cdesc icol 1 add get 4 get dup rules 3 le{1 eq}{pop t}ie
1946     {1 eq{0.8}{0.3}ie
1947     LW RL CP stroke M}{pop R}ie}{R}ie
1948     irow nhead nfoot add 1 sub ne nfoot 0 eq or
1949     {irow rspan add 1 sub nrow lt
1950     {rdesc irow rspan add get 3 get}{nfoot 0 eq{0}{1}ie}ie
1951     dup rules 2 mod 0 eq{1 eq}{pop t}ie
1952     {1 eq irow rspan add nhead eq or irow rspan add row eq nfoot 0 gt and or
1953     {0.8}{0.3}ie LW width neg 0 RL CP stroke M}{pop}ie}if
1954     }if
1955     /xoff xoff cdesc icol get 0 get add D
1956     }for
1957     /yoff yoff rhight sub D
1958     }forall
1959     grestore
1960     /Ms t D
1961     }if
1962     frame 1 gt{
1963     gsave
1964     1 LW 0 Sg
1965     xleft ycur M CP BB
1966     0 yoff frame 5 eq frame 7 ge or{RL}{R}ie
1967     twidth 0 frame 3 eq frame 4 eq or frame 8 ge or{RL}{R}ie CP BB
1968     0 yoff neg frame 6 ge{RL}{R}ie
1969     twidth neg 0 frame 2 eq frame 4 eq or frame 8 ge or{RL}{R}ie
1970     closepath stroke
1971     grestore
1972     /Ms t D
1973     }if
1974     }if
1975     } D
1976     EOT
1977    
1978     &openps if($opt_o);
1979     $ntab=-1;
1980     $tables="/tables [";
1981     @docs=$#ARGV<0?("-"):@ARGV;
1982     if($tocdoc) {$#docs=0};
1983     for (@docs) {$levl{$_}=1};
1984     $nref=0;
1985     $nhd=0;
1986     $nlnk=1;
1987     $ndoc=0;
1988     $nrem=0;
1989     $toc="/BO 0 D TC /Ba f D Bs /AU f D /UR () D RC ZF\n";
1990     $toc.="()F2" if(!$latin1);
1991     $toc.="($toc{'heading'})WB\n" if(!$tocdoc);
1992     $fl1="";
1993     $fl2="";
1994     $np="NP RC ZF";
1995     $P3="";
1996     while($html=shift @docs) {
1997     $ndoc++;
1998     $ba2="";
1999     $P2="(";
2000     $banner="";
2001     undef @links;
2002     $level=$levl{$html};
2003     if(&h2p) {
2004     if($ndoc==1) {
2005     $toc=~s/\$T/$ti/g;
2006     $toc=~s/\$A/$au/g;
2007     $toc=~s/[\200-\377]+/)F1($&)F2(/g if(!$latin1);
2008     }
2009     if($layer) {
2010     @docs=(@docs,@links);
2011     } else {
2012     @docs=(@links,@docs);
2013     }
2014     $rem=$#docs+1;
2015     if($rem && $opt_W) {
2016     &dbg("At least $rem document".($rem>1?"s":"")." remaining\n");
2017     }
2018     if($banner) {
2019     $_="/Ba t D /BA {($banner)BN} D\nBs f Pb CP /BO E D pop\n";
2020     &Subst($_);
2021     s/ H\(/ -1 H(/g;
2022     } else {
2023     $_="/Ba f D /BO 0 D Bs";
2024     }
2025     if($tocdoc && $first && $ndoc==1) {
2026     $TC=" TC";
2027     $et=" NP Ep ET /Tc f D";
2028     } else {
2029     $TC="";
2030     $et="";
2031     }
2032     $_.="\n/UR ($html) D\n/Ti ($ti) D\n/Au ($au) D\n/Df $draft D\n$TC\n";
2033     if(!$tocdoc) {
2034     $toc.="ND 1 gt{Ts 3 mul Np $refs{$html}()0 C()BD($ti)ES()$refs{$html}"
2035     ." 1 TN()EA()BN}if\n";
2036     }
2037     $hl=0;
2038     while($P2=~s/(\d) (\d) H\(([^\s<)]*)/$1 $2 $nhd H($3)WB $nref Sn(/) {
2039     $nhd++;
2040     if($hl+1<$2) {
2041     for($hl+1..$2-1) {
2042     push(@z1,-$nref);
2043     push(@z2,$_);
2044     }
2045     }
2046     $hl=$2;
2047     $hind[$hl-1]++;
2048     for $i ($hl..5) {$hind[$i]=0};
2049     $hind=join('.',@hind[0..$hl-1]);
2050     $hst=$3;
2051     $'=~/\)EH/;
2052     ($htxt=$hst.$`)=~s/\)EA\(//g;
2053     if(!$tocdoc) {
2054     $toc.="$hl NH le{$nref($hind\\240\\240)$hl C($htxt)$nref 1 TN()EA()BN}if\n";
2055     }
2056     push(@z1,$nref);
2057     push(@z2,$hl);
2058     $nref++;
2059     $htxt=~s/(\s+|\)BR\()/ /g;
2060     $htxt=~s/(^\s+|\)[^(]*\(|\s+$)//g;
2061     $htxt="" if(!$latin1);
2062     $dh.="/h$nhd [($hind\\240\\240)($htxt)] D\n";
2063     }
2064     if($tocdoc) {
2065     if($ndoc==1 && !$first) {
2066     $toc="TC RC ZF $_ $P2 WB () BN\n";
2067     $P2="";
2068     $P3="";
2069     $np="";
2070     $_="";
2071     }
2072     }
2073     $P3.="$fl1\n/Cb $bg D /Ct $tcol D /Cl $lcol D /CL -1 D Ct Sc\n$fl2\n$_\n$np\n$P2";
2074     if($tocdoc && $ndoc==1 && !$first) {
2075     $np="/Cb $bg D NP RC ZF";
2076     } else {
2077     $fl1="WB NL$et";
2078     $fl2="DS";
2079     $np="0 BO R";
2080     }
2081     }
2082     }
2083    
2084     $P3.=($P3!~/\)\s*$/?"()":"")."WB NL";
2085     if(!$tocdoc && $first && $nhd){$P3="$toc/OU t D /Cb $bg D NP Ep ET $P3"};
2086     if(!$first && ($tocdoc || !$tocdoc && $nhd)){$P3.=" $toc"};
2087    
2088     if($ntab>=0) {
2089     $_="$tables] D";
2090     &ack($_);
2091     y/\t\f/ /;
2092     s/[\200-\377]/sprintf("\\%3.3o",ord($&))/eg;
2093     s/\)XX/)9 9 PR/g;
2094     s/ H\(/ -1 H(/g;
2095     $tables=$_;
2096     }
2097     $_="%!\n%%Title: $title\n$P0$P1";
2098     if($nimg>=0) {
2099     $_.="/AX [".join(' ',@XS)."] D\n/AY [".join(' ',@YS)."] D\n"
2100     ."/IX [".join(' ',@IX)."] D\n/IT [".join(' ',@IT)."] D\n";
2101     if($nm>=0) {
2102     $_.="/AZ [".join(' ',@DP)."] D\n/WS [".join(' ',@WS)."] D\n"
2103     ."/FC [".join(' ',@FC)."] D\n/NI $nm D\n/BM ".($nm+1)." array D\nSB\n";
2104     for $i (0..$nm) {$_.="$BM[$i]\n\n"}
2105     }
2106     $_.="\n$pv%Endpv\n" if($nps);
2107     }
2108     @kw=split(/[, ]+/,$kw);
2109     @Kw=();
2110     for $i (@kw){push(@Kw,$i) if(!grep(/^$i$/,@Kw))};
2111     $kw=join(', ',@Kw);
2112     for $i (0..$#z2) {
2113     $n=0;
2114     $j=$i;
2115     while($j++<=$#z2 && $z2[$j]>$z2[$i]) {$n++ if($z2[$j]==$z2[$i]+1)};
2116     push(@z3,$n);
2117     }
2118     $tdef=$ntab>=0?"$tbl$tables\n0 1 $ntab\{TS}for RC ZF\n":"";
2119     $hd="/Hr [@z1]D\n/HV [@z2]D\n/Cn [@z3]D";
2120     &cut($hd);
2121     if($gd) {
2122     $sd="/Df t D /DG IW IW mul IL IL mul add sqrt D IW IL IW IL lt{E}if"
2123     ." /WM E D /WX E D /DZ 180 D gsave SD /DZ DZ DF mul D SD grestore\n";
2124     } else {
2125     $sd="/Df f D\n";
2126     }
2127     $_.=<<EOD;
2128     [/Creator ($version) /Author ($Au) /Keywords ($kw) /Subject ($su)
2129     /Title ($title) /DOCINFO pdfmark
2130     /ND $ndoc D
2131     /HN [1 1 $nref\{pop (??)}for] D
2132     $dh$hd
2133     Hr length 0 gt{[/PageMode /UseOutlines /DOCVIEW pdfmark}if
2134     /Hn 1 D
2135     0 1 Hr length 1 sub{
2136     /Bn E D [Cn Bn get dup 0 gt{/Count E HV Bn get Bl ge{neg}if}{pop}ie
2137     /Dest Hr Bn get dup abs ST cvs cvn E 0 ge{(h)Hn ST cvs join cvx exec dup 1 get
2138     E Nf{0 get E join}{pop}ie /Hn Hn 1 add D}{()}ie /Title E /OUT pdfmark}for
2139     ZF /FN Fp D Ps 0 FS /WC Wf{( )}{<A1A1>}ie SW pop D
2140     ET RC ZF
2141     $sd$rfs$tdef$P3
2142     /TE t D NP TU PM 0 eq and{/Pn () D showpage}if end restore
2143     EOD
2144    
2145     if(($first || $opt_R) && $xref{'passes'}) {
2146     &dbg("Inserting cross references\n") if($opt_d);
2147     for $i (1..$xref{'passes'}) {&ref};
2148     }
2149     &fin;
2150    
2151     sub h2p {
2152     if($html eq '-') {
2153     $_=<>;
2154     } elsif($html=~m|://|) {
2155     if(($prompt || $nrem>50) && $level>1) {
2156     &prompt("Retrieve document $html (y/n/q)? ",$ans);
2157     if($ans=~/q/i) {undef @docs};
2158     return 0 unless($ans=~/y/i);
2159     }
2160     &geturl($html,$_) || return;
2161     $nrem++;
2162     if($contyp!~m|text/html|i) {$_=" <plaintext>\n$_"};
2163     unless(($ba2)=$html=~m|(.*://.*/)|) {$ba2=$html."/"};
2164     } else {
2165     if(open(FILE,$html)) {
2166     &dbg("Reading $html\n") if($opt_W || $opt_d);
2167     $_=<FILE>;
2168     if(!/<HTML/i && $html!~/html?$/i && ($html!~/\.ps$/i || $ndoc>1)) {
2169     $_=" <plaintext>\n$_";
2170     }
2171     close FILE;
2172     } else {
2173     &dbg("*** Error opening $html\n");
2174     return 0;
2175     }
2176     }
2177    
2178     if(/^%!/ && /$delim/) {
2179     $psin=1;
2180     &openps if($opt_o);
2181     $_=$P0.$';
2182     for $s ("b","c","cw","g","t") {
2183     &dbg("Option -$s ignored\n") if(eval "\$opt_$s");
2184     }
2185     &fin;
2186     }
2187    
2188     &hb($_,$head);
2189     $head=~/<title$R\s*([\w\W]*)<\/title/i;
2190     ($ti=$2)=~s/\s+/ /g;
2191     $ti=$doctit{$html} if(!$ti);
2192     $ti=~s/\s*$//g;
2193     &spec($ti);
2194     &ent($ti);
2195     $ti="<Untitled>" if(!$ti);
2196     $title=$ti if(!$title);
2197     $draft="f" if(!$ddr);
2198     $au="";
2199     while($head=~/<meta\s[^>]*(name|http-equiv)\s*=\s*["']?\s*(\w+)$R/gi) {
2200     $k=$2;
2201     ($v)=$&=~/content\s*=\s*["']\s*([^"']+)/i;
2202     $v=~s/\s+/ /g;
2203     $v=~s/\s*$//g;
2204     &spec($v);
2205     &ent($v);
2206     if($k=~/author/i) {$au=$au?"$au, $v":$v};
2207     if($k=~/keywords/i) {$kw=$kw?"$kw, $v":$v};
2208     if($k=~/subject/i && !$su) {$su=$v};
2209     if(!$ddr && $k=~/status/i && $v=~/draft/i) {$draft="t";$gd=1};
2210     }
2211     $Au.=($Au?" + ":"").$au if($au);
2212     $b2=$opt_b;
2213     unless($b2) {
2214     ($b2)=$head=~/<base\s+href\s*=\s*"([^"]*)"$R/i;
2215     unless($b2) {($b2)=$head=~/<base\s+href\s*=\s*([\w\.-]+)$R/i}
2216     unless($b2) {$b2=$ba2}
2217     }
2218     $b2=~s|[^/]*$||;
2219     ($b1)=$b2=~m|(.*://[^/]*)/|;
2220     unless($b1) {$b1=$opt_r};
2221     unless($b2) {$b2=$html=~m|(.*/)[^/]*$|?$1:""};
2222     if(!defined $B2) {$B2=$b2};
2223     $levl{$b2.$html}=$levl{$html};
2224    
2225     while($link && $head=~/<link\s+[^>]*rel\s*=\s*["']?next$R/gi) {
2226     if(($lnk)=$&=~/href\s*=\s*["']?\s*([^"' >]*)/gi) {
2227     if($lnk=~m|.+//[^/]+$|) {$lnk=$&."/"}
2228     if($lnk=~m|://|) {
2229     $rlnk=0;
2230     } else {
2231     $rlnk=1;
2232     if($lnk=~m|^/|) {$lnk=$b1.$lnk} else {$lnk=$b2.$lnk}
2233     }
2234     while($lnk!~m|^\.\./| && $lnk=~m|[^/]*/\.\./|) {$lnk=$`.$'};
2235     $lnk=~s|/\./|/|g;
2236     if(&follow && !$levl{$lnk}) {
2237     $levl{$lnk}=$level+1;
2238     push(@links,$lnk);
2239     }
2240     }
2241     }
2242     ($battr)=/<BODY$R/i;
2243     ($lang)=$battr=~/\slang\s*=\s*['"]?([a-zA-Z-]+)/i;
2244     ($lang)=$head=~/<html[^>]+lang\s*=\s*['"]?([a-zA-Z-]+)/i if(!$lang);
2245     $lang=$opt_l if($opt_l);
2246     $lang='en' if(!$lang);
2247     $lang=lc $lang;
2248     if($battr=~/\stext\s*=\s*['"]?\s*#?(\w+)/i) {$tcol=&col2rgb($1)};
2249     if(!$tcol) {$tcol="Dt"};
2250     if($battr=~/\slink\s*=\s*['"]?\s*#?(\w+)/i) {$lcol=&col2rgb($1)};
2251     if(!$lcol) {$lcol="Dl"};
2252     &inihyph if($opt_H);
2253     ($bg)=$battr=~/BGCOLOR\s*=\s*["']?\s*#?(\w+)/i;
2254     $bg=&col2rgb($bg);
2255     if($bg) {
2256     ($red,$grn,$blu)=@cvec;
2257     } else {
2258     ($red,$grn,$blu)=$bgcol=~/#(\w+).*#(\w+).*#(\w+)/;
2259     $bg="Db";
2260     }
2261    
2262     $temp="";
2263     while(/<object$R/i) {
2264     $temp.=$`;
2265     $tag=$&;
2266     $end=$';
2267     $type=$tag=~/type\s*=\s*($S)/i?$+:"";
2268     $uaddr=$tag=~/data\s*=\s*($S)/i?$+:"";
2269     if($type=~/^text\/(html|plain)$/i
2270     || !$type && $uaddr=~m"(\.html?|://.+/|://[^/]+)$"i) {
2271     $tag=~/data\s*=\s*/i;
2272     if(&open($uaddr,$idoc)) {
2273     if($type=~/plain/i) {
2274     $idoc="<XMP>$idoc</XMP>";
2275     } else {
2276     &hb($idoc,$dum);
2277     }
2278     $_=$idoc;
2279     $_.=$' if($end=~/<\/object>/i);
2280     } else {
2281     &dbg("\n*** Error opening $uaddr\n");
2282     $_=$end;
2283     }
2284     } else {
2285     $temp.=$tag;
2286     $_=$end;
2287     }
2288     }
2289     $_=$temp.$_;
2290    
2291     if($opt_c && defined $package{'check'}) {
2292     $file=$html;
2293     if($html=~m|://|) {
2294     open(SCRATCH,">$scr");
2295     print SCRATCH;
2296     close SCRATCH;
2297     $file="$scr";
2298     }
2299     &dbg(`$package{'check'} $file`);
2300     }
2301    
2302     if(!$latin1) {
2303     if($opt_e=~/EUC-/i) {
2304     s/([\216\217\241-\376].)+/\000$&\000/g;
2305     &spec($_);
2306     s/\000(.+?)\000/)F1($1)F2(/g;
2307     } elsif($opt_e=~/SHIFT-JIS/i) {
2308     s/[\201-\237\340-\374][@-~\200-\374]/$&\000/g;
2309     s/[\241-\337]+(?!\000)/$&\000/g;
2310     s/[ -~\t\n\r\240]+(?!\000)/\002$&\001/g;
2311     &spec($_);
2312     s/\000//g;
2313     } else {
2314     while(/\e\$B([^\e]*)/) {
2315     $beg=$`;
2316     $end=$';
2317     $mat=$1;
2318     $mat=~s/\s//g;
2319     $_="$beg\001$mat$end";
2320     }
2321     s/\e\([BJ]/\002/g;
2322     &spec($_);
2323     }
2324     s/\001/)F1(/g;
2325     s/\002/)F2(/g;
2326     $_=")F2($_";
2327     y/\000-\010\013\016-\037\177//d;
2328     } else {
2329     &spec($_);
2330     y/\000-\010\013\016-\037\177-\237//d;
2331     }
2332     s/(\r\n|\r)/\n/g;
2333     $refs{$html}=$nref++ if(!defined $refs{$html});
2334     $_="\004$lang\004)WB $refs{$html} Sn($_";
2335    
2336     # Yes, I know Perl has case-insensitive pattern matching. But on my system
2337     # it takes about 10 times longer to run!
2338    
2339     $pt="";
2340     if(/<[pP][lL][aA][iI][nN][tT][eE][xX][tT]$R/) {$_=$`;$pt=$'};
2341     while($_){
2342     if(/(<[lL][iI][sS][tT][iI][nN][gG]$R)/) {$_=$`; $tag=$1; $rest=$';
2343     if(/<[xX][mM][pP]$R/){$_=$`; &Subst($_); $P2.="$_)XX("; $_=$'.$tag.$rest;
2344     if(m|</[xX][mM][pP]$R|) {$P2.="$`)RP("; $_=$'}
2345     else {$P2.=$'; $_=""}}
2346     else {&Subst($_); $P2.="$_)XX("; $_=$rest;
2347     if(m|</[lL][iI][sS][tT][iI][nN][gG]$R|) {$P2.="$`)RP("; $_=$'}
2348     else {$P2.=$'; $_=""}}}
2349     elsif(/<[xX][mM][pP]$R/) {$_=$`; &Subst($_); $P2.="$_)XX("; $_=$';
2350     if(m|</[xX][mM][pP]$R|) {$P2.="$`)RP("; $_=$'}
2351     else {$P2.=$'; $_=""}}
2352     else {&Subst($_);$P2.=$_; $_=""}
2353     }
2354     $pt=~s/\f/$pc/g;
2355     if($pt) {$P2.=")XX($pt"};
2356     $P2.=")";
2357     if($plain) {$P2.="RP ()"};
2358     while($P2=~/XX\(/) {
2359     $beg=$`;
2360     $'=~/\)(RP|$)/;
2361     $mat=$`;
2362     $end=$&.$';
2363     $mat=~s/(.*\n){30}.*/$&)WR(/g;
2364     ($temp=$mat)=~s/\)[^(]+\(//g;
2365     @prel=split(' *\n',$temp);
2366     $maxl=0;
2367     for $line (@prel) {
2368     $line=~s/\\.../x/g;
2369     while($line=~/\t+/) {
2370     $sp=' ' x (length($&)*8-length($`)%8);
2371     $line=~s/\t+/$sp/;
2372     $mat=~s/\t+/$sp/;
2373     }
2374     $ll=length($line);
2375     $maxl=$ll if($ll > $maxl);
2376     }
2377     $P2="$beg ".($#prel+1)." $maxl PR($mat$end";
2378     }
2379     $P1=~s/[\200-\377]/sprintf("\\%3.3o",ord($&))/eg;
2380     $P2=~s/[\200-\377]/sprintf("\\%3.3o",ord($&))/eg;
2381     $P2=~y/\t\f/ /;
2382     1;
2383     }
2384     sub Subst{
2385     local($_)=@_;
2386     if($page_break) {
2387     s/<!--NewPage-->/$pc/g;
2388     s/<(\?|hr\s+class\s*=\s*["']?)\s*page-break$R/$pc/gi;
2389     }
2390     s/<!--OddPage-->/)WB NL OP(/g;
2391     s/(&shy;?|&#173;?|<!--hy-->)/)HY(/g;
2392     while(/<!--/) {
2393     $_=$`;
2394     &getcom;
2395     $_.=$rest;
2396     }
2397     $temp="";
2398     while(/<([^"'>]*=\s*["'])/) {
2399     $temp.=$`."<";
2400     $_=$1.$';
2401     while(/^[^"'>]*=\s*(["'])/) {
2402     $temp.=$&;
2403     $_=$';
2404     if(/$1/) {
2405     ($tg=$`)=~y/>/\003/;
2406     $temp.=$tg.$&;
2407     $_=$';
2408     }
2409     }
2410     }
2411     $_=$temp.$_;
2412     $a='[aA][lL][iI][gG][nN]';
2413     $A="($a\\s*=\"?|[sS][tT][yY][lL][eE]\\s*=\\s*\"?[tT][eE][xX][tT]-\\s*$a:)";
2414     $I='[lL][eE][fF][tT]';
2415     $C='[cC][eE][nN][tT][eE][rR]';
2416     $D='[rR][iI][gG][hH][tT]';
2417     $J='[jJ][uU][sS][tT][iI][fF][yY]';
2418     $s='[sS][eE][lL][eE][cC][tT]';
2419     $F='[fF][oO][nN][tT]';
2420     $U='[cC][oO][lL][oO][rR]';
2421     s/<\w+[^>]*\s+[iI][dD]\s*=\s*($S)[^>]*>/$&<a name="$+">/g;
2422     s|<[dD][eE][lL]$R[\w\W]*?</[dD][eE][lL]>||g if($del{'display'}=~/^none$/);
2423     $ndiv=1;
2424     s|</?[dD][iI][vV]\d$R||g;
2425     s|<(/?)([dD][iI][vV])([>\s])|"<$1$2".($1?--$ndiv:$ndiv++).$3|eg;
2426     while(/<[dD][iI][vV](\d+)$R/) {
2427     $dbeg=$`;
2428     $dnum=$1;
2429     $dattr=$2;
2430     $dend=$';
2431     $div="";
2432     $ediv="";
2433     if($2=~/class\s*=\s*["']?noprint$R/i) {
2434     $_=$dbeg;
2435     $_.=$' if($dend=~/<\/[dD][iI][vV]$dnum>/);
2436     } else {
2437     if($dattr=~/$A\s*($I|$C|$D|$J)/) {
2438     $div.=")".$algn{"\L$2"}." Al(";
2439     $ediv.=")Ea(";
2440     }
2441     if($dattr=~/lang\s*=\s*["']?([a-zA-Z-]+)/i) {
2442     $lang=lc $1;
2443     $div.="\004$lang\004";
2444     &inihyph if($opt_H);
2445     $dbeg=~/(\004[^\004]*\004)[^\004]*$/;
2446     $ediv.=$1;
2447     }
2448     $dend=~s|</[dD][iI][vV]$dnum>|$ediv)BR(|;
2449     $_="$dbeg$div)BR($dend";
2450     }
2451     }
2452     s|<$C$R|)2 Al(|g;
2453     s|</$C$R|)Ea(|g;
2454     s|<(\w+)/([^/]+)/|<$1>$2</$1>|g;
2455     s/(<\w+[^>]*>)\n|\n(<\/\w+>)/$+/g;
2456     s|(<[lL][iI])$R\s*<[pP]>|)0 P($1$2|g;
2457     s/<[hH]([1-6])\s+$A\s*($I|$C|$D|$J)$R/)$algn{"\L$3"} $1 H(/g;
2458     s|<[hH]([1-6])$R|)0 $1 H(|g;
2459     s|</[hH][1-6]>|)EH(|g;
2460     s|<[bB][rR]$R|)BR(|g;
2461     s/<[pP]\s+[^>]*$A\s*($I|$C|$D|$J)$R/)$algn{"\L$2"} P(/g;
2462     s|<[pP]$R|)0 P(|g;
2463     s|</[pP]>|)EP(|g;
2464     s|<[aA][dD][dD][rR][eE][sS][sS]$R|)AD(|g;
2465     s|</[aA][dD][dD][rR][eE][sS][sS]>|)DA(|g;
2466     s|<[pP][rR][eE]$R\n?|)XX(|g;
2467     s|\n? *</[pP][rR][eE]>|)RP(|g;
2468     s|<[dD][tT]$R|)DT(|g;
2469     s|<[dD][dD]$R|)DD(|g;
2470     s|<[dD][lL]\s[^>]*[cC][oO][mM][pP][aA][cC][tT]$R|)1 DL(|g;
2471     s|<[dD][lL]$R|)0 DL(|g;
2472     s|</[dD][lL]>|)LD(|g;
2473     s|<[uU][lL]$R|)UL(|g;
2474     s|</[uU][lL]>|)LU(|g;
2475     s|<[mM][eE][nN][uU]$R|)UL(|g;
2476     s|</[mM][eE][nN][uU]>|)LU(|g;
2477     s|<[dD][iI][rR]$R|)UL(|g;
2478     s|</[dD][iI][rR]>|)LU(|g;
2479     s|<[oO][lL]\s[^>]*[sS][tT][aA][rR][tT]\s*=\s*['"]?(-?\d+)$R|$&)WB $1 Ln(|g;
2480     s|<[oO][lL]\s[^>]*[tT][yY][pP][eE]\s*=\s*['"]?([1iIaA])$R|)$lity{$1} OL(|g;
2481     s|<[oO][lL]$R|)4 OL(|g;
2482     s|</[oO][lL]>|)LO(|g;
2483     s|<[lL][iI]\s[^>]*[vV][aA][lL][uU][eE]\s*=\s*['"]?(-?\d+)$R|$&)WB $1 Ln(|g;
2484     s|<[lL][iI]\s[^>]*[tT][yY][pP][eE]\s*=\s*['"]?($ltr)$R|)$lity{$1} LI(|g;
2485     s|<[lL][iI]$R|)-1 LI(|g;
2486     s|</[lL][iI]$R||g;
2487     s"<([bB][qQ]|[bB][lL][oO][cC][kK][qQ][uU][oO][tT][eE])$R")BQ("g;
2488     s"</([bB][qQ]|[bB][lL][oO][cC][kK][qQ][uU][oO][tT][eE])>")QB("g;
2489     s|<[sS][tT][rR][oO][nN][gG]$R|)BD(|g;
2490     s|</[sS][tT][rR][oO][nN][gG]>|)ES(|g;
2491     s|<[sS][aA][mM][pP]$R|)SM(|g;
2492     s|</[sS][aA][mM][pP]>|)ES(|g;
2493     s|<[qQ]$R(\s*)|$2)Q(|g;
2494     s|(\s*)</[qQ]>|)EQ($1|g;
2495     s|<[cC][iI][tT][eE]$R|)CT(|g;
2496     s|</[cC][iI][tT][eE]>|)ES(|g;
2497     s|<[vV][aA][rR]$R|)I(|g;
2498     s|</[vV][aA][rR]>|)ES(|g;
2499     s|<[bB]$R|)BD(|g;
2500     s|</[bB]>|)ES(|g;
2501     s|<[iI]$R|)I(|g;
2502     s|</[iI]>|)ES(|g;
2503     s|<[tT][tT]$R|)TT(|g;
2504     s|</[tT][tT]>|)ES(|g;
2505     s|<[uU]$R|)UN(|g;
2506     s|</[uU]>|)NU(|g;
2507     s|<[sS]([tT][rR][iI][kK][eE])?$R|)SE(|g;
2508     s|</[sS]([tT][rR][iI][kK][eE])?>|)XE(|g;
2509     s|<[dD][fF][nN]$R|)I(|g;
2510     s|</[dD][fF][nN]>|)ES(|g;
2511     s|<[eE][mM]$R|)EM(|g;
2512     s|</[eE][mM]>|)ES(|g;
2513     s|<[cC][oO][dD][eE]$R|)SM(|g;
2514     s|</[cC][oO][dD][eE]>|)ES(|g;
2515     s|<[kK][bB][dD]$R|)KB(|g;
2516     s|</[kK][bB][dD]>|)ES(|g;
2517     s|<[bB][iI][gG]$R|)4 FZ(|g;
2518     s|</[bB][iI][gG]>|)ES(|g;
2519     s|<[sS][mM][aA][lL][lL]$R|)2 FZ(|g;
2520     s|</[sS][mM][aA][lL][lL]>|)ES(|g;
2521     s|<[iI][nN][sS]$R|)sM WB(|g;
2522     s|</[iI][nN][sS]>|)WB eM(|g;
2523     s|<[dD][eE][lL]$R|)sM $lt(|g;
2524     s|</[dD][eE][lL]>|)XE eM(|g;
2525     s|<[aA][cC][rR][oO][nN][yY][mM][^>]+[tT][iI][tT][lL][eE]\s*=\s*($S)[^>]*>|)($+)Ac(|g;
2526     s|</[aA][cC][rR][oO][nN][yY][mM]>|)Ca(|g;
2527     s|<[fF][oO][rR][mM][\w\W]*?</[fF][oO][rR][mM]>||g if(!$forms);
2528     s|</?[fF][oO][rR][mM]$R|)Ts BE(|g;
2529     s/<$s[^>]*[mM][uU][lL][tT][iI][pP][lL][eE]$R/)1 MS(<table>/g;
2530     s/<$s$R/)0 MS(<table>/g;
2531     s|</$s>|</table>|g;
2532     s/<[oO][pP][tT][iI][oO][nN]$R/<tr><td>)O(/g;
2533     while(/<[iI][nN][pP][uU][tT]$R/) {
2534     $beg=$`;
2535     $iattr=$1;
2536     $rest=$';
2537     $it=2;
2538     if($iattr=~/type\s*=\s*["']?(\w+)/i) {$it=$it{"\L$1"}};
2539     $siz=$iattr=~/size\s*=\s*["']?(\d+)/i?$1:12;
2540     $it="$siz $it" if($it==2);
2541     if(defined($it)) {
2542     $cmd=$it==3?"<img $iattr":")$it BX(";
2543     } else {
2544     $cmd="";
2545     }
2546     $_=$beg.$cmd.$rest;
2547     }
2548     while(/<[tT][eE][xX][tT][aA][rR][eE][aA]$R/) {
2549     $beg=$`;
2550     $txatr=$1;
2551     $rest=$';
2552     if($rest=~m|</[tT][eE][xX][tT][aA][rR][eE][aA]>|) {
2553     $rest=$';
2554     $data=$textarea_data?$`:"";
2555     $rows=4;
2556     $cols=20;
2557     if($txatr=~/rows\s*=\s*["']?(\d+)/i) {$rows=$1};
2558     if($txatr=~/cols\s*=\s*["']?(\d+)/i) {$cols=$1};
2559     $nl=$data=~y/\n/\n/;
2560     for ($nl..$rows) {$data.="\n"};
2561     $data=~/(.*\n){$rows}/;
2562     ($data=$&)=~s/.*\n/<tr height=24><td valign=top>)0 FZ($&)ES(/g;
2563     $wi=10*$cols;
2564     $_="$beg<table border width=$wi cellpadding=2>$data</table>$rest";
2565     } else {
2566     $_=$beg.$rest;
2567     }
2568     }
2569     $nfnt=1;
2570     s|<(/?)($F)([>\s])|"<$1$2".($1?--$nfnt:$nfnt++).$3|eg;
2571     while(/<$F(\d+)([^>]*)$U\s*=\s*["']?\s*#?(\w+)$R/) {
2572     $rgb=&col2rgb($3);
2573     $_=$`.($rgb?")WB $rgb Sc(":"")."<font$2$4";
2574     $temp=$';
2575     $temp=~s|</$F$1>|</font>)Ec(| if($rgb);
2576     $_.=$temp;
2577     }
2578     $base{"+"}="Bf add ";
2579     $base{"-"}="Bf add ";
2580     s/<$F\d*\s[^>]*[sS][iI][zZ][eE]\s*=\s*["']?([+-]?)(\d+\.?\d*)$R/)$1$2 $base{$1}FZ(/g;
2581     s|<$F\d*$R|)3 FZ(|g;
2582     s|</$F\d*>|)Ef(|g;
2583     s|<[bB][aA][sS][eE]$F\s[^>]*[sS][iI][zZ][eE]\s*=\s*["']?(\d+)$R|)$1 BZ(|g;
2584     while(/(<[aA]\s+[^>]*)[nN][aA][mM][eE]\s*=\s*(["']?)([^"'\s>]*)$R([^\s<)]*)/) {
2585     $lnk="$html#$3";
2586     $refs{$lnk}=$nref++ unless(defined $refs{$lnk});
2587     $_="$`$1$4$5)WB $refs{$lnk} Sn($'";
2588     }
2589     while(/<[aA]\s+[^>]*[hH][rR][eE][fF]\s*=\s*["']?\s*([^"'\s>]*)$R/) {
2590     $beg=$`;
2591     $tag=$&;
2592     $rest=$';
2593     $lnk=$1;
2594     $revtoc=$tag=~/rev\s*=['"]?\s*toc/i;
2595     $html=~m|[^/]*$|;
2596     $lnk=~s/^$&#/#/;
2597     $loc=$lnk=~/^#/;
2598     if($loc) {
2599     $html=~m|[^/]*$|;
2600     $lnk=$&.$lnk;
2601     }
2602     if($lnk=~m|.+//[^/]+$|) {$lnk=$&."/"}
2603     if($lnk=~m|://|) {
2604     $rlnk=0;
2605     } else {
2606     $rlnk=1;
2607     if($lnk=~m|^/|) {$lnk=$b1.$lnk} elsif($lnk!~m|^\w+:|) {$lnk=$b2.$lnk};
2608     }
2609     while($lnk!~m|^\.\./| && $lnk=~m|[^/]*/\.\./|) {$lnk=$`.$'};
2610     $lnk=~s"(^|/)\./"$1"g;
2611     ($doc)=$lnk=~/([^#]*)/;
2612     ($doctit{$doc})=$tag=~/title\s*=['"]([^'"]*)['"]/i;
2613     $T=0;
2614     $anch=2;
2615     if($loc || $opt_W && !$link && $level<=$maxlev && &follow){
2616     $refs{$lnk}=$nref++ unless(defined $refs{$lnk});
2617     $anch="$refs{$lnk} 1";
2618     $ltype=$rev && $revtoc && $ndoc==1 || $opt_C=~/f/ && $ndoc==1?1:0;
2619     $rest=~s|</a>|)$refs{$lnk} $ltype TN TL()Ec /AF f D(|i;
2620     if(&follow && !$levl{$doc}) {
2621     &dbg("Link: $doc\n") if($opt_d);
2622     $levl{$doc}=$level+1;
2623     push(@links,$doc);
2624     }
2625     } elsif(defined $refs{$lnk} || grep(/^$doc$/,(@docs,@links))) {
2626     $refs{$lnk}=$nref++ unless(defined $refs{$lnk});
2627     $anch="$refs{$lnk} 1";
2628     }
2629     $addr=$dum{$lnk}?"R$dum{$lnk}":0;
2630     if(!$dum{$lnk} && $lnk=~m|://|) {
2631     $dum{$lnk}=$nlnk++;
2632     $rfs.="/R$dum{$lnk} ($lnk) D\n";
2633     $addr="R$dum{$lnk}";
2634     }
2635     $_=$beg.")$addr $anch A(".$rest;
2636     }
2637     s|</[aA]>|)EA(|g;
2638     if((!$mult || $doc_sep eq $pc && $mult)
2639     && m|<[bB][aA][nN][nN][eE][rR]$R([\w\W]*)</[bB][aA][nN][nN][eE][rR]>|) {
2640     $banner=$2;
2641     $_=$`.$';
2642     }
2643     while(/<[tT][aA][bB][lL][eE]([^>]*)>/) {
2644     local($beg)=$`;
2645     local($rest)=$';
2646     $tattr=$1;
2647     $tag=$&;
2648     $rest=~/(<\/[tT][aA][bB][lL][eE]>|$)/;
2649     $table=$`;
2650     $rest=$';
2651     while($table=~/<[tT][aA][bB][lL][eE]([^>]*)>/) {
2652     $tattr=$1;
2653     $table=$';
2654     $beg.=$tag.$`;
2655     $tag=$&;
2656     }
2657     ($tla)=$tattr=~/lang\s*=\s*["']?([a-zA-Z-]+)/i;
2658     if(!$tla) {($tla)=$beg=~/\004_?([^\004]*)\004[^\004]*$/};
2659     $ntab++;
2660     $table=~s/^\s*//;
2661     undef %cells;
2662     undef %rd;
2663     undef @cali;
2664     undef @cval;
2665     undef @cgrp;
2666     undef @cwid;
2667     undef @codc;
2668     undef @r0;
2669     undef @c0;
2670     ($capat,$cap)=$table=~m|<caption$R([\w\W]*)</caption>|i;
2671     $capat=~/ALIGN\s*=\s*["']?\s*(\w+)/i;
2672     $capa=0;
2673     $capa=1 if("\L$1" eq "bottom");
2674     $capa=-1 if($cap!~/\S/);
2675     $bord=0;
2676     if($tattr=~/border/i) {
2677     ($bord)=$'=~/^\s*=\s*["']?(\d+)/;
2678     if(!$bord && $bord ne "0") {$bord=1};
2679     }
2680     ($talgn)=$tattr=~/ALIGN\s*=\s*["']?\s*(\w+)/i;
2681     $tal=-1;
2682     $tal=0 if($talgn=~/^left$/i);
2683     $tal=1 if($talgn=~/^center$/i);
2684     $tal=2 if($talgn=~/^right$/i);
2685     ($fra)=$tattr=~/FRAME\s*=\s*["']?\s*(\w+)/i;
2686     if($fra && $f{"\L$fra"}) {$fra=$f{"\L$fra"}} else {$fra=$bord?9:1};
2687     ($rul)=$tattr=~/RULES\s*=\s*["']?\s*(\w+)/i;
2688     if($rul && $r{"\L$rul"}) {$rul=$r{"\L$rul"}} else {$rul=$bord?5:1};
2689     unless(($twid)=$tattr=~/WIDTH\s*=\s*["']?(\d+\.?\d*%?)/i) {$twid=0};
2690     $twid=$twid=~/%$/?$`/100:-$twid;
2691     ($cpad)=$tattr=~/CELLPADDING\s*=\s*["']?\s*$V/i;
2692     if($tattr=~/CELLSPACING\s*=\s*["']?\s*$V/i && $1!=0) {$cpad+=$1/2};
2693     ($tbg)=$tattr=~/BGCOLOR\s*=\s*["']?\s*#?(\w+)/i;
2694     $tbg=&col2rgb($tbg);
2695     ($tcl)=$tattr=~/CLASS\s*=\s*["']?\s*(\w+)/i;
2696     $tcl="\L$tcl" eq "telelista"? 1: 0;
2697     $ic=0;
2698     $span=1;
2699     undef $gal;
2700     undef $gva;
2701     undef $odc;
2702     undef $gwi;
2703     $cgs=0;
2704     while($table=~/<[cC][oO][lL]([^>]*>)/g && $span>0) {
2705     $cola=$1;
2706     $ab=$`;
2707     $aft=$';
2708     $cola=~/(^|\s)ALIGN\s*=\s*["']?\s*(\w+)/i;
2709     $alg=$algn{"\L$2"};
2710     ($val)=$cola=~/VALIGN\s*=\s*["']?\s*(\w+)/i;
2711     $val=$v{"\L$val"};
2712     ($odc)=$cola=~/CHAR\s*=\s*["']?(.)/i;
2713     unless(($wid)=$cola=~/WIDTH\s*=\s*["'](\d+%?)/i) {$wid=0};
2714     if($wid=~/%$/) {$wid=$`/100};
2715     ($span)=$cola=~/SPAN\s*=\s*["']?\s*(\d+)/i;
2716     if(!$span && $span ne "0") {$span=1};
2717     $us=1;
2718     if($cola=~/^GROUP/i) {
2719     $gal=$alg;
2720     $gva=$val;
2721     $gdc=$odc;
2722     $gwi=$wid;
2723     $cgs=1;
2724     if($aft=~/<COL\s/i) {
2725     $us=$`=~m|</?COLGROUP|i;
2726     }
2727     } else {
2728     while($ab=~/<COLGROUP/i) {$ab=$'};
2729     if($ab=~m|</COLGROUP|i) {
2730     undef $gal;
2731     undef $gva;
2732     undef $odc;
2733     undef $gwi;
2734     }
2735     if(!$alg) {$alg=$gal};
2736     if(!$val) {$val=$gva};
2737     if(!$odc) {$odc=$gdc};
2738     if(!$wid) {$wid=$gwi};
2739     if($span eq "0") {
2740     $ic++;
2741     push(@cali,$alg);
2742     push(@cval,$val);
2743     push(@cwid,$wid);
2744     push(@codc,$odc);
2745     push(@cgrp,1);
2746     }
2747     }
2748     if($us) {
2749     for (1..$span) {
2750     $ic++;
2751     push(@cali,$alg);
2752     push(@cval,$val);
2753     push(@cwid,$wid);
2754     push(@codc,$odc);
2755     push(@cgrp,$cgs);
2756     $cgs=0;
2757     }
2758     }
2759     }
2760     $table=~/<t[hd][\s>]/i;
2761     if($`!~/<tr/i) {$table="<TR>$table"};
2762     $nrow=-1;
2763     $ncol=-1;
2764     $nhead=0;
2765     $nfoot=0;
2766     $nb=0;
2767     unless($table=~/<tbody$R/i || $table=~s|</tfoot>|$&<tbody>|i) {
2768     $table=~s|</thead>|$&<tbody>|i;
2769     }
2770     while($table=~/<[tT][rR]\s*([^>]*)>/g) {
2771     $nrow++;
2772     $ab=$`;
2773     $row=$';
2774     $rattr=$1;
2775     for $j (@c0) {
2776     $cells{"$nrow,$j,0"}=1;
2777     }
2778     $rgrp=0;
2779     if($ab=~/<tbody$R/i) {
2780     $ib=0;
2781     while($ab=~/<[tT][bB][oO][dD][yY]$R/g) {
2782     $ib++;
2783     $battr=$1;
2784     if($ib>$nb) {
2785     $rgrp=1;
2786     $nb=$ib;
2787     }
2788     }
2789     } else {
2790     if($ab=~/<tfoot$R/i) {
2791     $nfoot++;
2792     $battr=$1;
2793     } elsif($ab=~/<thead$R/i) {
2794     $nhead++;
2795     $battr=$1;
2796     }
2797     }
2798     $battr=~/(^|\s)ALIGN\s*=\s*["']?\s*(\w+)/i;
2799     $balgn=$algn{"\L$2"};
2800     $battr=~/VALIGN\s*=\s*["']?\s*(\w+)/i;
2801     $bva=$v{"\L$1"};
2802     ($bdc)=$battr=~/CHAR\s*=\s*["']?(.)/i;
2803     $rd{"$nrow,0"}=0;
2804     $rd{"$nrow,1"}=0;
2805     $rd{"$nrow,2"}=0 unless($rd{"$nrow,2"});
2806     $rd{"$nrow,3"}=$rgrp;
2807     $rattr=~/(^|\s)ALIGN\s*=\s*["']?\s*(\w+)/i;
2808     $ralgn=$algn{"\L$2"};
2809     $rattr=~/VALIGN\s*=\s*["']?\s*(\w+)/i;
2810     $rva=$v{"\L$1"};
2811     ($rla[$nrow])=$rattr=~/lang\s*=\s*["']?([a-zA-Z-]+)/i;
2812     ($rbg)=$rattr=~/BGCOLOR\s*=\s*["']?\s*#?(\w+)/i;
2813     $rbg[$nrow]=&col2rgb($rbg);
2814     ($rdc)=$rattr=~/CHAR\s*=\s*["']?(.)/i;
2815     if($row=~/<tr/i) {$row=$`};
2816     $rh[$nrow]=$rattr=~/HEIGHT\s*=\s*["']?(\d+)/i?$1:0;
2817     $icol=0;
2818     $colsp=1;
2819     while($row=~/<[tT]([hH]|[dD])(\s*[^>]*)>/g && $colsp>0) {
2820     $cattr=$2;
2821     $cell=$';
2822     $ctype=$1=~/h/i?1:0;
2823     if($cell=~/<t[hd]/i) {$cell=$`};
2824     $cell=~s/\s+$//;
2825     $cell=~s/\)HY\($/\255/;
2826     $cell=~s/[\200-\377]([^\\]|\\20.)/$&)WB(/g if(!$latin1);
2827     ($rowsp)=$cattr=~/ROWSPAN\s*=\s*["']?(\d+)/i;
2828     $rsp=$rowsp;
2829     if(!$rsp) {
2830     if($rsp eq "0") {
2831     push(@c0,$icol);
2832     } else {
2833     $rowsp=1;
2834     }
2835     $rsp=1;
2836     }
2837     ($colsp)=$cattr=~/COLSPAN\s*=\s*["']?(\d+)/i;
2838     $csp=$colsp;
2839     if(!$csp) {
2840     if($csp eq "0") {
2841     push(@r0,$nrow);
2842     $csp=$ncol-$icol<0? 1: $ncol-$icol+1;
2843     } else {
2844     $colsp=1;
2845     $csp=1;
2846     }
2847     }
2848     ($cdc)=$cattr=~/CHAR\s*=\s*["']?(.)/i;
2849     while($cells{"$nrow,$icol,0"}==1) {$icol++};
2850     #
2851     for $i ($nrow..$nrow+$rsp-2) {$rd{"$i,2"}=1};
2852     for $j ($icol..$icol+$csp-1) {
2853     for $i ($nrow..$nrow+$rsp-1) {
2854     $cells{"$i,$j,0"}=1;
2855     }
2856     }
2857     if($colsp) {
2858     for $j ($ncol+1..$icol+$csp) {
2859     for $i (@r0) {
2860     $cells{"$i,$j,0"}=1;
2861     }
2862     }
2863     }
2864     if($ic<$icol+$csp) {
2865     for ($ic..$icol+$csp-1) {
2866     push(@cali,$cali[$ic-1]);
2867     push(@cval,$cval[$ic-1]);
2868     push(@cgrp,0);
2869     }
2870     $ic=$icol+$csp;
2871     }
2872     $cal=$ctype;
2873     $cal=$balgn-1 if($balgn);
2874     $cal=$ralgn-1 if($ralgn);
2875     $cal=$cali[$icol]-1 if($cali[$icol]);
2876     if($cattr=~/(^|\s)ALIGN\s*=\s*["']?\s*(\w+)/i) {
2877     $cal=$algn{"\L$2"}-1 if($algn{"\L$2"});
2878     }
2879     $cvl=2;
2880     $cvl=$cval[$icol] if($cval[$icol]);
2881     $cvl=$bva if($bva);
2882     $cvl=$rva if($rva);
2883     if($cattr=~/VALIGN\s*=\s*["']?\s*(\w+)/i) {
2884     $cvl=$v{"\L$1"} if($v{"\L$1"});
2885     }
2886     ($cbg)=$cattr=~/BGCOLOR\s*=\s*["']?\s*#?(\w+)/i;
2887     $cbg=&col2rgb($cbg);
2888     for($rbg[$nrow],$tbg,$deftbg,$bg) {$cbg=$_ if(!$cbg)};
2889     $now=0;
2890     if($cattr=~/NOWRAP/i || $cal==4) {$now=1};
2891     $dc=".";
2892     $dc=$bdc if($bdc || $bdc eq "0");
2893     $dc=$rdc if($rdc || $rdc eq "0");
2894     $dc=$codc[$icol] if($codc[$icol] || $codc[$icol] eq "0");
2895     $dc=$cdc if($cdc || $cdc eq "0");
2896     ($wid)=$cattr=~/WIDTH\s*=\s*["'](\d+%)/i;
2897     if($wid=~/%$/) {$wid=$`/100};
2898     if($wid>$cwid[$icol]) {$cwid[$icol]=$wid};
2899     if($cpad || $cpad eq "0") {
2900     $clm=$cpad;
2901     $crm=$cpad;
2902     $ctm=$cpad;
2903     $cbm=$cpad;
2904     } else {
2905     $clm=$rul<5?8:4;
2906     $crm=$rul<5?8:4;
2907     $ctm=2;
2908     $cbm=6;
2909     }
2910     if($tcl==1) {
2911     $clm=$icol>0?12:2;
2912     $crm=12;
2913     $ctm=0;
2914     $cbm=0;
2915     }
2916     if($rul==1 && $fra==1 && $icol==0 && $tal==0) {$clm=0};
2917     ($lang)=$cattr=~/lang\s*=\s*["']?([a-zA-Z-]+)/i;
2918     for($rla[$nrow],$tla) {$lang=$_ if(!$lang)};
2919     $lang=lc $lang;
2920     &inihyph if($opt_H);
2921     $cbg=~/#(\w+).*#(\w+).*#(\w+)/;
2922     &img($cell,$1,$2,$3);
2923     @cll=("{(\004$lang\004)WB($cell)}",0,0,$ctype,0,$colsp,$rowsp,$cal,
2924     "($dc)",$cvl,$now,$clm,$crm,$ctm,$cbm,0,0,0,0,$cbg);
2925     for $i (0..$#cll) {$cells{"$nrow,$icol,$i"}=$cll[$i]};
2926     $icol+=$csp;
2927     if($icol-1>$ncol) {$ncol=$icol-1};
2928     }
2929     }
2930     for $j (0..$ncol) {
2931     for $i (0..$nrow) {
2932     if($cells{"$i,$j,0"} && $cells{"$i,$j,0"}!=1) {
2933     if($cells{"$i,$j,6"}>$nrow-$i+1) {$cells{"$i,$j,6"}=$nrow-$i+1};
2934     if($cells{"$i,$j,6"}>1) {$rd{"$i,2"}=1};
2935     }
2936     }
2937     }
2938     $rd{"$nrow,2"}=0;
2939     $rw="[";
2940     for $i (0..$nrow) {
2941     $rw.="[$rh[$i] ".$rd{"$i,1"}." ".$rd{"$i,2"}." ".$rd{"$i,3"}." 0 0 [";
2942     for $j (0..$ncol) {
2943     $cbg="";
2944     for($rbg[$i],$tbg,$deftbg,$bg) {$cbg=$_ if(!$cbg)};
2945     $temp="[{()} 0 0 0 0 1 1 0 (.) 0 0 $clm $crm $ctm $cbm 0 0 0 0 $cbg]";
2946     if($cells{"$i,$j,0"}==1) {
2947     $temp="0";
2948     } elsif($cells{"$i,$j,0"}) {
2949     $temp="[";
2950     for $k (0..$#cll) {
2951     $temp.=$cells{"$i,$j,$k"}." ";
2952     }
2953     $temp.="]";
2954     }
2955     $rw.="$temp\n";
2956     }
2957     $rw.="]]\n";
2958     }
2959     if($nrow==$nhead+$nfoot-1) {
2960     $nhead=0;
2961     $nfoot=0;
2962     }
2963     $tdesc="[0 0 $tcl 0 0 $tal 0 $twid $bord $nrow $ncol"
2964     ." $nhead $nfoot $fra $rul {($cap)} $capa]\n";
2965     $cdesc="[";
2966     for (0..$ncol) {
2967     unless($wid=$cwid[$_]) {$wid=0};
2968     $cdesc.="[0 0 0 $wid $cgrp[$_] 0 0]";
2969     }
2970     $cdesc.="]\n";
2971     $tables.="[$tdesc $cdesc $rw]]\n";
2972     $_=$beg.")$ntab PT(".$rest;
2973     }
2974     &img($_,$red,$grn,$blu);
2975     &ack($_);
2976     $_[0]=$_;
2977     }
2978     sub getcom{
2979     $com=$&;
2980     $'=~/--\s*(--|>)/;
2981     $com.=$`.$&;
2982     $rest=$';
2983     while($1 eq "--") {
2984     if($'!~/--\s*(--|>)/) {$'=~/(>)/};
2985     $com.=$`.$&;
2986     $rest=$';
2987     }
2988     }
2989     sub getl {
2990     ($l)=@_;
2991     if(!$lid{$l}) {
2992     while($l=~s/-[^-]+$// && !$lid{$l}) {};
2993     }
2994     $lid{$l};
2995     }
2996     sub ack {
2997     local($_)=@_;
2998     chdir $tempdir;
2999     while (/<[mM][aA][tT][hH]/) {
3000     $beg=$`;
3001     $rest=$&.$';
3002     $rest=~m|</[mM][aA][tT][hH]>|;
3003     $end=$';
3004     $math=$`;
3005     if(&math2sym($math)) {
3006     $_=$beg.$sym.$end;
3007     } elsif($package{'TeX'} && $package{'dvips'}) {
3008     $math=~s|\\200|\\|g;
3009     $math=~s|\\201|\(|g;
3010     $math=~s|\\202|\)|g;
3011     &math2tex($math);
3012     open(SCRATCH,">$scr.tex");
3013     print SCRATCH $tex;
3014     close SCRATCH;
3015     `tex $scr.tex`;
3016     `dvips -E $scr.dvi`;
3017     open(LOG,"$scr.log");
3018     $log=<LOG>;
3019     close LOG;
3020     ($h,$d)=$log=~/[\w\W]*$prog: +([\d.]+)pt: +([\d.]+)/ ? ($1,$2) : (1,0);
3021     $above=$h+$d>0?sprintf("%.4f",$h/($h+$d)):0;
3022     open(PS,"$scr.ps");
3023     $pic=<PS>;
3024     if($pic=~/^%!/ && $pic=~/%%BoundingBox: +$V +$V +$V +$V/) {
3025     $xs=$3-$1;
3026     $ys=$4-$2;
3027     $llx=$1;
3028     $lly=$2;
3029     $ps="";
3030     for $i (split(/\n/,$pic)) {
3031     $ps.=$i."\n" if($i && $i!~/^%/);
3032     }
3033     if($ps=~/\nTeXDict begin/) {
3034     if(!$ph) {
3035     $ph="/DH {1 F div dup scale /showpage {} D\n$`$&} D\n%EndDH\n";
3036     $pv=$ph.$pv;
3037     }
3038     $ps="save -$llx -$lly translate\nDH$' restore";
3039     }
3040     }
3041     $nimg++;
3042     $nps--;
3043     push(@XS,$xs);
3044     push(@YS,$ys);
3045     push(@IX,$nps);
3046     push(@IT,2);
3047     $pv.="/P$nimg {$ps} D\n";
3048     $eps{"P$nimg"}=$ps;
3049     $_=$beg.")$above 3 (P$nimg) $nimg IM(".$end;
3050     } else {
3051     $math=~s/<math$R//i;
3052     $_=$beg.$math.$end;
3053     }
3054     }
3055     chdir $cwd;
3056     s|<[sS][uU][bB]$R|)Sb(|g;
3057     s|<[sS][uU][pP]$R|)Sp(|g;
3058     s"</[sS][uU]([bB]|[pP])>")Es("g;
3059     s|<[A-Za-z/!?]\w*$R||g;
3060     &ent($_);
3061     y/\003/>/;
3062     s/\004([^\004]*)\004/")".&getl($1)." Sl($&"/eg;
3063     if($opt_H) {
3064     &dbg("Inserting potential hyphenation points\n") if($opt_d && $ndoc>0);
3065     $temp="";
3066     while(/\004([^\004]*)\004/) {
3067     $temp.=$`;
3068     $lang=$1;
3069     $end=$';
3070     if($end=~/\004([^\004]*)\004/) {
3071     $htext=$`;
3072     $end=$&.$';
3073     } else {
3074     $htext=$end;
3075     $end="";
3076     }
3077     $apa="";
3078     while($htext=~/(..?)\(([^)]*)/) {
3079     $slut=$';
3080     if($1 eq "XX") {
3081     $apa.=$`.$&;
3082     if($'=~/RP\(/) {
3083     $apa.=$`;
3084     $htext=$&.$';
3085     } else {
3086     $apa.=$slut;
3087     $htext="";
3088     }
3089     } elsif($1 eq ") ") {
3090     $apa.=$`.$&;
3091     $htext=$';
3092     } else {
3093     $apa.="$`$1(";
3094     $htext=$';
3095     ($txt=$2)=~s/[$ltrs]{$hyphenation{'min'},}/&hyph($&)/eg;
3096     $apa.=$txt;
3097     }
3098     }
3099     $_=$apa.$slut.$end;
3100     }
3101     $_=$temp.$_;
3102     }
3103     s/\004([^\004]*)\004//g;
3104     $_[0]=$_;
3105     }
3106     sub ent {
3107     local($_)=@_;
3108     for $char (keys %ent) {s/&($char)(;|$|(?=\W))/chr($ent{$char})/eg};
3109     for $char (keys %symb) {s/&($char)(;|$|(?=\W))/)SY(\\$symb{$char})ES(/g};
3110     s|&lt;?|<|g;
3111     s|&gt;?|>|g;
3112     s|&quot;?|"|g;
3113     s/&($space);?/)$space{$1} Se(/g;
3114     s|&#x($X+);?|"&#".hex($1).";"|eg;
3115     s|&#(\d+);?|$1==38?"\005":$1<256?chr($1):$&|eg;
3116     s/(\005|&amp;?)/\&/g;
3117     $_[0]=$_;
3118     }
3119     sub spec {
3120     $_[0]=~s/(\\|&#92(;|$|(?=\W)))/\\200/g;
3121     $_[0]=~s/(\(|&#40(;|$|(?=\W)))/\\201/g;
3122     $_[0]=~s/(\)|&#41(;|$|(?=\W)))/\\202/g;
3123     $_[0]=~s/&(there4|#8756)(;|$|(?=\W))/)SY(\\200)ES(/g;
3124     }
3125     sub math2tex {
3126     local($_)=@_;
3127     local($beg,$rest);
3128     %a=("line","overline",
3129     "cub","overbrace",
3130     "hat","widehat",
3131     "tilde","widetilde",
3132     "larr", "overleftarrow",
3133     "rarr", "overrightarrow");
3134     %b=("line","underline",
3135     "cub","underbrace",
3136     "hat","widehat",
3137     "tilde","widetilde");
3138     %s=("medium","\\big",
3139     "large","\\Big",
3140     "huge","\\bigg");
3141     ($mattr)=/<math$R/i;
3142     $st=$mattr=~/class\s*=\s*["']?chem/i?'\rm ':'';
3143     $di=$mattr=~/class\s*=\s*["']?displayed/i?'\displaystyle ':'';
3144     s/<math$R//gi;
3145     s/\\/\\backslash/g;
3146     s/__/_\\>_/gi;
3147     s/\^\^/^\\>^/gi;
3148     s/_([^_]+)_/_{$1}/g;
3149     s/\^([^^]+)\^/^{$1}/g;
3150     s/&thinsp;?/\\,/g;
3151     s/&sp;?/\\>/g;
3152     s/&emsp;?/\\;/g;
3153     s/&nbsp;?/\\>/g;
3154     s/&epsi;?/\\varepsilon /g;
3155     s/&upsi;?/\\upsilon /g;
3156     s/&piv;?/\\varpi /g;
3157     s/&sigmav;?/\\varsigma /g;
3158     s/&thetav;?/\\vartheta /g;
3159     s/&phiv;?/\\varphi /g;
3160     s/&Upsi;?/\\Upsilon /g;
3161     s/&omicron;?/o/g;
3162     s/&plusmn;?/\\pm /g;
3163     s/&or;?/\\vee /g;
3164     s/&and;?/\\wedge /g;
3165     s/&ap;?/\\approx /g;
3166     s/&sube;?/\\subseteq /g;
3167     s/&sub;?/\\subset /g;
3168     s/&supe;?/\\supseteq /g;
3169     s/&sup;?/\\supset /g;
3170     s/&isin;?/\\in /g;
3171     s/&larr;?/\\leftarrow /g;
3172     s/&rarr;?([_^])/\\mathop\\rightarrow\\limits$1 /g;
3173     s/&rarr;?/\\rightarrow /g;
3174     s/&uarr;?/\\uparrow /g;
3175     s/&darr;?/\\downarrow /g;
3176     s/&harr;?/\\leftrightarrow /g;
3177     s/&lArr;?/\\Leftarrow /g;
3178     s/&rArr;?/\\Rightarrow /g;
3179     s/&uArr;?/\\Uparrow /g;
3180     s/&dArr;?/\\Downarrow /g;
3181     s/&exist;?/\\exists /g;
3182     s/&inf;?/\\infty /g;
3183     s/&?int;?/\\int\\limits /g;
3184     s/&?sum;?/\\sum\\limits /g;
3185     s/&?prod;?/\\prod\\limits /g;
3186     s/&pd;?/\\partial /g;
3187     s/&lcub;?/\\{/g;
3188     s/&rcub;?/\\}/g;
3189     s/<t>/\\hbox{/gi;
3190     s/<b>/\\bf /gi;
3191     s/<bt>/{\\bf\\hbox{/gi;
3192     s/<sub$R/_{/gi;
3193     s/<sup$R/\^{/gi;
3194     s/<box\s*size=["']?(\w+)["']?>/{\\def\\lft{$s{$1}}\\def\\rgt{$s{$1}}/gi;
3195     s/<box$R/{/gi;
3196     s/<text\s*>/\\hbox{/gi;
3197     s/([\(\[\|])\s*<left>/\\lft$1/gi;
3198     s/<right>/\\rgt /gi;
3199     s/<(atop|choose|over)>/\\\L$1 /gi;
3200     s/<of>/}\\of{/gi;
3201     s/<bar>/\\overline{/gi;
3202     s/<vec>/\\overrightarrow{/gi;
3203     s/<hat>/\\widehat{/gi;
3204     s/<tilde>/\\widetilde{/gi;
3205     s/<(sqrt|root|vec|dot|ddot|hat|tilde)>/\\\L$1\{/gi;
3206     while(/<above\s+sym\s*=\s*["']?equals["']?\s*>/i) {
3207     $beg=$`."\\overline{\\overline{";
3208     $rest=$';
3209     $rest=~s/<\/above>/}}/i;
3210     $_=$beg.$rest;
3211     }
3212     s/<above\s*>/\\overline{/gi;
3213     s/<above\s+sym\s*=\s*["']?(\w+)["']?\s*>/\\$a{$1}\{/gi;
3214     s/<below\s*>/\\underline{/gi;
3215     s/<below\s+sym\s*=\s*["']?(\w+)["']?\s*>/\\$b{$1}\{/gi;
3216     s/<\/(math|row|item|b)>//gi;
3217     s/<\/(box|t|sup|sub|sqrt|root|vec|bar|dot|ddot|hat|tilde|above|below|text|array)>/}/gi;
3218     s/<\/bt>/}}/gi;
3219     s/&lt;?/< /gi;
3220     s/&gt;?/>/gi;
3221     s/&(\w+);?/\\$1 /gi;
3222     s/<array$R/\\matrix{/gi;
3223     s/<row>\s*<item$R//i;
3224     s/<row>\s*<item$R/\\cr /gi;
3225     s/<item>/&/gi;
3226     s/<[^ ]$R//gi;
3227     s/\n*$//;
3228     $tex="\\batchmode\\magnification=$mag\\hsize=40cm\\nopagenumbers\n"
3229     ."\\def\\lft{\\left}\\def\\rgt{\\right}\n\\setbox0=\\hbox{\$$st$di".$_."\$}\n"
3230     ."\\immediate\\write0{$prog: \\the\\ht0: \\the\\dp0}\\box0\n\\end\n";
3231     }
3232     sub Getopts {
3233     local($optlist)=@_;
3234     local(@args,$_,$opt,$opts,$rest,$olist,$plist,$found,@popts);
3235     local($errs)=0;
3236     local($[)=0;
3237     @args=split( /\|/, $optlist );
3238     for $opt (@args) {
3239     if(substr($opt,-1,1) ne ':') {$olist.=$opt}
3240     else {$plist.=$opt}
3241     }
3242     @popts=split(/:/,$plist);
3243     while(@ARGV && ($_=$ARGV[0]) =~ /^-(.*)/) {
3244     $opt=$1;
3245     if($opt=~/^-/ && $optalias{"\L$'"}) {$opt=$optalias{"\L$'"}};
3246     if($opt =~ /^[$olist]+$/) {
3247     while ($char=chop $opt) {eval "\$opt_$char=1"}
3248     shift(@ARGV);
3249     }
3250     else {
3251     $found=0;
3252     for $opts (@popts) {
3253     $rest=substr($opt,length($opts));
3254     if(index($opt,$opts)==0) {
3255     $found=1;
3256     shift(@ARGV);
3257     if(length($rest)==0) {
3258     ++$errs unless @ARGV;
3259     $rest=shift(@ARGV);
3260     }
3261     eval "\$opt_$opts=\$rest";
3262     }
3263     }
3264     if(!$found) {
3265     &dbg("Unknown option: $opt\n");
3266     ++$errs;
3267     shift(@ARGV);
3268     }
3269     }
3270     }
3271     $errs==0;
3272     }
3273     sub openps {
3274     open(STDOUT,">$opt_o") || die "*** Error opening $opt_o for output\n";
3275     }
3276     sub getalt {
3277     if($imgcmd eq "img") {
3278     $alt="";
3279     $match=0;
3280     if($img=~/alt\s*=\s*"([^"]*)"/i) {$alt=$1; $match=1};
3281     if(!$match && $img=~/alt\s*=\s*([\w\.-]+)/i) {$alt=$1; $match=1};
3282     if(!$match) {$alt=")WB IA WB("};
3283     $text="$alt )WB(";
3284     return;
3285     }
3286     if($imgcmd eq "hr") {
3287     $text=$img=~/align\s*=\s*["']?(left|center|right)/i?")$algn{$1} ":")2 ";
3288     $text.=$img=~/size\s*=\s*["']?$V/i?$1:.6;
3289     $wd=1;
3290     if($img=~/width\s*=\s*["']?$V(%?)/i) {$wd=$2?$1/100:-$1};
3291     $text.=" $wd HR(";
3292     return;
3293     }
3294     if($imgcmd eq "fig") {
3295     $text=")BN(";
3296     }
3297     }
3298     sub xbmtops {
3299     $fc=1;
3300     $dp=1;
3301     ($xs,$ys)=$pic=~/^#define.* (\d+)[\w\W]*^#define.* (\d+)/;
3302     $nd=2*int(($xs+7)/8)*$ys;
3303     ($pic)=$pic=~/[^#].* char.*[\w\W]*{([\w\W]*)}/;
3304     $pic=~s/[ ,\n\r]*0x[ ,]*//g;
3305     $pic=~y/01246789bdef/f7bd91e62480/;
3306     $bm=unpack("H*", pack("h*",$pic));
3307     }
3308     sub pmtops {
3309     $pm=~/^P([4-6])/;
3310     $maptype=$1;
3311     return if(!$maptype);
3312     $pm=$';
3313     $bm="";
3314     $nint=3;
3315     $dp=8;
3316     if($maptype==4) {
3317     $nint=2;
3318     $dp=1;
3319     }
3320     undef @num;
3321     $found=0;
3322     while($pm && $found<$nint) {
3323     if($pm=~/^\s*(\d+)/) {$num[$found]=$1};
3324     if($num[$found]) {
3325     $found++;
3326     $pm=$';
3327     } elsif($pm=~/^\s*#.*\n/) {
3328     $pm=$';
3329     } else {
3330     return;
3331     }
3332     }
3333     ($b)=$pm=~/\s([\w\W]*)/;
3334     ($xs,$ys,$bits)=@num;
3335     return if($bits>255);
3336     $fc=1;
3337     if($maptype==6) {
3338     $fc=3;
3339     $nd=6*$xs*$ys;
3340     $bm=unpack("H*",$b);
3341     } else {
3342     $bm=unpack("H*",$b);
3343     if($maptype==4) {
3344     $nd=2*int(($xs+7)/8)*$ys;
3345     $bm=~y/0123456789abcdef/fedcba9876543210/;
3346     } else {
3347     $nd=2*$xs*$ys;
3348     }
3349     }
3350     }
3351     sub trans {
3352     $next = 13;
3353     $temp = ord substr($pic,10,1);
3354     if($temp & 0x80) {$next += 3*2**(($temp & 0x07) + 1)} else {return};
3355     $byte = ord substr($pic,$next,1);
3356     while($byte != 0x3b && $next <= length $pic) {
3357     if($byte == 0x21) {
3358     if(ord substr($pic,$next+1,1) == 0xf9) {
3359     if(ord substr($pic,$next+3,1) & 0x01) {
3360     &dbg("Transparent\n") if($opt_d);
3361     $src{$URL}=$pic;
3362     $idx = 3*(ord substr($pic,$next+6,1))+13;
3363     substr($pic,$idx,3) = pack("H*",$red.$grn.$blu) if($idx<length $pic);
3364     }
3365     return;
3366     $next += 2;
3367     &skip;
3368     } else {
3369     $next += 2;
3370     &skip;
3371     }
3372     } elsif($byte == 0x2c) {
3373     $next += 10;
3374     $temp = ord substr($pic,$next-1,1);
3375     if($temp & 0x80) {$next += 3*2**(($temp & 0x07) + 1)};
3376     $next++;
3377     &skip;
3378     } else {return}
3379     }
3380     }
3381     sub skip {
3382     $byte = ord substr($pic,$next,1);
3383     while($byte != 0) {
3384     $next += $byte + 1;
3385     $byte = ord substr($pic,$next,1);
3386     }
3387     $next++;
3388     $byte = ord substr($pic,$next,1);
3389     }
3390     sub run {
3391     &dbg("@_\n") if($opt_d);
3392     $pm=`@_`;
3393     }
3394     sub geturl {
3395     local($url)=@_;
3396     &dbg("Retrieving $url");
3397     if($package{'libwww-perl'} || $package{'jfriedl'}) {
3398     warn "\n";
3399     &gu();
3400     if($code==401) {
3401     &prompt("\nDocument requires username and password\n\nUsername: ",$user);
3402     &prompt("Password: ",$pass);
3403     &gu($user,$pass);
3404     }
3405     $_[1]=$cont;
3406     } elsif(defined $geturl) {
3407     &dbg("...");
3408     $_[1]=`$geturl '$url'`;
3409     if($?) {
3410     &dbg("\n*** Error opening $url\n");
3411     return 0;
3412     }
3413     &dbg("done\n");
3414     if($_[1]=~/\r?\n\r?\n/) {
3415     $_[1]=$';
3416     $dhead=$`;
3417     ($code)=$dhead=~/HTTP\/\S+ +(\d+)/i;
3418     ($contyp)=$dhead=~/Content-type:\s+(.*)/i;
3419     } else {
3420     $code=500;
3421     }
3422     }
3423     $_[0]=$url;
3424     $code<300;
3425     }
3426     sub gu {
3427     if($package{'libwww-perl'}) {
3428     require LWP::UserAgent;
3429     $ua=new LWP::UserAgent;
3430     $req = HTTP::Request->new(GET => $url);
3431     $req->authorization_basic(@_) if(@_);
3432     $ua->agent($spoof) if($spoof);
3433     my $res = $ua->request($req);
3434     $code=$res->code;
3435     $contyp=$res->header('content-type');
3436     $cont=$res->content;
3437     } else {
3438     require "www.pl";
3439     @opts=@_?("authorization=$_[0]:$_[1]"):();
3440     push(@opts,"quiet") if(!$opt_d);
3441     $www::useragent=$spoof if($spoof);
3442     ($status,$memo,%info)=&www::open_http_url(*FILE,$url,@opts);
3443     $code=$info{'CODE'};
3444     ($contyp)=$info{'HEADER'}=~/Content-type:\s+(.*)/i;
3445     $cont=<FILE>;
3446     }
3447     }
3448     sub pictops {
3449     if($opt_g) {
3450     $fc=1;
3451     $pg1="pgm";
3452     $pg2="|ppmtopgm";
3453     } else {
3454     $fc=3;
3455     $pg1="ppm";
3456     $pg2="";
3457     }
3458     ($type)=$URL=~/([^\?]+)\??/;
3459     ($type)=$type=~/\.(\w+)$/;
3460     $bm="";
3461     $ps="";
3462     $pm="";
3463     if($opt_U && $src{$URL} && !$cmd{$URL.$red.$grn.$blu}) {
3464     $pic=$src{$URL};
3465     } elsif($URL=~m|://|) {
3466     &geturl($URL,$pic) || return;
3467     } else {
3468     $flag=0;
3469     if($opt_O) {
3470     $orig=$URL;
3471     unless($orig=~s/\.\w*$/.ps/) {$orig.=".ps"};
3472     if(open(ORIG,"$orig")) {
3473     $pic=<ORIG>;
3474     close ORIG;
3475     if($pic=~/^%!/ && $pic=~/%%BoundingBox:/) {
3476     $flag=1;
3477     &dbg("Using $orig as original for $URL\n") if($opt_d);
3478     }
3479     }
3480     }
3481     if(!$flag) {
3482     if(open(PIC,"$URL")) {
3483     binmode PIC;
3484     $pic=<PIC>;
3485     close PIC;
3486     } else {
3487     &dbg("*** Error opening $URL\n");
3488     return;
3489     }
3490     }
3491     }
3492     $pic=~s/^[\n\r]*//;
3493     &trans if($pic=~/^GIF/);
3494     open(SCRATCH,">$scr");
3495     print SCRATCH "$pic";
3496     close SCRATCH;
3497     if($pic=~/^%!/ && $pic=~/%%BoundingBox: +$V +$V +$V +$V/) {
3498     $xs=$3-$1;
3499     $ys=$4-$2;
3500     $ps="save\n0 0 M\nIS IS scale\n/showpage {}D\n-$1 -$2 translate\n";
3501     for $i (split(/\n/,$pic)) {
3502     $ps.=$i."\n" if($i && $i!~/^%/);
3503     }
3504     $ps.="restore";
3505     } elsif($type=~/.xbm$/i || $pic=~/^#define/) {
3506     &xbmtops;
3507     } elsif($package{'ImageMagick'}) {
3508     if($package{'PerlMagick'}) {
3509     $imobj=Image::Magick->new;
3510     $mess=$imobj->Read($scr);
3511     if($mess) {
3512     &dbg("$mess\n");
3513     } else {
3514     $mess=$imobj->Write("$scr\.$pg1");
3515     &dbg("$mess\n") if($mess);
3516     }
3517     undef $imobj;
3518     } else {
3519     # &run("convert $scr $pg1:-");
3520     &run("convert $scr $scr\.$pg1");
3521     }
3522     open(PNM,"$scr\.$pg1");
3523     binmode PNM;
3524     $pm=<PNM>;
3525     close PNM;
3526     if(!$pm && $pic=~/^\377\330/ && $package{'djpeg'}) {
3527     &run("djpeg $scr$pg2");
3528     }
3529     } elsif($pic=~/^\377\330/ && $package{'djpeg'}) {
3530     &run("djpeg $scr$pg2");
3531     } elsif($package{'pbmplus'} || $package{'netpbm'}) {
3532     if($pic=~/^GIF/) {
3533     &run("$giftopm $scr");
3534     } else {
3535     &run("anytopnm $scr");
3536     }
3537     if($opt_g && $pm=~/^P6/) {
3538     open(SCRATCH,">$scr");
3539     print SCRATCH $pm;
3540     close SCRATCH;
3541     &run("ppmtopgm $scr");
3542     }
3543     }
3544     &pmtops if(!$bm);
3545     return if(!$bm);
3546     $bm=substr($bm,0,$nd);
3547     $pad=$nd-length($bm);
3548     if($pad) {$bm.="f" x $pad};
3549     $bm=~s/(.{60})/$1\n/g;
3550     }
3551     sub math2sym {
3552     local($_)=@_;
3553     s/<math$R//gi;
3554     for $char (keys %symb) {s/&($char)(;|$|(?=\W))/\\$symb{$char}/g};
3555     $stat=!/([&<][a-zA-Z]|[_^{])/;
3556     s/[a-zA-Z\s]*[a-zA-Z][a-zA-Z\s]*/)ES()I($&)ES()SY(/g;
3557     s/(\\200|\\201|\\202)/)RO($&)ES(/g;
3558     $sym=")SY($_)ES(";
3559     $stat;
3560     }
3561     sub varsub {
3562     for (@_) {
3563     if(s/(^|[^\\])\$(T|N|U|H|A)/$1)join $vars{$2} join(/g) {$_="()$_\join"};
3564     s/(^|[^\\])\$D\{($S)\}/"$1".POSIX::strftime($+,@now)/eg;
3565     s/(^|[^\\])\$D/"$1".POSIX::strftime($datefmt,@now)/eg;
3566     s/(^|[^\\])\\/$1/g;
3567     s/\(\)join//g;
3568     s/\(\) ?(\([^)]*\)|\w+) ?join/$1/g;
3569     }
3570     }
3571     sub follow {
3572     return 0 if(!$opt_W);
3573     $H=$lnk=~/\.html?(#|$)/i || $lnk=~m|.+//.+/[^/\.]*$|;
3574     $T=$rev && ($revtoc && $ndoc==1 || $ndoc>1 && $H);
3575     $L=$b1=~m|://| && $lnk=~m"^$b1(/|$)" || $b1!~m|://| && $lnk!~m|://|;
3576     $B=$B2 && $lnk=~/^$B2/ || !$B2 && $lnk!~m"(^\.\.|://)";
3577     return $rlnk && ($H || $T) if($rel);
3578     return $L && ($H || $T) if($local);
3579     return $B && ($H || $T) if($below);
3580     return $H || $T if($rev);
3581     $H;
3582     }
3583     sub DSC {
3584     &dbg("Generating DSC PostScript\n") if($opt_d);
3585     %op=("moveto",2, "rmoveto",2, "lineto",2, "rlineto",2, "translate",2,
3586     "scale",2, "show",1, "awidthshow",6, "stroke",0, "save",0, "restore",0,
3587     "gsave",0, "grestore",0, "showpage",0, "newpath",0, "setlinewidth",1,
3588     "setlinejoin",1, "setgray",1, "closepath",0, "fill",0, "arc",5,
3589     "setrgbcolor",3, "rotate",1, "image",5, "colorimage",7);
3590     %sho=("moveto","M", "rmoveto","RM", "lineto","L", "rlineto","RL", "show","S",
3591     "showpage","N", "awidthshow","A");
3592     $i=0;
3593     $po="/OU true D\n";
3594     for (keys %op) {
3595     $cmd=$sho{$_}?$sho{$_}:$_;
3596     push(@val,$cmd);
3597     $in{$_}=$i++;
3598     $j=$op{$_}+1;
3599     $extra="";
3600     if(/showpage/) {$extra="Bb{Xl Yl Xh Yh}if Pn "};
3601     if(/image/) {$extra="K ";$j++};
3602     $t=$op{$_}?"$op{$_} copy $extra$in{$_} $j array astore":"[$extra$in{$_}]";
3603     $po.="/$_ {OU {$t ==} if $_}d\n";
3604     }
3605     $po.="/pdfmark {$i] ==} D\n";
3606     $in{"pdfmark"}=$i++;
3607     push(@val,"pdfmark");
3608     $po.="/NF {OU{2 copy E $i 3 array astore ==}if ONF}d\n"
3609     ."/EX {[IS EC] ==} D\n/Cd {} D\n/DU {TU PM 1 eq and TP and{Pn ==}if}d\n"
3610     ."/BB {US Bb{dup Yl lt{dup /Yl E D}if dup Yh gt{/Yh E D}{pop}ie\n"
3611     ." dup Xl lt{dup /Xl E D}if dup Xh gt{/Xh E D}{pop}ie}\n"
3612     ." {/Yl E D /Yh Yl D /Xl E D /Xh Xl D /Bb t D}ie}D\n";
3613     $in{"Nf"}=$i++;
3614     s|/(NF.*)|/O$1|;
3615     s|/BB.*|$po|;
3616     push(@val,"Nf");
3617     if($psin) {
3618     ($ti)=/%%Title: (.*)/;
3619     if(m|/BM (\d+)|) {
3620     $nbit=$1;
3621     for $vec ("IT","WS") {
3622     /\/$vec \[(.*)\]/;
3623     @$vec=split(' ',$1);
3624     }
3625     /\nSB/;
3626     for (0..$nbit-1) {
3627     $'=~/\n\n/;
3628     push(@BM,$`);
3629     }
3630     }
3631     ($epsf)=/(\n\/P\d+_?\d* [\w\W]*)%Endpv/;
3632     while($epsf=~/\n\/(P\d+_?\d*) \{/g) {
3633     $pid=$1;
3634     $rest=$';
3635     $temp=$'=~/\/P\d+_?\d* \{/?$`:$rest;
3636     ($eps{$pid})=$temp=~/([\w\W]*)} D/;
3637     }
3638     if(/\/DH {/) {
3639     $'=~/%EndDH/;
3640     $ph="/DH {$`";
3641     }
3642     }
3643     $j=-1;
3644     for $i (0..$#IT) {
3645     $j++ if($IT[$i] == 0);
3646     push(@ix,$j);
3647     }
3648     $dfn="/F $opt_s D\n$ph";
3649     for (keys %sho) {
3650     $dfn.="/$sho{$_} {$_} d\n";
3651     }
3652    
3653     open(SCR,">$scr.ps");
3654     print SCR "$_ quit\n";
3655     close SCR;
3656     $cd{')]'}="Cd ";
3657     $io="($in{'image'}|$in{'colorimage'})";
3658     $_="";
3659     $temp="";
3660     $pn="";
3661     $start=1;
3662     $EPS="%%EndPageSetup";
3663     $pp=0;
3664     $n=0;
3665     for $line (split(/\r?\n/,`gs -q -dNODISPLAY $scr.ps</dev/null`)) {
3666     if(!$pp) {
3667     $mv="";
3668     $cx="";
3669     $cy="";
3670     }
3671     if($start && $line!~/ $in{"pdfmark"}\]$/) {
3672     $pdf=$temp;
3673     $temp="";
3674     $start=0;
3675     }
3676     $pp=$line=~/^\[(\S+) (\S+) ($in{'moveto'}|$in{'rmoveto'}|$in{'Nf'})\]$/;
3677     S:{
3678     if($3==$in{"Nf"}) {
3679     $fn="$1 $2 $val[$3]\n";
3680     last S;
3681     }
3682     if($3==$in{"moveto"}) {
3683     $cx=$1;
3684     $cy=$2;
3685     $mv=sprintf("%.1f %.1f %s\n",$1,$2,$val[$3]);
3686     last S;
3687     }
3688     if($3==$in{"rmoveto"}) {
3689     if($mv) {
3690     $cx+=$1;
3691     $cy+=$2;
3692     $mv=sprintf("%.1f %.1f %s\n",$cx,$cy,$val[$in{"moveto"}]);
3693     } else {
3694     $temp.=sprintf("%.1f %.1f %s\n",$1,$2,$val[$3]) if($1||$2);
3695     }
3696     last S;
3697     }
3698     if($line=~s/^\[(.*)\((\S*)\) ($in{"showpage"})\]$/pgsave restore $val[$3]/) {
3699     $pbb="";
3700     if($1) {
3701     ($llx,$lly,$urx,$ury)=split(/ /,$1);
3702     $llx=int($llx);
3703     $lly=int($lly);
3704     $urx=int($urx+1);
3705     $ury=int($ury+1);
3706     $pbb="%%PageBoundingBox: $llx $lly $urx $ury\n";
3707     if(!defined($Llx) || $llx<$Llx) {$Llx=$llx};
3708     if(!defined($Lly) || $lly<$Lly) {$Lly=$lly};
3709     if(!defined($Urx) || $urx>$Urx) {$Urx=$urx};
3710     if(!defined($Ury) || $ury>$Ury) {$Ury=$ury};
3711     }
3712     $pn.="," if($pn && $2);
3713     $n++;
3714     @df=();
3715     for(0..$#docfonts) {
3716     push(@df,$docfonts[$_]) if($uf{$_}==$n);
3717     }
3718     push(@df,"Symbol") if($uf{"-1"}==$n);
3719     $fu="";
3720     $tmp=@df?"%%PageResources: font":"";
3721     &splitline(@df);
3722     $_.="%%Page: $pn$2 $n\n$fu$pbb%%BeginPageSetup\n/pgsave save D\n$temp$line\n";
3723     $EPS="%%EndPageSetup";
3724     $temp="";
3725     $line="";
3726     $fn="";
3727     $mv="";
3728     $pn="";
3729     last S;
3730     }
3731     if($line=~/^\[([^(]*)(\(.*\)) ($in{"show"}|$in{"awidthshow"})\]$/) {
3732     if(length $2>2) {
3733     $line="$fn$1$2 $val[$3]";
3734     if($fn=~/(\S+) Nf/ && $uf{$1}!=$n+1) {
3735     $uf{$1}=$n+1;
3736     $fnt=$1<0?"Symbol":$docfonts[$1];
3737     $line="%%IncludeResource: font $fnt\n$line";
3738     }
3739     $fn="";
3740     $pp=0;
3741     } else {
3742     $pp=1;
3743     }
3744     last S;
3745     }
3746     if($line=~/^\[(\S+) (\S+) ($in{"scale"})\]$/) {
3747     $line=$1!=1||$2!=1?"$1 $2 $val[$3]\n$EPS":"$EPS";
3748     $EPS="";
3749     last S;
3750     }
3751     if($line=~/^\[(.*) (\d+) $io\]$/) {
3752     $li=$BM[$2]=~y/\n/\n/+2;
3753     $line="\/picstr $WS[$ix[$2]] string D\n$1\n"
3754     ."%%BeginData: $li Hex Lines\n$val[$3]\n$BM[$2]\n%%EndData";
3755     last S;
3756     }
3757     if($line=~/^\((.*)\)$/) {
3758     $pn=$1;
3759     $line="";
3760     last S;
3761     }
3762     last S if($line=~s/^\[([^\/].* )?(\d+)\]$/$1$val[$2]/);
3763     last S if($line=~s/(\)\])? (\/\w+) $in{"pdfmark"}\]$/$1 $cd{$1}$2 pdfmark/);
3764     last S if($line=~s/^\[(\S+) \((P\d+.*)\)\]$/\/IS $1 D\n$eps{$2}/);
3765     &dbg("$line\n");
3766     }
3767     if(!$pp && $mv.$line) {
3768     $mv=~s/\.0//g;
3769     $temp.="$mv$line\n";
3770     }
3771     }
3772     @nf=();
3773     @sf=();
3774     $fontdef="";
3775     for(0..$#docfonts) {
3776     $ff=$ff{$docfonts[$_]};
3777     if($ff && $uf{$_}>0) {
3778     push(@sf,$docfonts[$_]);
3779     $fontdef.="%%BeginResource: font $docfonts[$_]\n$cont{$ff}\n%%EndResource\n";
3780     $cont{$ff}="";
3781     }
3782     push(@nf,$docfonts[$_]) if(!$ff && $uf{$_}>0);
3783     }
3784     push(@nf,"Symbol") if($uf{"-1"}>0);
3785     $ti="@ARGV" unless($psin);
3786     $or=$opt_L?"Landscape":"Portrait";
3787     $setup="%%BeginSetup\n";
3788     $setup.="$dupl\n" if($dupl);
3789     $setup.="$fontdef" if($fontdef);
3790     $fu="";
3791     $tmp=@nf?"%%DocumentNeededResources: font":"";
3792     &splitline(@nf);
3793     $tmp=@sf?"%%DocumentSuppliedResources: font":"";
3794     &splitline(@sf);
3795     s/\\(200|201|202)/\\$ssy{$1}/g;
3796     $dd="Clean7Bit";
3797     $dd="Clean8Bit" if(($fontdef.$_)=~/[\200-\377]/);
3798     $dd="Binary" if(($fontdef.$_)=~/[\000-\010\013-\014\016-\036]/);
3799     $time=localtime;
3800     print <<EOT;
3801     %!PS-Adobe-3.0
3802     %%Title: $title
3803     %%Creator: $version
3804     %%CreationDate: $time
3805     $fu%%DocumentData: $dd
3806     %%Orientation: $or
3807     %%BoundingBox: $Llx $Lly $Urx $Ury
3808     %%Pages: $n
3809     %%EndComments
3810     %%BeginProlog
3811     /d {bind def} bind def
3812     /D {def} d
3813     /ie {ifelse} d
3814     /E {exch} d
3815     /t true D
3816     /f false D
3817     $fl
3818     $cd
3819     $defs/Nf {dup 0 ge{FL E get}{pop /Symbol}ie findfont E scalefont setfont} D
3820     /IP {currentfile picstr readhexstring pop} D
3821     /WF $wf D
3822     $dfn%%EndProlog
3823     $setup$reenc$pdf%%EndSetup
3824     $_%%EOF
3825     EOT
3826     }
3827     sub splitline {
3828     for (@_) {
3829     if(length($tmp.$_)>78) {
3830     $fu.="$tmp\n";
3831     $tmp="%%+ font";
3832     }
3833     $tmp.=" $_";
3834     }
3835     $fu.="$tmp\n" if($tmp);
3836     }
3837     sub ref {
3838     @pnum=();
3839     /.*\s*$/;
3840     open(SCR,">$scr.ps");
3841     print SCR "$`HN{==}forall $& quit\n";
3842     close SCR;
3843     $pnum=`gs -q -dNODISPLAY $scr.ps</dev/null`;
3844     while($pnum=~/\([^)]*\)/g) {push(@pnum,$&)};
3845     $pnum="@pnum";
3846     &cut($pnum);
3847     s|/HN [^D]*D|/HN [$pnum] D|;
3848     }
3849     sub cut {
3850     $_[0]=~s/(.{70}[^ \n]*) ([^ ])/$1\n$2/g;
3851     }
3852     sub fin {
3853     if($opt_D) {
3854     &DSC;
3855     } else {
3856     print;
3857     }
3858     if($opt_d) {
3859     print DBG "\n";
3860     close DBG;
3861     }
3862     unlink "$scr","$scr.ps","$scr.ppm","$scr.tex","$scr.dvi","$scr.log" if($scr);
3863     exit;
3864     }
3865     sub col2rgb {
3866     $rgb=$colour{"\L$_[0]"}?($colour{"\L$_[0]"}):$_[0];
3867     @cvec=$rgb=~/($X$X)($X$X)($X$X)/?($1,$2,$3):();
3868     @cvec?"[16#$1 16#$2 16#$3]":"";
3869     }
3870     sub inihyph {
3871     if($hyphenation_file{$lang}) {
3872     $hyfile=$hyphenation_file{$lang};
3873     } else {
3874     &dbg("No hyphenation file for language '$lang'\n");
3875     $lng=$lang;
3876     while($lng=~s/-?[^-]+$// && !$hyphenation_file{$lng}) {};
3877     $hyfile=$hyphenation_file{$lng};
3878     &dbg(" ..using $hyfile\n");
3879     }
3880     if($init{$hyfile}) {
3881     $rep{$lang}=$refl{$hyfile};
3882     return;
3883     }
3884     if(open(HYPH,$hyfile)) {
3885     &dbg("Reading hyphenation patterns from $hyfile\n") if($opt_d);
3886     <HYPH>=~/\\patterns{.*/;
3887     close HYPH;
3888     $def=$`;
3889     ($patterns=$')=~s/\^\^($X$X)/chr hex $1/eg;
3890     $upp{$lang}='';
3891     $low{$lang}='';
3892     while ($def=~/\\lccode(`\\?\^\^|")($X$X)=(`\\?\^\^|")($X$X)/g) {
3893     if($2 ne $4) {
3894     $uc=$2;
3895     $lc=$4;
3896     if($`=~/\n$/ || $`!~/%.*$/) {
3897     $upp{$lang}.=chr hex $uc;
3898     $low{$lang}.=chr hex $lc;
3899     }
3900     }
3901     }
3902     while ($def=~/\\let\\(\w+)=(\^\^|")($X$X)/g) {
3903     $key=$1;
3904     $value=chr hex $3;
3905     $tex{$key}=$value if($`=~/\n$/ || $`!~/%.*$/);
3906     }
3907     for $key (keys %tex) {
3908     $patterns=~s/\\$key */$tex{$key}/g;
3909     }
3910     if($lang=~/^de/) {
3911     %de=('"a',228, '"o',246, '"u',252, '\3', 223);
3912     $patterns=~s/\\c\{[^}]*\}//g;
3913     $patterns=~s/\\n\{([^}]*)\}/$1/g;
3914     $patterns=~s/("a|"o|"u|\\3)/chr $de{$1}/eg;
3915     $upp{"de"}=~s/\337//;
3916     $low{"de"}=~s/\377//;
3917     }
3918     if($lang=~/^is/ && !$upp{"is"}) {
3919     %is=("'a","\341", "'e","\351", "'i","\355", "'o","\363", "'u","\372",
3920     "'y","\375", '"x',"\346", '"o',"\366", "'d","\360", "`t","\376");
3921     $isch=join("|",keys %is);
3922     $patterns=~s/($isch)/$is{$1}/g;
3923     $upp{"is"}="\301\311\315\323\332\335\306\326\336\320";
3924     $low{"is"}="\341\351\355\363\372\375\346\366\376\360";
3925     }
3926     if($lang=~/^fi/ && !$upp{"fi"}) {
3927     $upp{"fi"}="\304\326";
3928     $low{"fi"}="\344\366";
3929     }
3930     if($lang=~/^fr/ && !$upp{"fr"}) {
3931     $upp{"fr"}="\300\302\307\311\310\312\313\316\317\324\326\333\226";
3932     $low{"fr"}="\340\342\347\351\350\352\353\356\357\364\366\373\225";
3933     }
3934     if($lang=~/^es/ && !$upp{"es"}) {
3935     $upp{"es"}="\301\311\315\323\321\332\334";
3936     $low{"es"}="\341\351\355\363\361\372\374";
3937     }
3938     $patterns=~s/\{([\w\W]*?)\}/[$1]/g;
3939     $patterns=~/}/;
3940     $end=$`;
3941     if($def.$'=~/\\hyphenation\[.*/) {
3942     $'=~/]/;
3943     $hyext=$`;
3944     }
3945     ($patterns=$end)=~s/%.*//g;
3946     for $key (split('\s+',$patterns)) {
3947     $value=$key;
3948     $key=~s/\d//g;
3949     $value=~s/^([$ltrs.])/0$1/;
3950     $value=~s/[$ltrs](\d)/$1/g;
3951     $value=~s/[$ltrs.]/0/g;
3952     $patt{"$key,$lang"}=$value if($value=~/^\d+$/);
3953     }
3954     } else {
3955     &dbg("Cannot open hyphenation file: $hyfile\n");
3956     }
3957     $hext=$hyphenation_extfile{$lang};
3958     for(split('\s*:\s*',$hext)) {
3959     if(open(HEXT,$_)) {
3960     &dbg("Reading hyphenation extensions from $_\n") if($opt_d);
3961     $hyext.=<HEXT>;
3962     close HEXT;
3963     } else {
3964     &dbg("Cannot open hyphenation extension file: $_\n");
3965     }
3966     }
3967     if($hyext) {
3968     for $key (keys %tex) {
3969     $hyext=~s/$key */$tex{$key}/g;
3970     }
3971     for $key (split('\s+',$hyext)) {
3972     $key=~s/\s+//g;
3973     $value="00$key\0";
3974     $key=~s/-//g;
3975     $value=~s/[$ltrs]/0/g;
3976     $value=~s/0-/1/g;
3977     $hext{"$key,$lang"}=$value;
3978     }
3979     }
3980     $refl{$hyfile}=$lang;
3981     $rep{$lang}=$lang;
3982     $init{$hyfile}=1;
3983     }
3984     sub hyph {
3985     $word="\L$_[0]";
3986     eval "\$word=~y/$upp{$rep{$lang}}/$low{$rep{$lang}}/" if($upp{$rep{$lang}});
3987     $len=length($word);
3988     $h=$hext{"$word,$rep{$lang}"};
3989     if($h) {
3990     @br=split(//,$h);
3991     } else {
3992     @br=(0) x ($len+3);
3993     for $i (0..$len) {
3994     for $j (0..$len-$i) {
3995     $str=substr(".$word.",$j,$i+2);
3996     $pstr=$patt{"$str,$rep{$lang}"};
3997     if($pstr) {
3998     @patt=split(//,$pstr);
3999     for $k (0..$#patt) {
4000     $br[$k+$j]=$patt[$k] if($br[$k+$j]<$patt[$k]);
4001     }
4002     }
4003     }
4004     }
4005     }
4006     $hword="";
4007     for $i (0..$len-1) {
4008     $hword.=substr($_[0],$i,1);
4009     if(($h || $i>$hyphenation{'start'}-2 && $i<$len-$hyphenation{'end'})
4010     && $br[$i+2]%2==1) {$hword.=")HY("};
4011     }
4012     $hword.=")YH(" if(length $word < length $hword);
4013     $hword;
4014     }
4015     sub setel {
4016     $el=$_[0];
4017     eval "\%arr=\%$el";
4018     &fs($el);
4019     push(@font,$fontid{"\L$font"});
4020     push(@styl,$styl);
4021     push(@size,$arr{'font-size'});
4022     push(@alig,$algn{$arr{'text-align'}}-1);
4023     push(@topm,$arr{'margin-top'});
4024     push(@botm,$arr{'margin-bottom'});
4025     push(@lftm,$arr{'margin-left'});
4026     push(@rgtm,$arr{'margin-right'});
4027     push(@colr,$col eq "[16#00 16#00 16#00]"?0:$col);
4028     $temp=$arr{'margin-top'}*$arr{'font-size'};
4029     $mi=$temp if($temp>$mi);
4030     $temp=$arr{'margin-bottom'}*$arr{'font-size'};
4031     $mi=$temp if($temp>$mi);
4032     }
4033     sub fs {
4034     $arr{'font-family'}='times' if($el ne 'p' && !$latin1 && !defined $arr{$_});
4035     for ("font-family","font-size") {
4036     $arr{$_}=$body{$_} if(!defined $arr{$_});
4037     }
4038     ($font=$arr{'font-family'})=~s/\W/-/g;
4039     if(!$font_names{"\L$font"}) {$font=$fal{$font}};
4040     if(!$font_names{"\L$font"}) {
4041     &dbg("Unknown font: $arr{'font-family'}, using $deffnt{$_[0]}\n");
4042     $font=$deffnt{$_[0]};
4043     }
4044     if(!defined $fontid{"\L$font"}) {
4045     $fontid{"\L$font"}=$nfont++;
4046     @names=split(/\s+/,$font_names{"\L$font"});
4047     for($#names+1..3) {push(@names,$names[0])};
4048     @docfonts=(@docfonts,@names);
4049     }
4050     &getval($arr{"font-size"},2);
4051     for ('left','right','top','bottom') {
4052     $arr{"margin-$_"}=0 if(!defined $arr{"margin-$_"});
4053     }
4054     for ($arr{"text-indent"},$arr{"margin-top"},$arr{"margin-bottom"},
4055     $arr{"margin-left"},$arr{"margin-right"}) {
4056     &getval($_,0);
4057     }
4058     $styl=$arr{'font-style'}=~/^(i|o)/+2*($arr{'font-weight'}=~/^b/);
4059     $col=$arr{'color'}?&col2rgb($arr{'color'}):-1;
4060     }
4061     sub img {
4062     local($_,$red,$grn,$blu)=@_;
4063     local($beg,$end);
4064     ($red,$grn,$blu)=("FF","FF","FF") if(!$opt_U);
4065     while (/<(img|fig|hr|overlay|object)\s/i) {
4066     $imgcmd="\L$1";
4067     $beg=$`;
4068     $'=~/>/;
4069     $img=" $`";
4070     $end=$';
4071     $img=~s/\n/ /g;
4072     if($imgcmd ne "object" || $img=~/data\s*=\s*['"]?([\w\/\.:~%-]+\.$IM)/i
4073     || $img=~/type\s*=\s*['"]?(image\/|application\/postscript)/i){
4074     if($opt_T) {
4075     &getalt;
4076     } else {
4077     $al=0;
4078     $off="";
4079     ($align)=$img=~/align\s*=\s*['"]?(\w*)/i;
4080     if($align=~/^middle$/i) {$al=1};
4081     if($align=~/^top$/i) {$al=2};
4082     if($imgcmd eq "overlay") {
4083     $al=4;
4084     $xoff=0;
4085     $yoff=0;
4086     if($img=~/\s*x\s*=\s*['"]?(\d+)/i) {$xoff=$1};
4087     if($img=~/\s*y\s*=\s*['"]?(\d+)/i) {$yoff=$1};
4088     $off="$xoff $yoff ";
4089     }
4090     $url="";
4091     if($img=~/\s(src|data)\s*=\s*($S)/i) {($url)=$+=~/([^ \n]*)/};
4092     &dbg("Image: $url\n") if($opt_d && $url);
4093     $URL=$url;
4094     unless($url=~m|://|) {
4095     if($url=~m|^http:(.*)|) {$url=$1}
4096     if($url=~m|^/|) {$URL=$b1.$url} else {$URL=$b2.$url}
4097     }
4098     while($URL!~m|^\.\./| && $URL=~m|[^/]*/\.\./|) {$URL=$`.$'};
4099     $URL=~s|/\./|/|g;
4100     $text=$src{$URL}?$cmd{$URL.$red.$grn.$blu}:$cmd{$URL};
4101     if(!$text || $opt_U && $src{$URL} && !$cmd{$URL.$red.$grn.$blu}) {
4102     if(!$url || $failed{$url}) {
4103     &getalt;
4104     } else {
4105     &pictops;
4106     if($bm || $ps) {
4107     &dbg("Size: $xs*$ys\n") if($opt_d);
4108     $nimg++;
4109     push(@XS,$xs);
4110     push(@YS,$ys);
4111     if($bm) {
4112     $nm++;
4113     push(@DP,$dp);
4114     push(@BM,$bm);
4115     push(@WS,int(($xs-1)*$dp/8)+1);
4116     push(@FC,$fc);
4117     push(@IX,$nm);
4118     push(@IT,0);
4119     }
4120     if($ps) {
4121     $nps--;
4122     push(@IX,$nps);
4123     push(@IT,1);
4124     $nli=99999;
4125     $n=1;
4126     $npr=$ps=~s|(.*\n){$nli}|sprintf("$&} D\n/P$nimg\_%d {",$n++)|eg;
4127     if($npr) {
4128     $proc=" (";
4129     for $i (0..$npr) {
4130     $proc.="P$nimg\_$i ";
4131     }
4132     $proc.=")";
4133     $pv.="/P$nimg\_0 {$ps} D\n";
4134     $eps{"P$nimg\_0"}=$ps;
4135     } else {
4136     $proc=" (P$nimg)";
4137     $pv.="/P$nimg {$ps} D\n";
4138     $eps{"P$nimg"}=$ps;
4139     }
4140     }
4141     $text="$proc $nimg IM(";
4142     $cmd{$URL}=$text if(!$cmd{$URL});
4143     $cmd{$URL.$red.$grn.$blu}=$text if($src{$URL});
4144     $proc="";
4145     $end=$' if($imgcmd eq "object" && $end=~m|</object>|i);
4146     } else {
4147     &getalt;
4148     $failed{"$url"}=1;
4149     }
4150     }
4151     } elsif($imgcmd eq "object" && $end=~m|</object>|i) {
4152     $end=$';
4153     }
4154     }
4155     if($cmd{$URL}) {
4156     $text=")".$off.$al.$text;
4157     if($imgcmd eq "fig") {
4158     $end=~m|</fig>|i;
4159     $fig=$`;
4160     $end=$';
4161     $over="";
4162     while($fig=~/(<overlay$R)/ig) {$over.=$1};
4163     ($dum,$cap)=$fig=~m|<caption$R([\w\W]*)</caption>|i;
4164     ($dum,$cred)=$fig=~m|<credit$R([\w\W]*)</credit>|i;
4165     $text=")BN($text$over)BN($cap)BN($cred)BN(";
4166     }
4167     }
4168     }
4169     $_=$beg.$text.$end;
4170     }
4171     s|<[hH][rR]$R|)2 1 1 HR(|g;
4172     $_[0]=$_;
4173     }
4174     sub getval{
4175     local($val,$unit)=$_[0]=~/$V\s*(\w*)/g;
4176     $val*=$cm{$unit} if($_[1]==1 && defined $cm{$unit});
4177     $val*=$pt{$unit} if($_[1]==2 && defined $pt{$unit});
4178     $_[0]=$val;
4179     }
4180     sub getconf {
4181     local($_)=@_;
4182     while(/\@import\s+(([\w.\/-]+)|"([^"]*)"|'([^']*)')\s*;/) {
4183     if(open(SS,$+) && !$read{$+}) {
4184     $conf=<SS>;
4185     $_=$`.$conf.$';
4186     print DBG "***** $+:\n$conf" if($opt_d);
4187     close SS;
4188     $read{$+}=1;
4189     } else {
4190     &dbg($read{$+}?"Infinite \@import loop: $+\n":"Error opening: $+\n");
4191     $_=$`.$';
4192     }
4193     }
4194     @block=();
4195     while(&getblk($_)){};
4196     }
4197     sub getblk {
4198     local($_)=@_;
4199     local ($beg,$match,$end,$blk,$key,$val,$id,$temp);
4200     while(/^\s*\/\*/) {
4201     /\*\/|$/;
4202     $_=$';
4203     }
4204     return 0 if !/\S/;
4205     /[\w,:.@\s-]+\{/;
4206     $_=$';
4207     ($id=$&)=~s/^\s*|\s*\{//g;
4208     $id=lc $id;
4209     push(@block,"\L$id");
4210     if($#block==1) {
4211     $valid{$id}=1 if(!$user);
4212     if($id eq "color") {$id="colour"};
4213     if(!$valid{$id}) {
4214     &dbg("Error in configuration file: unknown block name '$id'\n");
4215     }
4216     }
4217     $blk="";
4218     W:while(/\s*(\/\*|[\w][\w-]*\s*:|[\w,:.\s-]+\{|\})\s*/) {
4219     $blk.=$1 if($1 ne "/*");
4220     $beg=$`;
4221     $match=$1;
4222     $end=$';
4223     S:{
4224     if($match=~/\{$/) {
4225     $temp=$match.$end;
4226     $blk.=&getblk($temp);
4227     $_=$temp;
4228     last S;
4229     }
4230     if($match=~/:$/) {
4231     ($key=$`)=~s/\s*$//;
4232     $end=~/([\w.\$-]+|"[^"]*"|'[^']*')\s*;?/;
4233     $blk.=$`.$&;
4234     $_=$';
4235     ($val=$1)=~s/^["']|["']$//g;
4236     $val=~s/'/\\'/g;
4237     $typ=1;
4238     $typ=2 if($val=~/^$V(cm|mm|in|pt|pc|em)$/);
4239     $typ=3 if($val=~/^$V$/);
4240     $typ=4 if($val=~/^-?\d+$/);
4241     $typ=5 if($val eq "0" || $val eq "1");
4242     if($block[0] eq '@html2ps') {
4243     if($#block==0) {
4244     if(!$user) {
4245     $valid{$key}=1;
4246     $type{$key}=$typ if(!defined $type{$key});
4247     }
4248     if($valid{$key}) {
4249     if($typ>=$type{$key}) {
4250     $key=~s/-/_/g;
4251     eval "\$$key='$val'" if($user || $val ne '');
4252     # print DBG "\$$key='$val'\n" if($opt_d && $user);
4253     } elsif($user) {
4254     &dbg("Error in configuration file: bad value for $key: $val\n");
4255     }
4256     } else {
4257     &dbg("Error in configuration file: unknown key '$key'\n");
4258     }
4259     }
4260     if($#block==1) {
4261     if($id eq "option" && $optalias{$key}) {$key=$optalias{$key}};
4262     if(!$user) {
4263     $valid{"$id,$key"}=1;
4264     $type{"$id,$key"}=$typ if(!defined $type{"$id,$key"});
4265     }
4266     if($valid{"$id,$key"} || $extend{$id}) {
4267     if($typ>=$type{"$id,$key"} || $id eq "colour") {
4268     eval "\$$id\{'$key'}='$val'" if($user || $val ne '');
4269     # print DBG "\$$id\{'$key'}='$val'\n" if($opt_d && $user);
4270     } elsif($user) {
4271     &dbg("Error in configuration file: bad value for $key: $val\n");
4272     }
4273     } else {
4274     &dbg("Error in block '$id' in configuration file:"
4275     ." unknown key '$key'\n");
4276     }
4277     }
4278     if($#block>1) {
4279     $temp="$block[$#block-1]_$key";
4280     $valid{$temp}=1 if(!$user);
4281     $parblk=$block[$#block-1];
4282     if($valid{$temp}) {
4283     eval "\$$parblk\_$key\{'$id'}='$val'";
4284     # print DBG "\$$parblk\_$key\{'$id'}='$val'\n" if($opt_d && $user);
4285     } elsif($valid{$parblk}) {
4286     &dbg("Error in block '$parblk' in configuration file:"
4287     ." unknown key '$key'\n");
4288     }
4289     }
4290     } else {
4291     for $i (split(',\s*',$id)) {
4292     $i=~s/\./_/;
4293     $i=~s/:/__/;
4294     eval "\$$i\{'\L$key'}='\L$val'";
4295     # print DBG "\$$i\{'\L$key'}='\L$val'\n" if($opt_d && $user);
4296     }
4297     }
4298     last S;
4299     }
4300     if($match eq "/*") {
4301     /\*\/|$/;
4302     $_=$';
4303     last S;
4304     }
4305     last W;
4306     }
4307     }
4308     pop(@block);
4309     $_[0]=$end;
4310     $blk;
4311     }
4312     sub prompt {
4313     local($/)="\n";
4314     &dbg($_[0]);
4315     chop($_[1]=<STDIN>);
4316     }
4317     sub dbg {
4318     print STDERR $_[0];
4319     print DBG $_[0];
4320     }
4321     sub hb {
4322     local($_)=@_;
4323     local($head,$body,$beg,$end,$match,$tag);
4324     #If neither </HEAD> nor <BODY> can be found, find the separation point (messy).
4325     if(!/<(body|\/head)/i || $`=~/<plaintext|<xmp|<listing|<!--/i) {
4326     $head="";
4327     $int="";
4328     S1: while(/<(\/?\w+|!--|!|\?)/) {
4329     S2:{
4330     $beg=$`;
4331     $end=$';
4332     $match=$&;
4333     $tag=$1;
4334     if($tag eq "!--") {
4335     $int.=$`;
4336     &getcom;
4337     $int.=$com;
4338     $_=$rest;
4339     last S2;
4340     }
4341     if($tag=~/[!?]/) {
4342     $end=~/>/;
4343     $int.="$beg$match$`>";
4344     $_=$';
4345     last S2;
4346     }
4347     $tag=~s|/||;
4348     last S1 if(!$head{"\L$tag"});
4349     $end=~/$R/;
4350     $head.=$int.$beg.$match.$&;
4351     $int="";
4352     $_=$';
4353     }
4354     }
4355     $body=$int.$_;
4356     } else {
4357     $head=$`;
4358     $body=$&.$';
4359     }
4360     $_[0]=$body;
4361     $_[1]=$head;
4362     }
4363     sub open {
4364     if($_[0]=~m|://|) {
4365     &geturl($_[0],$_[1]);
4366     } elsif(open(FILE,$_[0])) {
4367     $_[1]=<FILE>;
4368     close FILE;
4369     } else {
4370     0;
4371     }
4372     }

  ViewVC Help
Powered by ViewVC 1.1.22