| #! /bin/sh | |
| # texi2dvi --- produce DVI (or PDF) files from Texinfo (or LaTeX) sources. | |
| # $Id$ | |
| # | |
| # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, | |
| # 2002, 2003 Free Software Foundation, Inc. | |
| # | |
| # This program is free software: you can redistribute it and/or modify | |
| # it under the terms of the GNU General Public License as published by | |
| # the Free Software Foundation, either version 3 of the License, or | |
| # (at your option) any later version. | |
| # | |
| # This program is distributed in the hope that it will be useful, | |
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| # GNU General Public License for more details. | |
| # | |
| # You should have received a copy of the GNU General Public License | |
| # along with this program. If not, see <http://www.gnu.org/licenses/>. | |
| # | |
| # Original author: Noah Friedman <friedman@gnu.org>. | |
| # | |
| # Please send bug reports, etc. to bug-texinfo@gnu.org. | |
| # If possible, please send a copy of the output of the script called with | |
| # the `--debug' option when making a bug report. | |
| # This string is expanded by rcs automatically when this file is checked out. | |
| rcs_revision='$Revision$' | |
| rcs_version=`set - $rcs_revision; echo $2` | |
| program=`echo $0 | sed -e 's!.*/!!'` | |
| version="texi2dvi (GNU Texinfo 4.5) $rcs_version | |
| Copyright (C) 2003 Free Software Foundation, Inc. | |
| There is NO warranty. You may redistribute this software | |
| under the terms of the GNU General Public License. | |
| For more information about these matters, see the files named COPYING." | |
| usage="Usage: $program [OPTION]... FILE... | |
| Run each Texinfo or LaTeX FILE through TeX in turn until all | |
| cross-references are resolved, building all indices. The directory | |
| containing each FILE is searched for included files. The suffix of FILE | |
| is used to determine its language (LaTeX or Texinfo). | |
| Makeinfo is used to perform Texinfo macro expansion before running TeX | |
| when needed. | |
| Operation modes: | |
| -b, --batch no interaction | |
| -c, --clean remove all auxiliary files | |
| -D, --debug turn on shell debugging (set -x) | |
| -h, --help display this help and exit successfully | |
| -o, --output=OFILE leave output in OFILE (implies --clean); | |
| Only one input FILE may be specified in this case | |
| -q, --quiet no output unless errors (implies --batch) | |
| -s, --silent same as --quiet | |
| -v, --version display version information and exit successfully | |
| -V, --verbose report on what is done | |
| TeX tuning: | |
| -@ use @input instead of \input; for preloaded Texinfo | |
| -e, -E, --expand force macro expansion using makeinfo | |
| -I DIR search DIR for Texinfo files | |
| -l, --language=LANG specify the LANG of FILE (LaTeX or Texinfo) | |
| -p, --pdf use pdftex or pdflatex for processing | |
| -t, --texinfo=CMD insert CMD after @setfilename in copy of input file | |
| multiple values accumulate | |
| The values of the BIBTEX, LATEX (or PDFLATEX), MAKEINDEX, MAKEINFO, | |
| TEX (or PDFTEX), and TEXINDEX environment variables are used to run | |
| those commands, if they are set. | |
| Email bug reports to <bug-texinfo@gnu.org>, | |
| general questions and discussion to <help-texinfo@gnu.org>. | |
| Texinfo home page: http://www.gnu.org/software/texinfo/" | |
| # Initialize variables for option overriding and otherwise. | |
| # Don't use `unset' since old bourne shells don't have this command. | |
| # Instead, assign them an empty value. | |
| batch=false # eval for batch mode | |
| clean= | |
| debug= | |
| escape='\' | |
| expand= # t for expansion via makeinfo | |
| miincludes= # makeinfo include path | |
| oformat=dvi | |
| oname= # --output | |
| quiet= # by default let the tools' message be displayed | |
| set_language= | |
| textra= | |
| tmpdir=${TMPDIR:-/tmp}/t2d$$ # avoid collisions on 8.3 filesystems. | |
| txincludes= # TEXINPUTS extensions, with trailing colon | |
| txiprereq=19990129 # minimum texinfo.tex version to have macro expansion | |
| verbose=false # echo for verbose mode | |
| orig_pwd=`pwd` | |
| # Systems which define $COMSPEC or $ComSpec use semicolons to separate | |
| # directories in TEXINPUTS. | |
| if test -n "$COMSPEC$ComSpec"; then | |
| path_sep=";" | |
| else | |
| path_sep=":" | |
| fi | |
| # Pacify verbose cds. | |
| CDPATH=${ZSH_VERSION+.}$path_sep | |
| # In case someone crazy insists on using grep -E. | |
| : ${EGREP=egrep} | |
| # Save this so we can construct a new TEXINPUTS path for each file. | |
| TEXINPUTS_orig="$TEXINPUTS" | |
| # Unfortunately makeindex does not read TEXINPUTS. | |
| INDEXSTYLE_orig="$INDEXSTYLE" | |
| export TEXINPUTS INDEXSTYLE | |
| # Push a token among the arguments that will be used to notice when we | |
| # ended options/arguments parsing. | |
| # Use "set dummy ...; shift" rather than 'set - ..." because on | |
| # Solaris set - turns off set -x (but keeps set -e). | |
| # Use ${1+"$@"} rather than "$@" because Digital Unix and Ultrix 4.3 | |
| # still expand "$@" to a single argument (the empty string) rather | |
| # than nothing at all. | |
| arg_sep="$$--$$" | |
| set dummy ${1+"$@"} "$arg_sep"; shift | |
| # | |
| # Parse command line arguments. | |
| while test x"$1" != x"$arg_sep"; do | |
| # Handle --option=value by splitting apart and putting back on argv. | |
| case "$1" in | |
| --*=*) | |
| opt=`echo "$1" | sed -e 's/=.*//'` | |
| val=`echo "$1" | sed -e 's/[^=]*=//'` | |
| shift | |
| set dummy "$opt" "$val" ${1+"$@"}; shift | |
| ;; | |
| esac | |
| # This recognizes --quark as --quiet. So what. | |
| case "$1" in | |
| -@ ) escape=@;; | |
| # Silently and without documentation accept -b and --b[atch] as synonyms. | |
| -b | --b*) batch=eval;; | |
| -q | -s | --q* | --s*) quiet=t; batch=eval;; | |
| -c | --c*) clean=t;; | |
| -D | --d*) debug=t;; | |
| -e | -E | --e*) expand=t;; | |
| -h | --h*) echo "$usage"; exit 0;; | |
| -I | --I*) | |
| shift | |
| miincludes="$miincludes -I $1" | |
| txincludes="$txincludes$1$path_sep" | |
| ;; | |
| -l | --l*) shift; set_language=$1;; | |
| -o | --o*) | |
| shift | |
| clean=t | |
| case "$1" in | |
| /* | ?:/*) oname=$1;; | |
| *) oname="$orig_pwd/$1";; | |
| esac;; | |
| -p | --p*) oformat=pdf;; | |
| -t | --t*) shift; textra="$textra\\ | |
| $1";; | |
| -v | --vers*) echo "$version"; exit 0;; | |
| -V | --verb*) verbose=echo;; | |
| --) # What remains are not options. | |
| shift | |
| while test x"$1" != x"$arg_sep"; do | |
| set dummy ${1+"$@"} "$1"; shift | |
| shift | |
| done | |
| break;; | |
| -*) | |
| echo "$0: Unknown or ambiguous option \`$1'." >&2 | |
| echo "$0: Try \`--help' for more information." >&2 | |
| exit 1;; | |
| *) set dummy ${1+"$@"} "$1"; shift;; | |
| esac | |
| shift | |
| done | |
| # Pop the token | |
| shift | |
| # Interpret remaining command line args as filenames. | |
| case $# in | |
| 0) | |
| echo "$0: Missing file arguments." >&2 | |
| echo "$0: Try \`--help' for more information." >&2 | |
| exit 2 | |
| ;; | |
| 1) ;; | |
| *) | |
| if test -n "$oname"; then | |
| echo "$0: Can't use option \`--output' with more than one argument." >&2 | |
| exit 2 | |
| fi | |
| ;; | |
| esac | |
| # Prepare the temporary directory. Remove it at exit, unless debugging. | |
| if test -z "$debug"; then | |
| trap "cd / && rm -rf $tmpdir" 0 1 2 15 | |
| fi | |
| # Create the temporary directory with strict rights | |
| (umask 077 && mkdir $tmpdir) || exit 1 | |
| # Prepare the tools we might need. This may be extra work in some | |
| # cases, but improves the readibility of the script. | |
| utildir=$tmpdir/utils | |
| mkdir $utildir || exit 1 | |
| # A sed script that preprocesses Texinfo sources in order to keep the | |
| # iftex sections only. We want to remove non TeX sections, and | |
| # comment (with `@c texi2dvi') TeX sections so that makeinfo does not | |
| # try to parse them. Nevertheless, while commenting TeX sections, | |
| # don't comment @macro/@end macro so that makeinfo does propagate | |
| # them. Unfortunately makeinfo --iftex --no-ifhtml --no-ifinfo | |
| # doesn't work well enough (yet) to use that, so work around with sed. | |
| comment_iftex_sed=$utildir/comment.sed | |
| cat <<EOF >$comment_iftex_sed | |
| /^@tex/,/^@end tex/{ | |
| s/^/@c texi2dvi/ | |
| } | |
| /^@iftex/,/^@end iftex/{ | |
| s/^/@c texi2dvi/ | |
| /^@c texi2dvi@macro/,/^@c texi2dvi@end macro/{ | |
| s/^@c texi2dvi// | |
| } | |
| } | |
| /^@html/,/^@end html/{ | |
| s/^/@c (texi2dvi)/ | |
| } | |
| /^@ifhtml/,/^@end ifhtml/{ | |
| s/^/@c (texi2dvi)/ | |
| } | |
| /^@ifnottex/,/^@end ifnottex/{ | |
| s/^/@c (texi2dvi)/ | |
| } | |
| /^@ifinfo/,/^@end ifinfo/{ | |
| /^@node/p | |
| /^@menu/,/^@end menu/p | |
| t | |
| s/^/@c (texi2dvi)/ | |
| } | |
| s/^@ifnotinfo/@c texi2dvi@ifnotinfo/ | |
| s/^@end ifnotinfo/@c texi2dvi@end ifnotinfo/ | |
| EOF | |
| # Uncommenting is simple: Remove any leading `@c texi2dvi'. | |
| uncomment_iftex_sed=$utildir/uncomment.sed | |
| cat <<EOF >$uncomment_iftex_sed | |
| s/^@c texi2dvi// | |
| EOF | |
| # A shell script that computes the list of xref files. | |
| # Takes the filename (without extension) of which we look for xref | |
| # files as argument. The index files must be reported last. | |
| get_xref_files=$utildir/get_xref.sh | |
| cat <<\EOF >$get_xref_files | |
| #! /bin/sh | |
| # Get list of xref files (indexes, tables and lists). | |
| # Find all files having root filename with a two-letter extension, | |
| # saves the ones that are really Texinfo-related files. .?o? catches | |
| # many files: .toc, .log, LaTeX tables and lists, FiXme's .lox, maybe more. | |
| for this_file in "$1".?o? "$1".aux "$1".?? "$1".idx; do | |
| # If file is empty, skip it. | |
| test -s "$this_file" || continue | |
| # If the file is not suitable to be an index or xref file, don't | |
| # process it. The file can't be if its first character is not a | |
| # backslash or single quote. | |
| first_character=`sed -n '1s/^\(.\).*$/\1/p;q' $this_file` | |
| if test "x$first_character" = "x\\" \ | |
| || test "x$first_character" = "x'"; then | |
| xref_files="$xref_files ./$this_file" | |
| fi | |
| done | |
| echo "$xref_files" | |
| EOF | |
| chmod 500 $get_xref_files | |
| # File descriptor usage: | |
| # 0 standard input | |
| # 1 standard output (--verbose messages) | |
| # 2 standard error | |
| # 3 some systems may open it to /dev/tty | |
| # 4 used on the Kubota Titan | |
| # 5 tools output (turned off by --quiet) | |
| # Tools' output. If quiet, discard, else redirect to the message flow. | |
| if test "$quiet" = t; then | |
| exec 5>/dev/null | |
| else | |
| exec 5>&1 | |
| fi | |
| # Enable tracing | |
| test "$debug" = t && set -x | |
| # | |
| # TeXify files. | |
| for command_line_filename in ${1+"$@"}; do | |
| $verbose "Processing $command_line_filename ..." | |
| # If the COMMAND_LINE_FILENAME is not absolute (e.g., --debug.tex), | |
| # prepend `./' in order to avoid that the tools take it as an option. | |
| echo "$command_line_filename" | $EGREP '^(/|[A-z]:/)' >/dev/null \ | |
| || command_line_filename="./$command_line_filename" | |
| # See if the file exists. If it doesn't we're in trouble since, even | |
| # though the user may be able to reenter a valid filename at the tex | |
| # prompt (assuming they're attending the terminal), this script won't | |
| # be able to find the right xref files and so forth. | |
| if test ! -r "$command_line_filename"; then | |
| echo "$0: Could not read $command_line_filename, skipping." >&2 | |
| continue | |
| fi | |
| # Get the name of the current directory. We want the full path | |
| # because in clean mode we are in tmp, in which case a relative | |
| # path has no meaning. | |
| filename_dir=`echo $command_line_filename | sed 's!/[^/]*$!!;s!^$!.!'` | |
| filename_dir=`cd "$filename_dir" >/dev/null && pwd` | |
| # Strip directory part but leave extension. | |
| filename_ext=`basename "$command_line_filename"` | |
| # Strip extension. | |
| filename_noext=`echo "$filename_ext" | sed 's/\.[^.]*$//'` | |
| ext=`echo "$filename_ext" | sed 's/^.*\.//'` | |
| # _src. Use same basename since we want to generate aux files with | |
| # the same basename as the manual. If --expand, then output the | |
| # macro-expanded file to here, else copy the original file. | |
| tmpdir_src=$tmpdir/src | |
| filename_src=$tmpdir_src/$filename_noext.$ext | |
| # _xtr. The file with the user's extra commands. | |
| tmpdir_xtr=$tmpdir/xtr | |
| filename_xtr=$tmpdir_xtr/$filename_noext.$ext | |
| # _bak. Copies of the previous xref files (another round is run if | |
| # they differ from the new one). | |
| tmpdir_bak=$tmpdir/bak | |
| # Make all those directories and give up if we can't succeed. | |
| mkdir $tmpdir_src $tmpdir_xtr $tmpdir_bak || exit 1 | |
| # Source file might include additional sources. | |
| # We want `.:$orig_pwd' before anything else. (We'll add `.:' later | |
| # after all other directories have been turned into absolute paths.) | |
| # `.' goes first to ensure that any old .aux, .cps, | |
| # etc. files in ${directory} don't get used in preference to fresher | |
| # files in `.'. Include orig_pwd in case we are in clean mode, where | |
| # we've cd'd to a temp directory. | |
| common="$orig_pwd$path_sep$filename_dir$path_sep$txincludes" | |
| TEXINPUTS="$common$TEXINPUTS_orig" | |
| INDEXSTYLE="$common$INDEXSTYLE_orig" | |
| # Convert relative paths to absolute paths, so we can run in another | |
| # directory (e.g., in --clean mode, or during the macro-support | |
| # detection.) | |
| # | |
| # Empty path components are meaningful to tex. We rewrite them | |
| # as `EMPTY' so they don't get lost when we split on $path_sep. | |
| TEXINPUTS=`echo $TEXINPUTS |sed 's/^:/EMPTY:/;s/:$/:EMPTY/;s/::/:EMPTY:/g'` | |
| INDEXSTYLE=`echo $INDEXSTYLE |sed 's/^:/EMPTY:/;s/:$/:EMPTY/;s/::/:EMPTY:/g'` | |
| save_IFS=$IFS | |
| IFS=$path_sep | |
| set x $TEXINPUTS; shift | |
| TEXINPUTS=. | |
| for dir | |
| do | |
| case $dir in | |
| EMPTY) | |
| TEXINPUTS=$TEXINPUTS$path_sep | |
| ;; | |
| [\\/]* | ?:[\\/]*) # Absolute paths don't need to be expansed. | |
| TEXINPUTS=$TEXINPUTS$path_sep$dir | |
| ;; | |
| *) | |
| abs=`cd "$dir" && pwd` && TEXINPUTS=$TEXINPUTS$path_sep$abs | |
| ;; | |
| esac | |
| done | |
| set x $INDEXSTYLE; shift | |
| INDEXSTYLE=. | |
| for dir | |
| do | |
| case $dir in | |
| EMPTY) | |
| INDEXSTYLE=$INDEXSTYLE$path_sep | |
| ;; | |
| [\\/]* | ?:[\\/]*) # Absolute paths don't need to be expansed. | |
| INDEXSTYLE=$INDEXSTYLE$path_sep$dir | |
| ;; | |
| *) | |
| abs=`cd "$dir" && pwd` && INDEXSTYLE=$INDEXSTYLE$path_sep$abs | |
| ;; | |
| esac | |
| done | |
| IFS=$save_IFS | |
| # If the user explicitly specified the language, use that. | |
| # Otherwise, if the first line is \input texinfo, assume it's texinfo. | |
| # Otherwise, guess from the file extension. | |
| if test -n "$set_language"; then | |
| language=$set_language | |
| elif sed 1q "$command_line_filename" | grep 'input texinfo' >/dev/null; then | |
| language=texinfo | |
| else | |
| language= | |
| fi | |
| # Get the type of the file (latex or texinfo) from the given language | |
| # we just guessed, or from the file extension if not set yet. | |
| case ${language:-$filename_ext} in | |
| [lL]a[tT]e[xX] | *.ltx | *.tex) | |
| # Assume a LaTeX file. LaTeX needs bibtex and uses latex for | |
| # compilation. No makeinfo. | |
| bibtex=${BIBTEX:-bibtex} | |
| makeinfo= # no point in running makeinfo on latex source. | |
| texindex=${MAKEINDEX:-makeindex} | |
| if test $oformat = dvi; then | |
| tex=${LATEX:-latex} | |
| else | |
| tex=${PDFLATEX:-pdflatex} | |
| fi | |
| ;; | |
| *) | |
| # Assume a Texinfo file. Texinfo files need makeinfo, texindex and tex. | |
| bibtex= | |
| texindex=${TEXINDEX:-texindex} | |
| if test $oformat = dvi; then | |
| tex=${TEX:-tex} | |
| else | |
| tex=${PDFTEX:-pdftex} | |
| fi | |
| # Unless required by the user, makeinfo expansion is wanted only | |
| # if texinfo.tex is too old. | |
| if test "$expand" = t; then | |
| makeinfo=${MAKEINFO:-makeinfo} | |
| else | |
| # Check if texinfo.tex performs macro expansion by looking for | |
| # its version. The version is a date of the form YEAR-MO-DA. | |
| # We don't need to use [0-9] to match the digits since anyway | |
| # the comparison with $txiprereq, a number, will fail with non | |
| # digits. | |
| txiversion_tex=txiversion.tex | |
| echo '\input texinfo.tex @bye' >$tmpdir/$txiversion_tex | |
| # Run in the tmpdir to avoid leaving files. | |
| eval `cd $tmpdir >/dev/null && | |
| $tex $txiversion_tex 2>/dev/null | | |
| sed -n 's/^.*\[\(.*\)version \(....\)-\(..\)-\(..\).*$/txiformat=\1 txiversion="\2\3\4"/p'` | |
| $verbose "texinfo.tex preloaded as \`$txiformat', version is \`$txiversion' ..." | |
| if test "$txiprereq" -le "$txiversion" >/dev/null 2>&1; then | |
| makeinfo= | |
| else | |
| makeinfo=${MAKEINFO:-makeinfo} | |
| fi | |
| # As long as we had to run TeX, offer the user this convenience | |
| if test "$txiformat" = Texinfo; then | |
| escape=@ | |
| fi | |
| fi | |
| ;; | |
| esac | |
| # Expand macro commands in the original source file using Makeinfo. | |
| # Always use `end' footnote style, since the `separate' style | |
| # generates different output (arguably this is a bug in -E). | |
| # Discard main info output, the user asked to run TeX, not makeinfo. | |
| if test -n "$makeinfo"; then | |
| $verbose "Macro-expanding $command_line_filename to $filename_src ..." | |
| sed -f $comment_iftex_sed "$command_line_filename" \ | |
| | $makeinfo --footnote-style=end -I "$filename_dir" $miincludes \ | |
| -o /dev/null --macro-expand=- \ | |
| | sed -f $uncomment_iftex_sed >"$filename_src" | |
| filename_input=$filename_src | |
| fi | |
| # If makeinfo failed (or was not even run), use the original file as input. | |
| if test $? -ne 0 \ | |
| || test ! -r "$filename_src"; then | |
| $verbose "Reverting to $command_line_filename ..." | |
| filename_input=$filename_dir/$filename_ext | |
| fi | |
| # Used most commonly for @finalout, @smallbook, etc. | |
| if test -n "$textra"; then | |
| $verbose "Inserting extra commands: $textra" | |
| sed '/^@setfilename/a\ | |
| '"$textra" "$filename_input" >$filename_xtr | |
| filename_input=$filename_xtr | |
| fi | |
| # If clean mode was specified, then move to the temporary directory. | |
| if test "$clean" = t; then | |
| $verbose "cd $tmpdir_src" | |
| cd "$tmpdir_src" || exit 1 | |
| fi | |
| while :; do # will break out of loop below | |
| orig_xref_files=`$get_xref_files "$filename_noext"` | |
| # Save copies of originals for later comparison. | |
| if test -n "$orig_xref_files"; then | |
| $verbose "Backing up xref files: `echo $orig_xref_files | sed 's|\./||g'`" | |
| cp $orig_xref_files $tmpdir_bak | |
| fi | |
| # Run bibtex on current file. | |
| # - If its input (AUX) exists. | |
| # - If AUX contains both `\bibdata' and `\bibstyle'. | |
| # - If some citations are missing (LOG contains `Citation'). | |
| # or the LOG complains of a missing .bbl | |
| # | |
| # We run bibtex first, because I can see reasons for the indexes | |
| # to change after bibtex is run, but I see no reason for the | |
| # converse. | |
| # | |
| # Don't try to be too smart. Running bibtex only if the bbl file | |
| # exists and is older than the LaTeX file is wrong, since the | |
| # document might include files that have changed. Because there | |
| # can be several AUX (if there are \include's), but a single LOG, | |
| # looking for missing citations in LOG is easier, though we take | |
| # the risk to match false messages. | |
| if test -n "$bibtex" \ | |
| && test -r "$filename_noext.aux" \ | |
| && test -r "$filename_noext.log" \ | |
| && (grep '^\\bibdata[{]' "$filename_noext.aux" \ | |
| && grep '^\\bibstyle[{]' "$filename_noext.aux" \ | |
| && (grep 'Warning:.*Citation.*undefined' "$filename_noext.log" \ | |
| || grep 'No file .*\.bbl\.' "$filename_noext.log")) \ | |
| >/dev/null 2>&1; \ | |
| then | |
| $verbose "Running $bibtex $filename_noext ..." | |
| if $bibtex "$filename_noext" >&5; then :; else | |
| echo "$0: $bibtex exited with bad status, quitting." >&2 | |
| exit 1 | |
| fi | |
| fi | |
| # What we'll run texindex on -- exclude non-index files. | |
| # Since we know index files are last, it is correct to remove everything | |
| # before .aux and .?o?. But don't really do <anything>o<anything> | |
| # -- don't match whitespace as <anything>. | |
| # Otherwise, if orig_xref_files contains something like | |
| # foo.xo foo.whatever | |
| # the space after the o will get matched. | |
| index_files=`echo "$orig_xref_files" \ | |
| | sed "s!.*\.aux!!g; | |
| s!./$filename_noext\.[^ ]o[^ ]!!g; | |
| s/^[ ]*//;s/[ ]*$//"` | |
| # Run texindex (or makeindex) on current index files. If they | |
| # already exist, and after running TeX a first time the index | |
| # files don't change, then there's no reason to run TeX again. | |
| # But we won't know that if the index files are out of date or | |
| # nonexistent. | |
| if test -n "$texindex" && test -n "$index_files"; then | |
| $verbose "Running $texindex $index_files ..." | |
| if $texindex $index_files 2>&5 1>&2; then :; else | |
| echo "$0: $texindex exited with bad status, quitting." >&2 | |
| exit 1 | |
| fi | |
| fi | |
| # Finally, run TeX. | |
| # Prevent $ESCAPE from being interpreted by the shell if it happens | |
| # to be `/'. | |
| $batch tex_args="\\${escape}nonstopmode\ \\${escape}input" | |
| cmd="$tex $tex_args $filename_input" | |
| $verbose "Running $cmd ..." | |
| if $cmd >&5; then :; else | |
| echo "$0: $tex exited with bad status, quitting." >&2 | |
| echo "$0: see $filename_noext.log for errors." >&2 | |
| test "$clean" = t \ | |
| && cp "$filename_noext.log" "$orig_pwd" | |
| exit 1 | |
| fi | |
| # Decide if looping again is needed. | |
| finished=t | |
| # LaTeX (and the package changebar) report in the LOG file if it | |
| # should be rerun. This is needed for files included from | |
| # subdirs, since texi2dvi does not try to compare xref files in | |
| # subdirs. Performing xref files test is still good since LaTeX | |
| # does not report changes in xref files. | |
| if grep "Rerun to get" "$filename_noext.log" >/dev/null 2>&1; then | |
| finished= | |
| fi | |
| # Check if xref files changed. | |
| new_xref_files=`$get_xref_files "$filename_noext"` | |
| $verbose "Original xref files = `echo $orig_xref_files | sed 's|\./||g'`" | |
| $verbose "New xref files = `echo $new_xref_files | sed 's|\./||g'`" | |
| # If old and new lists don't at least have the same file list, | |
| # then one file or another has definitely changed. | |
| test "x$orig_xref_files" != "x$new_xref_files" && finished= | |
| # File list is the same. We must compare each file until we find | |
| # a difference. | |
| if test -n "$finished"; then | |
| for this_file in $new_xref_files; do | |
| $verbose "Comparing xref file `echo $this_file | sed 's|\./||g'` ..." | |
| # cmp -s returns nonzero exit status if files differ. | |
| if cmp -s "$this_file" "$tmpdir_bak/$this_file"; then :; else | |
| # We only need to keep comparing until we find one that | |
| # differs, because we'll have to run texindex & tex again no | |
| # matter how many more there might be. | |
| finished= | |
| $verbose "xref file `echo $this_file | sed 's|\./||g'` differed ..." | |
| test "$debug" = t && diff -c "$tmpdir_bak/$this_file" "$this_file" | |
| break | |
| fi | |
| done | |
| fi | |
| # If finished, exit the loop, else rerun the loop. | |
| test -n "$finished" && break | |
| done | |
| # If we were in clean mode, compilation was in a tmp directory. | |
| # Copy the DVI (or PDF) file into the directory where the compilation | |
| # has been done. (The temp dir is about to get removed anyway.) | |
| # We also return to the original directory so that | |
| # - the next file is processed in correct conditions | |
| # - the temporary file can be removed | |
| if test -n "$clean"; then | |
| if test -n "$oname"; then | |
| dest=$oname | |
| else | |
| dest=$orig_pwd | |
| fi | |
| $verbose "Copying $oformat file from `pwd` to $dest" | |
| cp -p "./$filename_noext.$oformat" "$dest" | |
| cd / # in case $orig_pwd is on a different drive (for DOS) | |
| cd $orig_pwd || exit 1 | |
| fi | |
| # Remove temporary files. | |
| if test "x$debug" = "x"; then | |
| $verbose "Removing $tmpdir_src $tmpdir_xtr $tmpdir_bak ..." | |
| cd / | |
| rm -rf $tmpdir_src $tmpdir_xtr $tmpdir_bak | |
| fi | |
| done | |
| $verbose "$0 done." | |
| exit 0 # exit successfully, not however we ended the loop. |