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";
31 system("rm -f $(TMPDIR)/ltx-*.$$");
33 sub rm_temp_files_and_exit {
34 system("rm -f $(TMPDIR)/ltx-*.$$");
37 $SIG{'INT'} = 'rm_temp_files_and_exit';
38 $SIG{'QUIT'} = 'rm_temp_files_and_exit';
44 &rm_temp_files_and_exit();
47 # must read through root file to see if a \bibliography
49 $Bibliography_requested = 0;
50 open(TEXIF, "<$TeX_input")
51 || &die_gracefully("$Pgm: Can't read $TeX_input\n");
53 $Bibliography_requested = 1 if /^\\bibliography/;
56 &die_gracefully("$Pgm: reading $TeX_input had errors\n") if $? >> 8;
58 # run latex first time (?)
59 &run_latex(); # sets $Says_labels_changed
62 while (&something_more_needed()) {
64 print STDERR "labels_changed=$Says_label_changed;bibtex_needed=$BibTeX_run_needed;makeindex_needed=$MakeIndex_run_needed\n" if $Verbose;
66 if ($BibTeX_run_needed) {
69 if ($MakeIndex_run_needed) {
70 unlink "$TeX_root.ind";
71 (system("makeindex $TeX_root.idx") >> 8)
72 && &die_gracefully("$Pgm: makeindex $TeX_root.idx had errors\n");
75 # save (copy) .aux file as .aux-prev file for future ref
77 unlink "$TeX_root.aux-prev";
78 (system("cp $TeX_root.aux $TeX_root.aux-prev") >> 8)
79 && &die_gracefully("$Pgm: cp $TeX_root.aux $TeX_root.aux-prev failed\n");
80 if (-f "$TeX_root.idx") {
81 unlink "$TeX_root.idx-prev";
82 (system("cp $TeX_root.idx $TeX_root.idx-prev") >> 8)
83 && &die_gracefully("$Pgm: cp $TeX_root.idx $TeX_root.idx-prev failed\n");
87 &run_latex(); # sets $Says_labels_changed
90 if ($Times_run >= 4) {
91 print STDERR "*** I don't run LaTeX more than four times;\n";
92 print STDERR "*** Something is probably wrong...\n";
93 &rm_temp_files_and_exit();
100 $Says_labels_changed = 0;
101 $Multiply_defined_labels = 0;
103 select(STDERR); $| = 1; select(STDOUT); # no buffering on STDERR
104 print STDERR "$Pgm: *** running LaTeX...\n" if $Verbose;
105 unlink "$TeX_root.dvi";
107 open(LTXPIPE, "latex $TeX_input 2>&1 |")
108 || &die_gracefully("$Pgm: Can't run latex pipe\n");
110 $Multiply_defined_labels = 1 if /^LaTeX Warning: Label .* multiply defined/;
111 $Says_labels_changed = 1 if /^LaTeX Warning: Label\(s\) may have changed/
112 && ! $Multiply_defined_labels;
116 &die_gracefully("$Pgm: LaTeX run had errors\n") if $? >> 8;
118 # sort .idx file, because this helps makeindex
119 # (can you say `bug'?)
120 if (-f "$TeX_root.idx") {
121 print STDERR "$Pgm: *** sorting $TeX_root.idx...\n" if $Verbose;
122 (system("sort $TeX_root.idx -o $TeX_root.idx") >> 8)
123 && &die_gracefully("$Pgm: sorting $TeX_root.idx failed\n");
128 sub run_bibtex { # ugly because bibtex doesn't return a correct error status
129 local($bibtex_had_errors) = 0;
131 print STDERR "$Pgm: *** running BibTeX...\n" if $Verbose;
132 unlink "$TeX_root.bbl";
134 $| = 1; # no buffering
135 open(BIBTXPIPE, "bibtex $TeX_root 2>&1 |")
136 || &die_gracefully("$Pgm: Can't run bibtex pipe\n");
137 while (<BIBTXPIPE>) {
138 $bibtex_had_errors = 1 if /^\(There.*error message(s)?\)$/;
142 &die_gracefully("$Pgm: BibTeX run had errors\n")
143 if $? >> 8 || $bibtex_had_errors;
146 sub something_more_needed {
147 # returns 1 or 0 if we need to run LaTeX
148 # possibly preceded by bibtex and/or makeindex run
150 # $Says_labels_changed was set by previous &run_latex...
151 $BibTeX_run_needed = 0;
152 $MakeIndex_run_needed = 0;
154 if ( ! -f ($TeX_root . '.aux-prev')) { # this was the first run
156 print STDERR "$Pgm: *** 'twas first run of LaTeX on $TeX_input\n" if $Verbose;
158 # we need makeindex to run if a non-zero-sized .idx file exists
160 $MakeIndex_run_needed = 1
161 if -f "$TeX_root.idx" && -s "$TeX_root.idx";
163 # we need bibtex to run if there are \citations in the .aux file
165 &slurp_aux_file('aux');
166 $BibTeX_run_needed = 1
167 if $Bibliography_requested &&
168 -f "$(TMPDIR)/ltx-aux-cite.$$" &&
169 -s "$(TMPDIR)/ltx-aux-cite.$$";
172 } else { # ltx had been run before (.aux-prev/.idx-prev files exist)
174 # slurp both .aux and .aux-prev files
175 &slurp_aux_file('aux');
176 &slurp_aux_file('aux-prev');
178 local($tmp_pre) = "$(TMPDIR)/ltx";
180 if ((-s "$tmp_pre-.aux-cite.$$") # there are still \cite's in there
181 && (system("cmp -s $tmp_pre-.aux-cite.$$ $tmp_pre-.aux-prev-cite.$$") >> 8)) {
182 $BibTeX_run_needed = 1 if $Bibliography_requested;
184 system("$(CONTEXT_DIFF) $tmp_pre-.aux-prev-cite.$$ $tmp_pre-.aux-cite.$$");
188 if (-f "$TeX_root.idx") {
189 $MakeIndex_run_needed =
190 (system("cmp -s $TeX_root.idx $TeX_root.idx-prev") >> 8) ? 1 : 0;
191 if ($MakeIndex_run_needed && $Verbose) {
192 system("$(CONTEXT_DIFF) $TeX_root.idx-prev $TeX_root.idx");
197 $Says_labels_changed || $BibTeX_run_needed || $MakeIndex_run_needed;
203 # copy all citations from slurpfile into $(TMPDIR)/ltx-$ext-cite.$$
205 open(SLURPF,"< $TeX_root.$ext")
206 || &die_gracefully("$Pgm: Can't open $TeX_root.$ext for reading\n");
207 open(CITEF,"> $(TMPDIR)/ltx-$ext-cite.$$")
208 || &die_gracefully("$Pgm: Can't open $(TMPDIR)/ltx-$ext-cite.$$ for writing\n");
211 print CITEF $_ if /\\citation/;