diff options
author | Taco Hoekwater <taco@elvenkind.com> | 2009-08-23 11:11:32 +0000 |
---|---|---|
committer | Taco Hoekwater <taco@elvenkind.com> | 2009-08-23 11:11:32 +0000 |
commit | 8fc3039c82d48605b5ca8b2eda3f4fdd755681e1 (patch) | |
tree | 3cd9bbdd599bc4d1ac0409e167fee2136e4c0ec9 /Master/texmf-dist/scripts/context/perl | |
parent | 850fc99b7cd3ae7a20065531fe866ff7bae642ec (diff) |
this is context 2009.08.19 17:10
git-svn-id: svn://tug.org/texlive/trunk@14827 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/scripts/context/perl')
-rw-r--r-- | Master/texmf-dist/scripts/context/perl/cont_mis.pm | 69 | ||||
-rw-r--r-- | Master/texmf-dist/scripts/context/perl/cont_set.pm | 670 | ||||
-rw-r--r-- | Master/texmf-dist/scripts/context/perl/texexec.pl | 3294 | ||||
-rw-r--r-- | Master/texmf-dist/scripts/context/perl/texexec.rme | 169 | ||||
-rw-r--r-- | Master/texmf-dist/scripts/context/perl/texutil.pl | 2914 | ||||
-rw-r--r-- | Master/texmf-dist/scripts/context/perl/utiplug.pm | 30 |
6 files changed, 0 insertions, 7146 deletions
diff --git a/Master/texmf-dist/scripts/context/perl/cont_mis.pm b/Master/texmf-dist/scripts/context/perl/cont_mis.pm deleted file mode 100644 index 6bd449bf045..00000000000 --- a/Master/texmf-dist/scripts/context/perl/cont_mis.pm +++ /dev/null @@ -1,69 +0,0 @@ -#D \module -#D [ file=cont\_mis.pm, -#D version=1999.05.05, -#D title=General modules, -#D subtitle=all kind of subs, -#D author=Hans Hagen, -#D date=\currentdate, -#D copyright={PRAGMA / Hans Hagen \& Ton Otten}] -#C -#C This module is part of the \CONTEXT\ macro||package and is -#C therefore copyrighted by \PRAGMA. See licen-en.pdf for -#C details. - -#D Not yet documented, source will be cleaned up. - -package cont_mis ; - -use strict ; - -my ($message, $separator, $content) ; - -format = -@>>>>>>>>>>>>>>>>>>>>> @ @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< -$message,$separator,$content -. - -sub report - { ($message, $separator, $content) = @_ ; write } - -sub crlf { print "\n" } -sub banner { crlf ; report (shift , '/', shift) ; crlf } -sub message { report (shift , ':', shift) } -sub help { report (shift , ' ', shift) } -sub status { message ('status' , shift) } -sub warning { message ('warning' , shift) } -sub error { message ('error' , shift) } -sub continue { message ('' , shift) } - -sub hex_color - { my ($r,$g,$b) = @_ ; - if ($r>1) { $r=0xffff } else { $r = 0xffff*$r } - if ($g>1) { $g=0xffff } else { $g = 0xffff*$g } - if ($b>1) { $b=0xffff } else { $b = 0xffff*$b } - local $_ = sprintf "%4x%4x%4x", $r, $g, $b ; - s/ /0/go ; - return $_ } - -sub InterfaceFound - { local $_ = shift ; - if (/^\%.*interface=(.*?)\b/) - { return $1 } - elsif (/\\(starttekst|stoptekst|startonderdeel)/) - { return 'nl' } - elsif (/\\(stelle|verwende|umgebung|benutze)/) - { return 'de' } - elsif (/\\(stel|gebruik|omgeving)/) - { return 'nl' } - elsif (/\\(use|setup|environment)/) - { return 'en' } - elsif (/(hoogte|breedte|letter)=/) - { return 'nl' } - elsif (/(height|width|style)=/) - { return 'en' } - elsif (/(hoehe|breite|schrift)=/) - { return 'de' } - else - { return '' } } - -1; diff --git a/Master/texmf-dist/scripts/context/perl/cont_set.pm b/Master/texmf-dist/scripts/context/perl/cont_set.pm deleted file mode 100644 index 41c62e75440..00000000000 --- a/Master/texmf-dist/scripts/context/perl/cont_set.pm +++ /dev/null @@ -1,670 +0,0 @@ -#D \module -#D [ file=cont\_set.pm, -#D version=1999.04.01, -#D title=General modules, -#D subtitle=showing \CONTEXT\ commands, -#D author=Hans Hagen, -#D date=\currentdate, -#D copyright={PRAGMA / Hans Hagen \& Ton Otten}, -#D suggestions={Tobias Burnus \& Taco Hoekater}] -#C -#C This module is part of the \CONTEXT\ macro||package and is -#C therefore copyrighted by \PRAGMA. See licen-en.pdf for -#C details. - -# todo: tacos speed patch - -#D As always: thanks to Taco and Tobias for testing this -#D module and providing suggestions and code snippets as -#D well as haunting bugs. - -package cont_set ; - -#D This module (package) deals with providing help information -#D about the \CONTEXT\ commands. The data needed is derived -#D from the setup files by \CONTEXT\ itself. The data is -#D stored in files with suffix \type {tws} (tex work setup). -#D This module introduces some subroutines: -#D -#D \starttabulatie[|Tl|p|] -#D \NC \type {set\_setup\_interface} \NC sets the primary interface -#D to search in \NC \NR -#D \NC \type {set\_setup\_title} \NC sets the title of the main -#D window title \NC \NR -#D \NC \type {setups\_found} \NC locate the \type {tws} files -#D using the \type {kpsewhich} -#D program \NC \NR -#D \NC \type {show\_setups} \NC allocate the radio buttons -#D that can be used to select a -#D command set \NC \NR -#D \NC \type {load\_setup(filename)} \NC load the names \type {tws} -#D file \NC \NR -#D \NC \type {load\_setups} \NC all found command files can -#D be loaded at once \NC \NR -#D \NC \type {setup\_found(filename)} \NC this routine returns~1 when -#D the file is loaded \NC \NR -#D \NC \type {update\_setup} \NC when we browse the list with -#D commands, this routine takes care -#D of updating the text area \NC \NR -#D \NC \type {change\_setup} \NC we can manually set the -#D command set we want to browse, -#D and this routine takes care of -#D this \NC \NR -#D \NC \type {show\_setup(command)} \NC context sensitive help can be -#D provided by calling this sub \NC \NR -#D \stoptabulatie -#D -#D First we load some packages and set some constants. - -use Tk ; -use Tk::ROText ; -use Config ; - -use strict; - -use subs qw/ update_setup / ; - -my $dosish = ($Config{'osname'} =~ /dos|win/i) ; -my $default_size = $dosish ? 9 : 12 ; - -my $textfont = "Courier $default_size " ; -my $userfont = "Courier $default_size italic" ; -my $buttonfont = "Helvetica $default_size bold " ; - -unless ($dosish) - { $textfont = "-adobe-courier-bold-r-normal--$default_size-120-75-75-m-70-iso8859-1" ; - $userfont = "-adobe-courier-bold-o-normal--$default_size-120-75-75-m-70-iso8859-1" ; - $buttonfont = "-adobe-helvetica-bold-r-normal--$default_size-120-75-75-p-69-iso8859-1" } - -my $s_vertical = 30 ; -my $s_horizontal = 72 ; -my $c_horizontal = 24 ; - -#D The main window is not resizable, but the text area and -#D command list will have scrollbars. - -my %lw ; # stack of lists - -my $mw = MainWindow -> new ( -title => 'ConTeXt commands' ) ; - -$mw -> withdraw() ; $mw -> resizable ('y', 'y') ; - -sub SetupWindow { return $mw } ; - -my $bw = $mw -> Frame () ; # buttons -my $tw = $mw -> Frame () ; # sw + fw -my $fw = $tw -> Frame () ; # string + list - -my $request = $fw -> Entry ( -font => $textfont , - -background => 'ivory1' , - -width => $c_horizontal ) ; - -my $cw = $fw -> Scrolled ( 'Listbox' , - -scrollbars => 'e' , - -font => $textfont , - -width => $c_horizontal , - -selectbackground => 'gray' , - -background => 'ivory1' , - -selectmode => 'browse' ) ; - -$cw -> pack ( -side => 'bottom' , -fill => 'both' , -expand => 1 ) ; -$request -> pack ( -side => 'top' , -fill => 'x' ) ; - -my $sw = $tw -> Scrolled ( 'ROText' , - -scrollbars => 'se' , - -height => $s_vertical , - -width => $s_horizontal , - -wrap => 'none' , - -background => 'ivory1' , - -font => $textfont ) ; - - -#D And the whole bunch of widgets are packed in the main -#D window. - -sub pack_them_all - { $sw -> pack ( -side => 'left' , -fill => 'both' , -expand => 1 ) ; - $fw -> pack ( -side => 'right' , -fill => 'y' , -expand => 0 ) ; - $bw -> pack ( -side => 'top' , -fill => 'x' , -anchor => 'w' , -expand => 1 ) ; - $tw -> pack ( -side => 'bottom', -fill => 'both' , -expand => 1 ) } - -sub unpack_them_all - { } - -pack_them_all ; - -#D We scan for available setup files, with suffix \type {tws}. -#D These should be somewhere on the system, grouped in one -#D directory. At least the english file \type {cont-en.tws} -#D should be found. - -my $tws_path = '' ; -my @setup_files = ('cont-en.tws') ; -my $setup_file = $setup_files[0] ; -my $setup_interface = 'en' ; -my $old_setup_file = '' ; - -sub set_setup_interface - { $setup_interface = shift } - -sub set_setup_title - { $mw -> configure ( -title => shift ) } - -sub setups_found - { $tws_path = `kpsewhich --format="other text files" --progname=context cont-en.tws` ; - $tws_path =~ s/cont-en\.tws.*// ; - chop $tws_path ; - @setup_files = glob ("$tws_path*.tws") ; - if (@setup_files) - { foreach (@setup_files) { s/\.tws// ; s/.*\/// } - $setup_file = $setup_files[0] ; - return 1 } - else - { return 0 } } - -#D A hide button - -sub show_hide_button - { my $hb = $bw -> Button ( -text => "hide" , - -font => $buttonfont , - -command => \&hide_widget ) ; - $hb -> pack ( -padx => '2p', - -pady => '2p', - -side => 'right' ) } - -sub hide_widget - { $mw -> withdraw() } - -#D The setup files can be shown and chosen. - -sub show_setups - { unpack_them_all ; - foreach (@setup_files) - { $lw{$_} = $bw -> Radiobutton ( -text => lc $_ , - -value => $_ , - -font => $buttonfont , - -selectcolor => 'ivory1' , - -indicatoron => 0 , - -command => \&change_setup , - -variable => \$setup_file ) ; - $lw{$_} -> pack ( -padx => '2p', - -pady => '2p', - -side => 'left' ) } - pack_them_all } - -$cw -> bind ('<B1-Motion>', \&update_setup ) ; -$cw -> bind ('<1>' , \&update_setup ) ; -$cw -> bind ('<Key>' , \&update_setup ) ; - -$sw -> tag ('configure', 'user' , -font => $userfont ) ; -$sw -> tag ('configure', 'command' , -foreground => 'green3' ) ; -$sw -> tag ('configure', 'variable' , -font => $userfont ) ; -$sw -> tag ('configure', 'default' , -underline => 1 ) ; -$sw -> tag ('configure', 'symbol' , -foreground => 'blue3' ) ; -$sw -> tag ('configure', 'or' , -foreground => 'yellow3' ) ; -$sw -> tag ('configure', 'argument' , -foreground => 'red3' ) ; -$sw -> tag ('configure', 'par' , -lmargin1 => '4m' , - -lmargin2 => '6m' ) ; - -my %setups ; -my %commands ; -my %loadedsetups ; -my %positions ; -my %crosslinks ; - -my $current_setup = '' ; - -#D Setups are organized in files called \type {*.tws} and -#D alike. Several files can be loaded simultaneously. When -#D loading, we grab whole paragraphs. The variables and values -#D belonging to a command, are stored in the hash table \type -#D {setups}, one per language. The command templates are -#D stored in \type {commands}. -#D -#D A \type {tws} file is generated by \CONTEXT\ from the setup -#D definition files. Only \CONTEXT\ knows the current meaning -#D of commands and keywords. The files are generating by -#D simply saying something like: -#D -#D \starttypen -#D texexec --interface=en setupd -#D texexec --interface=de setupd -#D texexec --interface=nl setupd -#D texexec --interface=cz setupd -#D texexec --interface=it setupd -#D \stoptypen -#D -#D This results in files formatted as: -#D -#D \starttypen -#D startsetup -#D com:setupcolors -#D typ:vars/ -#D var:state:start,stop,global,local: -#D var:conversion:yes,no,always: -#D var:reduction:yes,no: -#D var:rgb:yes,no: -#D var:cmyk:yes,no: -#D stopsetup -#D \stoptypen -#D -#D This format can be stored rather efficient and parsed rather -#D fast. What more do we need. - -sub load_setup - { my $filename = shift ; - unless (keys %{$commands{$filename}}) - { local $/ = 'stopsetup' ; # in plaats van '' ivm unix ; (taco) - $current_setup = '' ; - if (open(SETUP, "$tws_path$filename.tws" )) - { my $position = 0 ; - while (<SETUP>) - { chomp ; - s/startsetup//mso ; - s/stopsetup//mso ; # redundant geworden - s/\r\n //gms ; # in plaats van s/ //gms ; (taco) - s/com\:(.*?)\:\s(.*)//mso ; - my $string = $1 ; - my $command = $1 ; - my $setup = $2 ; - ++$position ; - $string =~ s/(.*?)\<\<(.*?)\>\>(.*?)/$1$2$3/o ; - $setups {$filename}{$string} = $setup ; - $commands {$filename}{$string} = $command ; - $positions {$filename}{$string} = $position ; - $crosslinks{$filename}[$position] = $string } - close (SETUP) } } - my @list = sort {lc $a cmp lc $b} keys %{$commands{$filename}} ; - $cw -> delete ('0.0', 'end') ; - $cw -> insert ('end', @list) ; - $cw -> selectionSet ('0.0', '0.0') ; - $cw -> activate ('0.0') ; - $setup_file = $filename ; - update_setup } - -sub load_setups - { foreach my $setup (@setup_files) { load_setup ($setup) } ; - $mw -> deiconify() } - -#D The core of this module deals with transforming the -#D definitions like shown earlier. Details on the format -#D can be found in the file \type {setupd.tex}. We use the -#D \type {Tk::Text} automatic hanging identation features. -#D The next subs are examples of the kind you write once -#D and never look at again. - -my @arguments = () ; -my $nested_setup = 0 ; -my $continue_setup = 0 ; -my $argument = 0 ; -my $stopsuffix = '' ; -my $stopcommand = '' ; - -my %arg ; - -$arg {repeat} = '//n*/' ; -$arg {arg} = 'argument/{/.../}' ; -$arg {args} = 'argument/{/..,...,../}' ; -$arg {dis} = 'argument/$$/.../$$' ; -$arg {idx} = 'argument/{/.../}' ; -$arg {idxs} = 'argument/{/..+...+../}' ; -$arg {mat} = 'argument/$/...:$' ; -$arg {nop} = '//.../' ; -$arg {fil} = '//.../' ; -$arg {pos} = 'symbol/(/.../)' ; -$arg {poss} = 'symbol/(/...,.../)' ; -$arg {sep} = 'command//\\\\/' ; -$arg {ref} = 'symbol/[/ref/]' ; -$arg {refs} = 'symbol/[/ref,../]' ; -$arg {val} = 'symbol/[/.../]' ; -$arg {vals} = 'symbol/[/..,...,../]' ; -$arg {var} = 'symbol/[/..=../]' ; -$arg {vars} = 'symbol/[/..,..=..,../]' ; -$arg {cmd} = 'command//\cmd/' ; -$arg {dest} = 'symbol/[/..ref/]' ; -$arg {dests} = 'symbol/[/..,..refs,../]' ; -$arg {trip} = 'symbol/[/x:y:z=/]' ; -$arg {trips} = 'symbol/[/x:y:z=,../]' ; -$arg {wrd} = 'argument/{/.../}' ; -$arg {wrds} = 'argument/{/......./}' ; -$arg {par} = 'command//\par/' ; -$arg {stp} = '//stop/' ; -$arg {par} = 'command///' ; - -sub show_command - { my $command = shift ; - local $_ = $commands{$setup_file}{$command} ; - if ($command eq $_) - { $sw -> insert ('end', "\\$command", 'command' ) } - elsif (/(.*?)\<\<(.*?)\>\>(.*?)/o) - { $sw -> insert ('end', "\\", 'command' ) ; - if ($1) { $sw -> insert ('end', $1, 'command' ) } - if ($2) { $sw -> insert ('end', $2, ['command','user'] ) } - if ($3) { $sw -> insert ('end', $3, 'command' ) } - $stopsuffix = $2 } } - -sub show_left_argument - { local $_ = shift ; - my @thearg = split (/\//, $arg{$arguments[$_]}) ; - $sw -> insert ('end', $thearg[1], ['par',$thearg[0]] ) } - -sub show_middle_argument - { local $_ = shift ; - my @thearg = split (/\//, $arg{$arguments[$_]}) ; - if ($thearg[1]) - { $sw -> insert ('end', $thearg[2], 'par' ) } - else - { $sw -> insert ('end', $thearg[2], ['par',$thearg[0]] ) } } - -sub show_right_argument - { local $_ = shift ; - my @thearg = split (/\//, $arg{$arguments[$_]}) ; - $sw -> insert ('end', $thearg[3], ['par',$thearg[0]] ) ; - ++$argument } - -sub show_reference - { if (($nested_setup<=1)&&(defined($arguments[$argument]))) - { if ($arguments[$argument]=~/ref/) - { $sw -> insert ('end', "\n" ) ; - show_left_argument ($argument) ; - show_middle_argument ($argument) ; - show_right_argument ($argument) } } } - -sub show_stop_command - { my $before_stop = shift ; - if ($stopcommand) - { if ($stopsuffix) - { $sw -> insert ('end', '\\stop', 'command' ) ; - $sw -> insert ('end', $stopsuffix, ['command','user'] ) } - else - { $sw -> insert ('end', $stopcommand, 'command' ) } } } - -sub show_whatever_left - { while ($argument<@arguments) - { $sw -> insert ('end', "\n" ) ; - show_left_argument ($argument) ; - show_middle_argument ($argument) ; - show_right_argument ($argument) ; - ++$argument } - if ($stopcommand) - { $sw -> insert ('end', "\n...\n...\n...\n", 'par') ; - show_stop_command } } - -sub do_update_setup # type: 0=all 1=vars 2=vals - { my ($command, $type) = @_ ; - my $setup = $setups{$setup_file}{$command} ; - my $default = '' ; - my $key = '' ; - my $meaning = '' ; - my @values = () ; - local $_ ; - ++$nested_setup ; - while ($setup=~/(typ|var|val|ivr|ivl)\:(.*?)\:\s/mgo) - { $key = $1 ; - $meaning = $2 ; - if (($key=~/var/o)&&($type!=2)) - { $_ = $meaning ; s/(.*?)\:(.*?)\:(.*)//o ; - if (($nested_setup>1)&&(!$2)) { next } - $key = $1 ; - if ($3) { $default = $3 } else { $default = '' } - $_= $2 ; s/\s//go ; @values = split (/,/,$_) ; - if ($continue_setup) - { $sw -> insert ('end', ",\n ", 'par') } - else - { $continue_setup = 1 ; - $sw -> insert ('end', "\n", 'par') ; - show_left_argument($argument) } - $sw -> insert ('end', $key , 'par' ) ; - $sw -> insert ('end', '=', ['symbol','par'] ) ; - #while (1) - while (@values) - { my $value = shift @values ; - if ($value =~ /^\*/o) - { $value =~ s/^\*//o ; - $sw -> insert ('end', lc $value, ['variable','par'] ) } - elsif ($value eq $default) - { $sw -> insert ('end', $value, ['default','par'] ) } - else - { $sw -> insert ('end', $value, 'par' ) } - if (@values) - { $sw -> insert ('end', '|' , ['or','par'] ) } - else - { last } } } - elsif (($key=~/val/o)&&($type!=1)) - { $_ = $meaning ; s/(.*)\:(.*)//o ; - if (($nested_setup>1)&&(!$2)) { next } - $_ = $1 ; s/\s//go ; @values = split (/,/,$_) ; - if ($2) { $default = $2 } else { $default = '' } - if ($continue_setup) - { $continue_setup = 0 ; - show_right_argument($argument) } - $sw -> insert ('end', "\n" , 'par') ; - show_left_argument($argument) ; - #while (1) - while (@values) - { unless (@values) { last } - my $value = shift (@values) ; - if ($value =~ /^\*/o) - { $value =~ s/^\*//o ; - $sw -> insert ('end', lc $value, ['variable','par'] ) } - elsif ($value eq $default) - { $sw -> insert ('end', $value, ['default','par'] ) } - else - { $sw -> insert ('end', $value, 'par' ) } - if (@values) - { $sw -> insert ('end', ', ', 'par' ) } - else - { last } } - show_right_argument($argument) } - elsif ($key=~/typ/o) - { if ($nested_setup==1) - { show_command ($command) ; - my $arguments = $meaning ; - if ($arguments=~/stp/) - { $_ = $command ; - s/start(.*)/$1/o ; - $stopcommand = "\\stop$_" ; - $arguments =~ s/stp//go } - @arguments = split (/\//,$arguments) ; - if (@arguments) - { for (my $i=0;$i<@arguments;$i++) - { show_left_argument ($i) ; - show_middle_argument ($i) ; - show_right_argument ($i) } - if ($stopcommand) - { $sw -> insert ('end', ' ... ') ; - show_stop_command } - $sw -> insert ('end', "\n\n") ; - show_command ($command) } - $argument = 0 ; - $continue_setup = 0 } } - elsif ($key=~/ivr/o) - { $meaning =~ s/(.*)\:(.*)//o ; - do_update_setup ($1,1) } - elsif ($key=~/ivl/o) - { $meaning =~ s/(.*)\:(.*)//o ; - do_update_setup ($1,2) } - show_reference } - --$nested_setup ; - if (($continue_setup)&&(!$nested_setup)) - { show_right_argument ; - show_whatever_left } } - -#D Now the real work is done, we only have to define a few -#D housekeeping routines. The next sub adapts the text area -#D to the current selected command and normally is bound to -#D the list browsing commands. - -sub update_setup - { $old_setup_file = $setup_file ; - if (keys %{$commands{$setup_file}}) - { my $key ; - unless ($cw->curselection) - { $cw -> selectionSet('0.0','0.0') } - $key = $cw -> get($cw->curselection) ; - if ($current_setup ne $key) - { $current_setup = $key ; - $sw -> delete ('1.0', 'end' ) ; - $nested_setup = 0 ; - $argument = 0 ; - $stopcommand = '' ; - $stopsuffix = '' ; - do_update_setup ($key,0) ; - $mw -> raise ; - $mw -> focus } } } - -#D In editors we want to provide context sensitive help -#D information. The next sub first tries to locate the -#D commands asked for in the setup data currently selected, -#D and when not found takes a look at all the loaded files. - -sub show_setup - { my $asked_for = shift ; - unless ($asked_for) { return } - my $found = 0 ; - $asked_for =~ s/^\\// ; - if ($setup_interface) - { $found = 0 ; - foreach my $name (@setup_files) - { if (($name=~/\-$setup_interface/)&&(exists($commands{$name}{$asked_for}))) - { $found = 1 ; - $setup_file = $name ; - last } } } - if (!($found)&&(exists($commands{$setup_file}{$asked_for}))) - { $found = 1 } - else - { $found = 0 ; - foreach my $name (@setup_files) - { if (exists($commands{$name}{$asked_for})) - { $found = 1 ; - $setup_file = $name ; - last } } } - if ($found) - { my @list = sort {lc $a cmp lc $b} keys %{$commands{$setup_file}} ; - $cw -> delete ('0.0', 'end') ; - $cw -> insert ('end', @list) ; - $found = 0 ; - foreach (@list) { if ($_ eq $asked_for) { last } ++$found } - my $index = "$found.0" ; - $cw -> selectionSet ($index, $index) ; - $cw -> activate ($index) ; - $cw -> see ($index) ; - update_setup ; - $mw -> raise ; - $mw -> focus } } - -#D Whenever a new set of commands is selected (by means of the -#D buttons on top the screen) the list and text are to be -#D updated. - -sub change_setup - { my $command = '' ; - if ($old_setup_file) - { unless ($cw->curselection) - { $cw -> selectionSet('0.0','0.0') } - $command = $cw -> get($cw->curselection) ; - my $position = $positions{$old_setup_file}{$command} ; - $command = $crosslinks{$setup_file}[$position] } - load_setup($setup_file) ; - my @list = sort {lc $a cmp lc $b} keys %{$commands{$setup_file}} ; - $cw -> delete ('0.0', 'end') ; - $cw -> insert ('end', @list) ; - if ($command) - { show_setup($command) } - else - { $cw -> selectionClear ('0.0','end') ; - $cw -> selectionSet ('0.0', '0.0') ; - $cw -> see ('0.0') ; - $cw -> activate ('0.0') } - update_setup ; - $mw -> raise ; - $mw -> focus } - -#D Sometimes we want to make sure the dat is loaded indeed: - -sub setup_found - { my $filename = shift ; - if (-e "$tws_path$filename.tws") - { $setup_file = $filename ; - return 1 } - else - { return 0 } } - -#D The next feature is dedicated to Tobias, who suggested -#D it, and Taco, who saw it as yet another proof of the -#D speed of \PERL. It's also dedicated to Ton, who needs it -#D for translating the big manual. - -sub handle_request - { my $index = $cw -> index('end') ; - unless ($index) { return } - my $req = $request -> get ; - unless ($req) { return } - $req =~ s/\\//o ; - $req =~ s/\s//go ; - $request -> delete('0','end') ; - $request -> insert('0',$req) ; - unless ($req) { return } - my ($l,$c) = split (/\./,$index) ; - for (my $i=0;$i<=$l;$i++) - { $index = "$i.0" ; - my $str = $cw -> get ($index, $index) ; - if ($str =~ /^$req/) - { $cw -> selectionClear ('0.0','end') ; - $cw -> selectionSet ($index, $index) ; - $cw -> activate ($index) ; - $cw -> see ($index) ; - update_setup ; - $mw -> raise ; - $mw -> focus ; - return } } } - -$request -> bind ('<Return>', sub { handle_request } ) ; - -sub insert_request - { my ($self, $chr) = @_ ; - if ($self ne $request) - { $request -> insert ('end', $chr) } - handle_request } - -foreach my $chr ('a'..'z','A'..'Z') - { $mw -> bind ( "<KeyPress-$chr>", sub { insert_request(shift, $chr) } ) } - -$mw -> bind ( "<backslash>", sub { insert_request(shift, "\\") } ) ; - -sub delete_request - { my $self = shift ; - if ($self ne $request) - { my $to = $request -> index ('end') ; - my $from = $to - 1 ; - if ($from<0) { $from = 0 } - $request -> delete ($from,$to) } - handle_request } - -$mw -> bind ( "<BackSpace>", sub { delete_request } ) ; - -sub new_request - { $request -> delete (0,'end') ; - handle_request } - -$mw -> bind ( "<space>", sub { new_request } ) ; - -#D Just in case: - -sub raise_setup - { $mw -> raise } - -sub dont_exit - { $mw -> protocol( 'WM_DELETE_WINDOW' => sub { } ) } - -#D An example use is: -#D -#D \starttypen -#D load_setup ("cont-$nl") ; -#D show_setup ('omlijnd') ; -#D MainLoop () ; -#D \stoptypen -#D -#D Now everything is done, we return 1: - -1 ; diff --git a/Master/texmf-dist/scripts/context/perl/texexec.pl b/Master/texmf-dist/scripts/context/perl/texexec.pl deleted file mode 100644 index fb564bbd5ed..00000000000 --- a/Master/texmf-dist/scripts/context/perl/texexec.pl +++ /dev/null @@ -1,3294 +0,0 @@ -eval '(exit $?0)' && eval 'exec perl -w -S $0 ${1+"$@"}' && eval 'exec perl -w -S $0 $argv:q' - if 0 ; - -#D \module -#D [ file=texexec.pl, -#D version=2004.08.29, -#D title=running \ConTeXt, -#D subtitle=\TEXEXEC, -#D author=Hans Hagen, -#D date=\currentdate, -#D copyright={PRAGMA / Hans Hagen \& Ton Otten}] -#C -#C This module is part of the \CONTEXT\ macro||package and is -#C therefore copyrighted by \PRAGMA. See readme.pdf for -#C details. - -# Thanks to Tobias Burnus for the german translations. -# Thanks to Thomas Esser for hooking it into web2c -# Thanks to Taco Hoekwater for suggesting improvements -# Thanks to Wybo Dekker for the advanced help interface and making it strict -# Thanks to Fabrice Popineau for windows path trickery and fixes - -# (I still have to completely understand the help code -) - -#D We started with a hack provided by Thomas Esser. This -#D expression replaces the unix specific line \type -#D {#!/usr/bin/perl}. - -#D History has learned that writing wrappers like this is quite painful -#D because of differences between platforms, changes in the tex command -#D line flags (fmt), default behaviour (e.g. 8 bit), and the assumption -#D that everyone runs the same tex and that distributers take care of -#D everything. Well, the result is a messy script like this ... Sorry. - -use strict ; - -my $OriginalArgs = join(' ',@ARGV) ; - -#~ use warnings ; # strange warnings, todo - -# todo: second run of checksum of mp file with --nomprun changes -# todo: warning if no args -# todo: <<<< in messages -# todo: cleanup - -use Cwd; -use Time::Local; -use Config; -use Getopt::Long; -use Class::Struct; # needed for help subsystem -use FindBin; -use File::Compare; -use File::Temp; -use Digest::MD5; - -#~ use IO::Handle; autoflush STDOUT 1; - -my %ConTeXtInterfaces; # otherwise problems with strict -my %ResponseInterface; # since i dunno how to allocate else - -my %Help; - -#D In this script we will launch some programs and other -#D scripts. \TEXEXEC\ uses an ini||file to sort out where -#D those programs are stored. Two boolean variables keep -#D track of the way to call the programs. In \TEXEXEC, -#D \type {$dosish} keeps track of the operating system. -#D It will be no surprise that Thomas Esser provided me -#D the neccessary code to accomplish this. - -$ENV{"MPXCOMMAND"} = "0"; # otherwise loop - -my $TotalTime = time; - -# start random seed hack -# -# This hack is needed since tex has 1 minute resolution, so -# we need to be smaller about 1440 (== 24*60 == tex's max time) -# in which case (david a's) random calculator will overflow. - -# my ( $sec, $min, $rest ) = gmtime; -# my $RandomSeed = $min * 60 + $sec; -# -# # i have to look up the mod function -) -# -# if ( $RandomSeed > 2880 ) { $RandomSeed -= 2880 } -# if ( $RandomSeed > 1440 ) { $RandomSeed -= 1440 } - -my ($sec, $min) = gmtime; -my $RandomSeed = ($min * 60 + $sec) % 2880; # else still overflow - -# See usage of $Random and $RandomSeed later on. -# -# end random seed hack - -my $dosish = ( $Config{'osname'} =~ /^(ms)?dos|^os\/2|^mswin/i ); -my $escapeshell = ( ($ENV{'SHELL'}) && ($ENV{'SHELL'} =~ m/sh/i )); - -my $TeXUtil = 'texutil'; -my $TeXExec = 'texexec'; -my $MetaFun = 'metafun'; -my $MpToPdf = 'mptopdf'; - -$Getopt::Long::passthrough = 1; # no error message -$Getopt::Long::autoabbrev = 1; # partial switch accepted - -my $AddEmpty = ''; -my $Alone = 0; -my $Optimize = 0; -my $ForceTeXutil = 0; -my $Arrange = 0; -my $BackSpace = '0pt'; -my $Background = ''; -my $CenterPage = 0; -my $ConTeXtInterface = 'unknown'; -my $Convert = ''; -my $DoMPTeX = 0; -my $DoMPXTeX = 0; -my $EnterBatchMode = 0; -my $EnterNonStopMode = 0; -my $Environments = ''; -my $Modules = ''; -my $FastMode = 0; -my $FinalMode = 0; -my $Format = ''; -my $MpDoFormat = ''; -my $HelpAsked = 0; -my $Version = 0; -my $MainBodyFont = 'standard'; -my $MainLanguage = 'standard'; -my $MainResponse = 'standard'; -my $MakeFormats = 0; -my $Markings = 0; -my $Mode = ''; -my $NoArrange = 0; -my $NoDuplex = 0; -my $NOfRuns = 8; -my $NoMPMode = 0; -my $NoMPRun = 0; -my $NoBanner = 0; -my $AutoMPRun = 0; -my $OutputFormat = 'standard'; -my $Pages = ''; -my $PageScale = '1000'; # == 1.0 -my $PaperFormat = 'standard'; -my $PaperOffset = '0pt'; -my $PassOn = ''; -my $PdfArrange = 0; -my $PdfSelect = 0; -my $PdfCombine = 0; -my $PdfOpen = 0; -my $PdfClose = 0; -my $AutoPdf = 0; -my $UseXPdf = 0; -my $PrintFormat = 'standard'; -my $ProducePdfT = 0; -my $ProducePdfM = 0; -my $ProducePdfX = 0; -my $ProducePdfXTX = 0; -my $ProducePs = 0; -my $Input = ""; -my $Result = ''; -my $Suffix = ''; -my $RunOnce = 0; -my $Selection = ''; -my $Combination = '2*4'; -my $SilentMode = 0; -my $TeXProgram = ''; -my $TeXTranslation = ''; -my $TextWidth = '0pt'; -my $TopSpace = '0pt'; -my $TypesetFigures = 0; -my $ForceFullScreen = 0; -my $ScreenSaver = 0; -my $TypesetListing = 0; -my $TypesetModule = 0; -my $UseColor = 0; -my $Verbose = 0; -my $PdfCopy = 0; -my $PdfTrim = 0; -my $LogFile = ""; -my $MpyForce = 0; -my $InpPath = ""; -my $AutoPath = 0; -my $RunPath = ""; -my $Arguments = ""; -my $Pretty = 0; -my $SetFile = ""; -my $TeXTree = ""; -my $TeXRoot = ""; -my $Purge = 0; -my $Separation = ""; -my $ModeFile = ""; -my $GlobalFile = 0; -my $AllPatterns = 0; -my $ForceXML = 0; -my $Random = 0; -my $Filters = ''; -my $NoMapFiles = 0 ; -my $Foxet = 0 ; -my $TheEnginePath = 0 ; -my $Paranoid = 0 ; -my $NotParanoid = 0 ; -my $BoxType = '' ; -my $Local = '' ; - -my $TempDir = '' ; - -my $StartLine = 0 ; -my $StartColumn = 0 ; -my $EndLine = 0 ; -my $EndColumn = 0 ; - -my $MpEngineSupport = 0 ; # not now, we also need to patch executemp in context itself - -# makempy : - -my $MakeMpy = ''; - -&GetOptions( - "arrange" => \$Arrange, - "batch" => \$EnterBatchMode, - "nonstop" => \$EnterNonStopMode, - "color" => \$UseColor, - "centerpage" => \$CenterPage, - "convert=s" => \$Convert, - "environments=s" => \$Environments, - "usemodules=s" => \$Modules, - "xml" => \$ForceXML, - "xmlfilters=s" => \$Filters, - "fast" => \$FastMode, - "final" => \$FinalMode, - "format=s" => \$Format, - "mpformat=s" => \$MpDoFormat, - "help" => \$HelpAsked, - "version" => \$Version, - "interface=s" => \$ConTeXtInterface, - "language=s" => \$MainLanguage, - "bodyfont=s" => \$MainBodyFont, - "results=s" => \$Result, - "response=s" => \$MainResponse, - "make" => \$MakeFormats, - "mode=s" => \$Mode, - "module" => \$TypesetModule, - "figures=s" => \$TypesetFigures, - "fullscreen" => \$ForceFullScreen, - "screensaver" => \$ScreenSaver, - "listing" => \$TypesetListing, - "mptex" => \$DoMPTeX, - "mpxtex" => \$DoMPXTeX, - "noarrange" => \$NoArrange, - "nomp" => \$NoMPMode, - "nomprun" => \$NoMPRun, - "nobanner" => \$NoBanner, - "automprun" => \$AutoMPRun, - "once" => \$RunOnce, - "output=s" => \$OutputFormat, - "pages=s" => \$Pages, - "paper=s" => \$PaperFormat, - "paperformat=s" => \$PaperFormat, - "passon=s" => \$PassOn, - "path=s" => \$InpPath, - "autopath" => \$AutoPath, - "pdf" => \$ProducePdfT, - "pdm" => \$ProducePdfM, - "dpm" => \$ProducePdfM, - "pdx" => \$ProducePdfX, - "dpx" => \$ProducePdfX, - "xtx" => \$ProducePdfXTX, - "ps" => \$ProducePs, - "pdfarrange" => \$PdfArrange, - "pdfselect" => \$PdfSelect, - "pdfcombine" => \$PdfCombine, - "pdfcopy" => \$PdfCopy, - "pdftrim" => \$PdfTrim, - "scale=s" => \$PageScale, - "selection=s" => \$Selection, - "combination=s" => \$Combination, - "noduplex" => \$NoDuplex, - "offset=s" => \$PaperOffset, - "paperoffset=s" => \$PaperOffset, - "backspace=s" => \$BackSpace, - "topspace=s" => \$TopSpace, - "markings" => \$Markings, - "textwidth=s" => \$TextWidth, - "addempty=s" => \$AddEmpty, - "background=s" => \$Background, - "logfile=s" => \$LogFile, - "print=s" => \$PrintFormat, - "suffix=s" => \$Suffix, - "runs=s" => \$NOfRuns, - "silent" => \$SilentMode, - "tex=s" => \$TeXProgram, - "verbose" => \$Verbose, - "alone" => \$Alone, - "optimize" => \$Optimize, - "texutil" => \$ForceTeXutil, - "mpyforce" => \$MpyForce, - "input=s" => \$Input, - "arguments=s" => \$Arguments, - "pretty" => \$Pretty, - "setfile=s" => \$SetFile, # obsolete - "purge" => \$Purge, - #### yet undocumented ################# - "runpath=s" => \$RunPath, - "random" => \$Random, - "makempy=s" => \$MakeMpy, - "allpatterns" => \$AllPatterns, - "separation=s" => \$Separation, - "textree=s" => \$TeXTree, - "texroot=s" => \$TeXRoot, - "translate=s" => \$TeXTranslation, - "pdfclose" => \$PdfClose, - "pdfopen" => \$PdfOpen, - "autopdf" => \$AutoPdf, - "xpdf" => \$UseXPdf, - "modefile=s" => \$ModeFile, # additional modes file - "globalfile" => \$GlobalFile, - "nomapfiles" => \$NoMapFiles, - "foxet" => \$Foxet, - "engine" => \$TheEnginePath, - "paranoid" => \$Paranoid, - "notparanoid" => \$NotParanoid, - "boxtype=s" => \$BoxType, # media art crop bleed trim - "local" => \$Local, - #### unix is unsafe (symlink viruses) - "tempdir=s" => \$TempDir, - #### experiment - "startline=s" => \$StartLine, - "startcolumn=s" => \$StartColumn, - "endline=s" => \$EndLine, - "endcolumn=s" => \$EndColumn -); # don't check name - -if ($Foxet) { - $ProducePdfT = 1 ; - $ForceXML = 1 ; - $Modules = "foxet" ; - $Purge = 1 ; -} - -# a set file (like blabla.bat) can set paths now - -if ( $SetFile ne "" ) { load_set_file( $SetFile, $Verbose ); $SetFile = "" } - -# later we will do a second attempt. - -$SIG{INT} = "IGNORE"; - -if ( $ARGV[0] && $ARGV[0] =~ /\.mpx$/io ) { # catch -tex=.... bug in mpost - $TeXProgram = ''; - $DoMPXTeX = 1; - $NoMPMode = 1; -} - -#### - -if ($Version) { - $Purge = 1 ; - } - -#### - -if ($Paranoid) { - $ENV{shell_escape} = 'f' ; - $ENV{openout_any} = 'p' ; - $ENV{openin_any} = 'p' ; -} elsif ($NotParanoid) { - $ENV{shell_escape} = 't' ; - $ENV{openout_any} = 'p' ; - $ENV{openin_any} = 'a' ; -} - -if (defined $ENV{openin_any} && $ENV{openin_any} eq 'p') { - $Paranoid = 1 ; # extra test in order to set readlevel -} - -if ((defined $ENV{shell_escape} && $ENV{shell_escape} eq 'f') || - (defined $ENV{SHELL_ESCAPE} && $ENV{SHELL_ESCAPE} eq 'f')) { - $AutoMPRun = 1 ; -} - -if ($ScreenSaver) { - $ForceFullScreen = 1; - $TypesetFigures = 'c'; - $ProducePdfT = 1; - $Purge = 1; -} - -if ( $DoMPTeX || $DoMPXTeX ) { - $RunOnce = 1; - $ProducePdfT = 0; - $ProducePdfX = 0; - $ProducePdfM = 0; - $ProducePdfXTX = 0; - $ProducePs = 0; -} - -if ( $PdfArrange || $PdfSelect || $PdfCopy || $PdfTrim || $PdfCombine ) { - $ProducePdfT = 1; - $RunOnce = 1; -} - -if ($ProducePdfT) { $OutputFormat = "pdftex" } -elsif ($ProducePdfM) { $OutputFormat = "dvipdfm" } -elsif ($ProducePdfX) { $OutputFormat = "dvipdfmx" } -elsif ($ProducePdfXTX) { $OutputFormat = "xetex" } -elsif ($ProducePs) { $OutputFormat = "dvips" } - -if ( $ProducePdfXTX ) { - $TeXProgram = 'xetex' ; # ignore the default pdfetex engine - $PassOn .= ' -no-pdf ' ; # Adam Lindsay's preference -} - -if ($AutoPdf) { - $PdfOpen = $PdfClose = 1 ; -} - -my $PdfOpenCall = "" ; - -if ($PdfOpen) { - $PdfOpenCall = "pdfopen --file" ; -} - -if ($UseXPdf && !$dosish) { - $PdfOpenCall = "xpdfopen" ; -} - -# this is our hook into paranoid path extensions, assumes that -# these three vars are part of path specs in texmf.cnf - -foreach my $i ('TXRESOURCES','MPRESOURCES','MFRESOURCES') { - foreach my $j ($RunPath,$InpPath) { - if ($j ne '') { - if ($ENV{$i} ne '') { - $ENV{$i} = $ENV{$i} . ',' . $j ; - } else { - $ENV{$i} = $j ; - } - } - } -} - -if ( $RunOnce || $Pages || $TypesetFigures || $TypesetListing ) { $NOfRuns = 1 } - -if ( ( $LogFile ne '' ) && ( $LogFile =~ /\w+\.log$/io ) ) { - open( LOGFILE, ">$LogFile" ); - *STDOUT = *LOGFILE; - *STDERR = *LOGFILE; -} - -my $Program = " TeXExec 5.4.3 - ConTeXt / PRAGMA ADE 1997-2005"; - -print "\n$Program\n\n"; - -if ($Verbose) { print " current path : " . cwd . "\n" } - -my $pathslash = '/'; -if ( $FindBin::Bin =~ /\\/ ) { $pathslash = "\\" } -my $cur_path = ".$pathslash"; - -# we need to handle window's "Program Files" path (patch by Fabrice P) - -my $own_path = "$FindBin::Bin/"; -my $own_type = $FindBin::Script; -my $own_quote = ( $own_path =~ m/^[^\"].* / ? "\"" : "" ); -my $own_stub = ""; - -if ( $own_type =~ /(\.pl|perl)/oi ) { $own_stub = "perl " } - -if ( $own_type =~ /(\.(pl|bin|exe))$/io ) { $own_type = $1 } -else { $own_type = '' } - -sub checked_path { - my $path = shift; - if ( ( defined($path) ) && ( $path ne '' ) ) { - $path =~ s/[\/\\]/$pathslash/go; - $path =~ s/[\/\\]*$//go; - $path .= $pathslash; - } else { - $path = ''; - } - return $path; -} - -sub checked_file { - my $path = shift; - if ( ( defined($path) ) && ( $path ne '' ) ) { - $path =~ s/[\/\\]/$pathslash/go; - } else { - $path = ''; - } - return $path; -} - -sub CheckPath { - my ( $Key, $Value ) = @_; - if ( ( $Value =~ /\// ) && ( $Value !~ /\;/ ) ) # no multipath test yet - { - $Value = checked_path($Value); - unless ( -d $Value ) { - print " error : $Key set to unknown path $Value\n"; - } - } -} - -# set <variable> to <value> -# for <script> set <variable> to <value> -# except for <script> set <variable> to <value> - -my $IniPath = ''; - -#D The kpsewhich program is not available in all tex distributions, so -#D we have to locate it before running it (as suggested by Thomas). - -my @paths; - -if ( $ENV{PATH} =~ /\;/ ) { @paths = split( /\;/, $ENV{PATH} ) } -else { @paths = split( /\:/, $ENV{PATH} ) } - -my $kpsewhich = ''; - -sub found_ini_file { - my $suffix = shift ; - #~ $IniPath = $0 ; - #~ $IniPath ~= s/\.pl$//io ; - #~ $IniPath = $InPath . ".'" + $suffix ; - #~ if (-e $IniPath) { - #~ } - # not really needed to check on texmfscripts, better on own path - print " locating ini file : kpsewhiching texexec.$suffix on scripts\n" if $Verbose ; - my $IniPath = `$kpsewhich --format="texmfscripts" -progname=context texexec.$suffix` ; - chomp($IniPath) ; - if ($IniPath eq '') { - print " locating ini file : kpsewhiching texexec.$suffix elsewhere\n" if $Verbose ; - $IniPath = `$kpsewhich --format="other text files" -progname=context texexec.$suffix` ; - chomp($IniPath) ; - } - return $IniPath ; -} - -if ( $IniPath eq '' ) { - foreach (@paths) { - my $p = checked_path($_) . 'kpsewhich'; - if ( ( -e $p ) || ( -e $p . '.exe' ) ) { - $kpsewhich = $p; - # FP: catch spurious error messages here if there $p has - # spaces and $own_quote is not set - $kpsewhich = ($kpsewhich =~ m/^[^\"].* / ? "\"$kpsewhich\"" : "$kpsewhich") ; - $IniPath = found_ini_file("ini"); - unless ( -e $IniPath ) { $IniPath = found_ini_file("rme") } - last; - } - } - if ($Verbose) { - if ( $kpsewhich eq '' ) { - print " locating ini file : kpsewhich not found in path\n"; - } elsif ( $IniPath eq '' ) { - print " locating ini file : not found by kpsewhich\n"; - } else { - if ( $IniPath =~ /rme/oi ) { - print " locating ini file : not found by kpsewhich, using '.rme' file\n"; - } else { - print " locating ini file : found by kpsewhich\n"; - } - } - } -} - -#D Now, when we didn't find the \type {kpsewhich}, we have -#D to revert to some other method. We could have said: -#D -#D \starttypen -#D unless ($IniPath) -#D { $IniPath = `perl texpath.pl texexec.ini` } -#D \stoptypen -#D -#D But loading perl (for the second time) take some time. Instead of -#D providing a module, which can introduce problems with loading, I -#D decided to copy the code of \type {texpath} into this file. - -use File::Find; -# use File::Copy ; no standard in perl - -my ( $ReportPath, $ReportName, $ReportFile ) = ( 0, 0, 1 ); -my ( $FileToLocate, $PathToStartOn ) = ( '', '' ); -my ( $LocatedPath, $LocatedName, $LocatedFile ) = ( '', '', '' ); - -sub DoLocateFile { # we have to keep on pruning - if ( lc $_ eq $FileToLocate ) { - $LocatedPath = $File::Find::dir; - $LocatedName = $_; - $LocatedFile = $File::Find::name; - } - if ($LocatedName) { $File::Find::prune = 1 } -} - -sub LocatedFile { - $PathToStartOn = shift; - $FileToLocate = lc shift; - if ( $FileToLocate eq '' ) { - $FileToLocate = $PathToStartOn; - $PathToStartOn = $own_path; - } - ( $LocatedPath, $LocatedName, $LocatedFile ) = ( '', '', '' ); - if ( $FileToLocate ne '' ) { - if ( -e $cur_path . $FileToLocate ) { - $LocatedPath = $cur_path; - $LocatedName = $FileToLocate; - $LocatedFile = $cur_path . $FileToLocate; - } else { - $_ = checked_path($PathToStartOn); - if ( -e $_ . $FileToLocate ) { - $LocatedPath = $_; - $LocatedName = $FileToLocate; - $LocatedFile = $_ . $FileToLocate; - } else { - $_ = checked_path($PathToStartOn); - if (/(.*?[\/\\]texmf[\/\\]).*/i) { - my $SavedRoot = $1; - File::Find::find( \&DoLocateFile, - checked_path( $1 . 'context/' ) ); - unless ($LocatedFile) { - File::Find::find( \&DoLocateFile, $SavedRoot ); - } - } else { - $_ = checked_path($_); - File::Find::find( \&DoLocateFile, $_ ); - } - } - } - } - return ( $LocatedPath, $LocatedName, $LocatedFile ); -} - -#D So now we can say: - -unless ($IniPath) { - ( $LocatedPath, $LocatedName, $IniPath ) = - LocatedFile( $own_path, 'texexec.ini' ); - if ($Verbose) { - if ( $IniPath eq '' ) { - print " locating ini file : not found by searching\n"; - } else { - print " locating ini file : found by searching\n"; - } - } -} - -#D The last resorts: - -unless ($IniPath) { - if ( $ENV{TEXEXEC_INI_FILE} ) { - $IniPath = checked_path( $ENV{TEXEXEC_INI_FILE} ) . 'texexec.ini'; - unless ( -e $IniPath ) { $IniPath = '' } - } - if ($Verbose) { - if ( $IniPath eq '' ) { - print " locating ini file : no environment variable set\n"; - } else { - print " locating ini file : found by environment variable\n"; - } - } -} - -unless ($IniPath) { - $IniPath = $own_path . 'texexec.ini'; - unless ( -e $IniPath ) { $IniPath = '' } - if ($Verbose) { - if ( $IniPath eq '' ) { - print " locating ini file : not found in own path\n"; - } else { - print " locating ini file : found in own path\n"; - } - } -} - -#D Now we're ready for loading the initialization file! We -#D also define some non strict variables. Using \type {$Done} -#D permits assignments. - -my %Done; - -unless ($IniPath) { $IniPath = 'texexec.ini' } - -if ( open( INI, $IniPath ) ) { - if ($Verbose) { print " reading : $IniPath\n" } - while (<INI>) { - if ( !/^[a-zA-Z\s]/oi ) { } - elsif (/except for\s+(\S+)\s+set\s+(\S+)\s*to\s*(.*)\s*/goi) { - my $one = $1; - my $two = $2; - my $three = $3; - if ( $one ne $Done{"TeXShell"} ) { - $three =~ s/^[\'\"]//o; - $three =~ s/[\'\"]$//o; - $three =~ s/\s*$//o; - if ($Verbose) { - print " setting : '$two' to '$three' except for '$one'\n"; - } - $Done{"$two"} = $three; - CheckPath( $two, $three ); - } - } elsif (/for\s+(\S+)\s+set\s+(\S+)\s*to\s*(.*)\s*/goi) { - my $one = $1; - my $two = $2; - my $three = $3; - $three =~ s/\s*$//o; - if ( $one eq $Done{"TeXShell"} ) { - $three =~ s/^[\'\"]//o; - $three =~ s/[\'\"]$//o; - if ($Verbose) { - print -" setting : '$two' to '$three' for '$one'\n"; - } - $Done{"$two"} = $three; - CheckPath( $two, $three ); - } - } elsif (/set\s+(\S+)\s*to\s*(.*)\s*/goi) { - my $one = $1; - my $two = $2; - unless ( defined( $Done{"$one"} ) ) { - $two =~ s/^[\'\"]//o; - $two =~ s/[\'\"]$//o; - $two =~ s/\s*$//o; - if ($Verbose) { - print - " setting : '$one' to '$two' for 'all'\n"; - } - $Done{"$one"} = $two; - CheckPath( $one, $two ); - } - } - } - close(INI); - if ($Verbose) { print "\n" } -} elsif ($Verbose) { - print - " warning : $IniPath not found, did you read 'texexec.rme'?\n"; - exit 1; -} else { - print - " warning : $IniPath not found, try 'texexec --verbose'\n"; - exit 1; -} - -sub IniValue { - my ( $Key, $Default ) = @_; - if ( defined( $Done{$Key} ) ) { $Default = $Done{$Key} } - if ($Default =~ /^(true|yes|on)$/io) { - $Default = 1 ; - } elsif ($Default =~ /^(false|no|off)$/io) { - $Default = 0 ; - } - if ($Verbose) { print " used setting : $Key = $Default\n" } - return $Default; -} - -my $TeXShell = IniValue( 'TeXShell', '' ); -my $SetupPath = IniValue( 'SetupPath', '' ); -my $UserInterface = IniValue( 'UserInterface', 'en' ); -my $UsedInterfaces = IniValue( 'UsedInterfaces', 'en' ); -my $TeXFontsPath = IniValue( 'TeXFontsPath', '.' ); -my $MpExecutable = IniValue( 'MpExecutable', 'mpost' ); -my $MpToTeXExecutable = IniValue( 'MpToTeXExecutable', 'mpto' ); -my $DviToMpExecutable = IniValue( 'DviToMpExecutable', 'dvitomp' ); -my $TeXProgramPath = IniValue( 'TeXProgramPath', '' ); -my $TeXFormatPath = IniValue( 'TeXFormatPath', '' ); -my $ConTeXtPath = IniValue( 'ConTeXtPath', '' ); -my $TeXScriptsPath = IniValue( 'TeXScriptsPath', '' ); -my $TeXHashExecutable = IniValue( 'TeXHashExecutable', '' ); -my $TeXExecutable = IniValue( 'TeXExecutable', 'tex' ); -my $TeXVirginFlag = IniValue( 'TeXVirginFlag', '-ini' ); -my $TeXBatchFlag = IniValue( 'TeXBatchFlag', '-interaction=batchmode' ); -my $TeXNonStopFlag = IniValue( 'TeXNonStopFlag', '-interaction=nonstopmode' ); -my $MpBatchFlag = IniValue( 'MpBatchFlag', '-interaction=batchmode' ); -my $MpNonStopFlag = IniValue( 'MpNonStopFlag', '-interaction=nonstopmode' ); -my $TeXPassString = IniValue( 'TeXPassString', '' ); -my $TeXFormatFlag = IniValue( 'TeXFormatFlag', '' ); -my $MpFormatFlag = IniValue( 'MpFormatFlag', '' ); -my $MpVirginFlag = IniValue( 'MpVirginFlag', '-ini' ); -my $MpPassString = IniValue( 'MpPassString', '' ); -my $MpFormat = IniValue( 'MpFormat', $MetaFun ); -my $MpFormatPath = IniValue( 'MpFormatPath', $TeXFormatPath ); -my $UseEnginePath = IniValue( 'UseEnginePath', ''); - -if ($TheEnginePath) { $UseEnginePath = 1 } - -# ok, let's force the engine; let's also forget about -# fmtutil, since it does not support $engine subpaths -# we will replace texexec anyway - -$UseEnginePath = 1 ; -$Alone = 1 ; - -my $FmtLanguage = IniValue( 'FmtLanguage', '' ); -my $FmtBodyFont = IniValue( 'FmtBodyFont', '' ); -my $FmtResponse = IniValue( 'FmtResponse', '' ); -my $TcXPath = IniValue( 'TcXPath', '' ); - - -$SetFile = IniValue( 'SetFile', $SetFile ); - -if ( ($Verbose) && ( $kpsewhich ne '' ) ) { - print "\n"; - my $CnfFile = `$kpsewhich -progname=context texmf.cnf`; - chomp($CnfFile); - print " applications will use : $CnfFile\n"; -} - -if ( ($FmtLanguage) && ( $MainLanguage eq 'standard' ) ) { - $MainLanguage = $FmtLanguage; -} -if ( ($FmtBodyFont) && ( $MainBodyFont eq 'standard' ) ) { - $MainBodyFont = $FmtBodyFont; -} -if ( ($FmtResponse) && ( $MainResponse eq 'standard' ) ) { - $MainResponse = $FmtResponse; -} - -# new versions, > 2004 will have -fmt as switch - -if ( $TeXFormatFlag eq "" ) { - if ($TeXProgram =~ /(etex|pdfetex)/) { - $TeXFormatFlag = "-efmt=" ; # >=2004 -fmt= - } elsif ($TeXProgram =~ /(eomega)/) { - $TeXFormatFlag = "-eoft=" ; # >=2004 obsolete - } elsif ($TeXProgram =~ /(aleph)/) { - $TeXFormatFlag = "-fmt=" ; - } else { - $TeXFormatFlag = "-fmt=" ; - } -} - -if ( $MpFormatFlag eq "" ) { - $MpFormatFlag = "-mem=" ; -} - -if ($TeXProgram) { $TeXExecutable = $TeXProgram } - -my $fmtutil = ''; - -# obsolete -# -# if ( $MakeFormats || $Verbose ) { -# if ($Alone || $UseEnginePath) { -# if ($Verbose) { print " generating format : not using fmtutil\n" } -# } elsif ( $TeXShell =~ /tetex|fptex/i ) { -# foreach (@paths) { -# my $p = checked_path($_) . 'fmtutil'; -# if ( -e $p ) { $fmtutil = $p; last } -# elsif ( -e $p . '.exe' ) { $fmtutil = $p . '.exe'; last } -# } -# $fmtutil = ($fmtutil =~ m/^[^\"].* / ? "\"$fmtutil\"" : "$fmtutil") ; -# if ($Verbose) { -# if ( $fmtutil eq '' ) { -# print " locating fmtutil : not found in path\n"; -# } else { -# print " locating fmtutil : $fmtutil\n"; -# } -# } -# } -# } - -if ($Verbose) { print "\n" } - -unless ($TeXScriptsPath) { $TeXScriptsPath = $own_path } - -unless ($ConTeXtPath) { $ConTeXtPath = $TeXScriptsPath } - -if ( $ENV{"HOME"} ) { - if ($SetupPath) { $SetupPath .= "," } -# my $home = $ENV{"HOME"}; -# $home = ($home =~ m/^[^\"].* / ? "\"$home\"" : "$home") ; -# $SetupPath .= $home; - $SetupPath .= $ENV{"HOME"}; -} - -if ($TeXFormatPath) { $TeXFormatPath =~ s/[\/\\]$//; $TeXFormatPath .= '/' } -if ($MpFormatPath) { $MpFormatPath =~ s/[\/\\]$//; $MpFormatPath .= '/' } -if ($ConTeXtPath) { $ConTeXtPath =~ s/[\/\\]$//; $ConTeXtPath .= '/' } -if ($SetupPath) { $SetupPath =~ s/[\/\\]$//; $SetupPath .= '/' } -if ($TeXScriptsPath) { $TeXScriptsPath =~ s/[\/\\]$//; $TeXScriptsPath .= '/' } - -sub QuotePath { - my ($path) = @_; - my @l = split(",", $path); - map { my $e = $_; $e = ($e =~ m/^[^\"].* / ? "\"$e\"" : "$e"); $_ = $e ;} @l; - return join(",", @l); -} - -$SetupPath = &QuotePath($SetupPath); - -$SetupPath =~ s/\\/\//go; - -my %OutputFormats; - -# the mother of all drivers - -$OutputFormats{dvips} = "dvips"; - -# needs an update - -$OutputFormats{acrobat} = "acrobat"; - -# the core drivers - -$OutputFormats{pdftex} = "pdftex"; $OutputFormats{pdf} = "pdftex"; -$OutputFormats{dvipdfm} = "dvipdfm"; $OutputFormats{dpm} = "dvipdfm"; -$OutputFormats{dvipdfmx} = "dvipdfmx"; $OutputFormats{dpx} = "dvipdfmx"; -$OutputFormats{xetex} = "xetex"; $OutputFormats{xtx} = "xetex"; -$OutputFormats{dvips} = "dvips"; $OutputFormats{ps} = "dvips"; - -# kind of obsolete now that yandy is gone - -$OutputFormats{dvipsone} = "dvipsone"; -$OutputFormats{dviwindo} = "dviwindo"; - -# it was never finished - -$OutputFormats{dviview} = "dviview"; - -my @ConTeXtFormats = ( "nl", "en", "de", "fr", "cz", "uk", "it", "ro", "xx"); - -sub SetInterfaces { - my ( $short, $long, $full ) = @_; - $ConTeXtInterfaces{$short} = $short; - $ConTeXtInterfaces{$long} = $short; - $ResponseInterface{$short} = $full; - $ResponseInterface{$long} = $full; -} - -#SetInterfaces ( "en" , "unknown" , "english" ) ; - -SetInterfaces( "nl", "dutch", "dutch" ); -SetInterfaces( "en", "english", "english" ); -SetInterfaces( "de", "german", "german" ); -SetInterfaces( "fr", "french", "french" ); -SetInterfaces( "cz", "czech", "czech" ); -SetInterfaces( "uk", "british", "english" ); -SetInterfaces( "it", "italian", "italian" ); -SetInterfaces( "no", "norwegian", "norwegian" ); -SetInterfaces( "ro", "romanian", "romanian" ); - -# Sub-option - -struct Subopt => { - desc => '$', # description - vals => '%' # assignable values -}; - -# Main option - -struct Opt => { - desc => '$', # desciption - vals => '%', # assignable values - subs => '%' # suboptions -}; - -my $helpdone = 0; - -sub print_subopt { - my ( $k, $opt ) = @_; - $~ = 'H3'; - write; - for $k ( sort keys %{ $opt->vals } ) { - print_val( $k, ${ $opt->vals }{$k} ); - } - format H3 = -@>>>>>>>>>>>>>>>>>>>>> @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< -"--$k",$opt->desc -. -} - -sub print_val { - my ( $k, $opt ) = @_; - $~ = 'H2'; - write; - format H2 = - @<<<<<<<< : @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< -$k,$opt -. -} - -# read all options - -my $recurse = -1 ; -my $shorthelp; -my @help; -my @opts = <DATA>; -while (@opts) { - $_ = shift @opts; - last if /^--+/; - my ( $k, $v ) = split( /\s+/, $_, 2 ); # was \t - $Help{$k} = read_options($v); -} - -# read a main option plus its -# description, -# assignable values and -# sub-options and their -# description and -# assignable values - -sub read_options { - $recurse++; - my $v = shift; - chomp; - my $opt = $recurse ? Subopt->new() : Opt->new(); - $opt->desc($v); - - while (@opts) { - $_ = shift @opts; - if (/^--+/) { unshift @opts, $_ if $recurse; last } - if ( $recurse && !/^=/ ) { unshift @opts, $_; last } - chomp; - my ( $kk, $vv ) = split( /\s+/, $_, 2 ); # was \t - $vv ||= ''; - if (/^=/) { $opt->vals( $kk, $vv ) } - elsif ( !$recurse ) { $opt->subs( $kk, read_options($vv) ) } - } - $recurse--; - $opt; -} - -sub print_opt { - my ( $k, $opt ) = @_; - if ($helpdone) { $shorthelp or print "\n" } - $helpdone = 1; # hh - $~ = 'H1'; - write; - return if $shorthelp < 0; - for $k ( sort keys %{ $opt->vals } ) { - print_val( $k, ${ $opt->vals }{$k} ); - } - return if $shorthelp > 0; - - for $k ( sort keys %{ $opt->subs } ) { - print_subopt( $k, ${ $opt->subs }{$k} ); - } - format H1 = -@>>>>>>>>>>>>>>>>>>>>> @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< -"--$k",$opt->desc -. -} - -# help to help - -sub show_help_options { - print # "\n" . - " --help overview of all options and their values\n" - . " --help all all about all options\n" - . " --help short just the main options\n" - . " --help mode ... pdf all about a few options\n" - . " --help '*.pdf' all about options containing 'pdf'\n" - . "\n" - . " more info http://www.pragma-ade.com/general/manuals/mtexexec.pdf\n" - . " http://www.ntg.nl/mailman/listinfo/ntg-context\n"; -} - -# determine what user wants to see - -if ($HelpAsked) { - $shorthelp = 0; - @help = ( sort keys %Help ); - if ( "@ARGV" eq "all" ) { # everything - } elsif ( "@ARGV" eq "short" ) { # nearly everything - $shorthelp--; - } elsif ( "@ARGV" eq "help" ) { # help on help - show_help_options; - exit; - } elsif (@ARGV) { # one or a few options, completely - my @h = @ARGV; - @help = (); - for (@h) { # print "testing $_\n"; - # next if (/^[\*\?]/) ; # HH, else error - if (/^[\*\?]/) { $_ = ".$_" } # HH, else error - $Help{$_} and push( @help, $_ ) or do { - my $unknown = $_; - for ( keys %Help ) { /$unknown/ and push( @help, $_ ) } - } - } - } else { # all main option and their assignable values - $shorthelp++; - } -} - -sub show_help_info { - map { print_opt( $_, $Help{$_} ) } @help; -} - -# uncomment this to see the structure of a Help element: -# print Dumper($Help{pdfselect}); - -#### end of help system - -my $FinalRunNeeded = 0; - -sub MPJobName { - my $JobName = shift; - my $MPfile = shift; - my $MPJobName = ''; - if ( -e "$JobName-$MPfile.mp" && -s "$JobName-$MPfile.mp" > 100 ) { - $MPJobName = "$JobName-$MPfile.mp" - } elsif ( -e "$MPfile.mp" && -s "$MPfile.mp" > 100 ) { - $MPJobName = "$MPfile.mp" - } else { $MPJobName = "" } - return $MPJobName; -} - -sub System { - my $cmd = shift ; - unless ( $dosish && ! $escapeshell ) { - $cmd =~ s/([^\\])\&/$1\\\&/io ; - } - if ($Verbose) { - print "\n$cmd\n\n" ; - } - system($cmd) -} - -sub Pipe { - my $cmd = shift ; - unless ( $dosish && ! $escapeshell ) { - $cmd =~ s/([^\\])\&/$1\\\&/io ; - } - if ($Verbose) { - print "\n$cmd\n\n" ; - } - return `$cmd` -} - - -sub RunPerlScript { - my ( $ScriptName, $Options ) = @_; - my $cmd = ''; - $own_quote = ($own_path =~ m/^[^\"].* / ? "\"" : "") ; - if ($Verbose) { - $Options .= ' --verbose' ; - } - if ($dosish) { - if ( -e "own_path$ScriptName$own_type" ) { - $cmd = -"$own_stub$own_quote$own_path$ScriptName$own_type$own_quote $Options"; - } elsif ( -e "$TeXScriptsPath$ScriptName$own_type" ) { - $cmd = -"$own_stub$own_quote$TeXScriptsPath$ScriptName$own_type$own_quote $Options"; - } else { - $cmd = ""; - } - } else { - $cmd = "$ScriptName $Options"; - } - unless ( $cmd eq "" ) { - System($cmd) ; - } -} - -my $FullFormat = ''; - -sub CheckOutputFormat { - my $Ok = 1; - if ( $OutputFormat ne 'standard' ) { - my @OutputFormat = split( /,/, $OutputFormat ); - foreach my $F (@OutputFormat) { - if ( defined( $OutputFormats{ lc $F } ) ) { - my $OF = $OutputFormats{ lc $F }; - next if ( ",$FullFormat," =~ /\,$OF\,/ ); - if ($FullFormat) { $FullFormat .= "," } - $FullFormat .= "$OutputFormats{lc $F}"; - } else { - $Ok = 0; - } - } - if ( !$Ok ) { - print(" unknown output format : $OutputFormat\n"); - } - } - unless ($FullFormat) { $FullFormat = $OutputFormat } -} # 'standard' to terminal - -sub MakeOptionFile { - my ( $FinalRun, $FastDisabled, $JobName, $JobSuffix, $KindOfRun ) = @_; - open( OPT, ">$JobName.top" ); - print OPT "\% $JobName.top\n"; - print OPT "\\unprotect\n"; - if ($EnterBatchMode) { print OPT "\\batchmode\n" } - if ($EnterNonStopMode) { print OPT "\\nonstopmode\n" } - if ($Paranoid) { - print " paranoid file mode : very true\n"; - print OPT "\\def\\maxreadlevel{1}\n" ; - } - $ModeFile =~ s/\\/\//gio ; # do this at top of file - $Result =~ s/\\/\//gio ; # do this at top of file - if ( $ModeFile ne '' ) { print OPT "\\readlocfile{$ModeFile}{}{}" } - if ( $Result ne '' ) { print OPT "\\setupsystem[file=$Result]\n" } - elsif ($Suffix) { print OPT "\\setupsystem[file=$JobName$Suffix]\n" } - if ( $InpPath ne "" ) { - $InpPath =~ s/\\/\//go; - $InpPath =~ s/\/$//go; - print OPT "\\usepath[$InpPath]\n"; - } - $MainLanguage = lc $MainLanguage; - unless ( $MainLanguage eq "standard" ) { - print OPT "\\setuplanguage[$MainLanguage]\n"; - } - # can best become : \use...[mik] / [web] - if ( $TeXShell =~ /MikTeX/io ) { - print OPT "\\def\\MPOSTbatchswitch \{$MpBatchFlag\}"; - print OPT "\\def\\MPOSTnonstopswitch \{$MpNonStopFlag\}"; - print OPT "\\def\\MPOSTformatswitch \{$MpPassString $MpFormatFlag\}"; - } - # - if ( $FullFormat ne 'standard' ) { - print OPT "\\setupoutput[$FullFormat]\n"; - } - if ($UseColor) { print OPT "\\setupcolors[\\c!state=\\v!start]\n" } - if ( $NoMPMode || $NoMPRun || $AutoMPRun ) { - print OPT "\\runMPgraphicsfalse\n"; - } - if ( ($FastMode) && ( !$FastDisabled ) ) { print OPT "\\fastmode\n" } - if ($SilentMode) { print OPT "\\silentmode\n" } - if ( $Separation ne "" ) { - print OPT "\\setupcolors[\\c!split=$Separation]\n"; - } - if ($SetupPath) { print OPT "\\setupsystem[\\c!directory=\{$SetupPath\}]\n" } - if ($dosish) { - print OPT "\\setupsystem[\\c!type=mswin]\n" - } else { # no darwin handling in old texexec - print OPT "\\setupsystem[\\c!type=unix]\n" - } - print OPT "\\setupsystem[\\c!n=$KindOfRun]\n"; - $_ = $PaperFormat; - #unless (($PdfArrange)||($PdfSelect)||($PdfCombine)||($PdfCopy)) - unless ( ($PdfSelect) || ($PdfCombine) || ($PdfCopy) || ($PdfTrim) ) { - if (/.4.3/goi) { - print OPT "\\setuppapersize[A4][A3]\n" ; - } elsif (/.5.4/goi) { - print OPT "\\setuppapersize[A5][A4]\n" ; - } elsif ( !/standard/ ) { - s/x/\*/io; - if (/\w+\d+/) { $_ = uc $_ } - my ( $from, $to ) = split(/\*/); - if ( $to eq "" ) { $to = $from } - print OPT "\\setuppapersize[$from][$to]\n"; - } - } - if ( ( $PdfSelect || $PdfCombine || $PdfCopy || $PdfTrim || $PdfArrange ) - && ( $Background ne '' ) ) - { - print " background graphic : $Background\n"; - print OPT "\\defineoverlay[whatever][{\\externalfigure[$Background][\\c!factor=\\v!max]}]\n"; - print OPT "\\setupbackgrounds[\\v!page][\\c!background=whatever]\n"; - } - if ($CenterPage) { - print OPT - "\\setuplayout[\\c!location=\\v!middle,\\c!marking=\\v!on]\n"; - } - if ($NoMapFiles) { - print OPT "\\disablemapfiles\n"; - } - if ($NoArrange) { print OPT "\\setuparranging[\\v!disable]\n" } - elsif ( $Arrange || $PdfArrange ) { - $FinalRunNeeded = 1; - if ($FinalRun) { - my $DupStr; - if ($NoDuplex) { $DupStr = "" } - else { $DupStr = ",\\v!doublesided" } - if ( $PrintFormat eq '' ) { - print OPT "\\setuparranging[\\v!normal]\n"; - } elsif ( $PrintFormat =~ /.*up/goi ) { - print OPT "\\setuparranging[2UP,\\v!rotated$DupStr]\n"; - } elsif ( $PrintFormat =~ /.*down/goi ) { - print OPT "\\setuparranging[2DOWN,\\v!rotated$DupStr]\n"; - } elsif ( $PrintFormat =~ /.*side/goi ) { - print OPT "\\setuparranging[2SIDE,\\v!rotated$DupStr]\n"; - } else { - print OPT "\\setuparranging[$PrintFormat]\n"; - } - } else { - print OPT "\\setuparranging[\\v!disable]\n"; - } - } - if ($Arguments) { print OPT "\\setupenv[$Arguments]\n" } - if ($Input) { print OPT "\\setupsystem[inputfile=$Input]\n" } - else { print OPT "\\setupsystem[inputfile=$JobName.$JobSuffix]\n" } - if ($Random) { print OPT "\\setupsystem[\\c!random=$RandomSeed]\n" } - if ($Mode) { print OPT "\\enablemode[$Mode]\n" } - if ($Pages) { - if ( lc $Pages eq "odd" ) { - print OPT "\\chardef\\whichpagetoshipout=1\n"; - } elsif ( lc $Pages eq "even" ) { - print OPT "\\chardef\\whichpagetoshipout=2\n"; - } else { - my @Pages = split( /\,/, $Pages ); - $Pages = ''; - foreach my $page (@Pages) { - if ( $page =~ /\:/ ) { - my ( $from, $to ) = split( /\:/, $page ); - foreach ( my $i = $from ; $i <= $to ; $i++ ) { - $Pages .= $i . ','; - } - } else { - $Pages .= $page . ','; - } - } - chop $Pages; - print OPT "\\def\\pagestoshipout\{$Pages\}\n"; - } - } - print OPT "\\protect\n"; - if ( $Filters ne "" ) { - foreach my $F ( split( /,/, $Filters ) ) { - print OPT "\\useXMLfilter[$F]\n"; - } - } - if ( $Modules ne "" ) { - foreach my $M ( split( /,/, $Modules ) ) { - print OPT "\\usemodule[$M]\n"; - } - } - if ( $Environments ne "" ) { - foreach my $E ( split( /,/, $Environments ) ) { - print OPT "\\environment $E\n"; - } - } - close(OPT); -} - -my $UserFileOk = 0; -my @MainLanguages; -my $AllLanguages = ''; - -sub MakeUserFile { - $UserFileOk = 0; - if ($AllPatterns) { - open( USR, ">cont-fmt.tex" ); - print USR "\\preloadallpatterns\n"; - } else { - return - if ( ( $MainLanguage eq 'standard' ) - && ( $MainBodyFont eq 'standard' ) ); - print " preparing user file : cont-fmt.tex\n"; - open( USR, ">cont-fmt.tex" ); - print USR "\\unprotect\n"; - $AllLanguages = $MainLanguage; - if ( $MainLanguage ne 'standard' ) { - @MainLanguages = split( /\,/, $MainLanguage ); - foreach (@MainLanguages) { - print USR "\\installlanguage[\\s!$_][\\c!state=\\v!start]\n"; - } - $MainLanguage = $MainLanguages[0]; - print USR "\\setupcurrentlanguage[\\s!$MainLanguage]\n"; - } - if ( $MainBodyFont ne 'standard' ) { - print USR "\\definetypescriptsynonym[cmr][$MainBodyFont]"; - print USR "\\definefilesynonym[font-cmr][font-$MainBodyFont]\n"; - } - print USR "\\protect\n"; - } - print USR "\\endinput\n"; - close(USR); - ReportUserFile(); - print "\n"; - $UserFileOk = 1; -} - -sub RemoveResponseFile { unlink "mult-def.tex" } - -sub MakeResponseFile { - if ( $MainResponse eq 'standard' ) { RemoveResponseFile() } - elsif ( !defined( $ResponseInterface{$MainResponse} ) ) { - RemoveResponseFile(); - } else { - my $MR = $ResponseInterface{$MainResponse}; - print " preparing interface file : mult-def.tex\n"; - print " response language : $MR\n"; - open( DEF, ">mult-def.tex" ); - print DEF "\\def\\currentresponses\{$MR\}\n\\endinput\n"; - close(DEF); - } -} - -sub RestoreUserFile { - unlink "cont-fmt.log"; - rename "cont-fmt.tex", "cont-fmt.log"; - ReportUserFile(); -} - -sub ReportUserFile { - return unless ($UserFileOk); - print "\n"; - if ( $MainLanguage ne 'standard' ) { - print " additional patterns : $AllLanguages\n"; - print " default language : $MainLanguage\n"; - } - if ( $MainBodyFont ne 'standard' ) { - print " default bodyfont : $MainBodyFont\n"; - } -} - -sub CheckPositions { } - -my $ConTeXtVersion = "unknown"; -my $ConTeXtModes = ''; - -sub ScanTeXPreamble { - my ($FileName) = @_; - open( TEX, $FileName ); - while (<TEX>) { - chomp; - if (/^\%.*/) { - if (/tex=([a-z]*)/goi) { $TeXExecutable = $1 } - if (/translat.*?=([\:\/0-9\-a-z]*)/goi) { $TeXTranslation = $1 } - if (/program=([a-z]*)/goi) { $TeXExecutable = $1 } - if (/output=([a-z\,\-]*)/goi) { $OutputFormat = $1 } - if (/modes=([a-z\,\-]*)/goi) { $ConTeXtModes = $1 } - if (/textree=([a-z\-]*)/goi) { $TeXTree = $1 } - if (/texroot=([a-z\-]*)/goi) { $TeXRoot = $1 } - if ( $ConTeXtInterface eq "unknown" ) { - - if (/format=([a-z]*)/goi) { - $ConTeXtInterface = $ConTeXtInterfaces{$1}; - } - if (/interface=([a-z]*)/goi) { - $ConTeXtInterface = $ConTeXtInterfaces{"$1"}; - } - } - if (/version=([a-z]*)/goi) { $ConTeXtVersion = $1 } - } else { - last; - } - } - close(TEX); - - # handy later on - - $ProducePdfT = ($OutputFormat eq "pdftex") ; - $ProducePdfM = ($OutputFormat eq "dvipdfm") ; - $ProducePdfX = ($OutputFormat eq "dvipdfmx") ; - $ProducePdfXTX = ($OutputFormat eq "xetex") ; - $ProducePs = ($OutputFormat eq "dvips") ; -} - -sub ScanContent { - my ($ConTeXtInput) = @_; - open( TEX, $ConTeXtInput ); - while (<TEX>) { - next if (/^\%/) ; - if ( -/\\(starttekst|stoptekst|startonderdeel|startdocument|startoverzicht)/ - ) - { - $ConTeXtInterface = "nl"; - last; - } elsif (/\\(stelle|verwende|umgebung|benutze)/) { - $ConTeXtInterface = "de"; - last; - } elsif (/\\(stel|gebruik|omgeving)/) { - $ConTeXtInterface = "nl"; - last; - } elsif (/\\(use|setup|environment)/) { - $ConTeXtInterface = "en"; - last; - } elsif (/\\(usa|imposta|ambiente)/) { - $ConTeXtInterface = "it"; - last; - } elsif (/(height|width|style)=/) { - $ConTeXtInterface = "en"; - last; - } elsif (/(hoehe|breite|schrift)=/) { - $ConTeXtInterface = "de"; - last; - } - # brr, can be \c! - elsif (/(hoogte|breedte|letter)=/) { $ConTeXtInterface = "nl"; last } - elsif (/(altezza|ampiezza|stile)=/) { $ConTeXtInterface = "it"; last } - elsif (/externfiguur/) { $ConTeXtInterface = "nl"; last } - elsif (/externalfigure/) { $ConTeXtInterface = "en"; last } - elsif (/externeabbildung/) { $ConTeXtInterface = "de"; last } - elsif (/figuraesterna/) { $ConTeXtInterface = "it"; last } - } - close(TEX); -} - -if ( $ConTeXtInterfaces{$ConTeXtInterface} ) { - $ConTeXtInterface = $ConTeXtInterfaces{$ConTeXtInterface}; -} - -my $Problems = my $Ok = 0; - -sub PrepRunTeX { - my ( $JobName, $JobSuffix, $PipeString ) = @_; - my $cmd; - my $TeXProgNameFlag = ''; - if ( !$dosish ) # we assume tetex on linux - { - $TeXProgramPath = ''; - $TeXFormatPath = ''; - if ( !$TeXProgNameFlag - && ( $Format =~ /^cont/ ) - && ( $TeXPassString !~ /progname/io ) ) - { - $TeXProgNameFlag = "-progname=context"; - } - } - $own_quote = ($TeXProgramPath =~ m/^[^\"].* / ? "\"" : "") ; - $cmd = join( ' ', - "$own_quote$TeXProgramPath$TeXExecutable$own_quote", - $TeXProgNameFlag, $TeXPassString, $PassOn, "" ); - if ($EnterBatchMode) { $cmd .= "$TeXBatchFlag " } - if ($EnterNonStopMode) { $cmd .= "$TeXNonStopFlag " } - if ( $TeXTranslation ne '' ) { $cmd .= "-translate-file=$TeXTranslation " } - $cmd .= "$TeXFormatFlag$TeXFormatPath$Format $JobName.$JobSuffix $PipeString"; - return $cmd; -} - -my $emergencyend = "" ; -#~ my $emergencyend = "\\emergencyend" ; - -sub RunTeX { - my ( $JobName, $JobSuffix ) = @_; - my $StartTime = time; - my $cmd = PrepRunTeX($JobName, $JobSuffix, ''); - if ($EnterBatchMode) { - $Problems = System("$cmd $emergencyend"); - } else { - $Problems = System("$cmd $emergencyend"); - } - my $StopTime = time - $StartTime; - print "\n return code : $Problems"; - print "\n run time : $StopTime seconds\n"; - return $Problems; -} - -sub PushResult { - my $File = shift; - $File =~ s/\..*$//o; - $Result =~ s/\..*$//o; - if ( ( $Result ne '' ) && ( $Result ne $File ) ) { - print " outputfile : $Result\n"; - unlink "texexec.tuo"; - rename "$File.tuo", "texexec.tuo"; - unlink "texexec.log"; - rename "$File.log", "texexec.log"; - unlink "texexec.dvi"; - rename "$File.dvi", "texexec.dvi"; - unlink "texexec.pdf"; - rename "$File.pdf", "texexec.pdf"; - - if ( -e "$Result.tuo" ) { - unlink "$File.tuo"; - rename "$Result.tuo", "$File.tuo"; - } - } - if ($Optimize) { unlink "$File.tuo" } -} - -sub PopResult { - my $File = shift; - $File =~ s/\..*$//o; - $Result =~ s/\..*$//o; - if ( ( $Result ne '' ) && ( $Result ne $File ) ) { - print " renaming : $File to $Result\n"; - unlink "$Result.tuo"; - rename "$File.tuo", "$Result.tuo"; - unlink "$Result.log"; - rename "$File.log", "$Result.log"; - unlink "$Result.dvi"; - rename "$File.dvi", "$Result.dvi"; - if ( -e "$File.dvi" ) { CopyFile( "$File.dvi", "$Result.dvi" ) } - unlink "$Result.pdf"; - rename "$File.pdf", "$Result.pdf"; - if ( -e "$File.pdf" ) { CopyFile( "$File.pdf", "$Result.pdf" ) } - return if ( $File ne "texexec" ); - rename "texexec.tuo", "$File.tuo"; - rename "texexec.log", "$File.log"; - rename "texexec.dvi", "$File.dvi"; - rename "texexec.pdf", "$File.pdf"; - } -} - -sub RunTeXutil { - my $StopRunning; - my $JobName = shift; - unlink "$JobName.tup"; - rename "$JobName.tuo", "$JobName.tup"; - print " sorting and checking : running texutil\n"; - my $TcXSwitch = ''; - if ( $TcXPath ne '' ) { $TcXSwitch = "--tcxpath=$TcXPath" } - RunPerlScript( $TeXUtil, "--ref --ij --high $TcXPath $JobName" ); - - if ( -e "$JobName.tuo" ) { - CheckPositions($JobName); - #~ print " utility file check : $JobName.tup <-> $JobName.tuo\n"; - $StopRunning = !compare( "$JobName.tup", "$JobName.tuo" ); - } else { - $StopRunning = 1; - } # otherwise potential loop - if ( !$StopRunning ) { - print "\n utility file analysis : another run needed\n"; - } - return $StopRunning; -} - -sub PurgeFiles { - my $JobName = shift; - print "\n purging files : $JobName\n"; - RunPerlScript( $TeXUtil, "--purge $JobName" ); - unlink( $Result . '.log' ) if ( -f $Result . '.log' ); -} - -sub RunTeXMP { - my $JobName = shift; - my $MPfile = shift; - my $MPrundone = 0; - my $MPJobName = MPJobName( $JobName, $MPfile ); - my $MPFoundJobName = ""; - if ( $MPJobName ne "" ) { - if ( open( MP, "$MPJobName" ) ) { - $_ = <MP>; - chomp; # we should handle the prefix as well - if (/^\%\s+translate.*?\=([\w\d\-]+)/io) { $TeXTranslation = $1 } - if (/collected graphics of job \"(.+)\"/i) { $MPFoundJobName = $1 } - close(MP); - if ( $MPFoundJobName ne "" ) { - if ( $JobName =~ /$MPFoundJobName$/i ) { - if ( $MpExecutable ne '' ) { - print - " generating graphics : metaposting $MPJobName\n"; - my $ForceMpy = ""; - if ($MpyForce) { $ForceMpy = "--mpyforce" } - my $ForceTCX = ''; - if ( $TeXTranslation ne '' ) { - $ForceTCX = "--translate=$TeXTranslation "; - } - if ($EnterBatchMode) { - RunPerlScript( $TeXExec, -"$ForceTCX $ForceMpy --mptex --nomp --batch $MPJobName" - ); - } elsif ($EnterNonStopMode) { - RunPerlScript( $TeXExec, -"$ForceTCX $ForceMpy --mptex --nomp --nonstop $MPJobName" - ); - } else { - RunPerlScript( $TeXExec, - "$ForceTCX $ForceMpy --mptex --nomp $MPJobName" - ); - } - } else { - print - " generating graphics : metapost cannot be run\n"; - } - $MPrundone = 1; - } - } - } - } - return $MPrundone; -} - -sub CopyFile { # agressive copy, works for open files like in gs - my ( $From, $To ) = @_; - return unless open( INP, "<$From" ); - binmode INP; - return unless open( OUT, ">$To" ); - binmode OUT; - while (<INP>) { print OUT $_ } - close(INP); - close(OUT); -} - -#~ sub CheckMPChanges { - #~ my $JobName = shift; - #~ my $checksum = 0; - #~ my $MPJobName = MPJobName( $JobName, "mpgraph" ); - #~ if ( open( MP, $MPJobName ) ) { - #~ while (<MP>) { - #~ unless (/random/oi) { - #~ $checksum += do { unpack( "%32C*", <MP> ) % 65535 } - #~ } - #~ } - #~ close(MP); - #~ } - #~ $MPJobName = MPJobName( $JobName, "mprun" ); - #~ if ( open( MP, $MPJobName ) ) { - #~ while (<MP>) { - #~ unless (/random/oi) { - #~ $checksum += do { unpack( "%32C*", <MP> ) % 65535 } - #~ } - #~ } - #~ close(MP); - #~ } - #~ print " mpgraph/mprun : $checksum\n"; - #~ return $checksum; -#~ } - -sub CheckMPChanges { - my $JobName = shift; my $str = '' ; - my $MPJobName = MPJobName( $JobName, "mpgraph" ); - if ( open( MP, $MPJobName ) ) { - $str .= do { local $/ ; <MP> ; } ; - close(MP) ; - } - $MPJobName = MPJobName( $JobName, "mprun" ); - if ( open( MP, $MPJobName ) ) { - $str .= do { local $/ ; <MP> ; } ; - close(MP) ; - } - $str =~ s/^.*?random.*?$//oim ; - return Digest::MD5::md5_hex($str) ; -} - -#~ sub CheckTubChanges { - #~ my $JobName = shift; - #~ my $checksum = 0; - #~ if ( open( TUB, "$JobName.tub" ) ) { - #~ while (<TUB>) { - #~ $checksum += do { unpack( "%32C*", <TUB> ) % 65535 } - #~ } - #~ close(TUB); - #~ } - #~ return $checksum; -#~ } - -sub CheckTubChanges { - my $JobName = shift; my $str = '' ; - if ( open( TUB, "$JobName.tub" ) ) { - $str = do { local $/ ; <TUB> ; } ; - close(TUB); - } - return Digest::MD5::md5_hex($str); -} - - -my $DummyFile = 0; - -sub isXMLfile { - my $Name = shift; - if ( ($ForceXML) || ( $Name =~ /\.(xml|fo|fox)$/io ) ) { return 1 } - else { - open( XML, $Name ); - my $str = <XML>; - close(XML); - return ( $str =~ /\<\?xml /io ); - } -} - -sub RunConTeXtFile { - my ( $JobName, $JobSuffix ) = @_; - if ($AutoPath) { - if ($JobName =~ /^(.*)[\/\\](.*?)$/o) { - $InpPath = $1 ; - $JobName = $2 ; - } - } - $JobName =~ s/\\/\//goi; - $InpPath =~ s/\\/\//goi; - my $OriSuffix = $JobSuffix; - if ($JobSuffix =~ /\_fo$/i) { - if (! -f $JobName) { - print "stripping funny suffix : _fo\n"; - $JobName =~ s/\_fo$//io ; - $JobSuffix =~ s/\_fo$//io ; - $OriSuffix =~ s/\_fo$//io ; - } - } - if (($dosish) && ($PdfClose)) { - my $ok = System("pdfclose --file $JobName.pdf") if -e "$JobName.pdf" ; - if (($Result ne '') && (-e "$Result.pdf")) { - $ok = System("pdfclose --file $Result.pdf") ; - } - System("pdfclose --all") unless $ok ; - } - if ( -e "$JobName.$JobSuffix" ) { - $DummyFile = ( ($ForceXML) || ( $JobSuffix =~ /(xml|fo|fox)/io ) ); - } - # to be considered : - # { $DummyFile = isXMLfile("$JobName.$JobSuffix") } - elsif ( $InpPath ne "" ) { - my @InpPaths = split( /,/, $InpPath ); - foreach my $rp (@InpPaths) { - if ( -e "$rp/$JobName.$JobSuffix" ) { $DummyFile = 1; last } - } - } - if ($DummyFile) { - open( TMP, ">$JobName.run" ); - if ( ( $JobSuffix =~ /(xml|fo|fox)/io ) || $ForceXML ) { - # scan xml preamble - open(XML,"<$JobName.$JobSuffix") ; - while (<XML>) { - if (/\<\?context\-directive\s+(\S+)\s+(\S+)\s+(\S+)\s*(.*?)\s*\?\>/o) { - my ($class, $key, $value, $rest) = ($1, $2, $3, $4) ; - if ($class eq 'job') { - if (($key eq 'mode') || ($key eq 'modes')) { - print TMP "\\enablemode[$value]\n" ; - } elsif (($key eq 'stylefile') || ($key eq 'environment')) { - print TMP "\\environment $value\n" ; - } elsif ($key eq 'module') { - print TMP "\\usemodule[$value]\n" ; - } elsif ($key eq 'interface') { - $ConTeXtInterface = $value ; - } elsif ($key eq 'control') { - if ($rest == 'purge') { $Purge = 1 } - } - } - } elsif (/\<[a-z]+/io) { - last ; - } - } - close(XML) ; - if ( $Filters ne "" ) { - print " using xml filters : $Filters\n"; - } - print TMP "\\starttext\n"; - print TMP "\\processXMLfilegrouped{$JobName.$JobSuffix}\n"; - print TMP "\\stoptext\n"; - } else { - print TMP "\\starttext\n"; - print TMP "\\processfile{$JobName.$JobSuffix}\n"; - print TMP "\\stoptext\n"; - } - close(TMP); - $JobSuffix = "run"; - } - if ( ( -e "$JobName.$JobSuffix" ) || ($GlobalFile) ) { - unless ($DummyFile) { # we don't need this for xml - ScanTeXPreamble("$JobName.$JobSuffix"); - if ( $ConTeXtInterface eq "unknown" ) { - ScanContent("$JobName.$JobSuffix"); - } - } - if ( $ConTeXtInterface eq "unknown" ) { - $ConTeXtInterface = $UserInterface; - } - if ( $ConTeXtInterface eq "unknown" ) { $ConTeXtInterface = "en" } - if ( $ConTeXtInterface eq "" ) { $ConTeXtInterface = "en" } - CheckOutputFormat; - my $StopRunning = 0; - my $MPrundone = 0; - if ( $Format eq '' ) { $Format = "cont-$ConTeXtInterface" } - print " executable : $TeXProgramPath$TeXExecutable\n"; - print " format : $TeXFormatPath$Format\n"; - if ($InpPath) { print " source path : $InpPath\n" } - - if ($DummyFile) { - print " dummy file : $JobName.$JobSuffix\n"; - } - print " inputfile : $JobName\n"; - print " output : $FullFormat\n"; - print " interface : $ConTeXtInterface\n"; - if ( $TeXTranslation ne '' ) { - print " translation : $TeXTranslation\n"; - } - my $Options = ''; - if ($Random) { $Options .= " random" } - if ($FastMode) { $Options .= " fast" } - if ($FinalMode) { $Options .= " final" } - if ($Verbose) { $Options .= " verbose" } - if ($TypesetListing) { $Options .= " listing" } - if ($TypesetModule) { $Options .= " module" } - if ($TypesetFigures) { $Options .= " figures" } - if ($MakeFormats) { $Options .= " make" } - if ($RunOnce) { $Options .= " once" } - if ($UseColor) { $Options .= " color" } - if ($EnterBatchMode) { $Options .= " batch" } - if ($EnterNonStopMode) { $Options .= " nonstop" } - if ($NoMPMode) { $Options .= " nomp" } - if ($CenterPage) { $Options .= " center" } - if ($Arrange) { $Options .= " arrange" } - if ($NoArrange) { $Options .= " no-arrange" } - if ($Options) { print " options :$Options\n" } - if ($ConTeXtModes) { print " possible modes : $ConTeXtModes\n" } - if ($Mode) { print " current mode : $Mode\n" } - else { print " current mode : none\n" } - if ($Arguments) { print " arguments : $Arguments\n" } - if ($Modules) { print " modules : $Modules\n" } - if ($Environments) { print " environments : $Environments\n" } - if ($Suffix) { $Result = "$JobName$Suffix" } - PushResult($JobName); - $Problems = 0; - my $TeXRuns = 0; - - if ( ($PdfArrange) || ($PdfSelect) || ($RunOnce) ) { - MakeOptionFile( 1, 1, $JobName, $OriSuffix, 3 ); - print "\n"; - $Problems = RunTeX( $JobName, $JobSuffix ); - if ($ForceTeXutil) { $Ok = RunTeXutil($JobName) } - CopyFile( "$JobName.top", "$JobName.tmp" ); - unlink "$JobName.top"; # runtime option file - PopResult($JobName); - } else { - while ( !$StopRunning && ( $TeXRuns < $NOfRuns ) && ( !$Problems ) ) - { - ++$TeXRuns; - if ( $TeXRuns == 1 ) { - MakeOptionFile( 0, 0, $JobName, $OriSuffix, 1 ); - } else { - MakeOptionFile( 0, 0, $JobName, $OriSuffix, 2 ); - } - print " TeX run : $TeXRuns\n\n"; - my ( $mpchecksumbefore, $mpchecksumafter ) = ( '', '' ); - my ( $tubchecksumbefore, $tubchecksumafter ) = ( '', '' ); - if ($AutoMPRun) { $mpchecksumbefore = CheckMPChanges($JobName) } - $tubchecksumbefore = CheckTubChanges($JobName) ; - $Problems = RunTeX( $JobName, $JobSuffix ); - $tubchecksumafter = CheckTubChanges($JobName) ; - if ($AutoMPRun) { $mpchecksumafter = CheckMPChanges($JobName) } - if ( ( !$Problems ) && ( $NOfRuns > 1 ) ) { - unless ( $NoMPMode ) { - $MPrundone = RunTeXMP( $JobName, "mpgraph" ); - $MPrundone = RunTeXMP( $JobName, "mprun" ); - } - $StopRunning = RunTeXutil($JobName); - if ($AutoMPRun) { - $StopRunning = - ( $StopRunning - && ( $mpchecksumafter eq $mpchecksumbefore ) ); - } - $StopRunning = - ( $StopRunning - && ( $tubchecksumafter eq $tubchecksumbefore ) ); - } - } - if ( ( $NOfRuns == 1 ) && $ForceTeXutil ) { - $Ok = RunTeXutil($JobName); - } - if ( ( !$Problems ) - && ( ( $FinalMode || $FinalRunNeeded ) ) - && ( $NOfRuns > 1 ) ) - { - MakeOptionFile( 1, $FinalMode, $JobName, $OriSuffix, 4 ); - print " final TeX run : $TeXRuns\n\n"; - $Problems = RunTeX( $JobName, $JobSuffix ); - } - CopyFile( "$JobName.top", "$JobName.tmp" ); - unlink "$JobName.tup"; # previous tuo file - unlink "$JobName.top"; # runtime option file - if ($ProducePdfX) { - $ENV{'backend'} = $ENV{'progname'} = 'dvipdfm' ; - $ENV{'TEXFONTMAPS'} = '.;$TEXMF/fonts/map/{dvipdfm,dvips,}//' ; - System("dvipdfmx -d 4 $JobName") ; - } elsif ($ProducePdfM) { - $ENV{'backend'} = $ENV{'progname'} = 'dvipdfm' ; - $ENV{'TEXFONTMAPS'} = '.;$TEXMF/fonts/map/{dvipdfm,dvips,}//' ; - System("dvipdfm $JobName") ; - } elsif ($ProducePdfXTX) { - $ENV{'backend'} = $ENV{'progname'} = 'xetex' ; - $ENV{'TEXFONTMAPS'} = '.;$TEXMF/fonts/map/{xetex,pdftex,dvips,}//' ; - System("xdv2pdf $JobName.xdv") ; - } elsif ($ProducePs) { - $ENV{'backend'} = $ENV{'progname'} = 'dvips' ; - $ENV{'TEXFONTMAPS'} = '.;$TEXMF/fonts/map/{dvips,pdftex,}//' ; - # temp hack, some day there will be map file loading in specials - my $mapfiles = '' ; - if (-f "$JobName.tui") { - open(TUI,"$JobName.tui") ; - while (<TUI>) { - if (/c \\usedmapfile\{.\}\{(.*?)\}/o) { - $mapfiles .= "-u +$1 " ; - } - } - close(TUI) ; - } - System("dvips $mapfiles $JobName.dvi") ; - } - PopResult($JobName); - } - if ($Purge) { PurgeFiles($JobName) } - if ($DummyFile) # $JobSuffix == run - { - unlink "$JobName.$JobSuffix"; - } - if ((!$Problems) && ($PdfOpen) && ($PdfOpenCall)) { - if ($Result ne '') { - System("$PdfOpenCall $Result.pdf") if -f "$Result.pdf" - } else { - System("$PdfOpenCall $JobName.pdf") if -f "$JobName.pdf" - } - } - } -} - -sub RunSomeTeXFile { - my ( $JobName, $JobSuffix ) = @_; - if ( -e "$JobName.$JobSuffix" ) { - PushResult($JobName); - print " executable : $TeXProgramPath$TeXExecutable\n"; - print " format : $TeXFormatPath$Format\n"; - print " inputfile : $JobName.$JobSuffix\n"; - $Problems = RunTeX( $JobName, $JobSuffix ); - PopResult($JobName); - } -} - -my $ModuleFile = "texexec"; -my $ListingFile = "texexec"; -my $FiguresFile = "texexec"; -my $ArrangeFile = "texexec"; -my $SelectFile = "texexec"; -my $CopyFile = "texexec"; -my $CombineFile = "texexec"; - -sub RunModule { - my @FileNames = sort @_; - if ($FileNames[0]) { - unless ( -e $FileNames[0] ) { - my $Name = $FileNames[0]; - @FileNames = ( "$Name.tex", "$Name.mp", "$Name.pl", "$Name.pm" ); - } - foreach my $FileName (@FileNames) { - next unless -e $FileName; - my ( $Name, $Suffix ) = split( /\./, $FileName ); - next unless $Suffix =~ /(tex|mp|pl|pm)/io; - DoRunModule( $Name, $Suffix ); - } - } else { - print " module : no modules found\n\n"; - } -} - -# the next one can be more efficient: directly process ted -# file a la --use=abr-01,mod-01 - -sub checktexformatpath { - # engine support is either broken of not implemented in some - # distributions, so we need to take care of it ourselves - my $texformats ; - if (defined($ENV{'TEXFORMATS'})) { - $texformats = $ENV{'TEXFORMATS'} ; - } else { - $texformats = '' ; - } - if ($texformats eq '') { - if ($UseEnginePath) { - if ($dosish) { - if ( $TeXShell =~ /MikTeX/io ) { - $texformats = `kpsewhich --alias=$TeXExecutable --expand-var=\$TEXFORMATS` ; - } else { - $texformats = `kpsewhich --engine=$TeXExecutable --expand-var=\$TEXFORMATS` ; - } - } else { - $texformats = `kpsewhich --engine=$TeXExecutable --expand-var=\\\$TEXFORMATS` ; - } - } else { - if ($dosish) { - $texformats = `kpsewhich --expand-var=\$TEXFORMATS` ; - } else { - $texformats = `kpsewhich --expand-var=\\\$TEXFORMATS` ; - } - } - chomp($texformats) ; - } - if (($texformats !~ /web2c\/.*$TeXExecutable/) && ($texformats !~ /web2c[\/\\].*\$engine/i)) { - $texformats =~ s/(web2c\/\{)(\,\})/$1\$engine$2/ ; # needed for empty engine flags - if ($texformats !~ /web2c[\/\\].*\$ENGINE/) { - $texformats =~ s/web2c/web2c\/{\$engine,}/ ; # needed for me - } - $ENV{'TEXFORMATS'} = $texformats ; - print " fixing texformat path : $ENV{'TEXFORMATS'}\n"; - } else { - print " using texformat path : $ENV{'TEXFORMATS'}\n" if ($Verbose) ; - } - if (! defined($ENV{'ENGINE'})) { - if ($MpEngineSupport) { - $ENV{'ENGINE'} .= $MpExecutable ; - } ; - $ENV{'ENGINE'} = $TeXExecutable ; - print "fixing engine variable : $ENV{'ENGINE'}\n"; - } -} - -sub DoRunModule { - my ( $FileName, $FileSuffix ) = @_; - RunPerlScript( $TeXUtil, "--documents $FileName.$FileSuffix" ); - print " module : $FileName\n\n"; - open( MOD, ">$ModuleFile.tex" ); - # we need to signal to texexec what interface to use - open( TED, "$FileName.ted" ); - my $firstline = <TED>; - close(TED); - if ( $firstline =~ /interface=/ ) { - print MOD $firstline ; - } else { - print MOD "% interface=en\n" ; - } - # so far - print MOD "\\usemodule[abr-01,mod-01]\n"; - print MOD "\\def\\ModuleNumber{1}\n"; - print MOD "\\starttext\n"; - print MOD "\\readlocfile{$FileName.ted}{}{}\n"; - print MOD "\\stoptext\n"; - close(MOD); - checktexformatpath ; - RunConTeXtFile( $ModuleFile, "tex" ); - if ( $FileName ne $ModuleFile ) { - foreach my $FileSuffix ( "dvi", "pdf", "tui", "tuo", "log" ) { - unlink("$FileName.$FileSuffix"); - rename( "$ModuleFile.$FileSuffix", "$FileName.$FileSuffix" ); - } - } - unlink("$ModuleFile.tex"); -} - -sub RunFigures { - my @Files = @_ ; - $TypesetFigures = lc $TypesetFigures; - return unless ( $TypesetFigures =~ /[abcd]/o ); - unlink "$FiguresFile.pdf"; - if (@Files) { RunPerlScript( $TeXUtil, "--figures @Files" ) } - open( FIG, ">$FiguresFile.tex" ); - print FIG "% format=english\n"; - print FIG "\\setuplayout\n"; - print FIG " [topspace=1.5cm,backspace=1.5cm,\n"; - print FIG " header=1.5cm,footer=0pt,\n"; - print FIG " width=middle,height=middle]\n"; - if ($ForceFullScreen) { - print FIG "\\setupinteraction\n"; - print FIG " [state=start]\n"; - print FIG "\\setupinteractionscreen\n"; - print FIG " [option=max]\n"; - } - if ($BoxType ne '') { - if ($BoxType !~ /box$/io) { - $BoxType .= "box" ; - } - } - print FIG "\\starttext\n"; - print FIG "\\showexternalfigures[alternative=$TypesetFigures,offset=$PaperOffset,size=$BoxType]\n"; - print FIG "\\stoptext\n"; - close(FIG); - $ConTeXtInterface = "en"; - checktexformatpath ; - RunConTeXtFile( $FiguresFile, "tex" ); - unlink('texutil.tuf') if ( -f 'texutil.tuf' ); -} - -sub CleanTeXFileName { - my $str = shift; - $str =~ s/([\$\_\#])/\\$1/go; - $str =~ s/([\~])/\\string$1/go; - return $str; -} - -sub RunListing { - my $FileName = my $CleanFileName = shift; - my @FileNames = glob $FileName; - return unless -f $FileNames[0]; - print " input file : $FileName\n"; - if ( $BackSpace eq "0pt" ) { $BackSpace = "1.5cm" } - else { print " backspace : $BackSpace\n" } - if ( $TopSpace eq "0pt" ) { $TopSpace = "1.5cm" } - else { print " topspace : $TopSpace\n" } - open( LIS, ">$ListingFile.tex" ); - print LIS "% format=english\n"; - print LIS "\\setupbodyfont[11pt,tt]\n"; - print LIS "\\setuplayout\n"; - print LIS " [topspace=$TopSpace,backspace=$BackSpace,\n"; - print LIS " header=0cm,footer=1.5cm,\n"; - print LIS " width=middle,height=middle]\n"; - print LIS "\\setuptyping[lines=yes]\n"; - if ($Pretty) { print LIS "\\setuptyping[option=color]\n" } - print LIS "\\starttext\n"; - - foreach $FileName (@FileNames) { - $CleanFileName = lc CleanTeXFileName($FileName); - print LIS "\\page\n"; - print LIS "\\setupfootertexts[\\tttf $CleanFileName][\\tttf \\pagenumber]\n"; - print LIS "\\typefile\{$FileName\}\n"; - } - print LIS "\\stoptext\n"; - close(LIS); - $ConTeXtInterface = "en"; - checktexformatpath ; - RunConTeXtFile( $ListingFile, "tex" ); -} - -sub RunArrange { - my @files = @_; - print " backspace : $BackSpace\n"; - print " topspace : $TopSpace\n"; - print " paperoffset : $PaperOffset\n"; - if ( $AddEmpty eq '' ) { print " empty pages added : none\n" } - else { print " empty pages added : $AddEmpty\n" } - if ( $TextWidth eq '0pt' ) { print " textwidth : unknown\n" } - else { print " textwidth : $TextWidth\n" } - open( ARR, ">$ArrangeFile.tex" ); - print ARR "% format=english\n"; - print ARR "\\definepapersize\n"; - print ARR " [offset=$PaperOffset]\n"; - print ARR "\\setuplayout\n"; - print ARR " [backspace=$BackSpace,\n"; - print ARR " topspace=$TopSpace,\n"; - - if ($Markings) { - print ARR " marking=on,\n"; - print " cutmarkings : on\n"; - } - print ARR " width=middle,\n"; - print ARR " height=middle,\n"; - print ARR " location=middle,\n"; - print ARR " header=0pt,\n"; - print ARR " footer=0pt]\n"; - if ($NoDuplex) { print " duplex : off\n" } - else { - print " duplex : on\n"; - print ARR "\\setuppagenumbering\n"; - print ARR " [alternative=doublesided]\n"; - } - print ARR "\\starttext\n"; - foreach my $FileName (@files) { - print " pdffile : $FileName\n"; - print ARR "\\insertpages\n [$FileName]"; - if ( $AddEmpty ne '' ) { print ARR "[$AddEmpty]" } - print ARR "[width=$TextWidth]\n"; - } - print ARR "\\stoptext\n"; - close(ARR); - $ConTeXtInterface = "en"; - checktexformatpath ; - RunConTeXtFile( $ModuleFile, "tex" ); -} - -sub RunSelect { - my $FileName = shift; - print " pdffile : $FileName\n"; - print " backspace : $BackSpace\n"; - print " topspace : $TopSpace\n"; - print " paperoffset : $PaperOffset\n"; - if ( $TextWidth eq '0pt' ) { print " textwidth : unknown\n" } - else { print " textwidth : $TextWidth\n" } - open( SEL, ">$SelectFile.tex" ); - print SEL "% format=english\n"; - print SEL "\\definepapersize\n"; - print SEL " [offset=$PaperOffset]\n"; - if ($PaperFormat =~ /fit/) { - print SEL "\\getfiguredimensions[$FileName]\n" ; - print SEL "\\expanded{\\definepapersize[fit][width=\\figurewidth,height=\\figureheight]}\n" ; - print SEL "\\setuppapersize[fit][fit]\n"; - $PaperFormat = '' ; # avoid overloading in option file - } elsif ( $PaperFormat ne 'standard' ) { - $_ = $PaperFormat; # NO UPPERCASE ! - s/x/\*/io; - my ( $from, $to ) = split(/\*/); - if ( $to eq "" ) { $to = $from } - print " papersize : $PaperFormat\n"; - print SEL "\\setuppapersize[$from][$to]\n"; - $PaperFormat = '' ; # avoid overloading in option file - } - # - print SEL "\\setuplayout\n"; - print SEL " [backspace=$BackSpace,\n"; - print SEL " topspace=$TopSpace,\n"; - if ($Markings) { - print SEL " marking=on,\n"; - print " cutmarkings : on\n"; - } - print SEL " width=middle,\n"; - print SEL " height=middle,\n"; - print SEL " location=middle,\n"; - print SEL " header=0pt,\n"; - print SEL " footer=0pt]\n"; - print SEL "\\setupexternalfigures\n"; - print SEL " [directory=]\n"; - print SEL "\\starttext\n"; - - if ( $Selection ne '' ) { - print SEL "\\filterpages\n"; - print SEL " [$FileName][$Selection][width=$TextWidth]\n"; - } - print SEL "\\stoptext\n"; - close(SEL); - $ConTeXtInterface = "en"; - checktexformatpath ; - RunConTeXtFile( $SelectFile, "tex" ); -} - -sub RunCopy { - my $DoTrim = shift ; - my @Files = @_ ; - if ( $PageScale == 1000 ) { - print " offset : $PaperOffset\n"; - } else { - print " scale : $PageScale\n"; - if ( $PageScale < 10 ) { $PageScale = int( $PageScale * 1000 ) } - } - open( COP, ">$CopyFile.tex" ); - print COP "% format=english\n"; - print COP "\\starttext\n"; - for my $FileName (@Files) { - print " pdffile : $FileName\n"; - print COP "\\getfiguredimensions\n"; - print COP " [$FileName]\n"; - print COP " [page=1"; - if ($DoTrim) { - print COP ",\n size=trimbox"; - } - print COP "]\n"; - print COP "\\definepapersize\n"; - print COP " [copy]\n"; - print COP " [width=\\naturalfigurewidth,\n"; - print COP " height=\\naturalfigureheight]\n"; - print COP "\\setuppapersize\n"; - print COP " [copy][copy]\n"; - print COP "\\setuplayout\n"; - print COP " [page]\n"; - print COP "\\setupexternalfigures\n"; - print COP " [directory=]\n"; - print COP "\\copypages\n"; - print COP " [$FileName]\n"; - print COP " [scale=$PageScale,\n"; - if ($Markings) { - print COP " marking=on,\n"; - print " cutmarkings : on\n"; - } - if ($DoTrim) { - print COP " size=trimbox,\n"; - print " cropping to : trimbox\n"; - } - print COP " offset=$PaperOffset]\n"; - } - print COP "\\stoptext\n"; - close(COP); - $ConTeXtInterface = "en"; - checktexformatpath ; - RunConTeXtFile( $CopyFile, "tex" ); -} - -sub RunCombine { - my @Files = @_; - $Combination =~ s/x/\*/io; - my ( $nx, $ny ) = split( /\*/, $Combination, 2 ); - return unless ( $nx && $ny ); - print " combination : $Combination\n"; - open( COM, ">$CombineFile.tex" ); - print COM "% format=english\n"; - if ( $PaperFormat ne 'standard' ) { - $_ = $PaperFormat; # NO UPPERCASE ! - s/x/\*/io; - my ( $from, $to ) = split(/\*/); - if ( $to eq "" ) { $to = $from } - print " papersize : $PaperFormat\n"; - print COM "\\setuppapersize[$from][$to]\n"; - } - # - if ( $PaperOffset eq '0pt' ) { $PaperOffset = '1cm' } - print " paper offset : $PaperOffset\n"; - print COM "\\setuplayout\n"; - print COM " [topspace=$PaperOffset,\n"; - print COM " backspace=$PaperOffset,\n"; - print COM " header=0pt,\n"; - print COM " footer=1cm,\n"; - print COM " width=middle,\n"; - print COM " height=middle]\n"; - - if ($NoBanner) { - print COM "\\setuplayout\n"; - print COM " [footer=0cm]\n"; - } - print COM "\\setupexternalfigures\n"; - print COM " [directory=]\n"; - print COM "\\starttext\n"; - for my $FileName (@Files) { - next if ( $FileName =~ /^texexec/io ); - next if (($Result ne '') && ( $FileName =~ /^$Result/i )); - print " pdffile : $FileName\n"; - my $CleanFileName = CleanTeXFileName($FileName); - print COM "\\setupfootertexts\n"; - print COM " [\\tttf $CleanFileName\\quad\\quad\\currentdate\\quad\\quad\\pagenumber]\n"; - print COM "\\combinepages[$FileName][nx=$nx,ny=$ny]\n"; - print COM "\\page\n"; - } - print COM "\\stoptext\n"; - close(COM); - $ConTeXtInterface = "en"; - checktexformatpath ; - RunConTeXtFile( $CombineFile, "tex" ); -} - -sub LocatedFormatPath { # watch out $engine is lowercase in kpse - my $FormatPath = shift; - my $EnginePath = shift; - my $EngineDone = shift; - if ($Local) { - $FormatPath = '.' ; # for patrick - } else { - if ( ( $FormatPath eq '' ) && ( $kpsewhich ne '' ) ) { - unless ($EngineDone) { - my $str = $ENV{"TEXFORMATS"} ; - $str =~ s/\$engine//io ; - $ENV{"TEXFORMATS"} = $str ; - } - # expanded paths - print " assuming engine : $EnginePath\n"; - if (($UseEnginePath)&&($EngineDone)) { - if ( $TeXShell =~ /MikTeX/io ) { - $FormatPath = `$kpsewhich --alias=$EnginePath --show-path=fmt` ; - } else { - $FormatPath = `$kpsewhich --engine=$EnginePath --show-path=fmt` ; - } - } else { - $FormatPath = `$kpsewhich --show-path=fmt` ; - } - chomp($FormatPath) ; - if ( ( $FormatPath ne '' ) && $Verbose ) { - print "located formatpath (1) : $FormatPath\n"; - } - # fall back - if ($FormatPath eq '') { - if (($UseEnginePath)&&($EngineDone)) { - if ($dosish) { - if ( $TeXShell =~ /MikTeX/io ) { - $FormatPath = `$kpsewhich --alias=$EnginePath --expand-path=\$TEXFORMATS` ; - } else { - $FormatPath = `$kpsewhich --engine=$EnginePath --expand-path=\$TEXFORMATS` ; - } - } else { - $FormatPath = `$kpsewhich --engine=$EnginePath --expand-path=\\\$TEXFORMATS` ; - } - } - chomp($FormatPath) ; - # either no enginepath or failed run - if ($FormatPath eq '') { - if ($dosish) { - $FormatPath = `$kpsewhich --expand-path=\$TEXFORMATS` ; - } else { - $FormatPath = `$kpsewhich --expand-path=\\\$TEXFORMATS` ; - } - } - chomp $FormatPath ; - } - chomp($FormatPath) ; - if ( ( $FormatPath ne '' ) && $Verbose ) { - print "located formatpath (2) : $FormatPath\n"; - } - $FormatPath =~ s/\\/\//g ; - if ($FormatPath ne '') { - my @fpaths ; - if ($dosish) { - @fpaths = split(';', $FormatPath) ; - } else { - @fpaths = split(':', $FormatPath) ; - } - # take first writable unless current - foreach my $fp (@fpaths) { - # remove funny patterns - $fp =~ s/\/+$// ; - $fp =~ s/^!!// ; - $fp =~ s/unsetengine/$EnginePath/ ; - if (($fp ne '') && ($fp ne '.')) { - # correct if needed - # append engine unless engine is already there - $fp =~ "$fp/$EnginePath" if ($fp =~ /[\\\/]$EnginePath[\\\/]*$/) ; - # path may not yet be present - # check if usable format path - my $fpp = $fp ; - $fpp =~ s/\/*$EnginePath\/*// ; - if ((-d $fpp) && (-w $fpp)) { - $FormatPath = $fpp ; - last ; - } - } - } - } - $FormatPath = '.' if (($FormatPath eq '') || (! -w $FormatPath)) ; - if ( ( $FormatPath ne '' ) && $Verbose ) { - print "located formatpath (3) : $FormatPath\n"; - } - $FormatPath .= '/'; - } - if ($UseEnginePath && $EngineDone && ($FormatPath ne '') && ($FormatPath !~ /$EnginePath\/$/)) { - $FormatPath .= $EnginePath ; - unless (-d $FormatPath) { - mkdir $FormatPath ; - } - $FormatPath .= '/' ; - } - } - print " using formatpath : $FormatPath\n" if $Verbose ; - return $FormatPath; -} - -sub RunOneFormat { - my ($FormatName) = @_; - my @TeXFormatPath; - my $TeXPrefix = ""; - if ( ( $fmtutil ne "" ) && ( $FormatName !~ /metafun|mptopdf/io ) ) { - # could not happen, not supported any more - my $cmd = "$fmtutil --byfmt $FormatName"; - MakeUserFile; # this works only when the path is kept - MakeResponseFile; - $Problems = System("$cmd"); - RemoveResponseFile; - RestoreUserFile; - } else { - $Problems = 1; - } - if ($Problems) { - $Problems = 0; - if ( $TeXExecutable =~ /etex|eetex|pdfetex|pdfeetex|pdfxtex|xpdfetex|eomega|aleph|xetex/io ) { - $TeXPrefix = "*"; - } - my $CurrentPath = cwd(); - my $TheTeXFormatPath = LocatedFormatPath($TeXFormatPath, $TeXExecutable,1); - if ( $TheTeXFormatPath ne '' ) { chdir $TheTeXFormatPath } - MakeUserFile; - MakeResponseFile; - $own_quote = ($TeXProgramPath =~ m/^[^\"].* / ? "\"" : "") ; - my $cmd = - "$own_quote$TeXProgramPath$TeXExecutable$own_quote $TeXVirginFlag " - . "$TeXPassString $PassOn ${TeXPrefix}$FormatName"; - $Problems = System($cmd) ; - RemoveResponseFile; - RestoreUserFile; - - if ( ( $TheTeXFormatPath ne '' ) && ( $CurrentPath ne '' ) ) { - print "\n"; - if ($UseEnginePath) { - print " used engineformatpath : $TheTeXFormatPath\n"; - } else { - print " used formatpath : $TheTeXFormatPath\n"; - } - print "\n"; - chdir $CurrentPath; - } - } -} - -sub RunFormats { - my $ConTeXtFormatsPrefix; - my $MetaFunDone = 0; - if (@ARGV) { @ConTeXtFormats = @ARGV } - elsif ( $UsedInterfaces ne '' ) { - @ConTeXtFormats = split /[\,\s]/, $UsedInterfaces; - } - if ($Format) { @ConTeXtFormats = $Format; $ConTeXtFormatsPrefix = ''; } - else { $ConTeXtFormatsPrefix = "cont-"; } - if ( $TeXHashExecutable ne '' ) { - unless ($FastMode) { - $own_quote = ($TeXProgramPath =~ m/^[^\"].* / ? "\"" : "") ; - my $cmd = "$own_quote$TeXProgramPath$TeXHashExecutable$own_quote"; - print "\n"; - print " TeX hash binary : $TeXProgramPath$TeXHashExecutable\n"; - print " comment : hashing may take a while ...\n"; - System($cmd); - } - } - foreach my $Interface (@ConTeXtFormats) { - if ( $Interface eq $MetaFun ) { - RunMpFormat($MetaFun); - $MetaFunDone = 1; - } elsif ( $Interface eq $MpToPdf ) { - if ( $TeXExecutable =~ /pdf/io ) { RunOneFormat("$MpToPdf") } - } else { - RunOneFormat("$ConTeXtFormatsPrefix$Interface"); - } - } - print "\n"; - print " TeX binary : $TeXProgramPath$TeXExecutable\n"; - print " format(s) : @ConTeXtFormats\n\n"; -} - -sub RunMpFormat { - # engine is not supported by MP - my $MpFormat = shift; - return if ( $MpFormat eq '' ); - my $CurrentPath = cwd(); - my $TheMpFormatPath = LocatedFormatPath($MpFormatPath,$MpExecutable,$MpEngineSupport); - if ( $TheMpFormatPath ne '' ) { chdir $TheMpFormatPath } - $own_quote = ($MpExecutable =~ m/^[^\"].* / ? "\"" : "") ; - my $cmd = - "$own_quote$MpExecutable$own_quote $MpVirginFlag $MpPassString $MpFormat"; - System($cmd ) ; - if ( ( $TheMpFormatPath ne '' ) && ( $CurrentPath ne '' ) ) { - print "\n"; - print " used formatpath : $TheMpFormatPath\n"; - print "\n"; - chdir $CurrentPath; - } -} - - -my $dir = File::Temp::tempdir(CLEANUP=>1) ; -my ($fh, $filename) = File::Temp::tempfile(DIR=>$dir, UNLINK=>1); - -sub RunFiles { - my $currentpath = cwd() ; - my $oldrunpath = $RunPath ; - # new - checktexformatpath ; - # test if current path is writable - if (! -w "$currentpath") { - print " current path readonly : $currentpath\n"; - # - # we cannot use the following because then the result will - # also be removed and users will not know where to look - # - # $RunPath = File::Temp::tempdir(CLEANUP=>1) ; - # if ($RunPath) { - # print " using temp path : $RunPath\n"; - # } else { - # print " problematic temp path : $currentpath\n"; - # exit ; - # } - # - foreach my $d ($ENV{"TMPDIR"},$ENV{"TEMP"},$ENV{"TMP"},"/tmp") { - if ($d && -e $d) { $RunPath = $d ; last ; } - } - if ($TempDir eq '') { - print " provide temp path for : $RunPath\n"; - exit ; - } elsif ($RunPath ne $oldrunpath) { - chdir ($RunPath) ; - unless (-e $TempDir) { - print " creating texexec path : $TempDir\n"; - mkdir ("$TempDir", 077) - } - if (-e $TempDir) { - $RunPath += $TempDir ; - } else { - # we abort this run because on unix an invalid tmp - # path can be an indication of a infected system - print " problematic temp path : $RunPath\n"; - exit ; - } - } else { - print " no writable temp path : $RunPath\n"; - exit ; - } - } - # test if we need to change paths - if (($RunPath ne "") && (-w "$RunPath")) { - print " changing to path : $RunPath\n"; - $InpPath = $currentpath ; - chdir ($RunPath) ; - } - # start working - if ($PdfArrange) { - my @arrangedfiles = (); - foreach my $JobName (@ARGV) { - unless ( $JobName =~ /.*\.pdf$/oi ) { - if ( -f "$JobName.pdf" ) { $JobName .= ".pdf" } - else { $JobName .= ".PDF" } - } - push @arrangedfiles, $JobName; - } - if (@arrangedfiles) { RunArrange(@arrangedfiles) } - } elsif ( ($PdfSelect) || ($PdfCopy) || ($PdfTrim) || ($PdfCombine) ) { - my $JobName = $ARGV[0]; - if ( $JobName ne '' ) { - unless ( $JobName =~ /.*\.pdf$/oi ) { - if ( -f "$JobName.pdf" ) { $JobName .= ".pdf" } - else { $JobName .= ".PDF" } - } - if ($PdfSelect) { - RunSelect($JobName) ; - } elsif ($PdfCopy) { - # RunCopy($JobName) ; - RunCopy(0,@ARGV) ; - } elsif ($PdfTrim) { - # RunCopy($JobName) ; - RunCopy(1,@ARGV) ; - } else { - # RunCombine ($JobName) ; - RunCombine(@ARGV); - } - } - } elsif ($TypesetModule) { - RunModule(@ARGV); - } else { - my $JobSuffix = "tex"; - foreach my $JobName (@ARGV) { - next if ($JobName =~ /^\-/io) ; - # start experiment - full name spec including suffix is prerequisite - if (($StartLine>0) && ($EndLine>=$StartLine) && (-e $JobName)) { - if (open(INP,$JobName) && open(OUT,'>texexec.tex')) { - print " writing partial file : $JobName\n"; - my $Line = 1 ; - my $Preamble = 1 ; - while (my $str = <INP>) { - if ($Preamble) { - if ($str =~ /\\start(text|tekst|product|project|component)/io) { - $Preamble = 0 ; - } else { - print OUT $str; - } - } elsif ($Line==$StartLine) { - print OUT "\\starttext\n" ; # todo: multilingual - print OUT $str ; - } elsif ($Line==$EndLine) { - print OUT $str ; - print OUT "\\stoptext\n" ; # todo: multilingual - last ; - } elsif (($Line>$StartLine) && ($Line<$EndLine)) { - print OUT $str ; - } - $Line += 1 ; - } - close(INP) ; - close(OUT) ; - $JobName = 'texexec.tex' ; - print " using job name : $JobName\n"; - } - } - # end experiment - if ( $JobName =~ s/\.(\w+)$//io ) { $JobSuffix = $1 } - if ( ( $Format eq '' ) || ( $Format =~ /^cont.*/io ) ) { - RunConTeXtFile( $JobName, $JobSuffix ); - } else { - RunSomeTeXFile( $JobName, $JobSuffix ); - } - unless ( -s "$JobName.log" ) { unlink("$JobName.log") } - unless ( -s "$JobName.tui" ) { unlink("$JobName.tui") } - } - } -} - -my $MpTmp = "tmpgraph"; # todo: prefix met jobname -my $MpKep = "$MpTmp.kep"; # sub => MpTmp("kep") -my $MpLog = "$MpTmp.log"; -my $MpBck = "$MpTmp.bck"; -my $MpTex = "$MpTmp.tex"; -my $MpDvi = "$MpTmp.dvi"; - -my %mpbetex; - -sub RunMP { ########### - if ( ($MpExecutable) && ($MpToTeXExecutable) && ($DviToMpExecutable) ) { - foreach my $RawMpName (@ARGV) { - my ( $MpName, $Rest ) = split( /\./, $RawMpName, 2 ); - my $MpFile = "$MpName.mp"; - if ( -e $MpFile - and ( -s $MpFile > 25 ) ) # texunlink makes empty file - { - unlink "$MpName.mpt"; - doRunMP( $MpName, 0 ); - # test for graphics, new per 14/12/2000 - my $mpgraphics = checkMPgraphics($MpName); - # test for labels - my $mplabels = checkMPlabels($MpName); - if ( $mpgraphics || $mplabels ) { - doRunMP( $MpName, $mplabels ); - } - } - } - } -} - -my $mpochecksum = ''; - -#~ sub checkMPgraphics { # also see makempy - #~ my $MpName = shift; - #~ if ( $MakeMpy ne '' ) { $MpName .= " --$MakeMpy " } # extra switches - #~ if ($MpyForce) { $MpName .= " --force " } # dirty - #~ else { - #~ return 0 unless -s "$MpName.mpo" > 32; - #~ return 0 unless ( open( MPO, "$MpName.mpo" ) ); - #~ $mpochecksum = do { local $/; unpack( "%32C*", <MPO> ) % 65535 }; - #~ close(MPO); - #~ if ( open( MPY, "$MpName.mpy" ) ) { - #~ my $str = <MPY>; - #~ chomp $str; - #~ close(MPY); - #~ if ( $str =~ /^\%\s*mpochecksum\s*\:\s*(\d+)/o ) { - #~ return 0 if ( ( $mpochecksum eq $1 ) && ( $mpochecksum ne 0 ) ); - #~ } - #~ } - #~ } - #~ RunPerlScript( "makempy", "$MpName" ); - #~ print " second MP run needed : text graphics found\n"; - #~ return 1; -#~ } - -sub checkMPgraphics { # also see makempy - my $MpName = shift; - if ( $MakeMpy ne '' ) { $MpName .= " --$MakeMpy " } # extra switches - if ($MpyForce) { $MpName .= " --force " } # dirty - else { - return 0 unless -s "$MpName.mpo" > 32; - return 0 unless ( open( MPO, "$MpName.mpo" ) ); - $mpochecksum = do { local $/; Digest::MD5::md5_hex(<MPO>) ; }; - close(MPO); - if ( open( MPY, "$MpName.mpy" ) ) { - my $str = <MPY>; - chomp $str; - close(MPY); - if ( $str =~ /^\%\s*mpochecksum\s*\:\s*([a-fA-F0-9]+)/o ) { - return 0 if ( ( $mpochecksum eq $1 ) && ( $mpochecksum ne '' ) ); - } - } - } - RunPerlScript( "makempy", "$MpName" ); - print " second MP run needed : text graphics found\n"; - return 1; -} - -sub checkMPlabels { - my $MpName = shift; - return 0 unless ((-f "$MpName.mpt") && ((-s "$MpName.mpt")>10) ); - return 0 unless open( MP, "$MpName.mpt" ); - my $n = 0; - my $t = "" ; - while (<MP>) { - if (/% setup : (.*)/o) { - $t = $1 ; - } else { - $t = "" ; - } - if (/% figure (\d+) : (.*)/o) { - if ($t ne "") { - $mpbetex{$1} .= "$t\n" ; - $t = "" ; - } - $mpbetex{$1} .= "$2\n"; - ++$n ; - } - } - close(MP); - print " second MP run needed : $n tex labels found\n" if $n; - return $n; -} - -sub doMergeMP { - # make sure that the verbatimtex ends up before btex etc - my ($n,$str) = @_ ; - if ($str =~ /(.*?)(verbatimtex.*?etex)\s*\;(.*)/mois) { - return "beginfig($n)\;\n$1$2\;\n$mpbetex{$n}\n$3\;endfig\;\n" ; - } else { - return "beginfig($n)\;\n$mpbetex{$n}\n$str\;endfig\;\n" ; - } -} - -sub doRunMP { ########### - my ( $MpName, $MergeBE ) = @_; - my $TexFound = 0; - my $MpFile = "$MpName.mp"; - if ( open( MP, $MpFile ) ) { # fails with % - my $MPdata = ""; - while (<MP>) { - unless (/^\%/) { $MPdata .= $_ } - } - $_ = $MPdata; - close(MP); - - # save old file - unlink($MpKep); - return if ( -e $MpKep ); - rename( $MpFile, $MpKep ); - # check for tex stuff - - $TexFound = $MergeBE || /btex .*? etex/o; - - # shorten lines into new file if okay - unless ( -e $MpFile ) { - open( MP, ">$MpFile" ); - s/(btex.*?)\;(.*?etex)/$1\@\@\@$2/gmois; - s/(\".*?)\;(.*?\")/$1\@\@\@$2/gmois; # added - s/\;/\;\n/gmois; - s/\n\n/\n/gmois; - s/(btex.*?)\@\@\@(.*?etex)/$1\;$2/gmois; - s/(\".*?)\@\@\@(.*?\")/$1\;$2/gmois; # added - # merge labels - if ($MergeBE) { - # i hate this indirect (sub regexp) mess - s/beginfig\s*\((\d+)\)\s*\;(.*?)endfig\s*\;/doMergeMP($1,$2)/gems ; - } - unless (/beginfig\s*\(\s*0\s*\)/gmois) { - if (defined($mpbetex{0})) { # test added, warning - print MP $mpbetex{0} ; - } - } - print MP $_; - print MP "\n" . "end" . "\n"; - close(MP); - } - if ($TexFound) { - print " metapost to tex : $MpName\n"; - $own_quote = ($MpToTeXExecutable =~ m/^[^\"].* / ? "\"" : "") ; - $Problems = - System("$own_quote$MpToTeXExecutable$own_quote $MpFile > $MpTex"); - if ( -e $MpTex && !$Problems ) { - open( TMP, ">>$MpTex" ); - print TMP "\\end\{document\}\n"; # to be sure - close(TMP); - if ( ( $Format eq '' ) || ( $Format =~ /^cont.*/io ) ) { - $OutputFormat = "dvips"; - RunConTeXtFile( $MpTmp, "tex" ); - } else { - RunSomeTeXFile( $MpTmp, "tex" ); - } - if ( -e $MpDvi && !$Problems ) { - print " dvi to metapost : $MpName\n"; - $own_quote = ($DviToMpExecutable =~ m/^[^\"].* / ? "\"" : "") ; - $Problems = System("$own_quote$DviToMpExecutable$own_quote $MpDvi $MpName.mpx"); - } - unlink $MpBck; - rename $MpTex, $MpBck; - unlink $MpDvi; - } - } - print " metapost : $MpName\n"; - $own_quote = ($MpExecutable =~ m/^[^\"].* / ? "\"" : "") ; - my $cmd = "$own_quote$MpExecutable$own_quote"; - if ($EnterBatchMode) { $cmd .= " $MpBatchFlag " } - if ($EnterNonStopMode) { $cmd .= " $MpNonStopFlag " } - if ( ( $MpFormat ne '' ) && ( $MpFormat !~ /(plain|mpost)/oi ) ) { - print " format : $MpFormat\n"; - $cmd .= " $MpPassString $MpFormatFlag$MpFormat "; - } - # prevent nameclash, experimental - my $MpMpName = "$MpName"; - $Problems = System("$cmd $MpMpName"); - open( MPL, "$MpName.log" ); - while (<MPL>) # can be one big line unix under win - { - while (/^l\.(\d+)\s/gmois) { - print " error in metapost run : $MpName.mp:$1\n"; - } - } - close(MPL) ; - unlink "mptrace.tmp"; - rename( $MpFile, "mptrace.tmp" ); - if ( -e $MpKep ) { - unlink($MpFile); - rename( $MpKep, $MpFile ); - } - } -} - -sub RunMPX { - my $MpName = shift; - $MpName =~ s/\..*$//o; - my $MpFile = $MpName . ".mp"; - if ( ($MpToTeXExecutable) - && ($DviToMpExecutable) - && ( -e $MpFile ) - && ( -s $MpFile > 5 ) - && open( MP, $MpFile ) ) - { - local $/ = "\0777"; - $_ = <MP>; - close(MP); - if (/(btex|etex|verbatimtex)/mos) { - print " generating mpx file : $MpName\n"; - $own_quote = ($MpToTeXExecutable =~ m/^[^\"].* / ? "\"" : "") ; - $Problems = - System("$own_quote$MpToTeXExecutable$own_quote $MpFile > $MpTex"); - if ( -e $MpTex && !$Problems ) { - open( TMP, ">>$MpTex" ); - print TMP "\\end\n"; # to be sure - close(TMP); - checktexformatpath ; - if ( ( $Format eq '' ) || ( $Format =~ /^cont.*/io ) ) { - RunConTeXtFile( $MpTmp, "tex" ); - } else { - RunSomeTeXFile( $MpTmp, "tex" ); - } - if ( -e $MpDvi && !$Problems ) { - $own_quote = ($DviToMpExecutable =~ m/^[^\"].* / ? "\"" : "") ; - $Problems = - System("$own_quote$DviToMpExecutable$own_quote $MpDvi $MpName.mpx"); - } - unlink $MpTex; - unlink $MpDvi; - } - } - } -} - -sub load_set_file { - my %new; - my %old; - my ( $file, $trace ) = @_; - if ( open( BAT, $file ) ) { - while (<BAT>) { - chomp; - if (/\s*SET\s+(.+?)\=(.+)\s*/io) { - my ( $var, $val ) = ( $1, $2 ); - $val =~ s/\%(.+?)\%/$ENV{$1}/goi; - unless ( defined( $old{$var} ) ) { - if ( defined( $ENV{$var} ) ) { $old{$var} = $ENV{$var} } - else { $old{$var} = "" } - } - $ENV{$var} = $new{$var} = $val; - } - } - close(BAT); - } - if ($trace) { - foreach my $key ( sort keys %new ) { - if ( $old{$key} ne $new{$key} ) { - print " changing env variable : '$key' from '$old{$key}' to '$new{$key}'\n"; - } elsif ( $old{$key} eq "" ) { - print " setting env variable : '$key' to '$new{$key}'\n"; - } else { - print " keeping env variable : '$key' at '$new{$key}'\n"; - } - } - print "\n"; - } -} - -if ( $SetFile ne "" ) { load_set_file( $SetFile, $Verbose ) } - -sub check_texmf_root { } -sub check_texmf_tree { } - -sub AnalyzeVersion - { my $str = join("\n", @_) ; - my ($texengine,$type) = ('unknown', 'unknown'); - open (LOG, "<texvers.log") ; - while (<LOG>) - { /^\s*This is (.*(pdf)?(|e|x)TeX.*?)$/o and $texengine = $1 ; - /^\s*ConTeXt (.*int: ([a-z]+).*?)\s*$/o and $type = $1; } - $type =~ s/ int: ([a-z]+)//; - $texengine =~ s/ Version//; - $texengine =~ s/ \(format.*$//; - close (LOG); - return ($texengine,$type) } - -sub show_version_info { - my ($texengine,$type); - open (TEX,">texvers.tex") ; - print TEX "\\bye " ; - close (TEX) ; - my $texutil = `$TeXUtil --help`; - $texutil =~ s/.*(TeXUtil[^\n]+)\n.*?$/$1/s; - print " texexec :$Program\n" ; - print " texutil : $texutil" ; - my $contexttext = `$kpsewhich context.tex`; - my $contextversion = "<not found>"; - if ($contexttext) { - chop $contexttext; - { local $/; - open (IN,"<$contexttext"); - $contextversion = <IN>; - close IN; - } - $contextversion =~ s/.*contextversion\{([0-9\.\:\s]+)\}.*/$1/s; - } - $EnterBatchMode = 1; - $Format = 'cont-en'; - my $cmd = PrepRunTeX("texvers","tex",'') ; - ($texengine,$type) = AnalyzeVersion(Pipe($cmd)) ; - print " tex : $texengine\n" ; - print " context : ver: $contextversion\n" ; - print " cont-en : $type\n" ; - foreach my $a (qw(cz de fr it nl ro uk xx)) { - my $test = Pipe("$kpsewhich -format='fmt' cont-$a") ; - if (defined $test && $test) { - $Format = 'cont-' . $a; - $cmd = PrepRunTeX("texvers","tex",''); - ($texengine,$type) = AnalyzeVersion(Pipe($cmd)) ; - print " cont-$a : $type\n" ; - } - } - unlink <texvers.*>; -} - -# the main thing - -if ($HelpAsked) { - show_help_info -} elsif ($Version) { - show_version_info -} elsif ($TypesetListing) { - check_texmf_root; - check_texmf_tree; - RunListing(@ARGV); -} elsif ($TypesetFigures) { - check_texmf_root; - check_texmf_tree; - RunFigures(@ARGV); -} elsif ($DoMPTeX) { - check_texmf_root; - check_texmf_tree; - RunMP; -} elsif ($DoMPXTeX) { - check_texmf_root; - check_texmf_tree; - RunMPX( $ARGV[0] ); -} elsif ($MakeFormats) { - check_texmf_root; - check_texmf_tree; - if ( $MpDoFormat ne '' ) { - RunMpFormat($MpDoFormat) ; - } - else { - RunFormats ; - } -} elsif (@ARGV) { - check_texmf_root; - check_texmf_tree; - @ARGV = <@ARGV>; - RunFiles; -} elsif ( !$HelpAsked ) { - show_help_options; -} - -$TotalTime = time - $TotalTime; - -unless ($HelpAsked) { print "\n total run time : $TotalTime seconds\n" } - -print "\n" ; -print " warning : use 'texmfstart texexec' instead\n" ; - -if ($Problems) { exit 1 } - -__DATA__ -arrange process and arrange ------------ -batch run in batch mode (don't pause) ------------ -nonstop run in non stop mode (don't pause) ------------ -centerpage center the page on the paper ------------ -color enable color (when not yet enabled) ------------ -usemodule load some modules first -=name list of modules ------------ -xmlfilter apply XML filter -=name list of filters ------------ -environment load some environments first -=name list of environments ------------ -fast skip as much as possible ------------ -figures typeset figure directory -=a room for corrections -=b just graphics -=c one (cropped) per page -paperoffset room left at paper border -fullscreen force full screen mode (pdf) ------------ -screensaver turn graphic file into a (pdf) full screen file ------------ -final add a final run without skipping ------------ -format fmt file -=name format file (memory dump) ------------ -mpformat mem file -=name format file (memory dump) ------------ -interface user interface -=en English -=nl Dutch -=de German -=fr French -=cz Czech -=uk British -=it Italian ------------ -language main hyphenation language -=xx standard abbreviation ------------ -listing produce a verbatim listing -backspace inner margin of the page -topspace top/bottom margin of the page -pretty enable pretty printing -color use color for pretty printing ------------ -make build format files -language patterns to include -bodyfont bodyfont to preload -response response interface language -format TeX format -mpformat MetaPost format -program TeX program ------------ -mode running mode -=list modes to set ------------ -module typeset tex/pl/mp module ------------ -mptex run an MetaPost plus btex-etex cycle ------------ -mpxtex generate an MetaPost mpx file ------------ -noarrange process but ignore arrange ------------ -nomp don't run MetaPost at all ------------ -nomprun don't run MetaPost at runtime ------------ -automprun MetaPost at runtime when needed ------------ -once run TeX only once (no TeXUtil either) ------------ -output specials to use -=pdftex Han The Thanh's pdf backend -=dvips Tomas Rokicky's dvi to ps converter -=dvipsone YandY's dvi to ps converter -=dviwindo YandY's windows previewer -=dvipdfm Mark Wicks' dvi to pdf converter -=dvipdfmx Jin-Hwan Cho's extended dvipdfm ------------ -passon switches to pass to TeX (--src for MikTeX) ------------ -pages pages to output -=odd odd pages -=even even pages -=x,y:z pages x and y to z ------------ -paper paper input and output format -=a4a3 A4 printed on A3 -=a5a4 A5 printed on A4 ------------ -path document source path -=string path ------------ -pdf produce PDF directly using pdf(e)tex ------------ -pdfarrange arrange pdf pages -paperoffset room left at paper border -paper paper format -noduplex single sided -backspace inner margin of the page -topspace top/bottom margin of the page -markings add cutmarks -background -=string background graphic -addempty add empty page after -textwidth width of the original (one sided) text ------------ -pdfcombine combine pages to one page -paperformat paper format -combination n*m pages per page -paperoffset room left at paper border -nobanner no footerline ------------ -pdfcopy scale pages down/up -scale new page scale -paperoffset room left at paper border -markings add cutmarks -background -=string background graphic ------------ -pdfselect select pdf pages -selection pages to select -=odd odd pages -=even even pages -=x,y:z pages x and y to z -paperoffset room left at paper border -paperformat paper format -backspace inner margin of the page -topspace top/bottom margin of the page -markings add cutmarks -background -=string background graphic -addempty add empty page after -textwidth width of the original (one sided) text ------------ -print page imposition scheme -=up 2 pages per sheet doublesided -=down 2 rotated pages per sheet doublesided ------------ -result resulting file -=name filename ------------ -input input file (if used) -=name filename ------------ -suffix resulting file suffix -=string suffix ------------ -runs maximum number of TeX runs -=n number of runs ------------ -silent minimize (status) messages ------------ -tex TeX binary -=name binary of executable ------------ -textree additional texmf tree to be used -=path subpath of tex root ------------ -texroot root of tex trees -=path tex root ------------ -verbose shows some additional info ------------ -help show this or more, e.g. '--help interface' ------------ -alone bypass utilities (e.g. fmtutil for non-standard fmts) ------------ -texutil force TeXUtil run ------------ -version display various version information ------------ -setfile load environment (batch) file diff --git a/Master/texmf-dist/scripts/context/perl/texexec.rme b/Master/texmf-dist/scripts/context/perl/texexec.rme deleted file mode 100644 index 43f142f9da4..00000000000 --- a/Master/texmf-dist/scripts/context/perl/texexec.rme +++ /dev/null @@ -1,169 +0,0 @@ -% == introduction == -% -% This is 'texexec.ini', the file used by texexec to determine where -% to find files, what TeX to use, what flags to pass, etc. Although -% TeXexec tries to locate things itself, a little help is sometimes -% needed. One can influence texexec by setting some variables. These -% are only needed when the automatic determined settings fail. -% -% == interfacing == -% -% UsedInterfaces nl,en the formats generated with --make -% UserInterface nl the default format used -% -% == binaries == -% -% TeXExecutable pdfetex the TeX binary to use -% MpExecutable mpost the MetaPost binary to use -% MpToTeXExecutable mpto the MetaPost to TeX converter -% DviToMpExecutable dvitomp the DVI to MetaPost converter -% -% == Scripts == -% -% DviSpecialScript dvispec the DVI special filter script -% -% == flags == -% -% TeXFormatFlag -fmt= the format introducer -% TeXVirginFlag -ini the format generation switch -% -% == paths == -% -% TeXFormatPath texmf/... fmt files -% ConTeXtPath texmf/tex/context/base sources -% SetupPath texmf/tex/base/user cont-sys/usr file -% TeXScriptsPath texmf/context/perltk scripts -% TeXFontsPath texmf font files -% -% MpFormatPath TeXFormatPath mem files -% -% == the main shell setting == -% -% As shown below, one can define his/her own sections. We default to -% the teTeX/fpTeX web2c based settings. - -set TeXShell to tetex -%set TeXShell to fptex -%set TeXShell to miktex -%set TeXShell to private - -% == setting up the variables == -% -% Here are some general defaults. They can be overruled later. - -set UseEnginePath to true - -set UsedInterfaces to en nl metafun mptopdf -set UserInterface to en - -set TeXExecutable to tex - -set MpExecutable to mpost -set MpToTeXExecutable to mpto -set DviToMpExecutable to dvitomp -set DviSpecialScript to dvispec - -set MpFormat to metafun - -set TeXFormatFlag to & -set MpFormatFlag to & - -% For teTeX the next settings will do. - -% -default-translate-file=cp8bit -file-line-error-style - -for tetex set TeXHashExecutable to mktexlsr -for tetex set TeXExecutable to pdfetex -for tetex set TeXVirginFlag to -ini -for tetex set TeXPassString to -progname=context -for tetex set TeXBatchFlag to -int=batchmode -for tetex set TeXNonStopFlag to -int=nonstopmode -for tetex set MpToTeXExecutable to mpto -for tetex set MpVirginFlag to -ini -for tetex set MpPassString to -progname=mpost -for tetex set MpBatchFlag to -int=batchmode -for tetex set MpNonStopFlag to -int=nonstopmode - -% These also apply to fpTeX. - -% -default-translate-file=cp8bit -file-line-error-style - -for fptex set TeXHashExecutable to mktexlsr -for fptex set TeXExecutable to pdfetex -for fptex set TeXVirginFlag to -ini -for fptex set TeXPassString to -progname=context -for fptex set TeXBatchFlag to -int=batchmode -for fptex set TeXNonStopFlag to -int=nonstopmode -for fptex set MpToTeXExecutable to mpto -for fptex set MpVirginFlag to -ini -for fptex set MpPassString to -progname=mpost -for fptex set MpBatchFlag to -int=batchmode -for fptex set MpNonStopFlag to -int=nonstopmode - -% a downward compatibility test (<7.5.3), next year we will use -8bit - -for tetex set TeXVirginFlag to -ini -translate-file=natural.tcx -for fptex set TeXVirginFlag to -ini -translate-file=natural.tcx -for tetex set MpVirginFlag to -ini -translate-file=natural.tcx -for fptex set MpVirginFlag to -ini -translate-file=natural.tcx - -for tetex set TeXPassString to -progname=context -translate-file=natural.tcx -for fptex set TeXPassString to -progname=context -translate-file=natural.tcx -for tetex set MpPassString to -progname=mpost -translate-file=natural.tcx -for fptex set MpPassString to -progname=mpost -translate-file=natural.tcx - -% MikTeX users probably have to set up some paths too. - -for miktex set TeXHashExecutable to initexmf --update-fndb -for miktex set TeXExecutable to pdfetex -for miktex set TeXVirginFlag to --initialize -for miktex set TeXPassString to --alias=context --translate-file=natural.tcx -for miktex set TeXBatchFlag to --interaction=batchmode -for miktex set TeXNonStopFlag to --interaction=nonstopmode -for miktex set MpToTeXExecutable to mpto -for miktex set MpVirginFlag to --initialize -for miktex set MpPassString to --alias=mpost --translate-file=natural.tcx -for miktex set MpBatchFlag to --interaction=batchmode -for miktex set MpNonStopFlag to --interaction=nonstopmode - -for miktex set TeXFormatFlag to --undump= -for miktex set MpFormatFlag to --undump= - -% These are the settings used on some machines at PRAGMA ADE that -% don't use the texmf tree. They can serve as an example for local -% settings. Local settings should either be added to the previous -% one, or go without the 'for' directives. Consider these -% settings as an example. - -for private set UsedInterfaces to en nl -for private set UserInterface to nl -for private set ConTeXtPath to t:/sources/ -for private set SetupPath to t:/perl/ -for private set TeXScriptsPath to t:/perl/ - -% == read this too == -% -% If this file is called 'texexec.rme', copy it to 'texexec.ini', -% check the settings above, change them according to your TeX -% distribution, and say: -% -% texexec --verbose -% -% When set up properly, you should see your local settings fly by. -% When these settings are ok, the next call should work: -% -% texexec --make -% -% and you should be able to process a file by saying -% -% texexec filename -% -% See 'mtexexec.pdf' for more information on the flags you can use with -% 'texexec'. Also make sure you have the 'texutil' script installed in -% the same path as 'texexec'. - -% Experimental -% -% set TcXPath to d:/tex/texmf/web2c -% set FmtLanguage to pl -% set FmtBodyFont to plr diff --git a/Master/texmf-dist/scripts/context/perl/texutil.pl b/Master/texmf-dist/scripts/context/perl/texutil.pl deleted file mode 100644 index ca364501584..00000000000 --- a/Master/texmf-dist/scripts/context/perl/texutil.pl +++ /dev/null @@ -1,2914 +0,0 @@ -eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"$@"}' && eval 'exec perl -S $0 $argv:q' - if 0; - -#D \module -#D [ file=texutil.pl, -#D version=2003.09.16, -#D title=pre- and postprocessing utilities, -#D subtitle=\TEXUTIL, -#D author=Hans Hagen, -#D date=\currentdate, -#D copyright={PRAGMA / Hans Hagen \& Ton Otten}] -#C -#C This module is part of the \CONTEXT\ macro||package and is -#C therefore copyrighted by \PRAGMA. See licen-en.pdf for -#C details. - -# much functionality will move to ctxtools, xmltools and pdftools; that way texutil -# becomes limited to tui processing only, which is cleaner (also for taco's binary -# version) - -# Thanks to Tobias Burnus for the german translations. -# Thanks to Thomas Esser for hooking it into web2c -# Thanks to Taco Hoekwater for making the file -w proof and some fixes -# Thanks to Alex Knowles and friends for the right JPG specs -# Thanks to Sebastian Rahtz for the eps to PDF method -# Thanks to Fabrice Popineau for windows bin code - -#D We started with a hack provided by Thomas Esser. This -#D expression replaces the unix specific line \type -#D {#!/usr/bin/perl}. - -# undocumented: -# -# --analyze file.pdf : reports some statistics -# --purge [jobname] : removes temporary files -# --purgeall [jobname] : removes all temporary files - -#D This is \TEXUTIL, a utility program (script) to be used -#D alongside the \CONTEXT\ macro package. This \PERL\ script is -#D derived from the \MODULA\ version and uses slightly better -#D algoritms for sanitizing \TEX\ specific (sub|)|strings. -#D -#D This implementation has some features not found in the -#D binary version, like scanning illustrations other than \EPS. -#D I would suggest to keep an eye on the version number: - -$Program = "TeXUtil 9.0.1 - ConTeXt / PRAGMA ADE 1992-2006" ; - -#D By the way, this is my first \PERL\ script, which means -#D that it will be improved as soon as I find new and/or more -#D suitable solutions in the \PERL\ manuals. As can be seen in -#D the definition of \type{$Program}, this program is part of -#D the \CONTEXT\ suite, and therefore can communicate with the -#D users in english as well as some other languages. One can -#D set his favourite language by saying something like: - -#D This one has a real old date, 1992. This is because it is -#D a converted modula program that was used in the very early -#D days of our \TEX\ history (macros for proper inclusion of -#D graphics were among the first thatwe wrote). - -#D \starttypen -#D perl texutil.pl --int=de --fig *.eps *.tif *.pdf *.png *.jpg -#D \stoptypen -#D -#D or simpler: -#D -#D \starttypen -#D perl texutil.pl --fig *.* -#D \stoptypen - -#D Of course one can also say \type{--interface=nl}, which -#D happens to be my native language. - -#D I won't go into too much detail on the algoritms used. -#D The next few pages show the functionality as reported by the -#D helpinformation and controled by command line arguments -#D and can serve as additional documentation. - -#D \TEXUTIL\ can handle different tasks; which one is active -#D depends on the command line arguments. These are handled by -#D a \PERL\ system module. This means that, at least for the -#D moment, there is no external control as provided by the -#D \PRAGMA\ environment system. - -use Getopt::Long ; -use FindBin ; - -#D We don't want error messages and accept partial switches, -#D which saves users some typing. - -$Getopt::Long::passthrough = 1 ; # no error message -$Getopt::Long::autoabbrev = 1 ; # partial switch accepted - -#D We also predefine the interface language and set a boolean -#D that keeps track of unknown options. \voetnoot {This feature -#D is still to be implemented.} - -$UserInterface = "en" ; -$UnknownOptions = 0 ; -$TcXPath = '' ; - -#D We need this for calling GS. - -use Config ; - -my $dosish = ($Config{'osname'} =~ /^(ms)?dos|^os\/2|^(ms|cyg)win/i) ; - -#D Here come the options: - -&GetOptions - ("references" => \$ProcessReferences, - "ij" => \$ProcessIJ, - "high" => \$ProcessHigh, - "quotes" => \$ProcessQuotes, - "tcxpath=s" => \$TcXPath, - "documents" => \$ProcessDocuments, - "type=s" => \$ProcessType, - "outputfile=s" => \$ProcessOutputFile, - "sources" => \$ProcessSources, - "setups" => \$ProcessSetups, - "templates" => \$ProcessTemplates, - "infos" => \$ProcessInfos, - "figures" => \$ProcessFigures, - "epspage" =>\$ProcessEpsPage, - "epstopdf" =>\$ProcessEpsToPdf, - "logfile" => \$ProcessLogFile, - "box" =>\$ProcessBox, - "hbox" =>\$ProcessHBox, - "vbox" =>\$ProcessVBox, - "criterium=f" =>\$ProcessCriterium, - "unknown" =>\$ProcessUnknown, - "purge" => \$PurgeFiles, - "purgeall" => \$PurgeAllFiles, - "analyze" => \$AnalyzeFile, - "filter" => \$FilterPages, - "help" => \$ProcessHelp, - "silent" => \$ProcessSilent, - "verbose" => \$ProcessVerbose, - "interface=s" => \$UserInterface) ; - -# A bit old, this code, could be an array. Anyhow, we will -# replace texutil soon. - -$InputFile = "@ARGV" ; # niet waterdicht - -#D We need some hacks to suppress terminal output. This -#D piece of code is based on page~193 of "Programming Perl". - -$ProgramLog = "texutil.log" ; - -# Well, it seems that unix' symlinks are sensitive for being -# hijacked. The assumption is that a known file can be a problem. -# Of course when one knows that certains files are processed, -# the names are always known and hijacking can always take -# place. But let's use a slightly less predictable name here: -# -# if ((@ARGV[0]) && (@ARGV[0] ne "")) { -# $ProgramLog = "@ARGV[0]-$ProgramLog" ; -# } else { -# # no need to be silent -# $ProcessSilent = 0 ; -# } -# -# or better, let's drop this feature, since i'm not in the mood -# now to test hacks like this (i'll just wait till the age of -# computer anarchy has ended). - -$ProgramLog = "/dev/null" ; - -# Maybe we should just write to the nul device. (In the rewritten -# version I can treat unix more strick.) - -sub RedirectTerminal - { open SAVEDSTDOUT, ">&STDOUT" ; - open STDOUT, ">$ProgramLog" ; - select STDOUT; $| = 1 } - -#D And, indeed: - -if ($ProcessSilent) - { RedirectTerminal } -else - { $ProcessVerbose = 0 } - -#D We can temporary open the terminal channel. - -sub OpenTerminal - { close STDOUT ; - open STDOUT, ">&SAVEDSTDOUT" } - -sub CloseTerminal - { open SAVEDSTDOUT, ">&STDOUT" ; - open STDOUT, ">>$ProgramLog" ; - select STDOUT; $| = 1 } - -#D By default wildcards are expanded into a list. The -#D subroutine below is therefore only needed when no file or -#D pattern is given. - -sub CompFileName - { my ($a,$b) = @_ ; - my ($fa,$sa) = split(/\./,$a) ; - my ($fb,$sb) = split(/\./,$b) ; - if (($sa =~ /^\d+$/o)&&($sb =~ /^\d+$/o)) - { $a = $fa . "." . sprintf("%10d",$sa) ; $a =~ s/\s/0/o ; - $b = $fb . "." . sprintf("%10d",$sb) ; $b =~ s/\s/0/o } - return (lc ($a) cmp lc ($b)) } - -sub CheckInputFiles - { @UserSuppliedFiles = glob $_[0] ; - @UserSuppliedFiles = sort { CompFileName($a,$b) } @UserSuppliedFiles } - -#D The next subroutine takes care of the optional output -#D filename (e.g. for figure dimensions). - -$ProcessOutputFile = "" ; - -my $Rubish ; - -sub SetOutputFile - { ($OutFilNam, $OutFilSuf) = split (/\./, $_[0], 2) ; - unless ($ProcessOutputFile eq "") - { $ProcessOutputFile .= "." . $OutFilSuf ; - ($OutFilNam, $OutFilSuf, $Rubish) = split (/\./, $ProcessOutputFile , 3)} - $OutputFile = $OutFilNam . "." . $OutFilSuf } - -#D Sometimes we need to split filenames. - -my ($FileName, $FileSuffix) = ("","") ; - -sub SplitFileName - { my $Rubish = "" ; - if ($_[0] =~ /^\.\//) - { ($Rubish, $FileName) = split ( /^\.\//, $_[0], 2) } - else - { $FileName = $_[0] } - return split (/\./, $FileName, 2) } - -#D In order to support multiple interfaces, we save the -#D messages in a hash table. As a bonus we can get a quick -#D overview of the messages we deal with. - -my %MS ; - -sub Report - { foreach $_ (@_) - { if (! defined $MS{$_}) - { print $_ } - else - { print $MS{$_} } - print " " } - print "\n" } - -#D The messages are saved in a hash table and are called -#D by name. This contents of this table depends on the -#D interface language in use. - -#D \startcompressdefinitions - -if ($UserInterface eq "nl") - - { # begin of dutch section - - $MS{"ProcessingReferences"} = "commando's, lijsten en indexen verwerken" ; - $MS{"MergingReferences"} = "indexen samenvoegen" ; - $MS{"GeneratingDocumentation"} = "ConTeXt documentatie file voorbereiden" ; - $MS{"GeneratingSources"} = "ConTeXt broncode file genereren" ; - $MS{"FilteringDefinitions"} = "ConTeXt definities filteren" ; - $MS{"CopyingTemplates"} = "TeXEdit toets templates copieren" ; - $MS{"CopyingInformation"} = "TeXEdit help informatie copieren" ; - $MS{"GeneratingFigures"} = "figuur file genereren" ; - $MS{"FilteringLogFile"} = "log file filteren (poor mans version)" ; - - $MS{"SortingIJ"} = "IJ sorteren onder Y" ; - $MS{"ConvertingHigh"} = "hoge ASCII waarden converteren" ; - $MS{"ProcessingQuotes"} = "characters met accenten afhandelen" ; - $MS{"ForcingFileType"} = "filetype instellen" ; - $MS{"UsingEps"} = "EPS files afhandelen" ; - $MS{"UsingTif"} = "TIF files afhandelen" ; - $MS{"UsingPdf"} = "PDF files afhandelen" ; - $MS{"UsingPng"} = "PNG files afhandelen" ; - $MS{"UsingJpg"} = "JPG files afhandelen" ; - $MS{"EpsToPdf"} = "EPS converteren naar PDF"; - $MS{"EpsPage"} = "EPS pagina instellen"; - $MS{"FilteringBoxes"} = "overfull boxes filteren" ; - $MS{"ApplyingCriterium"} = "criterium toepassen" ; - $MS{"FilteringUnknown"} = "onbekende ... filteren" ; - - $MS{"NoInputFile"} = "geen invoer file opgegeven" ; - $MS{"NoOutputFile"} = "geen uitvoer file gegenereerd" ; - $MS{"EmptyInputFile"} = "lege invoer file" ; - $MS{"NotYetImplemented"} = "nog niet beschikbaar" ; - - $MS{"Action"} = " actie :" ; - $MS{"Option"} = " optie :" ; - $MS{"Error"} = " fout :" ; - $MS{"Remark"} = " opmerking :" ; - $MS{"SystemCall"} = " systeemaanroep :" ; - $MS{"BadSystemCall"} = " foute systeemaanroep :" ; - $MS{"MissingSubroutine"} = " onbekende subroutine :" ; - - $MS{"EmbeddedFiles"} = " gebruikte files :" ; - $MS{"BeginEndError"} = " b/e fout in :" ; - $MS{"SynonymEntries"} = " aantal synoniemen :" ; - $MS{"SynonymErrors"} = " fouten :" ; - $MS{"RegisterEntries"} = " aantal ingangen :" ; - $MS{"RegisterErrors"} = " fouten :" ; - $MS{"PassedCommands"} = " aantal commando's :" ; - - $MS{"MultiPagePdfFile"} = " te veel pagina's :" ; - $MS{"MissingMediaBox"} = " geen mediabox :" ; - $MS{"MissingBoundingBox"} = " geen boundingbox :" ; - - $MS{"NOfDocuments"} = " documentatie blokken :" ; - $MS{"NOfDefinitions"} = " definitie blokken :" ; - $MS{"NOfSkips"} = " overgeslagen blokken :" ; - $MS{"NOfSetups"} = " gecopieerde setups :" ; - $MS{"NOfTemplates"} = " gecopieerde templates :" ; - $MS{"NOfInfos"} = " gecopieerde helpinfos :" ; - $MS{"NOfFigures"} = " verwerkte figuren :" ; - $MS{"NOfBoxes"} = " te volle boxen :" ; - $MS{"NOfUnknown"} = " onbekende ... :" ; - - $MS{"InputFile"} = " invoer file :" ; - $MS{"OutputFile"} = " outvoer file :" ; - $MS{"FileType"} = " type file :" ; - $MS{"EpsFile"} = " eps file :" ; - $MS{"PdfFile"} = " pdf file :" ; - $MS{"TifFile"} = " tif file :" ; - $MS{"PngFile"} = " png file :" ; - $MS{"JpgFile"} = " jpg file :" ; - $MS{"MPFile"} = " metapost file :" ; - - $MS{"LoadedFilter"} = " geladen filter :" ; - $MS{"RemappedKeys"} = " onderschepte keys :" ; - $MS{"WrongFilterPath"} = " fout filter pad :" ; - - $MS{"Overfull"} = "te vol" ; - $MS{"Entries"} = "ingangen" ; - $MS{"References"} = "verwijzingen" ; - - $MS{"PlugInInit"} = " plugin initialized :" ; - $MS{"PlugInReport"} = " plugin report :" ; - - } # end of dutch section - -elsif ($UserInterface eq "de") - - { # begin of german section - - $MS{"ProcessingReferences"} = "Verarbeiten der Befehle, Listen und Register" ; - $MS{"MergingReferences"} = "Register verschmelzen" ; - $MS{"GeneratingDocumentation"} = "Vorbereiten der ConTeXt-Dokumentationsdatei" ; - $MS{"GeneratingSources"} = "Erstellen einer nur Quelltext ConTeXt-Datei" ; - $MS{"FilteringDefinitions"} = "Filtern der ConTeXt-Definitionen" ; - $MS{"CopyingTemplates"} = "Kopieren der TeXEdit-Test-key-templates" ; - $MS{"CopyingInformation"} = "Kopieren der TeXEdit-Hilfsinformation" ; - $MS{"GeneratingFigures"} = "Erstellen einer Abb-Uebersichtsdatei" ; - $MS{"FilteringLogFile"} = "Filtern der log-Datei" ; - - $MS{"SortingIJ"} = "Sortiere IJ nach Y" ; - $MS{"ConvertingHigh"} = "Konvertiere hohe ASCII-Werte" ; - $MS{"ProcessingQuotes"} = "Verarbeiten der Akzentzeichen" ; - $MS{"ForcingFileType"} = "Dateityp einstellen" ; - $MS{"UsingEps"} = "EPS-Dateien verarbeite" ; - $MS{"UsingTif"} = "TIF-Dateien verarbeite" ; - $MS{"UsingPdf"} = "PDF-Dateien verarbeite" ; - $MS{"UsingPng"} = "PNG-Dateien verarbeite" ; - $MS{"UsingJpg"} = "JPG-Dateien verarbeite" ; - $MS{"EpsToPdf"} = "convert EPS to PDF"; - $MS{"EpsPage"} = "setup EPS page"; - - $MS{"FilteringBoxes"} = "Filtern der ueberfuellten Boxen" ; - $MS{"ApplyingCriterium"} = "Anwenden des uebervoll-Kriteriums" ; - $MS{"FilteringUnknown"} = "Filter unbekannt ..." ; - - $MS{"NoInputFile"} = "Keine Eingabedatei angegeben" ; - $MS{"NoOutputFile"} = "Keine Ausgabedatei generiert" ; - $MS{"EmptyInputFile"} = "Leere Eingabedatei" ; - $MS{"NotYetImplemented"} = "Noch nicht verfuegbar" ; - - $MS{"Action"} = " Aktion :" ; - $MS{"Option"} = " Option :" ; - $MS{"Error"} = " Fehler :" ; - $MS{"Remark"} = " Anmerkung :" ; - $MS{"SystemCall"} = " system call :" ; - $MS{"BadSystemCall"} = " bad system call :" ; - $MS{"MissingSubroutine"} = " missing subroutine :" ; - $MS{"SystemCall"} = " Systemaufruf :" ; - $MS{"BadSystemCall"} = " Fehlerhafter Aufruf :" ; - $MS{"MissingSubroutine"} = " Fehlende Unterroutine :" ; - - $MS{"EmbeddedFiles"} = " Eingebettete Dateien :" ; - $MS{"BeginEndError"} = " Beg./Ende-Fehler in :" ; - $MS{"SynonymEntries"} = " Synonymeintraege :" ; - $MS{"SynonymErrors"} = " Fehlerhafte Eintraege :" ; - $MS{"RegisterEntries"} = " Registereintraege :" ; - $MS{"RegisterErrors"} = " Fehlerhafte Eintraege :" ; - $MS{"PassedCommands"} = " Verarbeite Befehle :" ; - - $MS{"MultiPagePdfFile"} = " zu viele Seiten :" ; - $MS{"MissingMediaBox"} = " fehlende mediabox :" ; - $MS{"MissingBoundingBox"} = " fehlende boundingbox :" ; - - $MS{"NOfDocuments"} = " Dokumentbloecke :" ; - $MS{"NOfDefinitions"} = " Definitionsbloecke :" ; - $MS{"NOfSkips"} = "Uebersprungene Bloecke :" ; - $MS{"NOfSetups"} = " Kopierte setups :" ; - $MS{"NOfTemplates"} = " Kopierte templates :" ; - $MS{"NOfInfos"} = " Kopierte helpinfos :" ; - $MS{"NOfFigures"} = " Verarbeitete Abb. :" ; - $MS{"NOfBoxes"} = " Zu volle Boxen :" ; - $MS{"NOfUnknown"} = " Unbekannt ... :" ; - - $MS{"InputFile"} = " Eingabedatei :" ; - $MS{"OutputFile"} = " Ausgabedatei :" ; - $MS{"FileType"} = " Dateityp :" ; - $MS{"EpsFile"} = " eps-Datei :" ; - $MS{"PdfFile"} = " pdf-Datei :" ; - $MS{"TifFile"} = " tif-Datei :" ; - $MS{"PngFile"} = " png-Datei :" ; - $MS{"JpgFile"} = " jpg-Datei :" ; - $MS{"MPFile"} = " metapost-Datei :" ; - - $MS{"LoadedFilter"} = " loaded filter :" ; # tobias - $MS{"RemappedKeys"} = " remapped keys :" ; # tobias - $MS{"WrongFilterPath"} = " wrong filter path :" ; # tobias - - $MS{"Overfull"} = "zu voll" ; - $MS{"Entries"} = "Eintraege" ; - $MS{"References"} = "Referenzen" ; - - $MS{"ExtraProgram"} = " extra program :" ; - $MS{"PlugInInit"} = " plugin initialized :" ; - $MS{"PlugInReport"} = " plugin report :" ; - - } # end of german section - -elsif ($UserInterface eq "it") - - { # begin of italian section - - $MS{"ProcessingReferences"} = "elaborazione di comandi, liste e registri" ; - $MS{"MergingReferences"} = "fusione dei registri" ; - $MS{"GeneratingDocumentation"} = "preparazione del file di documentazione ConTeXt" ; - $MS{"GeneratingSources"} = "generazione del solo sorgente ConTeXt" ; - $MS{"FilteringDefinitions"} = "filtraggio delle definizioni formali ConTeXt" ; - $MS{"CopyingTemplates"} = "copia dei modelli rapidi di voci di TeXEdit" ; - $MS{"CopyingInformation"} = "copia delle informazioni di aiuto di TeXEdit" ; - $MS{"GeneratingFigures"} = "generazione del file di elengo delle figure" ; - $MS{"FilteringLogFile"} = "filtraggio del file di log" ; - - $MS{"SortingIJ"} = "IJ elencato sotto Y" ; - $MS{"ConvertingHigh"} = "conversione dei valori ASCII alti" ; - $MS{"ProcessingQuotes"} = "elaborazione dei caratteri accentati" ; - $MS{"ForcingFileType"} = "impostazine del tipo di file" ; - $MS{"UsingEps"} = "elaborazione del file EPS" ; - $MS{"UsingTif"} = "elaborazione del file TIF" ; - $MS{"UsingPdf"} = "elaborazione del file PDF" ; - $MS{"UsingPng"} = "elaborazione del file PNG" ; - $MS{"UsingJpg"} = "elaborazione del file JPG" ; - $MS{"EpsToPdf"} = "conversione da EPS a PDF"; - $MS{"EpsPage"} = "impostazione pagina EPS"; - - $MS{"FilteringBoxes"} = "filtraggio delle overfull boxes" ; - $MS{"ApplyingCriterium"} = "applicazione del criterio overfull" ; - $MS{"FilteringUnknown"} = "filtraggio dei messaggi non conosciuti ..." ; - - $MS{"NoInputFile"} = "nessun file di input specificato" ; - $MS{"NoOutputFile"} = "nessun file di output generato" ; - $MS{"EmptyInputFile"} = "file di input vuoto" ; - $MS{"NotYetImplemented"} = "non ancora disponibile" ; - - $MS{"Action"} = " azione :" ; - $MS{"Option"} = " opzione :" ; - $MS{"Error"} = " errore :" ; - $MS{"Remark"} = " commento :" ; - $MS{"SystemCall"} = " chiamata di sistema :" ; - $MS{"BadSystemCall"} = "chiamata di sistema er :" ; # GB: Hans, I need more space! - $MS{"MissingSubroutine"} = " subroutine mancante :" ; - - $MS{"EmbeddedFiles"} = " file inclusi :" ; - $MS{"BeginEndError"} = " errore di i/f in :" ; - $MS{"SynonymEntries"} = " voci di sinonimi :" ; - $MS{"SynonymErrors"} = " voci errate :" ; - $MS{"RegisterEntries"} = " voci di registro :" ; - $MS{"RegisterErrors"} = " voci errate :" ; - $MS{"PassedCommands"} = " comandi passati :" ; - - $MS{"MultiPagePdfFile"} = " troppe pagine :" ; - $MS{"MissingMediaBox"} = " mediabox mancante :" ; - $MS{"MissingBoundingBox"} = " boundingbox mancante :" ; - - $MS{"NOfDocuments"} = " blocchi di documento :" ; - $MS{"NOfDefinitions"} = "blocchi di definizioni :" ; - $MS{"NOfSkips"} = " blocchi saltati :" ; - $MS{"NOfSetups"} = " impostazioni copiate :" ; - $MS{"NOfTemplates"} = " modelli copiati :" ; - $MS{"NOfInfos"} = " helpinfo copiati :" ; - $MS{"NOfFigures"} = " figure elaborate :" ; - $MS{"NOfBoxes"} = " overfull boxes :" ; - $MS{"NOfUnknown"} = " sconosciuti ... :" ; - - $MS{"InputFile"} = " file di input :" ; - $MS{"OutputFile"} = " file di output :" ; - $MS{"FileType"} = " tipo di file :" ; - $MS{"EpsFile"} = " file eps :" ; - $MS{"PdfFile"} = " file pdf :" ; - $MS{"TifFile"} = " file tif :" ; - $MS{"PngFile"} = " file png :" ; - $MS{"JpgFile"} = " file jpg :" ; - $MS{"MPFile"} = " file metapost :" ; - - $MS{"LoadedFilter"} = " filtro caricato :" ; - $MS{"RemappedKeys"} = " voci rimappate :" ; - $MS{"WrongFilterPath"} = "percorso filtro errato :" ; - - $MS{"Overfull"} = "overfull" ; - $MS{"Entries"} = "voci" ; - $MS{"References"} = "riferimenti" ; - - $MS{"ExtraProgram"} = " extra program :" ; - $MS{"PlugInInit"} = " plugin initialized :" ; - $MS{"PlugInReport"} = " plugin report :" ; - - } # end of italian section - -else - - { # begin of english section - - $MS{"ProcessingReferences"} = "processing commands, lists and registers" ; - $MS{"MergingReferences"} = "merging registers" ; - $MS{"GeneratingDocumentation"} = "preparing ConTeXt documentation file" ; - $MS{"GeneratingSources"} = "generating ConTeXt source only file" ; - $MS{"FilteringDefinitions"} = "filtering formal ConTeXt definitions" ; - $MS{"CopyingTemplates"} = "copying TeXEdit quick key templates" ; - $MS{"CopyingInformation"} = "copying TeXEdit help information" ; - $MS{"GeneratingFigures"} = "generating figure directory file" ; - $MS{"FilteringLogFile"} = "filtering log file" ; - - $MS{"SortingIJ"} = "sorting IJ under Y" ; - $MS{"ConvertingHigh"} = "converting high ASCII values" ; - $MS{"ProcessingQuotes"} = "handling accented characters" ; - $MS{"ForcingFileType"} = "setting up filetype" ; - $MS{"UsingEps"} = "processing EPS-file" ; - $MS{"UsingTif"} = "processing TIF-file" ; - $MS{"UsingPdf"} = "processing PDF-file" ; - $MS{"UsingPng"} = "processing PNG-file" ; - $MS{"UsingJpg"} = "processing JPG-file" ; - $MS{"EpsToPdf"} = "convert EPS to PDF"; - $MS{"EpsPage"} = "setup EPS page"; - - $MS{"FilteringBoxes"} = "filtering overfull boxes" ; - $MS{"ApplyingCriterium"} = "applying overfull criterium" ; - $MS{"FilteringUnknown"} = "filtering unknown ..." ; - - $MS{"NoInputFile"} = "no input file given" ; - $MS{"NoOutputFile"} = "no output file generated" ; - $MS{"EmptyInputFile"} = "empty input file" ; - $MS{"NotYetImplemented"} = "not yet available" ; - - $MS{"Action"} = " action :" ; - $MS{"Option"} = " option :" ; - $MS{"Error"} = " error :" ; - $MS{"Remark"} = " remark :" ; - $MS{"SystemCall"} = " system call :" ; - $MS{"BadSystemCall"} = " bad system call :" ; - $MS{"MissingSubroutine"} = " missing subroutine :" ; - - $MS{"EmbeddedFiles"} = " embedded files :" ; - $MS{"BeginEndError"} = " b/e error in :" ; - $MS{"SynonymEntries"} = " synonym entries :" ; - $MS{"SynonymErrors"} = " bad entries :" ; - $MS{"RegisterEntries"} = " register entries :" ; - $MS{"RegisterErrors"} = " bad entries :" ; - $MS{"PassedCommands"} = " passed commands :" ; - - $MS{"MultiPagePdfFile"} = " too many pages :" ; - $MS{"MissingMediaBox"} = " missing mediabox :" ; - $MS{"MissingBoundingBox"} = " missing boundingbox :" ; - - $MS{"NOfDocuments"} = " document blocks :" ; - $MS{"NOfDefinitions"} = " definition blocks :" ; - $MS{"NOfSkips"} = " skipped blocks :" ; - $MS{"NOfSetups"} = " copied setups :" ; - $MS{"NOfTemplates"} = " copied templates :" ; - $MS{"NOfInfos"} = " copied helpinfos :" ; - $MS{"NOfFigures"} = " processed figures :" ; - $MS{"NOfBoxes"} = " overfull boxes :" ; - $MS{"NOfUnknown"} = " unknown ... :" ; - - $MS{"InputFile"} = " input file :" ; - $MS{"OutputFile"} = " output file :" ; - $MS{"FileType"} = " file type :" ; - $MS{"EpsFile"} = " eps file :" ; - $MS{"PdfFile"} = " pdf file :" ; - $MS{"TifFile"} = " tif file :" ; - $MS{"PngFile"} = " png file :" ; - $MS{"JpgFile"} = " jpg file :" ; - $MS{"MPFile"} = " metapost file :" ; - - $MS{"LoadedFilter"} = " loaded filter :" ; - $MS{"RemappedKeys"} = " remapped keys :" ; - $MS{"WrongFilterPath"} = " wrong filter path :" ; - - $MS{"Overfull"} = "overfull" ; - $MS{"Entries"} = "entries" ; - $MS{"References"} = "references" ; - - $MS{"ExtraProgram"} = " extra program :" ; - $MS{"PlugInInit"} = " plugin initialized :" ; - $MS{"PlugInReport"} = " plugin report :" ; - - } # end of english section - -#D \stopcompressdefinitions - -#D Showing the banner (name and version of the program) and -#D offering helpinfo is rather straightforward. - -sub ShowBanner - { Report("\n $Program\n") } - -sub ShowHelpInfo - { Report("HelpInfo") } - -#D The helpinfo is also saved in the hash table. This looks -#D like a waste of energy and space, but the program gains -#D readability. - -#D \startcompressdefinitions - -if ($UserInterface eq "nl") - - { # begin of dutch section - - $MS{"HelpInfo"} = - -" --references hulp file verwerken / tui->tuo \n" . -" --ij : IJ als Y sorteren \n" . -" --high : hoge ASCII waarden converteren \n" . -" --quotes : quotes converteren \n" . -" --tcxpath : tcx filter pad \n" . -" \n" . -" --purge(all) tijdelijke (klad) files verwijderen \n" . -" \n" . -" --documents documentatie file genereren / tex->ted \n" . -" --sources broncode file genereren / tex->tes \n" . -" --setups ConTeXt definities filteren / tex->texutil.tus \n" . -" --templates TeXEdit templates filteren / tex->tud \n" . -" --infos TeXEdit helpinfo filteren / tex->tud \n" . -" \n" . -" --figures eps figuren lijst genereren / *->texutil.tuf \n" . -" --epspage : voorbereiden voor pdf \n" . -" --epstopdf : omzetten naar pdf \n" . -" \n" . -" --logfile logfile filteren / log->$ProgramLog \n" . -" --box : overfull boxes controleren \n" . -" --criterium : overfull criterium in pt \n" . -" --unknown :onbekende ... controleren \n" ; - - } # end of dutch section - -elsif ($UserInterface eq "de") - - { # begin of german section - - $MS{"HelpInfo"} = - -" --references Verarbeiten der Hilfsdatei / tui->tuo \n" . -" --ij : Sortiere IJ als Y \n" . -" --high : Konvertiere hohe ASCII-Werte \n" . -" --quotes : Konvertiere akzentuierte Buchstaben \n" . -" --tcxpath : tcx Filter Path \n" . -" \n" . -" --purge(all) entferne temporaere ConTeXt-Dateien \n" . -" \n" . -" --documents Erstelle Dokumentationsdatei / tex->ted \n" . -" --sources Erstelle reine Quelltextdateien / tex->tes \n" . -" --setups Filtere ConTeXt-Definitionen / tex->texutil.tus\n" . -" --templates Filtere TeXEdit-templates / tex->tud \n" . -" --infos Filtere TeXEdit-helpinfo / tex->tud \n" . -" \n" . -" --figures Erstelle eps-Abbildungsliste / *->texutil.tuf \n" . -" --epspage : Bereite fuer pdf vor \n" . -" --epstopdf : Konvertiere zu pdf \n" . -" \n" . -" --logfile Filtere log-Datei / log->$ProgramLog \n" . -" --box : Ueberpruefe uebervolle Boxen \n" . -" --criterium : Uebervoll-Kriterium in pt \n" . -" --unknown : Ueberpruefe auf unbekannte ... \n" ; - - } # end of german section - -elsif ($UserInterface eq "it") - - { # begin of italian section GB: Hans, I need more space! - - $MS{"HelpInfo"} = - -" --references elabora file ausiliari / tui->tuo \n" . -" --ij : elenca IJ come Y \n" . -" --high : converti i valori ASCII alti \n" . -" --quotes : converti caratteri accentati \n" . -" --tcxpath : percorso del filtro tcx \n" . -" \n" . -" --purge(all) rimuovi i file temporanei ConTeXt \n" . -" \n" . -" --documents genera file di documentazione / tex->ted \n" . -" --sources genera solo sorgente / tex->tes \n" . -" --setups filtra definizioni ConTeXt / tex->texutil.tus \n" . -" --templates filtra modelli TeXEdit / tex->tud \n" . -" --infos filtra helpinfo TeXEdit / tex->tud \n" . -" \n" . -" --figures genera lista figure eps / *->texutil.tuf \n" . -" --epspage : prepara per pdf \n" . -" --epstopdf : converti in pdf \n" . -" \n" . -" --logfile filtra logfile / log->$ProgramLog \n" . -" --box : controlla overful boxes \n" . -" --criterium : criterio overfull in pt \n" . -" --unknown : controlla sconosciuti ... \n" ; - - } # end of italian section - -else - - { # begin of english section - - $MS{"HelpInfo"} = - -" --references process auxiliary file / tui->tuo \n" . -" --ij : sort IJ as Y \n" . -" --high : convert high ASCII values \n" . -" --quotes : convert quotes characters \n" . -" --tcxpath : tcx filter path \n" . -" \n" . -" --purge(all) clean up temporary context files \n" . -" \n" . -" --documents generate documentation file / tex->ted \n" . -" --sources generate source only file / tex->tes \n" . -" --setups filter ConTeXt definitions / tex->texutil.tus \n" . -" --templates filter TeXEdit templates / tex->tud \n" . -" --infos filter TeXEdit helpinfo / tex->tud \n" . -" \n" . -" --figures generate eps figure list / *->texutil.tuf \n" . -" --epspage : prepare for pdf \n" . -" --epstopdf : convert to pdf \n" . -" \n" . -" --logfile filter logfile / log->$ProgramLog \n" . -" --box : check overful boxes \n" . -" --criterium : overfull criterium in pt \n" . -" --unknown : check unknown ... \n" ; - - } # end of english section - -#D \stopcompressdefinitions - -#D In order to sort strings correctly, we have to sanitize -#D them. This is especially needed when we include \TEX\ -#D commands, quotes characters and compound word placeholders. -#D -#D \startopsomming[opelkaar] -#D \som \type{\name}: csnames are stripped -#D \som \type{{}}: are removed -#D \som \type{\"e}: and alike are translated into \type{"e} etc. -#D \som \type{"e}: is translated into an \type{e} and \type{b} etc. -#D \som \type{||}: becomes \type{-} -#D \som \type{\-}: also becomes \type{-} -#D \som \type{<*..>}: becomes \type{..} (internal XML entity) -#D \stopopsomming -#D -#D Of course other accented characters are handled too. The -#D appended string is responsible for decent sorting. -#D -#D \startPL -#D $TargetString = SanitizedString ( $SourceString ) ; -#D \stopPL -#D -#D The sort order depends on the ordering in array -#D \type{$ASCII}: - -$ASCII{"^"} = "a" ; $ASCII{'"'} = "b" ; $ASCII{"`"} = "c" ; -$ASCII{"'"} = "d" ; $ASCII{"~"} = "e" ; $ASCII{","} = "f" ; - -#sub SanitizedString -# { my ($string) = $_[0] ; -# if ($ProcessQuotes) -# { $string =~ s/\\([\^\"\`\'\~\,])/$1/gio ; -# $copied = $string ; -# $copied =~ s/([\^\"\`\'\~\,])([a-zA-Z])/$ASCII{$1}/gio ; -# $string =~ s/([\^\"\`\'\~\,])([a-zA-Z])/$2/gio ; -# $string=$string.$copied } -# $string =~ s/\\-|\|\|/\-/gio ; -# $string =~ s/\\[a-zA-Z]*| |\{|\}//gio ; -# return $string } - -#D YET UNDOCUMENTED - -my $SortN = 0 ; my @Filter ; - -# copied from texexec - -my @paths ; -my $kpsewhich = '' ; -my $pathslash = '/' ; if ($0 =~ /\\/) { $pathslash = "\\" } - -sub checked_path - { my $path = shift ; - if ((defined($path))&&($path ne '')) - { $path =~ s/[\/\\]/$pathslash/go ; - $path =~ s/[\/\\]*$//go ; - $path .= $pathslash } - else - { $path = '' } - return $path } - -if ($ENV{PATH} =~ /\;/) - { @paths = split(/\;/,$ENV{PATH}) } -else - { @paths = split(/\:/,$ENV{PATH}) } - -# until here. - -sub InitializeKeys - { my $filename = $ARGV[0] ; - return unless (open(TEX,"$filename.tex")) ; - for ($i=0;$i<=255;$i++) - { $Filter[$i] = $i } - if ($TcXPath eq '') - { foreach (@paths) - { my $p = checked_path($_) . 'kpsewhich' ; - if ((-e $p)||(-e $p . '.exe')) - { $kpsewhich = $p ; last } } } - $kpsewhich = "\"$kpsewhich\"" if ($kpsewhich =~ m/^[^\"].* /) ; - while (<TEX>) - { chomp ; - my $Filter ; - if (/^\%/) - { if (s/.*translat.*?=([\:\/0-9\-a-z]*)/$1/oi) - { my $Translation = $_ ; - if ($TcXPath ne '') - { $TcXPath = checked_path($TcXPath) ; - $Filter = "$TcXPath$pathslash$Translation.tcx" } - elsif ($kpsewhich ne '') - { $Filter = `$kpsewhich --format="web2c files" $Translation.tcx` ; - chomp $Filter } - else - { last } - if (open(ASC,$Filter)) - { Report ("LoadedFilter", $Translation) ; - while (<ASC>) - { if (/^(\d+)\s*(\d+)/) - { $Filter[$2] = $1 } } - close (ASC) } - elsif ($TcXPath ne '') - { Report ("WrongFilterPath", $TcXPath) } - last } } - else - { last } } - close (TEX) } - -sub HandleKey - { ++$SortN ; - $RestOfLine =~ s/\{(.*)\}/$1/o ; - my ($lan, $enc, $str, $chr, $map, $alf) = split(/\}\s*\{/, $RestOfLine) ; - if ($str =~ /^(\d+)/) { $str = ''.chr($Filter[$1]) } - $map = chr(ord($MAP[$i])+128) ; - $STR[$SortN] = $str ; - $CHR[$SortN] = $chr ; - $MAP[$SortN] = $map ; -#print "$chr$map = $alf\n" ; -# $ALF{"$chr$map"} = $alf } - $ALF{"$map"} = $alf } - -sub FlushKeys - { Report ("RemappedKeys", $SortN) } - -sub SanitizedString - { my $string = my $original = shift ; - if ($SortN) - { my $copied = $string ; - for ($i=1;$i<=$SortN;$i++) - { my $s = $STR[$i] ; - my $c = $CHR[$i] ; - my $m = $MAP[$i] ; - # print "[$i $s $c $m]\n" ; - $string =~ s/($s)/$c/ge ; - $copied =~ s/($s)/$m/ge } - $string .= "\x00"; - $string .= $copied } - elsif ($ProcessQuotes) - { $string =~ s/\\([\^\"\`\'\~\,])/$1/gio ; - $copied = $string ; - $copied =~ s/([\^\"\`\'\~\,])([a-zA-Z])/$ASCII{$1}/gi ; - $string =~ s/([\^\"\`\'\~\,])([a-zA-Z])/$2/gio ; - $string .= "\x00"; - $string .= $copied } -# new and very experimental, will change -$string =~ s/\<\*(.*?)\>/\\$1 /go ; # reduce entities / will be table too -$string =~ s/\\getXMLentity\s*\{(.*?)\}/$1/gio ; # {tex} => tex -$string =~ s/\<[a-zA-Z\/].*?\>//go ; # remove elements -# so far - $string =~ s/\\-|\|\|/\-/gio ; - $string =~ s/\\[a-zA-Z]*| |\{|\}//gio ; # ? -#print "$original $string $copied\n" ; - return $string } - -#D This subroutine looks a bit complicated, which is due to the -#D fact that we want to sort for instance an accented \type{e} -#D after the plain \type{e}, so the imaginary words -#D -#D \starttypen -#D eerste -#D \"eerste -#D \"e\"erste -#D eerst\"e -#D \stoptypen -#D -#D come out in an acceptable order. - -#D We also have to deal with the typical \TEX\ sequences with -#D the double \type{^}'s, like \type{^^45}. These hexadecimal -#D coded characters are just converted. -#D -#D \startPL -#D $TargetString = HighConverted ( $SourceString ) ; -#D \stopPL - -sub HighConverted - { my ($string) = $_[0] ; - $string =~ s/\^\^([a-f0-9][a-f0-9])/chr hex($1)/geo ; - return $string } - -#D \extras -#D {references} -#D -#D \CONTEXT\ can handle many lists, registers (indexes), -#D tables of whatever and references. This data is collected -#D in one pass and processed in a second one. In between, -#D relevant data is saved in the file \type{\jobname.tui}. -#D This file also holds some additional information concerning -#D second pass optimizations. -#D -#D The main task of \TEXUTIL\ is to sort lists and registers -#D (indexes). The results are stored in again one file called -#D \type{\jobname.tuo}. -#D -#D Just for debugging purposes the nesting of files loaded -#D during the \CONTEXT\ run is stored. Of course this only -#D applies to files that are handled by the \CONTEXT\ file -#D structuring commands (projects, products, components and -#D environments). -#D -#D We have to handle the entries: -#D -#D \starttypen -#D f b {test} -#D f e {test} -#D \stoptypen -#D -#D and only report some status info at the end of the run. - -sub InitializeFiles - { $NOfFiles = 0 ; - $NOfBadFiles = 0 } - -sub HandleFile - { $RestOfLine =~ s/.*\{(.*)\}/$1/gio ; - ++$Files{$RestOfLine} } - -sub FlushFiles # hash needs to be sorted, else problem on macosx - { print TUO "%\n" . "% $Program / Files\n" . "%\n" ; - foreach $File (sort keys %Files) - { print TUO "% $File ($Files{$File})\n" } - print TUO "%\n" ; - $NOfFiles = keys %Files ; - Report("EmbeddedFiles", $NOfFiles) ; - foreach $File (sort keys %Files) - { unless (($Files{$File} % 2) eq 0) - { ++$NOfBadFiles ; - Report("BeginEndError", $File) } } } - -#D Commands don't need a special treatment. They are just -#D copied. Such commands are tagged by a \type{c}, like: -#D -#D \starttypen -#D c \thisisutilityversion{year.month.day} -#D c \twopassentry{class}{key}{value} -#D c \mainreference{prefix}{entry}{pagenumber}{realpage}{tag} -#D c \listentry{category}{tag}{number}{title}{pagenumber}{realpage} -#D c \initializevariable\realnumberofpages{number} -#D \stoptypen -#D -#D For historic reasons we check for the presense of the -#D backslash. - -my $NOfPositionsFound = 0 ; -my $TotalNOfPositions = 0 ; -my $TotalNOfMPgraphics = 0 ; - -my $SectionSeparator = ":" ; - -sub InitializeCommands - { print TUO "%\n" . "% $Program / Commands\n" . "%\n" ; - $NOfCommands = 0 } - -sub HandleCommand - { ++$NOfCommands ; - $RestOfLine =~ s/^\\//go ; - if ($RestOfLine =~ /^pospxy/o) - { ++$NOfPositionsFound } - elsif ($RestOfLine =~ /^initializevariable\\totalnofpositions\{(.*)\}/o) - { $TotalNOfPositions = $1 } - elsif ($RestOfLine =~ /^initializevariable\\totalnofMPgraphics\{(.*)\}/o) - { $TotalNOfMPgraphics = $1 } -# todo: reg how to -# elsif ($RestOfLine =~ /^thisissectionseparator\{(.*)\}/o) -# { $SectionSeparator = $1 } - elsif ($RestOfLine =~ /^thisisbytesequence\{(.*)\}/o) - { $RestOfLine =~ s/\^//go } - print TUO "\\$RestOfLine\n" } - -sub FlushCommands - { Report ("PassedCommands", $NOfCommands) } - -#D Experimental: Extra -#D -#D s p : extra programs - -my @ExtraPrograms = () ; - -sub InitializeExtra - { } - -sub HandleExtra - { if ($RestOfLine =~ /(.)\s+(.*)\s*$/o) - { if ($1 eq "p") - { my $str = $2 ; $str =~ s/^\{(.*)\}$/$1/o ; - push @ExtraPrograms,$str } } } - -sub FlushExtra - { print TUO "%\n" . "% $Program / System\n" . "%\n" ; - foreach $EP (@ExtraPrograms) - { print TUO "% extra program : $EP\n" } } - -sub RunExtraPrograms - { foreach $EP (@ExtraPrograms) - { Report ("ExtraProgram", $EP) ; - system($EP) } } - -#D Plugins -#D -#D test.pm: -#D -#D \starttypen -#D see plugtest.pm -#D \stoptypen -#D -#D utility format: -#D -#D \starttypen -#D p u {name} {data} {data} ... -#D \stoptypen - -my $pm_path ; - -BEGIN - { ## $pm_path = `kpsewhich --format="other text files" --progname=context texutil.pl` ; - ## chomp($pm_path) ; - # $pm_path =~ s/texutil\.pl.*// } - # $pm_path = $0 ; - # $pm_path =~ s/\\/\//o ; - # $pm_path =~ s/texutil\.pl.*//io ; - ## $pm_path =~ s/(.*)texutil.*?$/$1/i ; - $pm_path = "$FindBin::Bin/" ; - if ($pm_path eq "") { $pm_path = "./" } } - -use lib $pm_path ; - -my %UserPlugIns ; - -sub HandlePlugIn - { if ($RestOfLine =~ /\s*u\s*\{(.*?)\}\s*(.*)\s*/io) - { my $tag = $1 ; - my $arg = $2 ; - if (! defined($UserPlugIns{$tag})) - { $UserPlugIns{$tag} = 1 ; - eval("use $tag") ; - my $result = $tag->identify ; - if ($result ne "") - { Report ("PlugInInit", "$tag -> $result") } - else - { Report ("PlugInInit", $tag ) } - $tag->initialize() } - if (defined($UserPlugIns{$tag})) - { $arg =~ s/\{(.*)\}/$1/o ; - my @args = split(/\}\s*\{/o, $arg) ; - $tag->handle(@args) } } } - -sub FlushPlugIns - { foreach my $tag (keys %UserPlugIns) - { my @report = $tag->report ; - foreach $rep (@report) - { my ($key,$val) = split (/\s*\:\s*/,$rep) ; - if ($val ne "") - { Report ("PlugInReport", "$tag -> $key -> $val") } - else - { Report ("PlugInReport", "$tag -> $key") } } - $tag->process ; - print TUO "%\n" . "% $Program / " . $tag->identify . "\n" . "%\n" ; - foreach my $str ($tag->results) - { print TUO "\\plugincommand\{$str\}\n" } } } - -#D Synonyms are a sort of key||value pairs and are used for -#D ordered lists like abbreviations and units. -#D -#D \starttypen -#D s e {class}{sanitized key}{key}{associated data} -#D \stoptypen -#D -#D The sorted lists are saved as (surprise): -#D -#D \starttypen -#D \synonymentry{class}{sanitized key}{key}{associated data} -#D \stoptypen - -sub InitializeSynonyms - { $NOfSynonyms = 0 ; - $NOfBadSynonyms = 0 } - -#M \definieersynoniem [testname] [testnames] [\testmeaning] -#M -#M \stelsynoniemenin [testname] [criterium=alles] - -#D Let's first make clear what we can expect. Synonym -#D entries look like: -#D -#D \startbuffer -#D \testname [alpha] {\sl alpha} {a greek letter a} -#D \testname {alpha} {another a} -#D \testname [Beta] {\kap{beta}} {a greek letter b} -#D \testname {beta} {indeed another b} -#D \testname {gamma} {something alike g} -#D \testname {delta} {just a greek d} -#D \stopbuffer -#D -#D \typebuffer -#D -#D This not that spectacular list is to be sorted according -#D to the keys (names). \haalbuffer - -sub HandleSynonym - { ++$NOfSynonyms ; - ($SecondTag, $RestOfLine) = split(/ /, $RestOfLine, 2) ; - ($Class, $Key, $Entry, $Meaning) = split(/} \{/, $RestOfLine) ; - chop $Meaning ; - $Class = substr $Class, 1 ; - if ($Entry eq "") - { ++$NOfBadSynonyms } - else - { $SynonymEntry[$NOfSynonyms] = - join ($JOIN,$Class,$Key,$Entry,$Meaning) } } - -#D Depending on the settings\voetnoot{One can call for -#D all defined entries, call only the used ones, change -#D layout, attach (funny) commands etc.} a list of -#D {\em testnames} looks like: -#D -#D \plaatslijstmettestnames -#D -#D Watch the order in which these entries are sorted. - -sub FlushSynonyms - { print TUO "%\n" . "% $Program / Synonyms\n" . "%\n" ; - @SynonymEntry = sort { lc($a) cmp lc($b) } @SynonymEntry ; - $NOfSaneSynonyms = 0 ; - for ($n=1; $n<=$NOfSynonyms; $n++) - { # check normally not needed - if (($n==1)||($SynonymEntry[$n] ne $SynonymEntry[$n-1])) - { ($Class, $Key, $Entry, $Meaning) = - split(/$JOIN/, $SynonymEntry[$n]) ; - ++$NOfSaneSynonyms ; - print TUO "\\synonymentry{$Class}{$Key}{$Entry}{$Meaning}\n" } } - Report("SynonymEntries", $NOfSynonyms, "->", $NOfSaneSynonyms, "Entries") ; - if ($NOfBadSynonyms>0) - { Report("SynonymErrors", $NOfBadSynonyms) } } - -#D Register entries need a bit more care, especially when they -#D are nested. In the near future we will also handle page -#D ranges. -#D -#D \starttypen -#D r e {class}{tag}{sanitized key}{key}{pagenumber}{realpage} -#D r s {class}{tag}{sanitized key}{key}{string}{pagenumber} -#D r r {class}{tag}{sanitized key}{key}{string}{pagenumber} -#D \stoptypen -#D -#D The last one indicates the start of a range. - -#D The first one is the normal entry, the second one concerns -#D {\em see this or that} entries. Keys are sanitized, unless -#D the user supplies a sanitized key. To save a lot of -#D programming, all data concerning an entry is stored in one -#D string. Subentries are specified as: -#D -#D \starttypen -#D first&second&third -#D first+second+third -#D \stoptypen -#D -#D When these characters are needed for typesetting purposes, we -#D can also use the first character to specify the separator: -#D -#D \starttypen -#D &$x^2+y^2=r^2$ -#D +this \& that -#D \stoptypen -#D -#D Subentries are first unpacked and next stored in a -#D consistent way, which means that we can use both separators -#D alongside each other. We leave it to the reader to sort -#D out the dirty tricks. - -$SPLIT ="%%" ; -$JOIN ="__" ; - -sub InitializeRegisters - { $NOfEntries = 0 ; - $NOfBadEntries = 0 } - -$ProcessType = "" ; - -$RegStat{"f"} = 1 ; -$RegStat{"e"} = 2 ; # end up between from and to -$RegStat{"t"} = 3 ; -$RegStat{"s"} = 4 ; - -my $RegSep = "$SectionSeparator$SectionSeparator" ; - -sub HandleRegister # the } { makes sure that local {} is ok - { ($SecondTag, $RestOfLine) = split(/ /, $RestOfLine, 2) ; - ++$NOfEntries ; - #~ if ($SecondTag eq "s") - #~ { ($Class, $Location, $Key, $Entry, $SeeToo, $Page ) = - #~ split(/} \{/, $RestOfLine) ; - #~ chop $Page ; - #~ $Class = substr $Class, 1 ; - #~ $RealPage = 0 } - #~ else - #~ { ($Class, $Location, $Key, $Entry, $Page, $RealPage ) = - #~ split(/} \{/, $RestOfLine) ; - #~ chop $RealPage ; - #~ $Class = substr $Class, 1 ; - #~ $SeeToo = "" } - if ($SecondTag eq "s") - { if ($RestOfLine =~ /^\s*(.*?)\}\s\{(.*?)\}\s\{(.*?)\}\s\{(.*)\}\s\{(.*?)\}\s\{(.*?)\s*$/o) - { ($Class, $Location, $Key, $Entry, $SeeToo, $Page ) = ($1,$2,$3,$4,$5,$6) ; - chop $Page ; - $Class = substr $Class, 1 ; - $RealPage = 0 } - else - { return } } - else - { if ($RestOfLine =~ /^\s*(.*?)\}\s\{(.*?)\}\s\{(.*?)\}\s\{(.*)\}\s\{(.*?)\}\s\{(.*?)\s*$/o) - { ($Class, $Location, $Key, $Entry, $Page, $RealPage ) = ($1,$2,$3,$4,$5,$6) ; - chop $RealPage ; - $Class = substr $Class, 1 ; - $SeeToo = "" } - else - { return } } - $_ = $Key ; - if (/$RegSep/) - { ($PageHow,$Key) = split (/$RegSep/) } - else - { $PageHow = "" } - $_ = $Entry ; - if (/$RegSep/) - { ($TextHow,$Entry) = split (/$RegSep/) } - else - { $TextHow = "" } - # - if ($Key eq "") - { $Key = SanitizedString($Entry) } - # if ($SortMethod ne '') - # { $ProcessHigh = 0 } - if ($ProcessHigh) - { $Key = HighConverted($Key) } - $KeyTag = substr $Key, 0, 1 ; - if ($KeyTag eq "&") - { $Key =~ s/^\&//go ; - $Key =~ s/([^\\])\&/$1$SPLIT/go } - elsif ($KeyTag eq "+") - { $Key =~ s/^\+//go ; - $Key =~ s/([^\\])\+/$1$SPLIT/go } - else - { $Key =~ s/([^\\])\&/$1$SPLIT/go ; - $Key =~ s/([^\\])\+/$1$SPLIT/go } - $Key .= " " ; # so, "Word" comes for "Word Another Word" - $EntryTag = substr $Entry, 0, 1 ; - if ($EntryTag eq "&") - { $Entry =~ s/^\&//go ; - $Entry =~ s/([^\\])\&/$1$SPLIT/go } - elsif ($EntryTag eq "+") - { $Entry =~ s/^\+//go ; - $Entry =~ s/([^\\])\+/$1$SPLIT/go } - elsif ($KeyTag eq "&") - { $Entry =~ s/([^\\])\&/$1$SPLIT/go } - elsif ($KeyTag eq "+") - { $Entry =~ s/([^\\])\+/$1$SPLIT/go } - else - { $Entry =~ s/([^\\])\&/$1$SPLIT/go ; - $Entry =~ s/([^\\])\+/$1$SPLIT/go } - $Key =~ s/^([^a-zA-Z])/ $1/go ; - $Key =~ s/^\s*\{(.*)\}$SPLIT/$1$SPLIT/go ; ####### new - $Entry =~ s/^\{(.*)\}$SPLIT/$1$SPLIT/go ; ###### new - if ($ProcessIJ) { $Key =~ s/ij/yy/go } - $LCKey = lc $Key ; - $RegStatus = $RegStat{$SecondTag} ; - $RealPageNumber= sprintf("%6i",$RealPage) ; - $RegisterEntry[$NOfEntries] = - join($JOIN,$Class,$LCKey,$Key,$Entry,$TextHow,$RegStatus, - $RealPageNumber,$Location,$Page,$PageHow,$SeeToo) } - -#M \definieerregister [testentry] [testentries] - -#D The previous routine deals with entries like: -#D -#D \startbuffer -#D \testentry {alpha} -#D \testentry {beta} -#D \testentry {gamma} -#D \testentry {gamma} -#D \testentry {delta} -#D \testentry {epsilon} -#D \testentry {alpha+first} -#D \testentry {alpha+second} -#D \testentry {alpha+second} -#D \testentry {alpha+third} -#D \testentry {alpha+second+one} -#D \testentry {alpha+second+one} -#D \testentry {alpha+second+two} -#D \testentry {alpha+second+three} -#D \testentry {gamma+first+one} -#D \testentry {gamma+second} -#D \testentry {gamma+second+one} -#D -#D \testentry {alpha+fourth} -#D \testentry {&alpha&fourth} -#D \testentry {+alpha+fourth} -#D -#D \testentry [alpha+fourth] {alpha+fourth} -#D \testentry [&alpha&fourth&one] {&alpha&fourth&one} -#D \testentry [+alpha+fourth+two] {&alpha&fourth&two} -#D -#D \testentry {\kap{alpha}+fifth} -#D \testentry {\kap{alpha}+f\'ifth} -#D \testentry {\kap{alpha}+f"ifth} -#D -#D \testentry [&betaformula] {&$a^2+b^2=c^2$} -#D -#D \testentry {zeta \& more} -#D -#D \testentry [pagehowto::key]{texthowto::entry} -#D -#D % a very special case, when key has , and is constructed -#D -#D \testentry [pagehowto::{key}]{texthowto::{entry}} -#D -#D \stopbuffer -#D -#D \typebuffer -#D -#D \haalbuffer After being sorted, these entries are -#D turned into something \TEX\ using: - -$CollapseEntries = 0 ; - -$RegisterEntry[0] = ("") ; - -sub How - { return "$TextHow$RegSep" . "$_[0]" } - -sub FlushSavedLine - { if (($CollapseEntries)&&($SavedFrom ne "")) - { if ($SavedTo ne "") - { print TUO "\\registerfrom$SavedFrom" ; - print TUO "\\registerto$SavedTo" } - else - { print TUO "\\registerpage$SavedFrom" } } - $SavedHow = "" ; - $SavedFrom = "" ; - $SavedTo = "" ; - $SavedEntry = "" } - -sub FlushRegisters - { print TUO "%\n" . "% $Program / Registers\n" . "%\n" ; - @RegisterEntry = sort { lc($a) cmp lc($b) } @RegisterEntry ; - $NOfSaneEntries = 0 ; - $NOfSanePages = 0 ; - $LastPage = "" ; - $LastRealPage = "" ; - $AlfaClass = "" ; - $Alfa = "" ; - $PreviousA = "" ; - $PreviousB = "" ; - $PreviousC = "" ; - $ActualA = "" ; - $ActualB = "" ; - $ActualC = "" ; - - $SavedFrom = "" ; - $SavedTo = "" ; - $SavedEntry = "" ; - $SavedHow = "" ; - - for ($n=1 ; $n<=$NOfEntries ; ++$n) - { ($Class, $LCKey, $Key, $Entry, $TextHow, $RegisterState, - $RealPage, $Location, $Page, $PageHow, $SeeToo) = - split(/$JOIN/, $RegisterEntry[$n]) ; - $RealPage =~ s/^\s*//o ; - $TestAlfa = lc substr $Key, 0, 1 ; - # - if ($SortN) - { $AlfKey = $Key ; - $AlfKey =~ s/(.).*\x00(.).*/$2/o ; - if (defined($ALF{$AlfKey})) - { $TestAlfa = $ALF{$AlfKey} } } - # - if ((lc $TestAlfa ne lc $Alfa) or ($AlfaClass ne $Class)) - { # $Alfa= lc substr $Key, 0, 1 ; - $Alfa = $TestAlfa ; - $AlfaClass = $Class ; - if ($Alfa ne " ") - { FlushSavedLine ; - print TUO "\\registerentry{$Class}{$Alfa}\n" } } - ($ActualA, $ActualB, $ActualC ) = - split(/$SPLIT/, $Entry, 3) ; - unless ($ActualA) { $ActualA = "" } - unless ($ActualB) { $ActualB = "" } - unless ($ActualC) { $ActualC = "" } - if (How($ActualA) eq $PreviousA) - { $ActualA = "" } - else - { $PreviousA = How($ActualA) ; - $PreviousB = "" ; - $PreviousC = "" } - if (How($ActualB) eq $PreviousB) - { $ActualB = "" } - else - { $PreviousB = How($ActualB) ; - $PreviousC = "" } - if (How($ActualC) eq $PreviousC) - { $ActualC = "" } - else - { $PreviousC = How($ActualC) } - $Copied = 0 ; - if ($ActualA ne "") - { FlushSavedLine ; - print TUO "\\registerentrya{$Class}{$ActualA}\n" ; - $Copied = 1 } - if ($ActualB ne "") - { FlushSavedLine ; - print TUO "\\registerentryb{$Class}{$ActualB}\n" ; - $Copied = 1 } - if ($ActualC ne "") - { FlushSavedLine ; - print TUO "\\registerentryc{$Class}{$ActualC}\n" ; - $Copied = 1 } - if ($Copied) - { $NOfSaneEntries++ } - if ($RealPage eq 0) - { FlushSavedLine ; - print TUO "\\registersee{$Class}{$PageHow,$TextHow}{$SeeToo}{$Page}\n" ; - $LastPage = $Page ; - $LastRealPage = $RealPage } - else { -if (($SavedHow ne $PageHow) && ($PageHow ne "")) { - # last valid page attribute counts - $SavedHow = $PageHow ; -} - if (($Copied) || ! (($LastPage eq $Page) && ($LastRealPage eq $RealPage))) - { # print "$LastPage / $Page // $LastRealPage / $RealPage\n" ; - $NextEntry = "{$Class}{$PreviousA}{$PreviousB}{$PreviousC}{$PageHow,$TextHow}" ; - #~ $SavedLine = "{$Class}{$PageHow,$TextHow}{$Location}{$Page}{$RealPage}\n" ; - $SavedLine = "{$Class}{$SavedHow,$TextHow}{$Location}{$Page}{$RealPage}\n" ; - if ($RegisterState eq $RegStat{"f"}) - { FlushSavedLine ; - print TUO "\\registerfrom$SavedLine" } - elsif ($RegisterState eq $RegStat{"t"}) - { FlushSavedLine ; - print TUO "\\registerto$SavedLine" ; $SavedHow = '' ; } - else - { if ($CollapseEntries) - { if ($SavedEntry ne $NextEntry) - { $SavedFrom = $SavedLine } - else - { $SavedTo = $SavedLine } - $SavedEntry = $NextEntry } - else - { print TUO "\\registerpage$SavedLine" ; $SavedHow = '' ; } - } - ++$NOfSanePages ; - $LastPage = $Page ; - $LastRealPage = $RealPage } } } - -FlushSavedLine ; - - Report("RegisterEntries", $NOfEntries, "->", $NOfSaneEntries, "Entries", - $NOfSanePages, "References") ; - if ($NOfBadEntries>0) - { Report("RegisterErrors", $NOfBadEntries) } } - -#D As promised, we show the results: -#D -#D \plaatstestentry - -#D For debugging purposes we flush some status information. The -#D faster machines become, the more important this section will -#D be. The totals, when changed, force texexec to do a second pass. - -sub FlushData - { print TUO "%\n" . "% $Program / Status\n" . "%\n" ; - print TUO "" . - "% embedded files : $NOfFiles ($NOfBadFiles errors)\n" . - "% synonym entries : $NOfSynonyms ($NOfBadSynonyms errors)\n" . - "% register entries : $NOfEntries ($NOfBadEntries errors)\n" . - "% metapost graphics : $TotalNOfMPgraphics\n" . - "% position commands : $TotalNOfPositions " ; - if ($TotalNOfPositions) - { if ($NOfPositionsFound) - { print TUO "(resolved)\n" } - else - { print TUO "(unresolved)\n" } } - else - { print TUO "(not used)\n" } } - -#D The functionallity described on the previous few pages is -#D called upon in the main routine: - -sub NormalHandleReferences - { if ($InputFile eq "") - { Report("Error", "NoInputFile") } - else - { unless (open (TUI, "$InputFile.tui")) - { Report("Error", "EmptyInputFile", $InputFile) } - else - { Report("InputFile", "$InputFile.tui" ) ; - unlink "$InputFile.tmp" ; - rename "$InputFile.tuo", "$InputFile.tmp" ; - Report("OutputFile", "$InputFile.tuo" ) ; - open (TUO, ">$InputFile.tuo") ; - print TUO "%\n" . "% $Program / Commands\n" . "%\n" ; - while (<TUI>) - { $SomeLine = $_ ; - chomp $SomeLine ; - ($FirstTag, $RestOfLine) = split ' ', $SomeLine, 2 ; - if ($FirstTag eq "c") - { HandleCommand } - elsif ($FirstTag eq "s") - { HandleSynonym } - elsif ($FirstTag eq "r") - { HandleRegister } - elsif ($FirstTag eq "f") - { HandleFile } - elsif ($FirstTag eq "k") - { HandleKey } - elsif ($FirstTag eq "e") - { HandleExtra } - elsif ($FirstTag eq "p") - { HandlePlugIn } - elsif ($FirstTag eq "q") - { $ValidOutput = 0 ; - last } } - if ($ValidOutput) - { FlushCommands ; # already done during pass - FlushKeys ; - FlushRegisters ; - FlushSynonyms ; - FlushPlugIns ; - FlushFiles ; - FlushData ; - FlushExtra ; - close (TUO) ; - RunExtraPrograms } - else - { close (TUO) ; - unlink "$InputFile.tuo" ; - rename "$InputFile.tmp", "$InputFile.tuo" ; - Report ("Remark", "NoOutputFile") } } } } - -my $Suffix ; - -sub MergerHandleReferences - { unlink "texutil.tuo" ; - Report("OutputFile", "texutil.tuo" ) ; - open (TUO, ">texutil.tuo") ; - foreach $InputFile (@ARGV) - { ($InputFile, $Suffix) = split (/\./, $InputFile, 2) ; - unless (open (TUI, "$InputFile.tui")) - { Report("Error", "EmptyInputFile", $InputFile) } - else - { Report("InputFile", "$InputFile.tui" ) ; - while (<TUI>) - { $SomeLine = $_ ; - chomp $SomeLine ; - ($FirstTag, $RestOfLine) = split ' ', $SomeLine, 2 ; - if ($FirstTag eq "r") - { HandleRegister } } } } - if ($ValidOutput) - { FlushRegisters ; - close (TUO) } - else - { close (TUO) ; - unlink "texutil.tuo" ; - Report ("Remark", "NoOutputFile") } } - -# sub HandleReferences -# { Report("Action", "ProcessingReferences") ; -# if ($ProcessIJ ) -# { Report("Option", "SortingIJ") } -# if ($ProcessHigh) -# { Report("Option", "ConvertingHigh") } -# if ($ProcessQuotes) -# { Report("Option", "ProcessingQuotes") } -# if ($InputFile eq "") -# { Report("Error", "NoInputFile") } -# else -# { unless (open (TUI, "$InputFile.tui")) -# { Report("Error", "EmptyInputFile", $InputFile) } -# else -# { Report("InputFile", "$InputFile.tui" ) ; -# InitializeCommands ; -# InitializeRegisters ; -# InitializeSynonyms ; -# InitializeFiles ; -# $ValidOutput = 1 ; -# unlink "$InputFile.tmp" ; -# rename "$InputFile.tuo", "$InputFile.tmp" ; -# Report("OutputFile", "$InputFile.tuo" ) ; -# open (TUO, ">$InputFile.tuo") ; -# while (<TUI>) -# { $SomeLine = $_ ; -# chomp $SomeLine ; -# ($FirstTag, $RestOfLine) = split ' ', $SomeLine, 2 ; -# if ($FirstTag eq "c") -# { HandleCommand } -# elsif ($FirstTag eq "s") -# { HandleSynonym } -# elsif ($FirstTag eq "r") -# { HandleRegister } -# elsif ($FirstTag eq "f") -# { HandleFile } -# elsif ($FirstTag eq "q") -# { $ValidOutput = 0 ; -# last } } -# if ($ValidOutput) -# { FlushCommands ; # already done during pass -# FlushRegisters ; -# FlushSynonyms ; -# FlushFiles ; -# FlushData ; -# close (TUO) } -# else -# { close (TUO) ; -# unlink "$InputFile.tuo" ; -# rename "$InputFile.tmp", "$InputFile.tuo" ; -# Report ("Remark", "NoOutputFile") } } } } - -sub HandleReferences - { $Merging = @ARGV ; - $Merging = ($Merging>1) ; - if ($Merging) - { Report("Action", "MergingReferences") } - else - { Report("Action", "ProcessingReferences") } - if ($ProcessIJ ) - { Report("Option", "SortingIJ") } - if ($ProcessHigh) - { Report("Option", "ConvertingHigh") } - if ($ProcessQuotes) - { Report("Option", "ProcessingQuotes") } - InitializeKeys ; - InitializeCommands ; - InitializeExtra ; - InitializeRegisters ; - InitializeSynonyms ; - InitializeFiles ; - $ValidOutput = 1 ; - if ($Merging) - { MergerHandleReferences } - else - { NormalHandleReferences } } - -# moved to ctxtools -# -# sub HandleDocuments -# { my $files = @ARGV.join(' ') ; system("ctxtools $files") } - -#D \extras -#D {documents} -#D -#D Documentation can be woven into a source file. The next -#D routine generates a new, \TEX\ ready file with the -#D documentation and source fragments properly tagged. The -#D documentation is included as comment: -#D -#D \starttypen -#D %D ...... some kind of documentation -#D %M ...... macros needed for documenation -#D %S B begin skipping -#D %S E end skipping -#D \stoptypen -#D -#D The most important tag is \type{%D}. Both \TEX\ and -#D \METAPOST\ files use \type{%} as a comment chacacter, while -#D \PERL\ uses \type{#}. Therefore \type{#D} is also handled. -#D -#D The generated file gets the suffix \type{ted} and is -#D structured as: -#D -#D \starttypen -#D \startmodule[type=suffix] -#D \startdocumentation -#D \stopdocumentation -#D \startdefinition -#D \stopdefinition -#D \stopmodule -#D \stoptypen -#D -#D Macro definitions specific to the documentation are not -#D surrounded by start||stop commands. The suffix specifaction -#D can be overruled at runtime, but defaults to the file -#D extension. This specification can be used for language -#D depended verbatim typesetting. - -my $skippingbang = 0 ; - -sub HandleDocuments - { Report("Action", "GeneratingDocumentation") ; - if ($ProcessType ne "") - { Report("Option", "ForcingFileType", $ProcessType) } - if ($InputFile eq "") - { Report("Error", "NoInputFile") } - else - { CheckInputFiles ($InputFile) ; - foreach $FullName (@UserSuppliedFiles) - { ($FileName, $FileSuffix) = SplitFileName ($FullName) ; - unless ($FileSuffix) - { $FileSuffix = "tex" } - unless (-f "$FileName.$FileSuffix") - { next } - unless (open (TEX, "$FileName.$FileSuffix")) - { Report("Error", "EmptyInputFile", "$FileName.$FileSuffix" ) } - else - { Report("InputFile", "$FileName.$FileSuffix") ; - Report("OutputFile", "$FileName.ted") ; - open (TED, ">$FileName.ted") ; - $NOfDocuments = 0 ; - $NOfDefinitions = 0 ; - $NOfSkips = 0 ; - $SkipLevel = 0 ; - $InDocument = 0 ; - $InDefinition = 0 ; - $skippingbang = 0 ; - if ($ProcessType eq "") - { $FileType=lc $FileSuffix } - else - { $FileType=lc $ProcessType } - Report("FileType", $FileType) ; - # we need to signal to texexec what interfaec to use - my $firstline = <TEX> ; - if ($firstline =~ /^\%.*interface\=/) - { print TED $firstline } - else - { seek TEX, 0, 0 } - # so far - print TED "\\startmodule[type=$FileType]\n" ; - while (<TEX>) - { chomp ; - s/\s*$//o ; - if ($skippingbang) - { $skippingbang = 0 } - elsif (/^[%\#]D/) - { if ($SkipLevel == 0) - { if (length $_ < 3) - {$SomeLine = "" } - else # HH: added after that - {$SomeLine = substr $_, 3 } - if ($InDocument) - { print TED "$SomeLine\n" } - else - { if ($InDefinition) - { print TED "\\stopdefinition\n" ; - $InDefinition = 0 } - unless ($InDocument) - { print TED "\n\\startdocumentation\n" } - print TED "$SomeLine\n" ; - $InDocument = 1 ; - ++$NOfDocuments } } } - elsif (/^[%\#]M/) - { if ($SkipLevel == 0) - { $SomeLine = substr $_, 3 ; - print TED "$SomeLine\n" } } - elsif (/^[%\%]S B]/) - { ++$SkipLevel ; - ++$NOfSkips } - elsif (/^[%\%]S E]/) - { --$SkipLevel } - elsif (/^[%\#]/) - { } - elsif (/^eval \'\(exit \$\?0\)\' \&\& eval \'exec perl/o) - { $skippingbang = 1 } - elsif ($SkipLevel == 0) - { $InLocalDocument = $InDocument ; - $SomeLine = $_ ; - if ($InDocument) - { print TED "\\stopdocumentation\n" ; - $InDocument = 0 } - if (($SomeLine eq "") && ($InDefinition)) - { print TED "\\stopdefinition\n" ; - $InDefinition = 0 } - else - { if ($InDefinition) - { print TED "$SomeLine\n" } - elsif ($SomeLine ne "") - { print TED "\n" . "\\startdefinition\n" ; - $InDefinition = 1 ; - unless ($InLocalDocument) - { ++$NOfDefinitions } - print TED "$SomeLine\n" } } } } - if ($InDocument) - { print TED "\\stopdocumentation\n" } - if ($InDefinition) - { print TED "\\stopdefinition\n" } - print TED "\\stopmodule\n" ; - close (TED) ; - unless (($NOfDocuments) || ($NOfDefinitions)) - { unlink "$FileName.ted" } - Report ("NOfDocuments", $NOfDocuments) ; - Report ("NOfDefinitions", $NOfDefinitions) ; - Report ("NOfSkips", $NOfSkips) } } } } - -#D \extras -#D {sources} -#D -#D Documented sources can be stripped of documentation and -#D comments, although at the current processing speeds the -#D overhead of skipping the documentation at run time is -#D neglectable. Only lines beginning with a \type{%} are -#D stripped. The stripped files gets the suffix \type{tes}. - -sub HandleSources - { Report("Action", "GeneratingSources") ; - if ($InputFile eq "") - { Report("Error", "NoInputFile") } - else - { CheckInputFiles ($InputFile) ; - foreach $FullName (@UserSuppliedFiles) - { ($FileName, $FileSuffix) = SplitFileName ($FullName) ; - unless ($FileSuffix) - { $FileSuffix = "tex" } - unless (-f "$FileName.$FileSuffix") - { next } - unless (open (TEX, "$FileName.$FileSuffix")) - { Report("Error", "EmptyInputFile", "$FileName.$FileSuffix" ) } - else - { Report("InputFile", "$FileName.$FileSuffix") ; - Report("OutputFile", "$FileName.tes") ; - open (TES, ">$FileName.tes") ; - $EmptyLineDone = 1 ; - $FirstCommentDone = 0 ; - while (<TEX>) - { $SomeLine = $_ ; - chomp $SomeLine ; - if ($SomeLine eq "") - { unless ($FirstCommentDone) - { $FirstCommentDone = 1 ; - print TES - "\n% further documentation is removed\n\n" ; - $EmptyLineDone = 1 } - unless ($EmptyLineDone) - { print TES "\n" ; - $EmptyLineDone = 1 } } - elsif ($SomeLine =~ /^%/) - { unless ($FirstCommentDone) - { print TES "$SomeLine\n" ; - $EmptyLineDone = 0 } } - else - { print TES "$SomeLine\n" ; - $EmptyLineDone = 0 } } - close (TES) ; - unless ($FirstCommentDone) - { unlink "$FileName.tes" } } } } } - -#D \extras -#D {setups} -#D -#D All \CONTEXT\ commands are specified in a compact format -#D that can be used to generate quick reference tables and -#D cards. Such setups are preceded by \type{%S}. The setups -#D are collected in the file \type{texutil.tus}. - -sub HandleSetups - { Report("Action", "FilteringDefinitions" ) ; - if ($InputFile eq "") - { Report("Error", "NoInputFile") } - else - { SetOutputFile ("texutil.tus" ) ; - Report("OutputFile", $OutputFile) ; - open (TUS, ">$OutputFile") ; # always reset! - $NOfSetups = 0 ; - CheckInputFiles ($InputFile) ; - foreach $FullName (@UserSuppliedFiles) - { ($FileName, $FileSuffix) = SplitFileName ($FullName) ; - unless ($FileSuffix) - { $FileSuffix = "tex" } - unless (-f "$FileName.$FileSuffix") - { next } - unless (open (TEX, "$FileName.$FileSuffix")) - { Report("Error", "EmptyInputFile", "$FileName.$FileSuffix" ) } - else - { Report("InputFile", "$FileName.$FileSuffix") ; - print TUS "%\n" . "% File : $FileName.$FileSuffix\n" . "%\n" ; - while (<TEX>) - { $SomeLine = $_ ; - chomp $SomeLine ; - ($Tag, $RestOfLine) = split(/ /, $SomeLine, 2) ; - if ($Tag eq "%S") - { ++$NOfSetups ; - while ($Tag eq "%S") - { print TUS "$RestOfLine\n" ; - $SomeLine = <TEX> ; - chomp $SomeLine ; - ($Tag, $RestOfLine) = split(/ /, $SomeLine, 2) } - print TUS "\n" } } } } - close (TUS) ; - unless ($NOfSetups) - { unlink $OutputFile } - Report("NOfSetups", $NOfSetups) } } - -#D \extras -#D {templates, infos} -#D -#D From the beginning, the \CONTEXT\ source files contained -#D helpinfo and key||templates for \TEXEDIT. In fact, for a -#D long time, this was the only documentation present. More -#D and more typeset (interactive) documentation is replacing -#D this helpinfo, but we still support the traditional method. -#D This information is formatted like: -#D -#D \starttypen -#D %I n=Struts -#D %I c=\strut,\setnostrut,\setstrut,\toonstruts -#D %I -#D %I text -#D %I .... -#D %P -#D %I text -#D %I .... -#D \stoptypen -#D -#D Templates look like: -#D -#D \starttypen -#D %T n=kap -#D %T m=kap -#D %T a=k -#D %T -#D %T \kap{?} -#D \stoptypen -#D -#D The key||value pairs stand for {\em name}, {\em mnemonic}, -#D {\em key}. This information is copied to files with the -#D extension \type{tud}. - -sub HandleEditorCues - { if ($ProcessTemplates) - { Report("Action", "CopyingTemplates" ) } - if ($ProcessInfos) - {Report("Action", "CopyingInformation" ) } - if ($InputFile eq "") - { Report("Error", "NoInputFile") } - else - { CheckInputFiles ($InputFile) ; - foreach $FullName (@UserSuppliedFiles) - { ($FileName, $FileSuffix) = SplitFileName ($FullName) ; - if ($FileSuffix eq "") - { $FileSuffix = "tex" } - unless (-f "$FileName.$FileSuffix") - { next } - unless (open (TEX, "$FileName.$FileSuffix")) - { Report("Error", "EmptyInputFile", "$FileName.$FileSuffix" ) } - else - { Report("InputFile", "$FileName.$FileSuffix") ; - Report("OutputFile", "$FileName.tud") ; - open (TUD, ">$FileName.tud") ; - $NOfTemplates = 0 ; - $NOfInfos = 0 ; - while (<TEX>) - { $SomeLine = $_ ; - chomp $SomeLine ; - ($Tag, $RestOfLine) = split(/ /, $SomeLine, 2) ; - if (($Tag eq "%T") && ($ProcessTemplates)) - { ++$NOfTemplates ; - while ($Tag eq "%T") - { print TUD "$SomeLine\n" ; - $SomeLine = <TEX> ; - chomp $SomeLine ; - ($Tag, $RestOfLine) = split(/ /, $SomeLine, 2) } - print TUD "\n" } - elsif (($Tag eq "%I") && ($ProcessInfos)) - { ++$NOfInfos ; - while (($Tag eq "%I") || ($Tag eq "%P")) - { print TUD "$SomeLine\n" ; - $SomeLine = <TEX> ; - chomp $SomeLine ; - ($Tag, $RestOfLine) = split(/ /, $SomeLine, 2) } - print TUD "\n" } } - close (TUD) ; - unless (($NOfTemplates) || ($NOfInfos)) - { unlink "$FileName.tud" } - if ($ProcessTemplates) - { Report("NOfTemplates", $NOfTemplates) } - if ($ProcessInfos) - { Report("NOfInfos", $NOfInfos) } } } } } - -#D \extras -#D {figures} -#D -#D Directories can be scanned for illustrations in \EPS, \PDF, -#D \TIFF, \PNG\ or \JPG\ format. The resulting file \type{texutil.tuf} -#D contains entries like: -#D -#D \starttypen -#D \thisisfigureversion{year.month.day} -#D \presetfigure[file][...specifications...] -#D \stoptypen -#D -#D where the specifications are: -#D -#D \starttypen -#D [e=suffix,x=xoffset,y=yoffset,w=width,h=height,t=title,c=creator,s=size] -#D \stoptypen -#D -#D This data can be used when determining dimensions and -#D generate directories of illustrations. - -$DPtoCM = 2.54/72.0 ; -$INtoCM = 2.54 ; - -sub SaveFigurePresets - { my ($FNam, $FTyp, $FUni, $FXof, $FYof, $FWid, $FHei, $FTit, $FCre, $FSiz) = @_ ; - if ($ProcessVerbose) - { OpenTerminal ; - if ($FUni) - { print "n=$FNam t=$FTyp " . - (sprintf "x=%1.3fcm y=%1.3fcm ", $FXof, $FYof) . - (sprintf "w=%5.3fcm h=%5.3fcm\n", $FWid, $FHei) } - else - { print "n=$FNam t=$FTyp " . - "x=${FXof}bp y=${FYof}bp " . - "w=${FWid}bp h=${FHei}bp\n" } - CloseTerminal } - else - { ++$NOfFigures ; - $Figures[$NOfFigures] = "\\presetfigure[$FNam][e=$FTyp" ; - if ($FUni) - { $Figures[$NOfFigures] .= (sprintf ",w=%5.3fcm,h=%5.3fcm", $FWid, $FHei) } - else - { $Figures[$NOfFigures] .= ",w=${FWid}bp,h=${FHei}bp" } - if (($FXof!=0)||($FYof!=0)) - { if ($FUni) - { $Figures[$NOfFigures] .= (sprintf ",x=%1.3fcm,y=%1.3fcm", $FXof, $FYof) } - else - { $Figures[$NOfFigures] .= ",x=${FXof}bp,y=${FYof}bp" } } - if ($FTit) - { $Figures[$NOfFigures] .= ",t=\{$FTit\}" } - if ($FCre) - { $Figures[$NOfFigures] .= ",c=\{$FCre\}" } - $Figures[$NOfFigures] .= ",s=$FSiz]" } } - -#D The \EPS\ to \PDF\ conversion pipe to \GHOSTSCRIPT\ is -#D inspired by a script posted by Sebastian Ratz at the -#D \PDFTEX\ mailing list. Watch the bounding box check, we -#D use the values found in an earlier pass. - -sub ConvertEpsToEps - { my ( $SuppliedFileName , $LLX, $LLY, $URX, $URY ) = @_ ; - ($FileName, $FileSuffix) = SplitFileName ($SuppliedFileName) ; - if ($ProcessEpsToPdf) - { if ($dosish) { $gs = "gswin32c" } else { $gs = "gs" } - unlink "$FileName.pdf" ; - $GSCommandLine = "-q " . - "-sDEVICE=pdfwrite " . - "-dNOCACHE " . - "-dUseFlateCompression=true " . - "-dMaxSubsetPct=100 " . - "-sOutputFile=$FileName.pdf " . - "- -c " . - "quit " ; - open ( EPS, "| $gs $GSCommandLine") } - elsif ($PDFReady) - { return } - else - { open ( EPS, ">texutil.tmp" ) ; - binmode EPS } - open ( TMP , "$SuppliedFileName" ) ; - binmode TMP ; - $EpsBBOX = 0 ; - $EpsWidth = $URX - $LLX ; - $EpsHeight = $URY - $LLY ; - $EpsXOffset = 0 - $LLX ; - $EpsYOffset = 0 - $LLY ; - while (<TMP>) - { if (/%!PS/) - { s/(.*)%!PS/%!PS/o ; - print EPS $_ ; - last } } - while (<TMP>) - { if ((!$PDFReady)&&(/^%%(HiResB|ExactB|B)oundingBox:/o)) - { unless ($EpsBBOX) - { print EPS "%%PDFready: $Program\n" ; - print EPS "%%BoundingBox: 0 0 $EpsWidth $EpsHeight\n" ; - print EPS "<< /PageSize [$EpsWidth $EpsHeight] >> setpagedevice\n" ; - print EPS "gsave $EpsXOffset $EpsYOffset translate\n" ; - $EpsBBOX = 1 } } - elsif (/^%%EOF/o) # when final: (/^%%(EOF|Trailer)/o) - { last } - elsif (/^%%Trailer/o) - { last } - else - { print EPS $_ } } - close ( TMP ) ; - if (($EpsBBOX)&&(!$PDFReady)) - { print EPS "grestore\n%%EOF\n%%RestOfFileIgnored: $Program\n" ; - close ( EPS ) ; - Report ( "PdfFile", "$SuppliedFileName" ) ; - unless ($ProcessEpsToPdf) - { unlink "$SuppliedFileName" ; - rename "texutil.tmp", "$SuppliedFileName" } } - else - { close (EPS) } - unlink "texutil.tmp" } - -sub HandleEpsFigure - { my ($SuppliedFileName) = @_ ; - my ($Temp) = "" ; - if (-f $SuppliedFileName) - { ($FileName, $FileSuffix) = SplitFileName ($SuppliedFileName) ; - if ($FileSuffix ne "") - {#$Temp = $FileSuffix ; - #$Temp =~ s/[0-9]//go ; - #if ($Temp eq "") - if ($FileSuffix =~ /^[0-9]+$/o) - { $EpsFileName = $SuppliedFileName; - Report ( "MPFile", "$SuppliedFileName" ) } - elsif ((lc $FileSuffix ne "eps")&&(lc $FileSuffix ne "mps")) - { return } - else - { $EpsFileName = $SuppliedFileName; # $FileName - Report ( "EpsFile", "$SuppliedFileName" ) } - $EpsTitle = "" ; - $EpsCreator = "" ; - open ( EPS , $SuppliedFileName ) ; - binmode EPS ; - $EpsSize = -s EPS ; - $PDFReady = 0 ; - $MPSFound = 0 ; - $BBoxFound = 0 ; - while (<EPS>) - { $SomeLine = $_; - chomp $SomeLine ; - if (($BBoxFound) && ((substr $SomeLine,0,1) ne "%")) - { last } - if ($BBoxFound<2) - { if ($SomeLine =~ /^%%BoundingBox:(?!\s+\(atend\))/io) # atend (th) - { $EpsBBox = $SomeLine ; $BBoxFound = 1 ; next } - elsif ($SomeLine =~ /^%%HiResBoundingBox:/io) - { $EpsBBox = $SomeLine ; $BBoxFound = 2 ; next } - elsif ($SomeLine =~ /^%%ExactBoundingBox:/io) - { $EpsBBox = $SomeLine ; $BBoxFound = 3 ; next } } - if ($SomeLine =~ /^%%PDFready:/io) - { $PDFReady = 1 } - elsif ($SomeLine =~ /^%%Creator:/io) - { ($Tag, $EpsCreator) = split (/ /, $SomeLine, 2) ; - if ($EpsCreator =~ /MetaPost/io) - { $MPSFound = 1 } } - elsif ($SomeLine =~ /^%%Title:/io) - { ($Tag, $EpsTitle) = split (/ /, $SomeLine, 2) } } - close ( EPS ) ; - if ($BBoxFound) - { ($Tag, $LLX, $LLY, $URX, $URY, $RestOfLine) = split (/ /, $EpsBBox, 6 ) ; - $EpsHeight = ($URY-$LLY)*$DPtoCM ; - $EpsWidth = ($URX-$LLX)*$DPtoCM ; - $EpsXOffset = $LLX*$DPtoCM ; - $EpsYOffset = $LLY*$DPtoCM ; - if ($MPSFound) - { $EpsType = "mps" } - else - { $EpsType = "eps" } - SaveFigurePresets - ( $EpsFileName, $EpsType, 1, - $EpsXOffset, $EpsYOffset, $EpsWidth, $EpsHeight, - $EpsTitle, $EpsCreator, $EpsSize ) ; - if (($ProcessEpsPage) || ($ProcessEpsToPdf)) - { ConvertEpsToEps ( $SuppliedFileName, $LLX, $LLY, $URX, $URY ) } } - else - { Report ( "MissingBoundingBox", "$SuppliedFileName" ) } } } } - -#D The \PDF\ scanning does a similar job. This time we -#D search for a mediabox. I could have shared some lines -#D with the previous routines, but prefer readability. - -sub HandlePdfFigure - { my ( $SuppliedFileName ) = @_ ; - ($FileName, $FileSuffix) = SplitFileName ($SuppliedFileName) ; - if (lc $FileSuffix ne "pdf") - { return } - else - { $PdfFileName = $SuppliedFileName ; - Report ( "PdfFile", "$SuppliedFileName" ) } - open ( PDF , $SuppliedFileName ) ; - binmode PDF ; - $PdfSize = -s PDF ; - $MediaBoxFound = 0 ; - $MediaBox = 0 ; - $PageFound = 0 ; - $PagesFound = 0 ; - while (<PDF>) - { $SomeLine = $_ ; - chomp ($SomeLine) ; - if ($SomeLine =~ /\/Type\s*\/Pages/io) - { $PagesFound = 1 } - elsif ($SomeLine =~ /\/Type\s*\/Page/io) - { ++$PageFound ; - if ($PageFound>1) { last } } - if (($PageFound)||($PagesFound)) - { if (($MediaBoxFound < 2) && ($SomeLine =~ /\/ArtBox\s*\[/io)) - { $MediaBoxFound = 3 ; - $MediaBox = $SomeLine } - elsif (($MediaBoxFound < 2) && ($SomeLine =~ /\/CropBox\s*\[/io)) - { $MediaBoxFound = 2 ; - $MediaBox = $SomeLine } - elsif (($MediaBoxFound == 0) && ($SomeLine =~ /\/MediaBox\s*\[/io)) - { $MediaBoxFound = 1 ; - $MediaBox = $SomeLine } } } - close ( PDF ) ; - if ($PageFound>1) - { Report ( "MultiPagePdfFile", "$SuppliedFileName" ) } - if (($MediaBoxFound) && ($MediaBox)) - { my $D = "[0-9\-\.]" ; - $MediaBox =~ /\/(Media|Crop|Art)Box\s*\[\s*($D+)\s*($D+)\s*($D+)\s*($D+)/o ; - $LLX = $2 ; $LLY = $3 ; $URX = $4 ; $URY = $5 ; - $PdfHeight = ($URY-$LLY)*$DPtoCM ; - $PdfWidth = ($URX-$LLX)*$DPtoCM ; - $PdfXOffset = $LLX*$DPtoCM ; - $PdfYOffset = $LLY*$DPtoCM ; - SaveFigurePresets - ( $PdfFileName, "pdf", 1, - $PdfXOffset, $PdfYOffset, $PdfWidth, $PdfHeight, - "", "", $PdfSize ) } - else - { Report ( "MissingMediaBox", "$SuppliedFileName" ) } } - -#D A previous version of \TEXUTIL\ used \type{tifftags} or -#D \type{tiffinfo} for collecting the dimensions. However, -#D the current implementation does this job itself. - -sub TifGetByte - { my $B = 0 ; - read TIF, $B, 1 ; - return ord($B) } - -sub TifGetShort - { my $S = 0 ; - read TIF, $S, 2 ; - if ($TifLittleEndian) - { return (unpack ("v", $S)) } - else - { return (unpack ("n", $S)) } } - -sub TifGetLong - { my $L = 0 ; - read TIF, $L, 4 ; - if ($TifLittleEndian) - { return (unpack ("V", $L)) } - else - { return (unpack ("N", $L)) } } - -sub TifGetRational - { my ($N, $M) = (0,0) ; - $N = TifGetLong ; - $M = TifGetLong ; - return $N/$M } - -sub TifGetAscii - { my $S = "" ; - --$TifValues; - unless ($TifValues) - { return "" } - else - { read TIF, $S, $TifValues ; - return $S } } - -sub TifGetWhatever - { if ($_[0]==1) - { return TifGetByte } - elsif ($_[0]==2) - { return TifGetAscii } - elsif ($_[0]==3) - { return TifGetShort } - elsif ($_[0]==4) - { return TifGetLong } - elsif ($_[0]==5) - { return TifGetRational } - else - { return 0 } } - -sub TifGetChunk - { seek TIF, $TifNextChunk, 0 ; - $Length = TifGetShort ; - $TifNextChunk += 2 ; - for ($i=1; $i<=$Length; $i++) - { seek TIF, $TifNextChunk, 0 ; - $TifTag = TifGetShort ; - $TifType = TifGetShort ; - $TifValues = TifGetLong ; - if ($TifTag==256) - { $TifWidth = TifGetWhatever($TifType) } - elsif ($TifTag==257) - { $TifHeight = TifGetWhatever($TifType) } - elsif ($TifTag==296) - { $TifUnit = TifGetWhatever($TifType) } - elsif ($TifTag==282) - { seek TIF, TifGetLong, 0 ; - $TifHRes = TifGetWhatever($TifType) } - elsif ($TifTag==283) - { seek TIF, TifGetLong, 0 ; - $TifVRes = TifGetWhatever($TifType) } - elsif ($TifTag==350) - { seek TIF, TifGetLong, 0 ; - $TifCreator = TifGetWhatever($TifType) } - elsif ($TifTag==315) - { seek TIF, TifGetLong, 0 ; - $TifAuthor = TifGetWhatever($TifType) } - elsif ($TifTag==269) - { seek TIF, TifGetLong, 0 ; - $TifTitle = TifGetWhatever($TifType) } - $TifNextChunk += 12 } - seek TIF, $TifNextChunk, 0 ; - $TifNextChunk = TifGetLong ; - return ($TifNextChunk>0) } - -sub HandleTifFigure - { my ( $SuppliedFileName ) = @_ ; - ($FileName, $FileSuffix) = SplitFileName ($SuppliedFileName) ; - if (lc $FileSuffix ne "tif") - { return } - else - { $TifFile = $SuppliedFileName ; - if (open ( TIF, $TifFile )) { # { must be here, perl 5.003 bug - Report ( "TifFile", "$SuppliedFileName" ) ; - binmode TIF; - $TifWidth = 0 ; - $TifHeight = 0 ; - $TifTitle = "" ; - $TifAuthor = "" ; - $TifCreator = "" ; - $TifUnit = 0 ; - $TifHRes = 1 ; - $TifVRes = 1 ; - $TifSize = -s TIF ; - $TifByteOrder = "" ; - seek TIF, 0, 0 ; - read TIF, $TifByteOrder, 2 ; - $TifLittleEndian = ($TifByteOrder eq "II") ; - $TifTag = TifGetShort; - unless ($TifTag == 42) - { close ( TIF ) ; - return } - $TifNextChunk = TifGetLong ; - while (TifGetChunk) { } - if ($TifUnit==2) - { $TifMult = $INtoCM } - elsif ($TifUnit==3) - { $TifMult = 1 } - else - { $TifMult = 72 } - $TifWidth = ($TifWidth /$TifHRes)*$TifMult ; - $TifHeight = ($TifHeight/$TifVRes)*$TifMult ; - close ( TIF ) ; - SaveFigurePresets - ( $TifFile, "tif", $TifUnit, - 0, 0, $TifWidth, $TifHeight, - $TifTitle, $TifCreator, $TifSize ) } } } - -#D I first intended to use the public utility \type{pngmeta} -#D (many thanks to Taco for compiling it), but using this -#D utility to analyze lots of \PNG\ files, I tried to do a -#D similar job in \PERL. Here are the results: - -my ($PngSize, $PngWidth, $PngHeight) = (0,0,0) ; -my ($PngMult, $PngHRes, $PngVRes, $PngUnit) = (0,1,1,0) ; -my ($PngFile, $PngTitle, $PngAuthor, $PngCreator) = ("","","") ; -my ($PngNextChunk, $PngLength, $PngType) = (0,0,0) ; -my ($PngKeyword, $PngDummy) = ("","") ; - -my $PngSignature = chr(137) . chr(80) . chr(78) . chr(71) . - chr (13) . chr(10) . chr(26) . chr(10) ; -sub PngGetByte - { my ($B) = 0 ; - read PNG, $B, 1 ; - return (ord($B)) } - -sub PngGetLong - { my ($L) = 0 ; - read PNG, $L, 4 ; - return (unpack("N", $L)) } - -sub PngGetChunk - { if ($PngNextChunk<$PngSize) - { seek PNG, $PngNextChunk, 0 ; - $PngLength = PngGetLong ; - $PngNextChunk = $PngNextChunk + $PngLength + 12 ; - read PNG, $PngType, 4 ; - if ($PngType eq "") - { return 0 } - elsif ($PngType eq "IEND") - { return 0 } - elsif ($PngType eq "IHDR") - { $PngWidth = PngGetLong ; - $PngHeight = PngGetLong } - elsif ($PngType eq "pHYs") - { $PngHRes = PngGetLong ; - $PngVRes = PngGetLong ; - read PNG, $PngUnit, 1 } - elsif ($PngType eq "tEXt") - { read PNG, $PngKeyword, $PngLength ; - ($PngKeyword,$PngDummy) = split(/\x00/,$PngKeyword) ; - if ( $PngKeyword eq "Title") - { $PngTitle = $PngDummy } - elsif ( $PngKeyword eq "Author") - { $PngAuthor = $PngDummy } - elsif ( $PngKeyword eq "Software") - { $PngCreator = $PngDummy } } - return 1 } - else - { return 0 } } - -sub HandlePngFigure - { my ( $SuppliedFileName ) = @_ ; - ($FileName, $FileSuffix) = SplitFileName ($SuppliedFileName) ; - if (lc $FileSuffix ne "png") - { return } - else - { $PngFile = $SuppliedFileName ; - if (open ( PNG, $PngFile )) - { Report ( "PngFile", "$SuppliedFileName" ) } - $PngSize = 0 ; - $PngWidth = 0 ; - $PngHeight = 0 ; - $PngTitle = "" ; - $PngAuthor = "" ; - $PngCreator = "" ; - $PngUnit = 0 ; - $PngVRes = 1 ; - $PngHRes = 1 ; - $PngSig = "" ; - $PngSize = -s PNG ; - binmode PNG ; - seek PNG, 0, 0 ; - read PNG, $PngSig, 8; - unless ($PngSig eq $PngSignature) - { close ( PNG ) ; - return } - $PngNextChunk = 8 ; - while (PngGetChunk) { } - $PngWidth = ($PngWidth /$PngVRes) ; - $PngHeight = ($PngHeight/$PngHRes) ; - close ( PNG ) ; - SaveFigurePresets - ( $PngFile, "png", $PngUnit, - 0, 0, $PngWidth, $PngHeight, - $PngTitle, $PngCreator, $PngSize ) } } - -#D Well, we also offer \JPG\ scanning (actually \JFIF) -#D scanning. (I can recomend David Salomon's book on Data -#D Compression to those interested in the internals of -#D \JPG.) -#D -#D It took me some time to discover that the (sort of) -#D reference document I used had a faulty byte position table. -#D Nevertheless, when I was finaly able to grab the header, -#D Piet van Oostrum pointer me to the \PERL\ script of Alex -#D Knowles (and numerous other contributers), from which I -#D could deduce what segment contained the dimensions. - -my ($JpgSize, $JpgWidth, $JpgHeight) = (0,0,0) ; -my ($JpgMult, $JpgUnit, $JpgHRes, $JpgVRes) = (1,0,1,1) ; -my ($JpgFile, $JpgVersion, $JpgDummy) = ("",0,"") ; -my ($JpgSig, $JpgPos, $JpgLen, $JpgSoi, $JpgApp) = ("",0,0,0,0) ; - -my $JpgSignature = "JFIF" . chr(0) ; - -sub JpgGetByte - { my ($B) = 0 ; - read JPG, $B, 1 ; - return ( ord($B) ) } - -sub JpgGetInteger - { my ($I) = 0 ; - read JPG, $I, 2 ; - return (unpack("n", $I)) } - -sub HandleJpgFigure - { my ($SuppliedFileName) = @_ ; - ($FileName, $FileSuffix) = SplitFileName ($SuppliedFileName) ; - if (lc $FileSuffix ne "jpg") - { return } - else - { $JpgFile = $SuppliedFileName ; - Report ( "JpgFile", "$SuppliedFileName" ) } - open ( JPG, $JpgFile ) ; - binmode JPG ; - $JpgSignature = "JFIF" . chr(0) ; - $JpgSize = -s JPG ; - $JpgWidth = 0 ; - $JpgHeight = 0 ; - $JpgUnit = 0 ; - $JpgVRes = 1 ; - $JpgHRes = 1 ; - seek JPG, 0, 0 ; - read JPG, $JpgSig, 4 ; - unless ($JpgSig eq chr(255).chr(216).chr(255).chr(224)) - { close ( JPG ) ; - return } - $JpgLen = JpgGetInteger; - read JPG, $JpgSig, 5 ; - unless ($JpgSig eq $JpgSignature) - { close ( JPG ) ; - return } - $JpgUnit = JpgGetByte ; - $JpgVersion = JpgGetInteger ; - $JpgHRes = JpgGetInteger ; - $JpgVRes = JpgGetInteger ; - $JpgPos = $JpgLen + 4 ; - $JpgSoi = 255 ; - while () - { seek JPG, $JpgPos, 0 ; - $JpgSoi = JpgGetByte ; - $JpgApp = JpgGetByte ; - $JpgLen = JpgGetInteger ; - if ($JpgSoi!=255) - { last } - if (($JpgApp>=192) && ($JpgApp<=195)) # Found in the perl script. - { $JpgDummy = JpgGetByte ; # Found in the perl script. - $JpgHeight = JpgGetInteger ; # Found in the perl script. - $JpgWidth = JpgGetInteger } # Found in the perl script. - $JpgPos = $JpgPos + $JpgLen + 2 } - close ( JPG ) ; - if ($JpgUnit==1) - { $JpgMult = $INtoCM } - else - { $JpgMult = 1 } - $JpgHRes = 72 unless $JpgHRes>1 ; - $JpgVRes = 72 unless $JpgVRes>1 ; - $JpgWidth = ($JpgWidth/$JpgHRes)*$JpgMult ; - $JpgHeight = ($JpgHeight/$JpgVRes)*$JpgMult ; - close ( JPG ) ; - SaveFigurePresets - ( $JpgFile, "jpg", $JpgUnit, - 0, 0, $JpgWidth, $JpgHeight, - "", "", $JpgSize ) } - -#D Now we can handle figures! - -sub InitializeFigures - { $NOfFigures = 0 } - -sub FlushFigures - { SetOutputFile ("texutil.tuf") ; - open ( TUF, ">$OutputFile" ) ; - print TUF "%\n" . "% $Program / Figures\n" . "%\n" ; - print TUF "\\thisisfigureversion\{1996.06.01\}\n" . "%\n" ; - # a joins is nicer - for ($n=1 ; $n<=$NOfFigures ; ++$n) - { print TUF "$Figures[$n]%\n" } - print TUF "\\endinput"; - close (TUF) ; - if ($NOfFigures) - { Report("OutputFile", $OutputFile ) } - else - { unlink $OutputFile } - Report ( "NOfFigures", $NOfFigures ) } - -sub DoHandleFigures - { my ($FigureSuffix, $FigureMethod) = @_ ; - if ($InputFile eq "") - { $InputFile = $FigureSuffix } - CheckInputFiles ($InputFile) ; - foreach $FileName (@UserSuppliedFiles) - { &{$FigureMethod} ( $FileName ) } } - -sub HandleFigures - { Report("Action", "GeneratingFigures" ) ; - foreach $FileType (@ARGV) - { if ($FileType=~/\.eps/io) - { Report("Option", "UsingEps") ; - if ($ProcessEpsToPdf) { Report("Option", "EpsToPdf") } - if ($ProcessEpsPage) { Report("Option", "EpsPage") } - last } } - foreach $FileType (@ARGV) - { if ($FileType=~/\.pdf/io) - { Report("Option", "UsingPdf") ; - last } } - foreach $FileType (@ARGV) - { if ($FileType=~/\.tif/io) - { Report("Option", "UsingTif") ; - #RunTifPrograms ; - last } } - foreach $FileType (@ARGV) - { if ($FileType=~/\.png/io) - { Report("Option", "UsingPng") ; - last } } - foreach $FileType (@ARGV) - { if ($FileType=~/\.jpg/io) - { Report("Option", "UsingJpg") ; - last } } - InitializeFigures ; - DoHandleFigures ("eps", "HandleEpsFigure") ; - DoHandleFigures ("pdf", "HandlePdfFigure") ; - DoHandleFigures ("tif", "HandleTifFigure") ; - DoHandleFigures ("png", "HandlePngFigure") ; - DoHandleFigures ("jpg", "HandleJpgFigure") ; - FlushFigures } - -#D \extras -#D {logfiles} -#D -#D This (poor man's) log file scanning routine filters -#D overfull box messages from a log file (\type{\hbox}, -#D \type{\vbox} or both). The collected problems are saved -#D in \type{$ProgramLog}. One can specify a selection -#D criterium. -#D -#D \CONTEXT\ reports unknown entities. These can also be -#D filtered. When using fast computers, or when processing -#D files in batch, one has to rely on the log files and/or -#D this filter. - -$Unknown = "onbekende verwijzing|" . - "unbekannte Referenz|" . - "unknown reference|" . - "dubbele verwijzing|" . - "duplicate reference|" . - "doppelte Referenz" ; - -sub FlushLogTopic - { unless ($TopicFound) - { $TopicFound = 1 ; - print ALL "\n% File: $FileName.log\n\n" } } - -sub HandleLogFile - { if ($ProcessBox) - { Report("Option", "FilteringBoxes", "(\\vbox & \\hbox)") ; - $Key = "[h|v]box" } - elsif ($ProcessHBox) - { Report("Option", "FilteringBoxes", "(\\hbox)") ; - $Key = "hbox" ; - $ProcessBox = 1 } - elsif ($ProcessVBox) - { Report("Option", "FilteringBoxes", "(\\vbox)") ; - $Key = "vbox" ; - $ProcessBox = 1 } - if (($ProcessBox) && ($ProcessCriterium)) - { Report("Option", "ApplyingCriterium") } - if ($ProcessUnknown) - { Report("Option", "FilteringUnknown") } - unless (($ProcessBox) || ($ProcessUnknown)) - { ShowHelpInfo ; - return } - Report("Action", "FilteringLogFile" ) ; - if ($InputFile eq "") - { Report("Error", "NoInputFile") } - else - { $NOfBoxes = 0 ; - $NOfMatching = 0 ; - $NOfUnknown = 0 ; - SetOutputFile ($ProgramLog) ; - Report("OutputFile", $OutputFile) ; - CheckInputFiles ($InputFile) ; - open ( ALL, ">$OutputFile" ) ; - foreach $FullName (@UserSuppliedFiles) - { ($FileName, $FileSuffix) = SplitFileName ($FullName) ; - if (! open (LOG, "$FileName.log")) - { Report("Error", "EmptyInputFile", "$FileName.$FileSuffix" ) } - elsif (-e "$FileName.tex") - { $TopicFound = 0 ; - Report("InputFile", "$FileName.log") ; - while (<LOG>) - { $SomeLine = $_ ; - chomp $SomeLine ; - if (($ProcessBox) && ($SomeLine =~ /Overfull \\$Key/)) - { ++$NOfBoxes ; - $SomePoints = $SomeLine ; - $SomePoints =~ s/.*\((.*)pt.*/$1/ ; - if ($SomePoints>=$ProcessCriterium) - { ++$NOfMatching ; - FlushLogTopic ; - print ALL "$SomeLine\n" ; - $SomeLine=<LOG> ; - print ALL $SomeLine } } - if (($ProcessUnknown) && ($SomeLine =~ /$Unknown/io)) - { ++$NOfUnknown ; - FlushLogTopic ; - print ALL "$SomeLine\n" } } } } - close (ALL) ; - unless (($NOfBoxes) ||($NOfUnknown)) - { unlink $OutputFile } - if ($ProcessBox) - { Report ( "NOfBoxes" , "$NOfBoxes", "->", $NOfMatching, "Overfull") } - if ($ProcessUnknown) - { Report ( "NOfUnknown", "$NOfUnknown") } } } - -#D Undocumented feature. -# -# obsolete, i.e now in ctxtools, so this will become: -# -# sub PurgeFiles { -# if ($PurgeAllFiles) { -# system("ctxtools --purge $ARGV[0]") ; -# } else { -# system("ctxtools --purge --all $ARGV[0]") ; -# } - -my $removedfiles = 0 ; -my $keptfiles = 0 ; -my $persistentfiles = 0 ; -my $reclaimedbytes = 0 ; - -sub RemoveContextFile - { my $filename = shift ; - my $filesize = -s $filename ; - unlink $filename ; - if (-e $filename) - { ++$persistentfiles ; - print " persistent : $filename\n" } - else - { ++$removedfiles ; $reclaimedbytes += $filesize ; - print " removed : $filename\n" } } - -sub KeepContextFile - { my $filename = shift ; - ++$keptfiles ; - print " kept : $filename\n" } - -my @dontaskprefixes = sort glob "mpx-*" ; push @dontaskprefixes , - ("tex-form.tex","tex-edit.tex","tex-temp.tex", - "texexec.tex","texexec.tui","texexec.tuo", - "texexec.ps","texexec.pdf","texexec.dvi", - "cont-opt.tex","cont-opt.bak") ; -my @dontasksuffixes = - ("mpgraph.mp","mpgraph.mpd","mpgraph.mpo","mpgraph.mpy", - "mprun.mp", "mprun.mpd", "mprun.mpo", "mprun.mpy", - "xlscript.xsl") ; -my @forsuresuffixes = - ("tui","tup","ted","tes","top", - "log","tmp","run","bck","rlg", - "mpt","mpx","mpd","mpo") ; -my @texonlysuffixes = - ("dvi","ps","pdf") ; -my @texnonesuffixes = - ("tuo","tub","top") ; - -if ($PurgeAllFiles) - { push @forsuresuffixes, @texnonesuffixes ; @texnonesuffixes = [] } - -sub PurgeFiles # no my in foreach - { my $pattern = $ARGV[0] ; - my $strippedname ; - my $basename ; - my @files = () ; - if ($pattern eq '') - { $pattern = "*.*" ; - @files = glob $pattern } - else - { $pattern = $ARGV[0] . "-*.*" ; - @files = glob $pattern ; - $pattern = $ARGV[0] . ".*" ; - push(@files,glob $pattern) } - @files = sort @files ; - print " purging files : $pattern\n\n" ; - foreach $file (@dontaskprefixes) - { if (-e $file) - { RemoveContextFile($file) } } - foreach $file (@dontasksuffixes) - { if (-e $file) - { RemoveContextFile($file) } } - foreach $suffix (@dontasksuffixes) - { foreach (@files) - { if (/$suffix$/i) - { RemoveContextFile($_) } } } - foreach $suffix (@forsuresuffixes) - { foreach (@files) - { if (/\.$suffix$/i) - { RemoveContextFile($_) } } } - foreach $file (@files) - { if ($file =~ /(.*?)\.\d+$/) - { $basename = $1 ; - if (($file =~ /mp(graph|run)/) || (-e "$basename.mp")) - { RemoveContextFile($file) } } } - foreach $suffix (@texnonesuffixes) - { foreach (@files) - { if (/(.*)\.$suffix$/i) - { if ((-e "$1.tex")||(-e "$1.xml")||(-e "$1.fo")) - { KeepContextFile($_) } - else - { $strippedname = $1 ; - $strippedname =~ s/\-[a-z]$//io ; - if ((-e "$strippedname.tex")||(-e "$strippedname.xml")) - { KeepContextFile($_." (potential result file)") } - else - { RemoveContextFile($_) } } } } } - if ($removedfiles||$keptfiles||$persistentfiles) - { print "\n" } - print " removed files : $removedfiles\n" ; - print " kept files : $keptfiles\n" ; - print " persistent files : $persistentfiles\n" ; - print " reclaimed bytes : $reclaimedbytes\n" } - -#D Another undocumented feature. -# -# obsolete, i.e now in pdftools, so this will become: -# -# sub AnalyzeFile -# { system("pdftools --analyze $ARGV[0]") } - -sub AnalyzeFile - { my $filename = $ARGV[0] ; - return unless (($filename =~ /\.pdf/)&&(-e $filename)) ; - my $filesize = -s $filename ; - print " analyzing file : $filename\n" ; - print " file size : $filesize\n" ; - open (PDF, $filename) ; - binmode PDF ; - my $Object = 0 ; - my $Annot = 0 ; - my $Link = 0 ; - my $Widget = 0 ; - my $Named = 0 ; - my $Script = 0 ; - my $Cross = 0 ; - while (<PDF>) - { while (/\d+\s+\d+\s+obj/go) { ++$Object } ; - while (/\/Type\s*\/Annot/go) { ++$Annot } ; - while (/\/GoToR\s*\/F/go) { ++$Cross } ; - while (/\/Subtype\s*\/Link/go) { ++$Link } ; - while (/\/Subtype\s*\/Widget/go) { ++$Widget } ; - while (/\/S\s*\/Named/go) { ++$Named } ; - while (/\/S\s*\/JavaScript/go) { ++$Script } } - close (PDF) ; - print " objects : $Object\n" ; - print " annotations : $Annot\n" ; - print " links : $Link ($Named named / $Script scripts / $Cross files)\n" ; - print " widgets : $Widget\n" } - -# moved to ctxtools -# -# sub FilterPages -# { system("ctxtools $ARGV{0]") } - -sub FilterPages # temp feature / no reporting - { my $filename = $ARGV[0] ; - return unless -f "$filename.pdf" ; - my $old = '' ; - my $n = 0 ; - if (open(PDF,"<$filename.pdf") && open(TUO,">>$filename.tuo")) - { binmode PDF ; - while (<PDF>) - { chomp ; - if (($_ eq '/Type /Page') && ($old =~ /^(\d+)\s+0\s+obj/o)) - { ++$n ; $p = $1 ; - print TUO "\\objectreference{PDFP}{$n}{$p}{$n}\n" } - else - { $old = $_ } } - close(PDF) ; - close(TUO) } } - - ShowBanner ; - -if ($UnknownOptions ) { ShowHelpInfo } # not yet done -elsif ($ProcessReferences) { HandleReferences } -elsif ($ProcessDocuments ) { HandleDocuments } -elsif ($ProcessSources ) { HandleSources } -elsif ($ProcessSetups ) { HandleSetups } -elsif ($ProcessTemplates ) { HandleEditorCues } -elsif ($ProcessInfos ) { HandleEditorCues } -elsif ($ProcessFigures ) { HandleFigures } -elsif ($ProcessLogFile ) { HandleLogFile } -elsif ($PurgeFiles ) { PurgeFiles } -elsif ($PurgeAllFiles ) { PurgeFiles } -elsif ($AnalyzeFile ) { AnalyzeFile } -elsif ($FilterPages ) { FilterPages } -elsif ($ProcessHelp ) { ShowHelpInfo } # redundant -else { ShowHelpInfo } - -print "\n" ; -print " remark : 'texutil' is now part of 'texexec'\n" ; -print " warning : use 'texmfstart texutil' instead\n" ; - -#D So far. diff --git a/Master/texmf-dist/scripts/context/perl/utiplug.pm b/Master/texmf-dist/scripts/context/perl/utiplug.pm deleted file mode 100644 index 2bc162e1e38..00000000000 --- a/Master/texmf-dist/scripts/context/perl/utiplug.pm +++ /dev/null @@ -1,30 +0,0 @@ -package utiplug ; - -my @data ; -my @result ; - -sub utiplug::initialize - { @data = () } - -sub utiplug::process - { @data = sort @data ; - for (my $i=0; $i<@data; $i++) - { @result[$i] = "\\plugintest\{$i\}\{$data[$i]\}" } } - -sub utiplug::handle - { my ($self,$text,$rest) = @_ ; push @data, $text } - -sub utiplug::identify - { return "utiplug test plugin" } - -sub utiplug::report - { my $keys = @data ; - if ($keys) - { return ("done", "keys:$keys") } - else - { return ("nothing done") } } - -sub utiplug::results - { return @result } - -1 ; |