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

Contents 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.1.1 - (show annotations) (download) (vendor branch)
Fri Sep 20 19:47:29 2002 UTC (22 years, 10 months ago) by adcroft
Branch: Import, MAIN
CVS Tags: baseline, HEAD
Changes since 1.1: +0 -0 lines
Importing web-site building process.

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