1 $Pgm = $0; $Pgm =~ s/.*\/([^\/]+)$/\1/;
3 # set up signal handler
4 sub quit_upon_signal { &rm_temp_files_and_exit(); }
5 $SIG{'INT'} = 'quit_upon_signal';
6 $SIG{'QUIT'} = 'quit_upon_signal';
9 if ($ARGV[0] eq '-v') {
14 die "$Pgm: must have exactly one argument\n" if $#ARGV != 0;
15 # figure out input file and its filename root
17 $TeX_input = $ARGV[0];
18 if ($TeX_input =~ /(.+)\.[^\.\/\n]+$/) {
21 $TeX_root = $TeX_input;
23 } elsif (-f $ARGV[0].'.tex') {
24 $TeX_input = $ARGV[0].'.tex';
27 die "$Pgm: input file $ARGV[0] doesn't exist\n";
30 if ( $ENV{'TMPDIR'} ) { # where to make tmp file names
31 $Tmp_prefix = $ENV{'TMPDIR'} ;
33 $Tmp_prefix ='$(TMPDIR)';
34 $ENV{'TMPDIR'} = '$(TMPDIR)'; # set the env var as well
38 system("rm -f $Tmp_prefix/ltx-*.$$");
40 sub rm_temp_files_and_exit {
41 system("rm -f $Tmp_prefix/ltx-*.$$");
44 $SIG{'INT'} = 'rm_temp_files_and_exit';
45 $SIG{'QUIT'} = 'rm_temp_files_and_exit';
51 &rm_temp_files_and_exit();
54 # must read through root file to see if a \bibliography
56 $Bibliography_requested = 0;
57 open(TEXIF, "<$TeX_input")
58 || &die_gracefully("$Pgm: Can't read $TeX_input\n");
60 $Bibliography_requested = 1 if /^\\bibliography/;
63 &die_gracefully("$Pgm: reading $TeX_input had errors\n") if $? >> 8;
65 # run latex first time (?)
66 &run_latex(); # sets $Says_labels_changed
69 while (&something_more_needed()) {
71 print STDERR "labels_changed=$Says_label_changed;bibtex_needed=$BibTeX_run_needed;makeindex_needed=$MakeIndex_run_needed\n" if $Verbose;
73 if ($BibTeX_run_needed) {
76 if ($MakeIndex_run_needed) {
77 unlink "$TeX_root.ind";
78 (system("makeindex $TeX_root.idx") >> 8)
79 && &die_gracefully("$Pgm: makeindex $TeX_root.idx had errors\n");
82 # save (copy) .aux file as .aux-prev file for future ref
84 unlink "$TeX_root.aux-prev";
85 (system("cp $TeX_root.aux $TeX_root.aux-prev") >> 8)
86 && &die_gracefully("$Pgm: cp $TeX_root.aux $TeX_root.aux-prev failed\n");
87 if (-f "$TeX_root.idx") {
88 unlink "$TeX_root.idx-prev";
89 (system("cp $TeX_root.idx $TeX_root.idx-prev") >> 8)
90 && &die_gracefully("$Pgm: cp $TeX_root.idx $TeX_root.idx-prev failed\n");
94 &run_latex(); # sets $Says_labels_changed
97 if ($Times_run >= 4) {
98 print STDERR "*** I don't run LaTeX more than four times;\n";
99 print STDERR "*** Something is probably wrong...\n";
100 &rm_temp_files_and_exit();
107 $Says_labels_changed = 0;
108 $Multiply_defined_labels = 0;
110 select(STDERR); $| = 1; select(STDOUT); # no buffering on STDERR
111 print STDERR "$Pgm: *** running LaTeX...\n" if $Verbose;
112 unlink "$TeX_root.dvi";
114 open(LTXPIPE, "latex $TeX_input 2>&1 |")
115 || &die_gracefully("$Pgm: Can't run latex pipe\n");
117 $Multiply_defined_labels = 1 if /^LaTeX Warning: Label .* multiply defined/;
118 $Says_labels_changed = 1 if /^LaTeX Warning: Label\(s\) may have changed/
119 && ! $Multiply_defined_labels;
123 &die_gracefully("$Pgm: LaTeX run had errors\n") if $? >> 8;
125 # sort .idx file, because this helps makeindex
126 # (can you say `bug'?)
127 if (-f "$TeX_root.idx") {
128 print STDERR "$Pgm: *** sorting $TeX_root.idx...\n" if $Verbose;
129 (system("sort $TeX_root.idx -o $TeX_root.idx") >> 8)
130 && &die_gracefully("$Pgm: sorting $TeX_root.idx failed\n");
135 sub run_bibtex { # ugly because bibtex doesn't return a correct error status
136 local($bibtex_had_errors) = 0;
138 print STDERR "$Pgm: *** running BibTeX...\n" if $Verbose;
139 unlink "$TeX_root.bbl";
141 $| = 1; # no buffering
142 open(BIBTXPIPE, "bibtex $TeX_root 2>&1 |")
143 || &die_gracefully("$Pgm: Can't run bibtex pipe\n");
144 while (<BIBTXPIPE>) {
145 $bibtex_had_errors = 1 if /^\(There.*error message(s)?\)$/;
149 &die_gracefully("$Pgm: BibTeX run had errors\n")
150 if $? >> 8 || $bibtex_had_errors;
153 sub something_more_needed {
154 # returns 1 or 0 if we need to run LaTeX
155 # possibly preceded by bibtex and/or makeindex run
157 # $Says_labels_changed was set by previous &run_latex...
158 $BibTeX_run_needed = 0;
159 $MakeIndex_run_needed = 0;
161 if ( ! -f ($TeX_root . '.aux-prev')) { # this was the first run
163 print STDERR "$Pgm: *** 'twas first run of LaTeX on $TeX_input\n" if $Verbose;
165 # we need makeindex to run if a non-zero-sized .idx file exists
167 $MakeIndex_run_needed = 1
168 if -f "$TeX_root.idx" && -s "$TeX_root.idx";
170 # we need bibtex to run if there are \citations in the .aux file
172 &slurp_aux_file('aux');
173 $BibTeX_run_needed = 1
174 if $Bibliography_requested &&
175 -f "$Tmp_prefix/ltx-aux-cite.$$" &&
176 -s "$Tmp_prefix/ltx-aux-cite.$$";
179 } else { # ltx had been run before (.aux-prev/.idx-prev files exist)
181 # slurp both .aux and .aux-prev files
182 &slurp_aux_file('aux');
183 &slurp_aux_file('aux-prev');
185 local($tmp_pre) = "$Tmp_prefix/ltx";
187 if ((-s "$tmp_pre-.aux-cite.$$") # there are still \cite's in there
188 && (system("cmp -s $tmp_pre-.aux-cite.$$ $tmp_pre-.aux-prev-cite.$$") >> 8)) {
189 $BibTeX_run_needed = 1 if $Bibliography_requested;
191 system("$(CONTEXT_DIFF) $tmp_pre-.aux-prev-cite.$$ $tmp_pre-.aux-cite.$$");
195 if (-f "$TeX_root.idx") {
196 $MakeIndex_run_needed =
197 (system("cmp -s $TeX_root.idx $TeX_root.idx-prev") >> 8) ? 1 : 0;
198 if ($MakeIndex_run_needed && $Verbose) {
199 system("$(CONTEXT_DIFF) $TeX_root.idx-prev $TeX_root.idx");
204 $Says_labels_changed || $BibTeX_run_needed || $MakeIndex_run_needed;
210 # copy all citations from slurpfile into $Tmp_prefix/ltx-$ext-cite.$$
212 open(SLURPF,"< $TeX_root.$ext")
213 || &die_gracefully("$Pgm: Can't open $TeX_root.$ext for reading\n");
214 open(CITEF,"> $Tmp_prefix/ltx-$ext-cite.$$")
215 || &die_gracefully("$Pgm: Can't open $Tmp_prefix/ltx-$ext-cite.$$ for writing\n");
218 print CITEF $_ if /\\citation/;