source: trunk/texinfo/util/texi2dvi@ 2787

Last change on this file since 2787 was 2617, checked in by bird, 19 years ago

GNU Texinfo 4.8

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