]> git.ipfire.org Git - thirdparty/bash.git/blame - support/texi2dvi
Bash-4.3 patch 32
[thirdparty/bash.git] / support / texi2dvi
CommitLineData
ccc6cda3 1#! /bin/sh
f73dda09 2# texi2dvi --- produce DVI (or PDF) files from Texinfo (or LaTeX) sources.
b80f6443 3# $Id: texi2dvi,v 1.14 2003/02/05 00:42:33 karl Exp $
b72432fd 4#
b80f6443
JA
5# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001,
6# 2002, 2003 Free Software Foundation, Inc.
b72432fd 7#
3185942a
JA
8# This program is free software: you can redistribute it and/or modify
9# it under the terms of the GNU General Public License as published by
10# the Free Software Foundation, either version 3 of the License, or
11# (at your option) any later version.
726f6388 12#
3185942a
JA
13# This program is distributed in the hope that it will be useful,
14# but WITHOUT ANY WARRANTY; without even the implied warranty of
15# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16# GNU General Public License for more details.
726f6388 17#
3185942a
JA
18# You should have received a copy of the GNU General Public License
19# along with this program. If not, see <http://www.gnu.org/licenses/>.
b72432fd 20#
f73dda09 21# Original author: Noah Friedman <friedman@gnu.org>.
b72432fd
JA
22#
23# Please send bug reports, etc. to bug-texinfo@gnu.org.
726f6388 24# If possible, please send a copy of the output of the script called with
ccc6cda3 25# the `--debug' option when making a bug report.
726f6388 26
ccc6cda3 27# This string is expanded by rcs automatically when this file is checked out.
b80f6443 28rcs_revision='$Revision: 1.14 $'
f73dda09
JA
29rcs_version=`set - $rcs_revision; echo $2`
30program=`echo $0 | sed -e 's!.*/!!'`
b80f6443 31version="texi2dvi (GNU Texinfo 4.5) $rcs_version
726f6388 32
b80f6443 33Copyright (C) 2003 Free Software Foundation, Inc.
f73dda09
JA
34There is NO warranty. You may redistribute this software
35under the terms of the GNU General Public License.
36For more information about these matters, see the files named COPYING."
ccc6cda3 37
f73dda09 38usage="Usage: $program [OPTION]... FILE...
726f6388 39
f73dda09
JA
40Run each Texinfo or LaTeX FILE through TeX in turn until all
41cross-references are resolved, building all indices. The directory
42containing each FILE is searched for included files. The suffix of FILE
43is used to determine its language (LaTeX or Texinfo).
b72432fd 44
f73dda09
JA
45Makeinfo is used to perform Texinfo macro expansion before running TeX
46when needed.
ccc6cda3 47
b80f6443
JA
48Operation modes:
49 -b, --batch no interaction
50 -c, --clean remove all auxiliary files
51 -D, --debug turn on shell debugging (set -x)
52 -h, --help display this help and exit successfully
53 -o, --output=OFILE leave output in OFILE (implies --clean);
54 Only one input FILE may be specified in this case
55 -q, --quiet no output unless errors (implies --batch)
56 -s, --silent same as --quiet
57 -v, --version display version information and exit successfully
58 -V, --verbose report on what is done
59
60TeX tuning:
61 -@ use @input instead of \input; for preloaded Texinfo
62 -e, -E, --expand force macro expansion using makeinfo
63 -I DIR search DIR for Texinfo files
64 -l, --language=LANG specify the LANG of FILE (LaTeX or Texinfo)
65 -p, --pdf use pdftex or pdflatex for processing
66 -t, --texinfo=CMD insert CMD after @setfilename in copy of input file
67 multiple values accumulate
f73dda09
JA
68
69The values of the BIBTEX, LATEX (or PDFLATEX), MAKEINDEX, MAKEINFO,
70TEX (or PDFTEX), and TEXINDEX environment variables are used to run
71those commands, if they are set.
72
73Email bug reports to <bug-texinfo@gnu.org>,
b80f6443
JA
74general questions and discussion to <help-texinfo@gnu.org>.
75Texinfo home page: http://www.gnu.org/software/texinfo/"
f73dda09
JA
76
77# Initialize variables for option overriding and otherwise.
ccc6cda3
JA
78# Don't use `unset' since old bourne shells don't have this command.
79# Instead, assign them an empty value.
f73dda09 80batch=false # eval for batch mode
b72432fd 81clean=
ccc6cda3 82debug=
b80f6443 83escape='\'
f73dda09 84expand= # t for expansion via makeinfo
b80f6443 85miincludes= # makeinfo include path
f73dda09 86oformat=dvi
b80f6443
JA
87oname= # --output
88quiet= # by default let the tools' message be displayed
f73dda09 89set_language=
b72432fd 90textra=
f73dda09 91tmpdir=${TMPDIR:-/tmp}/t2d$$ # avoid collisions on 8.3 filesystems.
b80f6443 92txincludes= # TEXINPUTS extensions, with trailing colon
f73dda09 93txiprereq=19990129 # minimum texinfo.tex version to have macro expansion
f73dda09
JA
94verbose=false # echo for verbose mode
95
96orig_pwd=`pwd`
97
98# Systems which define $COMSPEC or $ComSpec use semicolons to separate
99# directories in TEXINPUTS.
100if test -n "$COMSPEC$ComSpec"; then
101 path_sep=";"
102else
103 path_sep=":"
104fi
726f6388 105
b80f6443
JA
106# Pacify verbose cds.
107CDPATH=${ZSH_VERSION+.}$path_sep
108
109# In case someone crazy insists on using grep -E.
110: ${EGREP=egrep}
111
b72432fd 112# Save this so we can construct a new TEXINPUTS path for each file.
ccc6cda3 113TEXINPUTS_orig="$TEXINPUTS"
f73dda09
JA
114# Unfortunately makeindex does not read TEXINPUTS.
115INDEXSTYLE_orig="$INDEXSTYLE"
116export TEXINPUTS INDEXSTYLE
117
118# Push a token among the arguments that will be used to notice when we
119# ended options/arguments parsing.
120# Use "set dummy ...; shift" rather than 'set - ..." because on
121# Solaris set - turns off set -x (but keeps set -e).
122# Use ${1+"$@"} rather than "$@" because Digital Unix and Ultrix 4.3
123# still expand "$@" to a single argument (the empty string) rather
124# than nothing at all.
125arg_sep="$$--$$"
126set dummy ${1+"$@"} "$arg_sep"; shift
127
128# \f
ccc6cda3 129# Parse command line arguments.
f73dda09
JA
130while test x"$1" != x"$arg_sep"; do
131
132 # Handle --option=value by splitting apart and putting back on argv.
ccc6cda3 133 case "$1" in
f73dda09
JA
134 --*=*)
135 opt=`echo "$1" | sed -e 's/=.*//'`
136 val=`echo "$1" | sed -e 's/[^=]*=//'`
137 shift
138 set dummy "$opt" "$val" ${1+"$@"}; shift
139 ;;
140 esac
141
142 # This recognizes --quark as --quiet. So what.
143 case "$1" in
144 -@ ) escape=@;;
145 # Silently and without documentation accept -b and --b[atch] as synonyms.
146 -b | --b*) batch=eval;;
147 -q | -s | --q* | --s*) quiet=t; batch=eval;;
148 -c | --c*) clean=t;;
149 -D | --d*) debug=t;;
b80f6443 150 -e | -E | --e*) expand=t;;
f73dda09
JA
151 -h | --h*) echo "$usage"; exit 0;;
152 -I | --I*)
153 shift
154 miincludes="$miincludes -I $1"
b80f6443 155 txincludes="$txincludes$1$path_sep"
f73dda09
JA
156 ;;
157 -l | --l*) shift; set_language=$1;;
b80f6443
JA
158 -o | --o*)
159 shift
160 clean=t
161 case "$1" in
162 /* | ?:/*) oname=$1;;
163 *) oname="$orig_pwd/$1";;
164 esac;;
f73dda09
JA
165 -p | --p*) oformat=pdf;;
166 -t | --t*) shift; textra="$textra\\
167$1";;
168 -v | --vers*) echo "$version"; exit 0;;
169 -V | --verb*) verbose=echo;;
170 --) # What remains are not options.
ccc6cda3 171 shift
f73dda09
JA
172 while test x"$1" != x"$arg_sep"; do
173 set dummy ${1+"$@"} "$1"; shift
174 shift
175 done
176 break;;
177 -*)
178 echo "$0: Unknown or ambiguous option \`$1'." >&2
179 echo "$0: Try \`--help' for more information." >&2
180 exit 1;;
181 *) set dummy ${1+"$@"} "$1"; shift;;
726f6388 182 esac
f73dda09 183 shift
726f6388 184done
f73dda09
JA
185# Pop the token
186shift
726f6388 187
f73dda09 188# Interpret remaining command line args as filenames.
b80f6443
JA
189case $# in
190 0)
f73dda09
JA
191 echo "$0: Missing file arguments." >&2
192 echo "$0: Try \`--help' for more information." >&2
b72432fd 193 exit 2
b80f6443
JA
194 ;;
195 1) ;;
196 *)
197 if test -n "$oname"; then
198 echo "$0: Can't use option \`--output' with more than one argument." >&2
199 exit 2
200 fi
201 ;;
202esac
b72432fd 203
f73dda09
JA
204# Prepare the temporary directory. Remove it at exit, unless debugging.
205if test -z "$debug"; then
206 trap "cd / && rm -rf $tmpdir" 0 1 2 15
207fi
208
209# Create the temporary directory with strict rights
210(umask 077 && mkdir $tmpdir) || exit 1
211
212# Prepare the tools we might need. This may be extra work in some
213# cases, but improves the readibility of the script.
214utildir=$tmpdir/utils
215mkdir $utildir || exit 1
216
217# A sed script that preprocesses Texinfo sources in order to keep the
218# iftex sections only. We want to remove non TeX sections, and
219# comment (with `@c texi2dvi') TeX sections so that makeinfo does not
220# try to parse them. Nevertheless, while commenting TeX sections,
221# don't comment @macro/@end macro so that makeinfo does propagate
222# them. Unfortunately makeinfo --iftex --no-ifhtml --no-ifinfo
223# doesn't work well enough (yet) to use that, so work around with sed.
224comment_iftex_sed=$utildir/comment.sed
225cat <<EOF >$comment_iftex_sed
226/^@tex/,/^@end tex/{
227 s/^/@c texi2dvi/
228}
229/^@iftex/,/^@end iftex/{
230 s/^/@c texi2dvi/
231 /^@c texi2dvi@macro/,/^@c texi2dvi@end macro/{
232 s/^@c texi2dvi//
233 }
234}
b80f6443
JA
235/^@html/,/^@end html/{
236 s/^/@c (texi2dvi)/
237}
238/^@ifhtml/,/^@end ifhtml/{
239 s/^/@c (texi2dvi)/
240}
241/^@ifnottex/,/^@end ifnottex/{
242 s/^/@c (texi2dvi)/
243}
f73dda09
JA
244/^@ifinfo/,/^@end ifinfo/{
245 /^@node/p
246 /^@menu/,/^@end menu/p
b80f6443
JA
247 t
248 s/^/@c (texi2dvi)/
f73dda09 249}
b80f6443
JA
250s/^@ifnotinfo/@c texi2dvi@ifnotinfo/
251s/^@end ifnotinfo/@c texi2dvi@end ifnotinfo/
f73dda09
JA
252EOF
253# Uncommenting is simple: Remove any leading `@c texi2dvi'.
254uncomment_iftex_sed=$utildir/uncomment.sed
255cat <<EOF >$uncomment_iftex_sed
256s/^@c texi2dvi//
257EOF
258
259# A shell script that computes the list of xref files.
260# Takes the filename (without extension) of which we look for xref
261# files as argument. The index files must be reported last.
262get_xref_files=$utildir/get_xref.sh
263cat <<\EOF >$get_xref_files
264#! /bin/sh
265
266# Get list of xref files (indexes, tables and lists).
267# Find all files having root filename with a two-letter extension,
268# saves the ones that are really Texinfo-related files. .?o? catches
b80f6443 269# many files: .toc, .log, LaTeX tables and lists, FiXme's .lox, maybe more.
f73dda09
JA
270for this_file in "$1".?o? "$1".aux "$1".?? "$1".idx; do
271 # If file is empty, skip it.
272 test -s "$this_file" || continue
273 # If the file is not suitable to be an index or xref file, don't
274 # process it. The file can't be if its first character is not a
275 # backslash or single quote.
276 first_character=`sed -n '1s/^\(.\).*$/\1/p;q' $this_file`
277 if test "x$first_character" = "x\\" \
278 || test "x$first_character" = "x'"; then
279 xref_files="$xref_files ./$this_file"
280 fi
281done
282echo "$xref_files"
283EOF
284chmod 500 $get_xref_files
285
286# File descriptor usage:
287# 0 standard input
288# 1 standard output (--verbose messages)
289# 2 standard error
290# 3 some systems may open it to /dev/tty
291# 4 used on the Kubota Titan
292# 5 tools output (turned off by --quiet)
293
294# Tools' output. If quiet, discard, else redirect to the message flow.
295if test "$quiet" = t; then
296 exec 5>/dev/null
297else
298 exec 5>&1
299fi
300
301# Enable tracing
b72432fd 302test "$debug" = t && set -x
726f6388 303
f73dda09
JA
304# \f
305# TeXify files.
306
b72432fd
JA
307for command_line_filename in ${1+"$@"}; do
308 $verbose "Processing $command_line_filename ..."
309
f73dda09
JA
310 # If the COMMAND_LINE_FILENAME is not absolute (e.g., --debug.tex),
311 # prepend `./' in order to avoid that the tools take it as an option.
b80f6443 312 echo "$command_line_filename" | $EGREP '^(/|[A-z]:/)' >/dev/null \
f73dda09
JA
313 || command_line_filename="./$command_line_filename"
314
315 # See if the file exists. If it doesn't we're in trouble since, even
b72432fd
JA
316 # though the user may be able to reenter a valid filename at the tex
317 # prompt (assuming they're attending the terminal), this script won't
f73dda09
JA
318 # be able to find the right xref files and so forth.
319 if test ! -r "$command_line_filename"; then
320 echo "$0: Could not read $command_line_filename, skipping." >&2
b72432fd
JA
321 continue
322 fi
323
f73dda09
JA
324 # Get the name of the current directory. We want the full path
325 # because in clean mode we are in tmp, in which case a relative
326 # path has no meaning.
327 filename_dir=`echo $command_line_filename | sed 's!/[^/]*$!!;s!^$!.!'`
328 filename_dir=`cd "$filename_dir" >/dev/null && pwd`
329
330 # Strip directory part but leave extension.
331 filename_ext=`basename "$command_line_filename"`
332 # Strip extension.
333 filename_noext=`echo "$filename_ext" | sed 's/\.[^.]*$//'`
334 ext=`echo "$filename_ext" | sed 's/^.*\.//'`
335
336 # _src. Use same basename since we want to generate aux files with
337 # the same basename as the manual. If --expand, then output the
338 # macro-expanded file to here, else copy the original file.
339 tmpdir_src=$tmpdir/src
340 filename_src=$tmpdir_src/$filename_noext.$ext
341
342 # _xtr. The file with the user's extra commands.
343 tmpdir_xtr=$tmpdir/xtr
344 filename_xtr=$tmpdir_xtr/$filename_noext.$ext
345
346 # _bak. Copies of the previous xref files (another round is run if
347 # they differ from the new one).
348 tmpdir_bak=$tmpdir/bak
349
350 # Make all those directories and give up if we can't succeed.
351 mkdir $tmpdir_src $tmpdir_xtr $tmpdir_bak || exit 1
b72432fd 352
b80f6443
JA
353 # Source file might include additional sources.
354 # We want `.:$orig_pwd' before anything else. (We'll add `.:' later
355 # after all other directories have been turned into absolute paths.)
356 # `.' goes first to ensure that any old .aux, .cps,
f73dda09
JA
357 # etc. files in ${directory} don't get used in preference to fresher
358 # files in `.'. Include orig_pwd in case we are in clean mode, where
359 # we've cd'd to a temp directory.
b80f6443 360 common="$orig_pwd$path_sep$filename_dir$path_sep$txincludes"
f73dda09
JA
361 TEXINPUTS="$common$TEXINPUTS_orig"
362 INDEXSTYLE="$common$INDEXSTYLE_orig"
363
b80f6443
JA
364 # Convert relative paths to absolute paths, so we can run in another
365 # directory (e.g., in --clean mode, or during the macro-support
366 # detection.)
367 #
368 # Empty path components are meaningful to tex. We rewrite them
369 # as `EMPTY' so they don't get lost when we split on $path_sep.
370 TEXINPUTS=`echo $TEXINPUTS |sed 's/^:/EMPTY:/;s/:$/:EMPTY/;s/::/:EMPTY:/g'`
371 INDEXSTYLE=`echo $INDEXSTYLE |sed 's/^:/EMPTY:/;s/:$/:EMPTY/;s/::/:EMPTY:/g'`
372 save_IFS=$IFS
373 IFS=$path_sep
374 set x $TEXINPUTS; shift
375 TEXINPUTS=.
376 for dir
377 do
378 case $dir in
379 EMPTY)
380 TEXINPUTS=$TEXINPUTS$path_sep
381 ;;
382 [\\/]* | ?:[\\/]*) # Absolute paths don't need to be expansed.
383 TEXINPUTS=$TEXINPUTS$path_sep$dir
384 ;;
385 *)
386 abs=`cd "$dir" && pwd` && TEXINPUTS=$TEXINPUTS$path_sep$abs
387 ;;
388 esac
389 done
390 set x $INDEXSTYLE; shift
391 INDEXSTYLE=.
392 for dir
393 do
394 case $dir in
395 EMPTY)
396 INDEXSTYLE=$INDEXSTYLE$path_sep
397 ;;
398 [\\/]* | ?:[\\/]*) # Absolute paths don't need to be expansed.
399 INDEXSTYLE=$INDEXSTYLE$path_sep$dir
400 ;;
401 *)
402 abs=`cd "$dir" && pwd` && INDEXSTYLE=$INDEXSTYLE$path_sep$abs
403 ;;
404 esac
405 done
406 IFS=$save_IFS
407
f73dda09
JA
408 # If the user explicitly specified the language, use that.
409 # Otherwise, if the first line is \input texinfo, assume it's texinfo.
410 # Otherwise, guess from the file extension.
411 if test -n "$set_language"; then
412 language=$set_language
b80f6443 413 elif sed 1q "$command_line_filename" | grep 'input texinfo' >/dev/null; then
f73dda09
JA
414 language=texinfo
415 else
416 language=
417 fi
418
419 # Get the type of the file (latex or texinfo) from the given language
420 # we just guessed, or from the file extension if not set yet.
421 case ${language:-$filename_ext} in
422 [lL]a[tT]e[xX] | *.ltx | *.tex)
423 # Assume a LaTeX file. LaTeX needs bibtex and uses latex for
424 # compilation. No makeinfo.
425 bibtex=${BIBTEX:-bibtex}
426 makeinfo= # no point in running makeinfo on latex source.
427 texindex=${MAKEINDEX:-makeindex}
428 if test $oformat = dvi; then
429 tex=${LATEX:-latex}
430 else
431 tex=${PDFLATEX:-pdflatex}
432 fi
433 ;;
434
435 *)
436 # Assume a Texinfo file. Texinfo files need makeinfo, texindex and tex.
437 bibtex=
438 texindex=${TEXINDEX:-texindex}
439 if test $oformat = dvi; then
440 tex=${TEX:-tex}
441 else
442 tex=${PDFTEX:-pdftex}
443 fi
444 # Unless required by the user, makeinfo expansion is wanted only
445 # if texinfo.tex is too old.
446 if test "$expand" = t; then
447 makeinfo=${MAKEINFO:-makeinfo}
448 else
449 # Check if texinfo.tex performs macro expansion by looking for
450 # its version. The version is a date of the form YEAR-MO-DA.
451 # We don't need to use [0-9] to match the digits since anyway
452 # the comparison with $txiprereq, a number, will fail with non
453 # digits.
454 txiversion_tex=txiversion.tex
455 echo '\input texinfo.tex @bye' >$tmpdir/$txiversion_tex
456 # Run in the tmpdir to avoid leaving files.
b80f6443
JA
457 eval `cd $tmpdir >/dev/null &&
458 $tex $txiversion_tex 2>/dev/null |
459 sed -n 's/^.*\[\(.*\)version \(....\)-\(..\)-\(..\).*$/txiformat=\1 txiversion="\2\3\4"/p'`
f73dda09
JA
460 $verbose "texinfo.tex preloaded as \`$txiformat', version is \`$txiversion' ..."
461 if test "$txiprereq" -le "$txiversion" >/dev/null 2>&1; then
462 makeinfo=
463 else
464 makeinfo=${MAKEINFO:-makeinfo}
465 fi
466 # As long as we had to run TeX, offer the user this convenience
467 if test "$txiformat" = Texinfo; then
468 escape=@
469 fi
470 fi
471 ;;
472 esac
b72432fd 473
f73dda09 474 # Expand macro commands in the original source file using Makeinfo.
b72432fd
JA
475 # Always use `end' footnote style, since the `separate' style
476 # generates different output (arguably this is a bug in -E).
477 # Discard main info output, the user asked to run TeX, not makeinfo.
f73dda09
JA
478 if test -n "$makeinfo"; then
479 $verbose "Macro-expanding $command_line_filename to $filename_src ..."
480 sed -f $comment_iftex_sed "$command_line_filename" \
481 | $makeinfo --footnote-style=end -I "$filename_dir" $miincludes \
482 -o /dev/null --macro-expand=- \
483 | sed -f $uncomment_iftex_sed >"$filename_src"
484 filename_input=$filename_src
485 fi
486
487 # If makeinfo failed (or was not even run), use the original file as input.
488 if test $? -ne 0 \
489 || test ! -r "$filename_src"; then
b72432fd 490 $verbose "Reverting to $command_line_filename ..."
f73dda09 491 filename_input=$filename_dir/$filename_ext
b72432fd 492 fi
b72432fd
JA
493
494 # Used most commonly for @finalout, @smallbook, etc.
495 if test -n "$textra"; then
f73dda09 496 $verbose "Inserting extra commands: $textra"
b72432fd 497 sed '/^@setfilename/a\
f73dda09
JA
498'"$textra" "$filename_input" >$filename_xtr
499 filename_input=$filename_xtr
b72432fd
JA
500 fi
501
502 # If clean mode was specified, then move to the temporary directory.
503 if test "$clean" = t; then
f73dda09
JA
504 $verbose "cd $tmpdir_src"
505 cd "$tmpdir_src" || exit 1
b72432fd
JA
506 fi
507
f73dda09
JA
508 while :; do # will break out of loop below
509 orig_xref_files=`$get_xref_files "$filename_noext"`
510
511 # Save copies of originals for later comparison.
512 if test -n "$orig_xref_files"; then
513 $verbose "Backing up xref files: `echo $orig_xref_files | sed 's|\./||g'`"
514 cp $orig_xref_files $tmpdir_bak
515 fi
516
517 # Run bibtex on current file.
518 # - If its input (AUX) exists.
519 # - If AUX contains both `\bibdata' and `\bibstyle'.
520 # - If some citations are missing (LOG contains `Citation').
521 # or the LOG complains of a missing .bbl
522 #
523 # We run bibtex first, because I can see reasons for the indexes
524 # to change after bibtex is run, but I see no reason for the
525 # converse.
526 #
527 # Don't try to be too smart. Running bibtex only if the bbl file
528 # exists and is older than the LaTeX file is wrong, since the
529 # document might include files that have changed. Because there
530 # can be several AUX (if there are \include's), but a single LOG,
531 # looking for missing citations in LOG is easier, though we take
532 # the risk to match false messages.
533 if test -n "$bibtex" \
534 && test -r "$filename_noext.aux" \
535 && test -r "$filename_noext.log" \
536 && (grep '^\\bibdata[{]' "$filename_noext.aux" \
537 && grep '^\\bibstyle[{]' "$filename_noext.aux" \
538 && (grep 'Warning:.*Citation.*undefined' "$filename_noext.log" \
539 || grep 'No file .*\.bbl\.' "$filename_noext.log")) \
540 >/dev/null 2>&1; \
541 then
542 $verbose "Running $bibtex $filename_noext ..."
543 if $bibtex "$filename_noext" >&5; then :; else
544 echo "$0: $bibtex exited with bad status, quitting." >&2
545 exit 1
546 fi
547 fi
548
549 # What we'll run texindex on -- exclude non-index files.
550 # Since we know index files are last, it is correct to remove everything
b80f6443
JA
551 # before .aux and .?o?. But don't really do <anything>o<anything>
552 # -- don't match whitespace as <anything>.
553 # Otherwise, if orig_xref_files contains something like
554 # foo.xo foo.whatever
555 # the space after the o will get matched.
f73dda09
JA
556 index_files=`echo "$orig_xref_files" \
557 | sed "s!.*\.aux!!g;
b80f6443 558 s!./$filename_noext\.[^ ]o[^ ]!!g;
f73dda09
JA
559 s/^[ ]*//;s/[ ]*$//"`
560 # Run texindex (or makeindex) on current index files. If they
561 # already exist, and after running TeX a first time the index
562 # files don't change, then there's no reason to run TeX again.
563 # But we won't know that if the index files are out of date or
564 # nonexistent.
565 if test -n "$texindex" && test -n "$index_files"; then
566 $verbose "Running $texindex $index_files ..."
567 if $texindex $index_files 2>&5 1>&2; then :; else
568 echo "$0: $texindex exited with bad status, quitting." >&2
569 exit 1
726f6388 570 fi
b72432fd
JA
571 fi
572
573 # Finally, run TeX.
f73dda09
JA
574 # Prevent $ESCAPE from being interpreted by the shell if it happens
575 # to be `/'.
576 $batch tex_args="\\${escape}nonstopmode\ \\${escape}input"
f73dda09 577 cmd="$tex $tex_args $filename_input"
b80f6443 578 $verbose "Running $cmd ..."
f73dda09
JA
579 if $cmd >&5; then :; else
580 echo "$0: $tex exited with bad status, quitting." >&2
581 echo "$0: see $filename_noext.log for errors." >&2
582 test "$clean" = t \
583 && cp "$filename_noext.log" "$orig_pwd"
584 exit 1
b72432fd 585 fi
f73dda09
JA
586
587
588 # Decide if looping again is needed.
589 finished=t
590
591 # LaTeX (and the package changebar) report in the LOG file if it
592 # should be rerun. This is needed for files included from
593 # subdirs, since texi2dvi does not try to compare xref files in
594 # subdirs. Performing xref files test is still good since LaTeX
595 # does not report changes in xref files.
b80f6443 596 if grep "Rerun to get" "$filename_noext.log" >/dev/null 2>&1; then
f73dda09
JA
597 finished=
598 fi
599
600 # Check if xref files changed.
601 new_xref_files=`$get_xref_files "$filename_noext"`
602 $verbose "Original xref files = `echo $orig_xref_files | sed 's|\./||g'`"
603 $verbose "New xref files = `echo $new_xref_files | sed 's|\./||g'`"
604
605 # If old and new lists don't at least have the same file list,
606 # then one file or another has definitely changed.
607 test "x$orig_xref_files" != "x$new_xref_files" && finished=
608
609 # File list is the same. We must compare each file until we find
610 # a difference.
611 if test -n "$finished"; then
612 for this_file in $new_xref_files; do
613 $verbose "Comparing xref file `echo $this_file | sed 's|\./||g'` ..."
614 # cmp -s returns nonzero exit status if files differ.
615 if cmp -s "$this_file" "$tmpdir_bak/$this_file"; then :; else
616 # We only need to keep comparing until we find one that
617 # differs, because we'll have to run texindex & tex again no
618 # matter how many more there might be.
619 finished=
620 $verbose "xref file `echo $this_file | sed 's|\./||g'` differed ..."
621 test "$debug" = t && diff -c "$tmpdir_bak/$this_file" "$this_file"
b72432fd
JA
622 break
623 fi
726f6388 624 done
b72432fd 625 fi
726f6388 626
f73dda09
JA
627 # If finished, exit the loop, else rerun the loop.
628 test -n "$finished" && break
b72432fd
JA
629 done
630
631 # If we were in clean mode, compilation was in a tmp directory.
f73dda09 632 # Copy the DVI (or PDF) file into the directory where the compilation
b72432fd
JA
633 # has been done. (The temp dir is about to get removed anyway.)
634 # We also return to the original directory so that
635 # - the next file is processed in correct conditions
636 # - the temporary file can be removed
637 if test -n "$clean"; then
b80f6443
JA
638 if test -n "$oname"; then
639 dest=$oname
640 else
641 dest=$orig_pwd
642 fi
643 $verbose "Copying $oformat file from `pwd` to $dest"
644 cp -p "./$filename_noext.$oformat" "$dest"
f73dda09 645 cd / # in case $orig_pwd is on a different drive (for DOS)
b72432fd
JA
646 cd $orig_pwd || exit 1
647 fi
648
f73dda09
JA
649 # Remove temporary files.
650 if test "x$debug" = "x"; then
651 $verbose "Removing $tmpdir_src $tmpdir_xtr $tmpdir_bak ..."
652 cd /
653 rm -rf $tmpdir_src $tmpdir_xtr $tmpdir_bak
b72432fd 654 fi
726f6388
JA
655done
656
b72432fd 657$verbose "$0 done."
f73dda09 658exit 0 # exit successfully, not however we ended the loop.