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