2 # texi2dvi --- produce DVI (or PDF) files from Texinfo (or LaTeX) sources.
5 # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001,
6 # 2002, 2003 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$'
31 rcs_version
=`set - $rcs_revision; echo $2`
32 program
=`echo $0 | sed -e 's!.*/!!'`
33 version
="texi2dvi (GNU Texinfo 4.5) $rcs_version
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."
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 # In case someone crazy insists on using grep -E.
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
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.
128 set dummy
${1+"$@"} "$arg_sep"; shift
131 # Parse command line arguments.
132 while test x
"$1" != x
"$arg_sep"; do
134 # Handle --option=value by splitting apart and putting back on argv.
137 opt
=`echo "$1" | sed -e 's/=.*//'`
138 val
=`echo "$1" | sed -e 's/[^=]*=//'`
140 set dummy
"$opt" "$val" ${1+"$@"}; shift
144 # This recognizes --quark as --quiet. So what.
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;;
152 -e |
-E |
--e*) expand=t
;;
153 -h |
--h*) echo "$usage"; exit 0;;
156 miincludes
="$miincludes -I $1"
157 txincludes
="$txincludes$1$path_sep"
159 -l |
--l*) shift; set_language
=$1;;
164 /* | ?
:/*) oname
=$1;;
165 *) oname
="$orig_pwd/$1";;
167 -p |
--p*) oformat
=pdf
;;
168 -t |
--t*) shift; textra
="$textra\\
170 -v |
--vers*) echo "$version"; exit 0;;
171 -V |
--verb*) verbose
=echo;;
172 --) # What remains are not options.
174 while test x
"$1" != x
"$arg_sep"; do
175 set dummy
${1+"$@"} "$1"; shift
180 echo "$0: Unknown or ambiguous option \`$1'." >&2
181 echo "$0: Try \`--help' for more information." >&2
183 *) set dummy
${1+"$@"} "$1"; shift;;
190 # Interpret remaining command line args as filenames.
193 echo "$0: Missing file arguments." >&2
194 echo "$0: Try \`--help' for more information." >&2
199 if test -n "$oname"; then
200 echo "$0: Can't use option \`--output' with more than one argument." >&2
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
211 # Create the temporary directory with strict rights
212 (umask 077 && mkdir
$tmpdir) ||
exit 1
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
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
231 /^@iftex/,/^@end iftex/{
233 /^@c texi2dvi@macro/,/^@c texi2dvi@end macro/{
237 /^@html/,/^@end html/{
240 /^@ifhtml/,/^@end ifhtml/{
243 /^@ifnottex/,/^@end ifnottex/{
246 /^@ifinfo/,/^@end ifinfo/{
248 /^@menu/,/^@end menu/p
252 s/^@ifnotinfo/@c texi2dvi@ifnotinfo/
253 s/^@end ifnotinfo/@c texi2dvi@end ifnotinfo/
255 # Uncommenting is simple: Remove any leading `@c texi2dvi'.
256 uncomment_iftex_sed
=$utildir/uncomment.
sed
257 cat <<EOF >$uncomment_iftex_sed
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
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"
286 chmod 500 $get_xref_files
288 # File descriptor usage:
290 # 1 standard output (--verbose messages)
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)
296 # Tools' output. If quiet, discard, else redirect to the message flow.
297 if test "$quiet" = t
; then
304 test "$debug" = t
&& set -x
309 for command_line_filename
in ${1+"$@"}; do
310 $verbose "Processing $command_line_filename ..."
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"
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
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`
332 # Strip directory part but leave extension.
333 filename_ext
=`basename "$command_line_filename"`
335 filename_noext
=`echo "$filename_ext" | sed 's/\.[^.]*$//'`
336 ext
=`echo "$filename_ext" | sed 's/^.*\.//'`
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
344 # _xtr. The file with the user's extra commands.
345 tmpdir_xtr
=$tmpdir/xtr
346 filename_xtr
=$tmpdir_xtr/$filename_noext.
$ext
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
352 # Make all those directories and give up if we can't succeed.
353 mkdir
$tmpdir_src $tmpdir_xtr $tmpdir_bak ||
exit 1
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"
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
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'`
376 set x
$TEXINPUTS; shift
382 TEXINPUTS
=$TEXINPUTS$path_sep
384 [\\/]* | ?
:[\\/]*) # Absolute paths don't need to be expansed.
385 TEXINPUTS
=$TEXINPUTS$path_sep$dir
388 abs
=`cd "$dir" && pwd` && TEXINPUTS
=$TEXINPUTS$path_sep$abs
392 set x
$INDEXSTYLE; shift
398 INDEXSTYLE
=$INDEXSTYLE$path_sep
400 [\\/]* | ?
:[\\/]*) # Absolute paths don't need to be expansed.
401 INDEXSTYLE
=$INDEXSTYLE$path_sep$dir
404 abs
=`cd "$dir" && pwd` && INDEXSTYLE
=$INDEXSTYLE$path_sep$abs
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
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
433 tex
=${PDFLATEX:-pdflatex}
438 # Assume a Texinfo file. Texinfo files need makeinfo, texindex and tex.
440 texindex
=${TEXINDEX:-texindex}
441 if test $oformat = dvi
; then
444 tex
=${PDFTEX:-pdftex}
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}
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
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
466 makeinfo
=${MAKEINFO:-makeinfo}
468 # As long as we had to run TeX, offer the user this convenience
469 if test "$txiformat" = Texinfo
; then
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
489 # If makeinfo failed (or was not even run), use the original file as input.
491 ||
test ! -r "$filename_src"; then
492 $verbose "Reverting to $command_line_filename ..."
493 filename_input
=$filename_dir/$filename_ext
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
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
510 while :; do # will break out of loop below
511 orig_xref_files
=`$get_xref_files "$filename_noext"`
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
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
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
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")) \
544 $verbose "Running $bibtex $filename_noext ..."
545 if $bibtex "$filename_noext" >&5; then :; else
546 echo "$0: $bibtex exited with bad status, quitting." >&2
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" \
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
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
576 # Prevent $ESCAPE from being interpreted by the shell if it happens
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
585 && cp "$filename_noext.log" "$orig_pwd"
590 # Decide if looping again is needed.
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
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'`"
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
=
611 # File list is the same. We must compare each file until we find
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.
622 $verbose "xref file `echo $this_file | sed 's|\./||g'` differed ..."
623 test "$debug" = t
&& diff -c "$tmpdir_bak/$this_file" "$this_file"
629 # If finished, exit the loop, else rerun the loop.
630 test -n "$finished" && break
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
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
651 # Remove temporary files.
652 if test "x$debug" = "x"; then
653 $verbose "Removing $tmpdir_src $tmpdir_xtr $tmpdir_bak ..."
655 rm -rf $tmpdir_src $tmpdir_xtr $tmpdir_bak
660 exit 0 # exit successfully, not however we ended the loop.
This page took 0.045095 seconds and 4 git commands to generate.