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