2 # The perl script requires bindings for the following
3 # variables to be prepended:
8 $Pgm = $0; $Pgm =~ s/.*\/([^\/]+)$/\1/;
10 # set up signal handler
11 sub quit_upon_signal { &rm_temp_files_and_exit(); }
12 $SIG{'INT'} = 'quit_upon_signal';
13 $SIG{'QUIT'} = 'quit_upon_signal';
16 if ($ARGV[0] eq '-v') {
21 die "$Pgm: must have exactly one argument\n" if $#ARGV != 0;
22 # figure out input file and its filename root
24 $TeX_input = $ARGV[0];
25 if ($TeX_input =~ /(.+)\.[^\.\/\n]+$/) {
28 $TeX_root = $TeX_input;
30 } elsif (-f $ARGV[0].'.tex') {
31 $TeX_input = $ARGV[0].'.tex';
34 die "$Pgm: input file $ARGV[0] doesn't exist\n";
37 if ( $ENV{'TMPDIR'} ) { # where to make tmp file names
38 $Tmp_prefix = $ENV{'TMPDIR'} ;
40 $Tmp_prefix ="$DEFAULT_TMPDIR";
41 $ENV{'TMPDIR'} = "$DEFAULT_TMPDIR"; # set the env var as well
45 system("rm -f $Tmp_prefix/ltx-*.$$");
47 sub rm_temp_files_and_exit {
48 system("rm -f $Tmp_prefix/ltx-*.$$");
51 $SIG{'INT'} = 'rm_temp_files_and_exit';
52 $SIG{'QUIT'} = 'rm_temp_files_and_exit';
58 &rm_temp_files_and_exit();
61 # must read through root file to see if a \bibliography
63 $Bibliography_requested = 0;
64 open(TEXIF, "<$TeX_input")
65 || &die_gracefully("$Pgm: Can't read $TeX_input\n");
67 $Bibliography_requested = 1 if /^\\bibliography/;
70 &die_gracefully("$Pgm: reading $TeX_input had errors\n") if $? >> 8;
72 # run latex first time (?)
73 &run_latex(); # sets $Says_labels_changed
76 while (&something_more_needed()) {
78 print STDERR "labels_changed=$Says_label_changed;bibtex_needed=$BibTeX_run_needed;makeindex_needed=$MakeIndex_run_needed\n" if $Verbose;
80 if ($BibTeX_run_needed) {
83 if ($MakeIndex_run_needed) {
84 unlink "$TeX_root.ind";
85 (system("makeindex $TeX_root.idx") >> 8)
86 && &die_gracefully("$Pgm: makeindex $TeX_root.idx had errors\n");
89 # save (copy) .aux file as .aux-prev file for future ref
91 unlink "$TeX_root.aux-prev";
92 (system("cp $TeX_root.aux $TeX_root.aux-prev") >> 8)
93 && &die_gracefully("$Pgm: cp $TeX_root.aux $TeX_root.aux-prev failed\n");
94 if (-f "$TeX_root.idx") {
95 unlink "$TeX_root.idx-prev";
96 (system("cp $TeX_root.idx $TeX_root.idx-prev") >> 8)
97 && &die_gracefully("$Pgm: cp $TeX_root.idx $TeX_root.idx-prev failed\n");
101 &run_latex(); # sets $Says_labels_changed
104 if ($Times_run >= 4) {
105 print STDERR "*** I don't run LaTeX more than four times;\n";
106 print STDERR "*** Something is probably wrong...\n";
107 &rm_temp_files_and_exit();
114 $Says_labels_changed = 0;
115 $Multiply_defined_labels = 0;
117 select(STDERR); $| = 1; select(STDOUT); # no buffering on STDERR
118 print STDERR "$Pgm: *** running LaTeX...\n" if $Verbose;
119 unlink "$TeX_root.dvi";
121 open(LTXPIPE, "latex $TeX_input 2>&1 |")
122 || &die_gracefully("$Pgm: Can't run latex pipe\n");
124 $Multiply_defined_labels = 1 if /^LaTeX Warning: Label .* multiply defined/;
125 $Says_labels_changed = 1 if /^LaTeX Warning: Label\(s\) may have changed/
126 && ! $Multiply_defined_labels;
130 &die_gracefully("$Pgm: LaTeX run had errors\n") if $? >> 8;
132 # sort .idx file, because this helps makeindex
133 # (can you say `bug'?)
134 if (-f "$TeX_root.idx") {
135 print STDERR "$Pgm: *** sorting $TeX_root.idx...\n" if $Verbose;
136 (system("sort $TeX_root.idx -o $TeX_root.idx") >> 8)
137 && &die_gracefully("$Pgm: sorting $TeX_root.idx failed\n");
142 sub run_bibtex { # ugly because bibtex doesn't return a correct error status
143 local($bibtex_had_errors) = 0;
145 print STDERR "$Pgm: *** running BibTeX...\n" if $Verbose;
146 unlink "$TeX_root.bbl";
148 $| = 1; # no buffering
149 open(BIBTXPIPE, "bibtex $TeX_root 2>&1 |")
150 || &die_gracefully("$Pgm: Can't run bibtex pipe\n");
151 while (<BIBTXPIPE>) {
152 $bibtex_had_errors = 1 if /^\(There.*error message(s)?\)$/;
156 &die_gracefully("$Pgm: BibTeX run had errors\n")
157 if $? >> 8 || $bibtex_had_errors;
160 sub something_more_needed {
161 # returns 1 or 0 if we need to run LaTeX
162 # possibly preceded by bibtex and/or makeindex run
164 # $Says_labels_changed was set by previous &run_latex...
165 $BibTeX_run_needed = 0;
166 $MakeIndex_run_needed = 0;
168 if ( ! -f ($TeX_root . '.aux-prev')) { # this was the first run
170 print STDERR "$Pgm: *** 'twas first run of LaTeX on $TeX_input\n" if $Verbose;
172 # we need makeindex to run if a non-zero-sized .idx file exists
174 $MakeIndex_run_needed = 1
175 if -f "$TeX_root.idx" && -s "$TeX_root.idx";
177 # we need bibtex to run if there are \citations in the .aux file
179 &slurp_aux_file('aux');
180 $BibTeX_run_needed = 1
181 if $Bibliography_requested &&
182 -f "$Tmp_prefix/ltx-aux-cite.$$" &&
183 -s "$Tmp_prefix/ltx-aux-cite.$$";
186 } else { # ltx had been run before (.aux-prev/.idx-prev files exist)
188 # slurp both .aux and .aux-prev files
189 &slurp_aux_file('aux');
190 &slurp_aux_file('aux-prev');
192 local($tmp_pre) = "$Tmp_prefix/ltx";
194 if ((-s "$tmp_pre-.aux-cite.$$") # there are still \cite's in there
195 && (system("cmp -s $tmp_pre-.aux-cite.$$ $tmp_pre-.aux-prev-cite.$$") >> 8)) {
196 $BibTeX_run_needed = 1 if $Bibliography_requested;
198 system("$CONTEXT_DIFF $tmp_pre-.aux-prev-cite.$$ $tmp_pre-.aux-cite.$$");
202 if (-f "$TeX_root.idx") {
203 $MakeIndex_run_needed =
204 (system("cmp -s $TeX_root.idx $TeX_root.idx-prev") >> 8) ? 1 : 0;
205 if ($MakeIndex_run_needed && $Verbose) {
206 system("$CONTEXT_DIFF $TeX_root.idx-prev $TeX_root.idx");
211 $Says_labels_changed || $BibTeX_run_needed || $MakeIndex_run_needed;
217 # copy all citations from slurpfile into $Tmp_prefix/ltx-$ext-cite.$$
219 open(SLURPF,"< $TeX_root.$ext")
220 || &die_gracefully("$Pgm: Can't open $TeX_root.$ext for reading\n");
221 open(CITEF,"> $Tmp_prefix/ltx-$ext-cite.$$")
222 || &die_gracefully("$Pgm: Can't open $Tmp_prefix/ltx-$ext-cite.$$ for writing\n");
225 print CITEF $_ if /\\citation/;