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