2 # texi2dvi --- produce DVI (or PDF) files from Texinfo (or LaTeX) sources.
3 # $Id: texi2dvi,v 1.1 2002/12/05 21:07:19 earnie Exp $
5 # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001,
6 # 2002 Free Software Foundation, Inc.
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)
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.
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.
23 # Original author: Noah Friedman <friedman@gnu.org>.
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.
29 # This string is expanded by rcs automatically when this file is checked out.
30 rcs_revision
='$Revision: 1.1 $'
31 rcs_version
=`set - $rcs_revision; echo $2`
32 program
=`echo $0 | sed -e 's!.*/!!'`
33 version
="texi2dvi (GNU Texinfo 4.3) $rcs_version
35 Copyright (C) 2002 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."
40 usage
="Usage: $program [OPTION]... FILE...
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).
47 Makeinfo is used to perform Texinfo macro expansion before running TeX
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
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
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.
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/"
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
86 expand= # t for expansion via makeinfo
87 miincludes= # makeinfo include path
90 quiet= # by default let the tools' message be displayed
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
100 # Systems which define $COMSPEC or $ComSpec use semicolons to separate
101 # directories in TEXINPUTS.
102 if test -n "$COMSPEC$ComSpec"; then
108 # Pacify verbose cds.
109 CDPATH
=${ZSH_VERSION+.}$path_sep
111 # Save this so we can construct a new TEXINPUTS path for each file.
112 TEXINPUTS_orig
="$TEXINPUTS"
113 # Unfortunately makeindex does not read TEXINPUTS.
114 INDEXSTYLE_orig
="$INDEXSTYLE"
115 export TEXINPUTS INDEXSTYLE
117 # Push a token among the arguments that will be used to notice when we
118 # ended options/arguments parsing.
119 # Use "set dummy ...; shift" rather than 'set - ..." because on
120 # Solaris set - turns off set -x (but keeps set -e).
121 # Use ${1+"$@"} rather than "$@" because Digital Unix and Ultrix 4.3
122 # still expand "$@" to a single argument (the empty string) rather
123 # than nothing at all.
125 set dummy
${1+"$@"} "$arg_sep"; shift
128 # Parse command line arguments.
129 while test x
"$1" != x
"$arg_sep"; do
131 # Handle --option=value by splitting apart and putting back on argv.
134 opt
=`echo "$1" | sed -e 's/=.*//'`
135 val
=`echo "$1" | sed -e 's/[^=]*=//'`
137 set dummy
"$opt" "$val" ${1+"$@"}; shift
141 # This recognizes --quark as --quiet. So what.
144 # Silently and without documentation accept -b and --b[atch] as synonyms.
145 -b |
--b*) batch=eval;;
146 -q |
-s |
--q* |
--s*) quiet
=t
; batch=eval;;
149 -e |
-E |
--e*) expand=t
;;
150 -h |
--h*) echo "$usage"; exit 0;;
153 miincludes
="$miincludes -I $1"
154 txincludes
="$txincludes$1$path_sep"
156 -l |
--l*) shift; set_language
=$1;;
161 /* | ?
:/*) oname
=$1;;
162 *) oname
="$orig_pwd/$1";;
164 -p |
--p*) oformat
=pdf
;;
165 -t |
--t*) shift; textra
="$textra\\
167 -v |
--vers*) echo "$version"; exit 0;;
168 -V |
--verb*) verbose
=echo;;
169 --) # What remains are not options.
171 while test x
"$1" != x
"$arg_sep"; do
172 set dummy
${1+"$@"} "$1"; shift
177 echo "$0: Unknown or ambiguous option \`$1'." >&2
178 echo "$0: Try \`--help' for more information." >&2
180 *) set dummy
${1+"$@"} "$1"; shift;;
187 # Interpret remaining command line args as filenames.
190 echo "$0: Missing file arguments." >&2
191 echo "$0: Try \`--help' for more information." >&2
196 if test -n "$oname"; then
197 echo "$0: Can't use option \`--output' with more than one argument." >&2
203 # Prepare the temporary directory. Remove it at exit, unless debugging.
204 if test -z "$debug"; then
205 trap "cd / && rm -rf $tmpdir" 0 1 2 15
208 # Create the temporary directory with strict rights
209 (umask 077 && mkdir
$tmpdir) ||
exit 1
211 # Prepare the tools we might need. This may be extra work in some
212 # cases, but improves the readibility of the script.
213 utildir
=$tmpdir/utils
214 mkdir
$utildir ||
exit 1
216 # A sed script that preprocesses Texinfo sources in order to keep the
217 # iftex sections only. We want to remove non TeX sections, and
218 # comment (with `@c texi2dvi') TeX sections so that makeinfo does not
219 # try to parse them. Nevertheless, while commenting TeX sections,
220 # don't comment @macro/@end macro so that makeinfo does propagate
221 # them. Unfortunately makeinfo --iftex --no-ifhtml --no-ifinfo
222 # doesn't work well enough (yet) to use that, so work around with sed.
223 comment_iftex_sed
=$utildir/comment.
sed
224 cat <<EOF >$comment_iftex_sed
228 /^@iftex/,/^@end iftex/{
230 /^@c texi2dvi@macro/,/^@c texi2dvi@end macro/{
234 /^@html/,/^@end html/{
237 /^@ifhtml/,/^@end ifhtml/{
240 /^@ifnottex/,/^@end ifnottex/{
243 /^@ifinfo/,/^@end ifinfo/{
245 /^@menu/,/^@end menu/p
249 s/^@ifnotinfo/@c texi2dvi@ifnotinfo/
250 s/^@end ifnotinfo/@c texi2dvi@end ifnotinfo/
252 # Uncommenting is simple: Remove any leading `@c texi2dvi'.
253 uncomment_iftex_sed
=$utildir/uncomment.
sed
254 cat <<EOF >$uncomment_iftex_sed
258 # A shell script that computes the list of xref files.
259 # Takes the filename (without extension) of which we look for xref
260 # files as argument. The index files must be reported last.
261 get_xref_files
=$utildir/get_xref.sh
262 cat <<\EOF
>$get_xref_files
265 # Get list of xref files (indexes, tables and lists).
266 # Find all files having root filename with a two-letter extension,
267 # saves the ones that are really Texinfo-related files. .?o? catches
268 # many files: .toc, .log, LaTeX tables and lists, FiXme's .lox, maybe more.
269 for this_file
in "$1".?o?
"$1".aux
"$1".??
"$1".idx
; do
270 # If file is empty, skip it.
271 test -s "$this_file" ||
continue
272 # If the file is not suitable to be an index or xref file, don't
273 # process it. The file can't be if its first character is not a
274 # backslash or single quote.
275 first_character
=`sed -n '1s/^\(.\).*$/\1/p;q' $this_file`
276 if test "x$first_character" = "x\\" \
277 ||
test "x$first_character" = "x'"; then
278 xref_files
="$xref_files ./$this_file"
283 chmod 500 $get_xref_files
285 # File descriptor usage:
287 # 1 standard output (--verbose messages)
289 # 3 some systems may open it to /dev/tty
290 # 4 used on the Kubota Titan
291 # 5 tools output (turned off by --quiet)
293 # Tools' output. If quiet, discard, else redirect to the message flow.
294 if test "$quiet" = t
; then
301 test "$debug" = t
&& set -x
306 for command_line_filename
in ${1+"$@"}; do
307 $verbose "Processing $command_line_filename ..."
309 # If the COMMAND_LINE_FILENAME is not absolute (e.g., --debug.tex),
310 # prepend `./' in order to avoid that the tools take it as an option.
311 echo "$command_line_filename" |
egrep '^(/|[A-z]:/)' >/dev
/null \
312 || command_line_filename
="./$command_line_filename"
314 # See if the file exists. If it doesn't we're in trouble since, even
315 # though the user may be able to reenter a valid filename at the tex
316 # prompt (assuming they're attending the terminal), this script won't
317 # be able to find the right xref files and so forth.
318 if test ! -r "$command_line_filename"; then
319 echo "$0: Could not read $command_line_filename, skipping." >&2
323 # Get the name of the current directory. We want the full path
324 # because in clean mode we are in tmp, in which case a relative
325 # path has no meaning.
326 filename_dir
=`echo $command_line_filename | sed 's!/[^/]*$!!;s!^$!.!'`
327 filename_dir
=`cd "$filename_dir" >/dev/null && pwd`
329 # Strip directory part but leave extension.
330 filename_ext
=`basename "$command_line_filename"`
332 filename_noext
=`echo "$filename_ext" | sed 's/\.[^.]*$//'`
333 ext
=`echo "$filename_ext" | sed 's/^.*\.//'`
335 # _src. Use same basename since we want to generate aux files with
336 # the same basename as the manual. If --expand, then output the
337 # macro-expanded file to here, else copy the original file.
338 tmpdir_src
=$tmpdir/src
339 filename_src
=$tmpdir_src/$filename_noext.
$ext
341 # _xtr. The file with the user's extra commands.
342 tmpdir_xtr
=$tmpdir/xtr
343 filename_xtr
=$tmpdir_xtr/$filename_noext.
$ext
345 # _bak. Copies of the previous xref files (another round is run if
346 # they differ from the new one).
347 tmpdir_bak
=$tmpdir/bak
349 # Make all those directories and give up if we can't succeed.
350 mkdir
$tmpdir_src $tmpdir_xtr $tmpdir_bak ||
exit 1
352 # Source file might include additional sources.
353 # We want `.:$orig_pwd' before anything else. (We'll add `.:' later
354 # after all other directories have been turned into absolute paths.)
355 # `.' goes first to ensure that any old .aux, .cps,
356 # etc. files in ${directory} don't get used in preference to fresher
357 # files in `.'. Include orig_pwd in case we are in clean mode, where
358 # we've cd'd to a temp directory.
359 common
="$orig_pwd$path_sep$filename_dir$path_sep$txincludes"
360 TEXINPUTS
="$common$TEXINPUTS_orig"
361 INDEXSTYLE
="$common$INDEXSTYLE_orig"
363 # Convert relative paths to absolute paths, so we can run in another
364 # directory (e.g., in --clean mode, or during the macro-support
367 # Empty path components are meaningful to tex. We rewrite them
368 # as `EMPTY' so they don't get lost when we split on $path_sep.
369 TEXINPUTS
=`echo $TEXINPUTS |sed 's/^:/EMPTY:/;s/:$/:EMPTY/;s/::/:EMPTY:/g'`
370 INDEXSTYLE
=`echo $INDEXSTYLE |sed 's/^:/EMPTY:/;s/:$/:EMPTY/;s/::/:EMPTY:/g'`
373 set x
$TEXINPUTS; shift
379 TEXINPUTS
=$TEXINPUTS$path_sep
381 [\\/]* | ?
:[\\/]*) # Absolute paths don't need to be expansed.
382 TEXINPUTS
=$TEXINPUTS$path_sep$dir
385 abs
=`cd "$dir" && pwd` && TEXINPUTS
=$TEXINPUTS$path_sep$abs
389 set x
$INDEXSTYLE; shift
395 INDEXSTYLE
=$INDEXSTYLE$path_sep
397 [\\/]* | ?
:[\\/]*) # Absolute paths don't need to be expansed.
398 INDEXSTYLE
=$INDEXSTYLE$path_sep$dir
401 abs
=`cd "$dir" && pwd` && INDEXSTYLE
=$INDEXSTYLE$path_sep$abs
407 # If the user explicitly specified the language, use that.
408 # Otherwise, if the first line is \input texinfo, assume it's texinfo.
409 # Otherwise, guess from the file extension.
410 if test -n "$set_language"; then
411 language
=$set_language
412 elif sed 1q
"$command_line_filename" | fgrep
'input texinfo' >/dev
/null
; then
418 # Get the type of the file (latex or texinfo) from the given language
419 # we just guessed, or from the file extension if not set yet.
420 case ${language:-$filename_ext} in
421 [lL
]a
[tT
]e
[xX
] |
*.ltx |
*.tex
)
422 # Assume a LaTeX file. LaTeX needs bibtex and uses latex for
423 # compilation. No makeinfo.
424 bibtex
=${BIBTEX:-bibtex}
425 makeinfo
= # no point in running makeinfo on latex source.
426 texindex
=${MAKEINDEX:-makeindex}
427 if test $oformat = dvi
; then
430 tex
=${PDFLATEX:-pdflatex}
435 # Assume a Texinfo file. Texinfo files need makeinfo, texindex and tex.
437 texindex
=${TEXINDEX:-texindex}
438 if test $oformat = dvi
; then
441 tex
=${PDFTEX:-pdftex}
443 # Unless required by the user, makeinfo expansion is wanted only
444 # if texinfo.tex is too old.
445 if test "$expand" = t
; then
446 makeinfo
=${MAKEINFO:-makeinfo}
448 # Check if texinfo.tex performs macro expansion by looking for
449 # its version. The version is a date of the form YEAR-MO-DA.
450 # We don't need to use [0-9] to match the digits since anyway
451 # the comparison with $txiprereq, a number, will fail with non
453 txiversion_tex
=txiversion.tex
454 echo '\input texinfo.tex @bye' >$tmpdir/$txiversion_tex
455 # Run in the tmpdir to avoid leaving files.
456 eval `cd $tmpdir >/dev/null &&
457 $tex $txiversion_tex 2>/dev/null |
458 sed -n 's/^.*\[\(.*\)version \(....\)-\(..\)-\(..\).*$/txiformat=\1 txiversion="\2\3\4"/p'`
459 $verbose "texinfo.tex preloaded as \`$txiformat', version is \`$txiversion' ..."
460 if test "$txiprereq" -le "$txiversion" >/dev
/null
2>&1; then
463 makeinfo
=${MAKEINFO:-makeinfo}
465 # As long as we had to run TeX, offer the user this convenience
466 if test "$txiformat" = Texinfo
; then
473 # Expand macro commands in the original source file using Makeinfo.
474 # Always use `end' footnote style, since the `separate' style
475 # generates different output (arguably this is a bug in -E).
476 # Discard main info output, the user asked to run TeX, not makeinfo.
477 if test -n "$makeinfo"; then
478 $verbose "Macro-expanding $command_line_filename to $filename_src ..."
479 sed -f $comment_iftex_sed "$command_line_filename" \
480 |
$makeinfo --footnote-style=end
-I "$filename_dir" $miincludes \
481 -o /dev
/null
--macro-expand=- \
482 |
sed -f $uncomment_iftex_sed >"$filename_src"
483 filename_input
=$filename_src
486 # If makeinfo failed (or was not even run), use the original file as input.
488 ||
test ! -r "$filename_src"; then
489 $verbose "Reverting to $command_line_filename ..."
490 filename_input
=$filename_dir/$filename_ext
493 # Used most commonly for @finalout, @smallbook, etc.
494 if test -n "$textra"; then
495 $verbose "Inserting extra commands: $textra"
496 sed '/^@setfilename/a\
497 '"$textra" "$filename_input" >$filename_xtr
498 filename_input
=$filename_xtr
501 # If clean mode was specified, then move to the temporary directory.
502 if test "$clean" = t
; then
503 $verbose "cd $tmpdir_src"
504 cd "$tmpdir_src" ||
exit 1
507 while :; do # will break out of loop below
508 orig_xref_files
=`$get_xref_files "$filename_noext"`
510 # Save copies of originals for later comparison.
511 if test -n "$orig_xref_files"; then
512 $verbose "Backing up xref files: `echo $orig_xref_files | sed 's|\./||g'`"
513 cp $orig_xref_files $tmpdir_bak
516 # Run bibtex on current file.
517 # - If its input (AUX) exists.
518 # - If AUX contains both `\bibdata' and `\bibstyle'.
519 # - If some citations are missing (LOG contains `Citation').
520 # or the LOG complains of a missing .bbl
522 # We run bibtex first, because I can see reasons for the indexes
523 # to change after bibtex is run, but I see no reason for the
526 # Don't try to be too smart. Running bibtex only if the bbl file
527 # exists and is older than the LaTeX file is wrong, since the
528 # document might include files that have changed. Because there
529 # can be several AUX (if there are \include's), but a single LOG,
530 # looking for missing citations in LOG is easier, though we take
531 # the risk to match false messages.
532 if test -n "$bibtex" \
533 && test -r "$filename_noext.aux" \
534 && test -r "$filename_noext.log" \
535 && (grep '^\\bibdata[{]' "$filename_noext.aux" \
536 && grep '^\\bibstyle[{]' "$filename_noext.aux" \
537 && (grep 'Warning:.*Citation.*undefined' "$filename_noext.log" \
538 ||
grep 'No file .*\.bbl\.' "$filename_noext.log")) \
541 $verbose "Running $bibtex $filename_noext ..."
542 if $bibtex "$filename_noext" >&5; then :; else
543 echo "$0: $bibtex exited with bad status, quitting." >&2
548 # What we'll run texindex on -- exclude non-index files.
549 # Since we know index files are last, it is correct to remove everything
550 # before .aux and .?o?. But don't really do <anything>o<anything>
551 # -- don't match whitespace as <anything>.
552 # Otherwise, if orig_xref_files contains something like
553 # foo.xo foo.whatever
554 # the space after the o will get matched.
555 index_files
=`echo "$orig_xref_files" \
557 s!./$filename_noext\.[^ ]o[^ ]!!g;
558 s/^[ ]*//;s/[ ]*$//"`
559 # Run texindex (or makeindex) on current index files. If they
560 # already exist, and after running TeX a first time the index
561 # files don't change, then there's no reason to run TeX again.
562 # But we won't know that if the index files are out of date or
564 if test -n "$texindex" && test -n "$index_files"; then
565 $verbose "Running $texindex $index_files ..."
566 if $texindex $index_files 2>&5 1>&2; then :; else
567 echo "$0: $texindex exited with bad status, quitting." >&2
573 # Prevent $ESCAPE from being interpreted by the shell if it happens
575 $batch tex_args
="\\${escape}nonstopmode\ \\${escape}input"
576 cmd
="$tex $tex_args $filename_input"
577 $verbose "Running $cmd ..."
578 if $cmd >&5; then :; else
579 echo "$0: $tex exited with bad status, quitting." >&2
580 echo "$0: see $filename_noext.log for errors." >&2
582 && cp "$filename_noext.log" "$orig_pwd"
587 # Decide if looping again is needed.
590 # LaTeX (and the package changebar) report in the LOG file if it
591 # should be rerun. This is needed for files included from
592 # subdirs, since texi2dvi does not try to compare xref files in
593 # subdirs. Performing xref files test is still good since LaTeX
594 # does not report changes in xref files.
595 if fgrep
"Rerun to get" "$filename_noext.log" >/dev
/null
2>&1; then
599 # Check if xref files changed.
600 new_xref_files
=`$get_xref_files "$filename_noext"`
601 $verbose "Original xref files = `echo $orig_xref_files | sed 's|\./||g'`"
602 $verbose "New xref files = `echo $new_xref_files | sed 's|\./||g'`"
604 # If old and new lists don't at least have the same file list,
605 # then one file or another has definitely changed.
606 test "x$orig_xref_files" != "x$new_xref_files" && finished
=
608 # File list is the same. We must compare each file until we find
610 if test -n "$finished"; then
611 for this_file
in $new_xref_files; do
612 $verbose "Comparing xref file `echo $this_file | sed 's|\./||g'` ..."
613 # cmp -s returns nonzero exit status if files differ.
614 if cmp -s "$this_file" "$tmpdir_bak/$this_file"; then :; else
615 # We only need to keep comparing until we find one that
616 # differs, because we'll have to run texindex & tex again no
617 # matter how many more there might be.
619 $verbose "xref file `echo $this_file | sed 's|\./||g'` differed ..."
620 test "$debug" = t
&& diff -c "$tmpdir_bak/$this_file" "$this_file"
626 # If finished, exit the loop, else rerun the loop.
627 test -n "$finished" && break
630 # If we were in clean mode, compilation was in a tmp directory.
631 # Copy the DVI (or PDF) file into the directory where the compilation
632 # has been done. (The temp dir is about to get removed anyway.)
633 # We also return to the original directory so that
634 # - the next file is processed in correct conditions
635 # - the temporary file can be removed
636 if test -n "$clean"; then
637 if test -n "$oname"; then
642 $verbose "Copying $oformat file from `pwd` to $dest"
643 cp -p "./$filename_noext.$oformat" "$dest"
644 cd / # in case $orig_pwd is on a different drive (for DOS)
645 cd $orig_pwd ||
exit 1
648 # Remove temporary files.
649 if test "x$debug" = "x"; then
650 $verbose "Removing $tmpdir_src $tmpdir_xtr $tmpdir_bak ..."
652 rm -rf $tmpdir_src $tmpdir_xtr $tmpdir_bak
657 exit 0 # exit successfully, not however we ended the loop.