]> git.ipfire.org Git - thirdparty/bash.git/blame - support/texi2dvi
Bash-5.1 patch 4: fix key-value pair associative array assignment word expansions
[thirdparty/bash.git] / support / texi2dvi
CommitLineData
ccc6cda3 1#! /bin/sh
a0c0a00f 2# texi2dvi --- produce DVI (or PDF) files from Texinfo (or (La)TeX) sources.
b72432fd 3#
8868edaf 4# Copyright 1992-2019 Free Software Foundation, Inc.
b72432fd 5#
a0c0a00f
CR
6# This program is free software; you can redistribute it and/or modify
7# it under the terms of the GNU General Public License as published by
8# the Free Software Foundation; either version 3 of the License,
9# or (at your option) any later version.
726f6388 10#
a0c0a00f
CR
11# This program is distributed in the hope that it will be useful,
12# but WITHOUT ANY WARRANTY; without even the implied warranty of
13# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14# GNU General Public License for more details.
726f6388 15#
a0c0a00f
CR
16# You should have received a copy of the GNU General Public License
17# along with this program. If not, see <http://www.gnu.org/licenses/>.
b72432fd 18#
a0c0a00f 19# Originally written by Noah Friedman.
b72432fd
JA
20#
21# Please send bug reports, etc. to bug-texinfo@gnu.org.
726f6388 22# If possible, please send a copy of the output of the script called with
ccc6cda3 23# the `--debug' option when making a bug report.
726f6388 24
a0c0a00f
CR
25test -f /bin/ksh && test -z "$RUNNING_KSH" \
26 && { UNAMES=`uname -s`; test "x$UNAMES" = xULTRIX; } 2>/dev/null \
27 && { RUNNING_KSH=true; export RUNNING_KSH; exec /bin/ksh $0 ${1+"$@"}; }
28unset RUNNING_KSH
29
30# No failure shall remain unpunished.
31set -e
32
33# In case the default sed doesn't suffice.
34: ${SED=sed}
35
a0c0a00f
CR
36program=`echo $0 | $SED -e 's!.*/!!'`
37
38build_mode=${TEXI2DVI_BUILD_MODE:-local}
39build_dir=${TEXI2DVI_BUILD_DIRECTORY:-.}
40
8868edaf
CR
41orig_pwd=`pwd`
42
a0c0a00f
CR
43# Initialize variables for option overriding and otherwise.
44# Don't use `unset' since old bourne shells don't have this command.
45# Instead, assign them an empty value.
46action=compile
a0c0a00f
CR
47debug=false
48escape="\\"
49expand=false # true for expansion via makeinfo
50includes=
51line_error=true # pass --file-line-error to TeX
52max_iters=7 # when to quit
53oname= # --output
54out_lang=dvi
55quiet=false # let the tools' message be displayed
56set_language=
57src_specials=
58shell_escape=
59latex2html=hevea # or set to tex4ht
60textra= # Extra TeX commands to insert in the input file.
61txiprereq=19990129 # minimum texinfo.tex version with macro expansion
62verb=false # true for verbose mode
63translate_file= # name of charset translation file
64
a0c0a00f
CR
65# We have to initialize IFS to space tab newline since we save and
66# restore IFS and apparently POSIX allows stupid/broken behavior with
67# empty-but-set IFS.
68# http://lists.gnu.org/archive/html/automake-patches/2006-05/msg00008.html
8868edaf 69# We need space, tab and newline, in precisely that order. And don't leave
a0c0a00f
CR
70# trailing blanks.
71space=' '
72tab=' '
73newline='
74'
75IFS="$space$tab$newline"
76
a0c0a00f
CR
77: ${EGREP=egrep}
78
79# Systems which define $COMSPEC or $ComSpec use semicolons to separate
8868edaf 80# directories in TEXINPUTS -- except for Cygwin and Msys, where COMSPEC
a0c0a00f 81# might be inherited, but : is used.
8868edaf
CR
82
83# In the case of Msys, uname returns a value derived from MSYSTEM, as
84# MSYSTEM is user configurable, it is not so safe to use it to detect
85# Msys. It is safer to use OSTYPE, this is why we set MSYSTEM to
86# $OSTYPE before calling uname
a0c0a00f 87if test -n "$COMSPEC$ComSpec" \
8868edaf 88 && MSYSTEM=$OSTYPE uname | $EGREP -iv 'cygwin|msys' >/dev/null; then
a0c0a00f
CR
89 path_sep=";"
90else
91 path_sep=":"
92fi
93
8868edaf 94
a0c0a00f
CR
95# Pacify verbose cds.
96CDPATH=${ZSH_VERSION+.}$path_sep
97
a0c0a00f 98
8868edaf
CR
99# Now we define numerous functions, with no other executable code.
100# The main program is at the end of the file.
101
102
103# \f Standard help and version functions.
a0c0a00f 104#
8868edaf
CR
105# usage - display usage and exit successfully.
106usage ()
107{
108 cat <<EOF
109Usage: $program [OPTION]... FILE...
110 or: texi2pdf [OPTION]... FILE...
111 or: pdftexi2dvi [OPTION]... FILE...
112
113Run each Texinfo or (La)TeX FILE through TeX in turn until all
114cross-references are resolved, building all indices. The directory
115containing each FILE is searched for included files. The suffix of FILE
116is used to determine its language ((La)TeX or Texinfo). To process
117(e)plain TeX files, set the environment variable LATEX=tex.
118
119When invoked as \`texi2pdf' or given the option --pdf generate PDF output.
120Otherwise, generate DVI.
121
122General options:
123 -D, --debug turn on shell debugging (set -x)
124 -h, --help display this help and exit successfully
125 -o, --output=OFILE leave output in OFILE; only one input FILE is allowed
126 -q, --quiet no output unless errors
127 -v, --version display version information and exit successfully
128 -V, --verbose report on what is done
129 --max-iterations=N don't process files more than N times [$max_iters]
130 --mostly-clean remove auxiliary files or directories from
131 previous runs (but not the output)
132
133Output format:
134 --dvi output a DVI file [default]
135 --dvipdf output a PDF file via DVI (using a dvi-to-pdf program)
136 --html output an HTML file from LaTeX, using HeVeA
137 --info output an Info file from LaTeX, using HeVeA
138 -p, --pdf use pdftex or pdflatex for processing
139 --ps output a PostScript file via DVI (using dvips)
140 --text output a plain text file from LaTeX, using HeVeA
141
142TeX tuning:
143 -E, --expand macro expansion using makeinfo
144 -I DIR search DIR for Texinfo files
145 -l, --language=LANG specify LANG for FILE, either latex or texinfo
146 --no-line-error do not pass --file-line-error to TeX
147 --shell-escape pass --shell-escape to TeX
148 --src-specials pass --src-specials to TeX
149 --translate-file=FILE use given charset translation file for TeX
150 -t, --command=CMD insert CMD in copy of input file
151
152Build modes:
153 --build=MODE specify the treatment of auxiliary files [$build_mode]
154 --tidy same as --build=tidy
155 -c, --clean same as --build=clean
156 --build-dir=DIR specify where the tidy compilation is performed;
157 implies --tidy;
158 defaults to TEXI2DVI_BUILD_DIRECTORY [$build_dir]
159
160The MODE specifies where the TeX compilation takes place, and, as a
161consequence, how auxiliary files are treated. The build mode can also
162be set using the environment variable TEXI2DVI_BUILD_MODE.
163
164Valid values of MODE are:
165 \`local' compile in the current directory, leaving all the auxiliary
166 files around. This is the traditional TeX use.
167 \`tidy' compile in a local *.t2d directory, where the auxiliary files
168 are left. Output files are copied back to the original file.
169 \`clean' same as \`tidy', but remove the auxiliary directory afterwards.
170 Every compilation therefore requires the full cycle.
171
172The values of these environment variables are used to run the
173corresponding commands, if they are set:
174
175 BIBER BIBTEX DVIPDF DVIPS EGREP HEVEA LATEX MAKEINDEX MAKEINFO
176 PDFLATEX PDFTEX SED T4HT TEX TEX4HT TEXINDEX TEXINDY THUMBPDF_CMD
177
178Regarding --dvipdf, if DVIPDF is not set in the environment, the
179following programs are looked for (in this order): dvipdfmx dvipdfm
180dvipdf dvi2pdf dvitopdf.
181
182If Texinfo is installed on your site, then the command
183
184 info texi2dvi
185
186should give you access to more documentation.
187
188Report bugs to bug-texinfo@gnu.org,
189general questions and discussion to help-texinfo@gnu.org.
190GNU Texinfo home page: <http://www.gnu.org/software/texinfo/>
191General help using GNU software: <http://www.gnu.org/gethelp/>
192EOF
193 exit 0
194}
195
196
197# version - Display version info and exit successfully.
198version ()
199{
200 cat <<EOF
201texi2dvi (GNU Texinfo 6.7)
202
203Copyright (C) 2019 Free Software Foundation, Inc.
204License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
205This is free software: you are free to change and redistribute it.
206There is NO WARRANTY, to the extent permitted by law.
207EOF
208 exit 0
209}
210
211
212# \f Generic auxiliary functions.
213
214# Used to access files and directories after we have changed directory
215# (for --tidy).
216rel=
217
218# Change directory, updating some relative paths.
219cd_dir ()
220{
221 cd "$1"
222
223 # Check if argument or input file is absolute, and if so, make all the path
224 # variables absolute.
225 use_absolute=false
a0c0a00f 226 case $1 in
8868edaf
CR
227 [\\/]* | ?:[\\/]*) # absolute path
228 use_absolute=true ;;
229 esac
230 case $in_input in
231 [\\/]* | ?:[\\/]*)
232 use_absolute=true ;;
a0c0a00f 233 esac
a0c0a00f 234
8868edaf
CR
235 if $use_absolute ; then
236 for cdd_dir in work_build workdir t2ddir work_bak in_input in_dir; do
237 eval "$cdd_dir=\`absolute \$$cdd_dir\`"
238 done
239 return
240 fi
241
242 # Replace each path component with ".." and add a single trailing slash.
243 rel=`echo "$1" | \$SED -e 's/[^/\\][^/\\]*/../g' -e 's/[/\\]*$/\//'`
244}
a0c0a00f 245
8868edaf 246# cd_orig - Return to the original directory.
a0c0a00f
CR
247cd_orig ()
248{
249 # In case $orig_pwd is on a different drive (for DOS).
250 cd /
251
252 # Return to the original directory so that
253 # - the next file is processed in correct conditions
254 # - the temporary file can be removed
255 cd "$orig_pwd" || exit 1
8868edaf
CR
256
257 rel=
a0c0a00f
CR
258}
259
8868edaf
CR
260
261# func_dirname FILE - Return the directory part of FILE.
a0c0a00f
CR
262func_dirname ()
263{
264 dirname "$1" 2>/dev/null \
265 || { echo "$1" | $SED 's!/[^/]*$!!;s!^$!.!'; }
266}
267
268
8868edaf
CR
269# noext FILE - Return FILE with one extension removed:
270# foo.bar.baz -> foo.bar
a0c0a00f
CR
271noext ()
272{
273 echo "$1" | $SED -e 's/\.[^/.][^/.]*$//'
274}
275
276
8868edaf 277# absolute NAME - Return an absolute path to NAME.
a0c0a00f
CR
278absolute ()
279{
280 case $1 in
281 [\\/]* | ?:[\\/]*)
282 # Absolute paths don't need to be expanded.
283 echo "$1"
284 ;;
8868edaf
CR
285 *) absolute_slashes=`echo "$1" | $SED -n 's,.*[^/]\(/*\)$,\1,p'`
286 absolute_rel=$orig_pwd/`func_dirname "$1"`
287 if test -d "$absolute_rel"; then
288 (cd "$absolute_rel" 2>/dev/null \
289 && absolute_name=`pwd`/`basename "$1"`"$absolute_slashes"
290 echo "$absolute_name")
a0c0a00f 291 else
8868edaf 292 error 1 "not a directory: $absolute_rel"
a0c0a00f
CR
293 fi
294 ;;
295 esac
296}
297
298
8868edaf 299# ensure_dir DIR1 DIR2... - Make sure given directories exist.
a0c0a00f
CR
300ensure_dir ()
301{
302 for dir
303 do
304 # Beware that in parallel builds we may have several concurrent
305 # attempts to create the directory. So fail only if "mkdir"
306 # failed *and* the directory still does not exist.
307 test -d "$dir" \
308 || mkdir "$dir" \
309 || test -d "$dir" \
310 || error 1 "cannot create directory: $dir"
311 done
312}
313
314
8868edaf
CR
315# error EXIT_STATUS LINE1 LINE2... - Report an error and exit with
316# failure if EXIT_STATUS is non-null.
a0c0a00f
CR
317error ()
318{
8868edaf 319 error_status="$1"
a0c0a00f
CR
320 shift
321 report "$@"
8868edaf
CR
322 if test "$error_status" != 0; then
323 exit $error_status
a0c0a00f
CR
324 fi
325}
326
327
8868edaf 328# findprog PROG - Return true if PROG is somewhere in PATH, else false.
a0c0a00f
CR
329findprog ()
330{
8868edaf 331 saveIFS="$IFS"
a0c0a00f
CR
332 IFS=$path_sep # break path components at the path separator
333 for dir in $PATH; do
334 IFS=$saveIFS
335 # The basic test for an executable is `test -f $f && test -x $f'.
336 # (`test -x' is not enough, because it can also be true for directories.)
337 # We have to try this both for $1 and $1.exe.
338 #
339 # Note: On Cygwin and DJGPP, `test -x' also looks for .exe. On Cygwin,
340 # also `test -f' has this enhancement, but not on DJGPP. (Both are
341 # design decisions, so there is little chance to make them consistent.)
342 # Thusly, it seems to be difficult to make use of these enhancements.
343 #
344 if { test -f "$dir/$1" && test -x "$dir/$1"; } \
345 || { test -f "$dir/$1.exe" && test -x "$dir/$1.exe"; }; then
346 return 0
347 fi
348 done
349 return 1
350}
351
8868edaf 352# report LINE1 LINE2... - Echo each argument to stderr.
a0c0a00f
CR
353report ()
354{
355 for i in "$@"
356 do
357 echo >&2 "$0: $i"
358 done
359}
360
361
8868edaf 362# run COMMAND-LINE - Run COMMAND-LINE verbosely, catching errors as failures.
a0c0a00f
CR
363run ()
364{
365 verbose "Running $@"
366 "$@" 2>&5 1>&2 \
367 || error 1 "$1 failed"
368}
369
370
8868edaf 371# verbose WORD1 WORD2... - Echo concatenated WORDs to stderr, if $verb.
a0c0a00f
CR
372verbose ()
373{
374 if $verb; then
375 echo >&2 "$0: $@"
376 fi
377}
378
379
8868edaf
CR
380# \f Handling lists.
381#
382# list_append LIST-NAME ELEM - Append ELEM to (the contents of) LIST-NAME.
a0c0a00f
CR
383list_append ()
384{
8868edaf 385 list_name="$1"
a0c0a00f 386 shift
8868edaf 387 eval set X \$$list_name "$@"
a0c0a00f 388 shift
8868edaf 389 eval $list_name=\""$@"\"
a0c0a00f
CR
390}
391
392
8868edaf
CR
393# list_concat_dirs LIST-NAME DIR-LIST - Append to LIST-NAME all the
394# components (including empty ones) from the $path_sep-separated list
395# DIR-LIST. Make the paths absolute.
a0c0a00f
CR
396list_concat_dirs ()
397{
8868edaf 398 lcd_list="$1"
a0c0a00f
CR
399 # Empty path components are meaningful to tex. We rewrite them as
400 # `EMPTY' so they don't get lost when we split on $path_sep.
401 # Hopefully no one will have an actual directory named EMPTY.
8868edaf
CR
402 lcd_replace_EMPTY="-e 's/^$path_sep/EMPTY$path_sep/g' \
403 -e 's/$path_sep\$/${path_sep}EMPTY/g' \
404 -e 's/$path_sep$path_sep/${path_sep}EMPTY${path_sep}/g'"
a0c0a00f
CR
405 save_IFS=$IFS
406 IFS=$path_sep
8868edaf 407 set x `echo "$2" | eval $SED $lcd_replace_EMPTY`; shift
a0c0a00f 408 IFS=$save_IFS
8868edaf 409 for lcd_dir
a0c0a00f 410 do
8868edaf 411 case $lcd_dir in
a0c0a00f
CR
412 EMPTY)
413 list_append $lcd_list ""
414 ;;
415 *)
8868edaf
CR
416 if test -d $lcd_dir; then
417 dir=`absolute "$lcd_dir"`
418 list_append $lcd_list "$lcd_dir"
a0c0a00f
CR
419 fi
420 ;;
421 esac
422 done
423}
424
425
8868edaf
CR
426# list_prefix LIST-NAME SEP -> STRING - Return string with each element
427# of LIST-NAME preceded by SEP.
a0c0a00f
CR
428list_prefix ()
429{
8868edaf 430 lp_separator="$2"
a0c0a00f
CR
431 eval set X \$$1
432 shift
8868edaf 433 lp_result=''
a0c0a00f
CR
434 for i
435 do
8868edaf 436 lp_result="$lp_result \"$lp_separator\" \"$i\""
a0c0a00f 437 done
8868edaf 438 echo "$lp_result"
a0c0a00f
CR
439}
440
8868edaf 441# list_infix LIST-NAME SEP -> STRING - Same as list_prefix, but a separator.
a0c0a00f
CR
442list_infix ()
443{
444 eval set X \$$1
445 shift
8868edaf 446 save_IFS="$IFS"
a0c0a00f
CR
447 IFS=$path_sep
448 echo "$*"
8868edaf 449 IFS=$save_IFS
a0c0a00f
CR
450}
451
8868edaf 452# list_dir_to_abs LIST-NAME - Convert list to using only absolute dir names.
a0c0a00f
CR
453# Currently unused, but should replace absolute_filenames some day.
454list_dir_to_abs ()
455{
8868edaf
CR
456 ldta_list="$1"
457 eval set X \$$ldta_list
a0c0a00f 458 shift
8868edaf 459 ldta_result=''
a0c0a00f
CR
460 for dir
461 do
462 dir=`absolute "$dir"`
463 test -d "$dir" || continue
8868edaf 464 ldta_result="$ldata_result \"$dir\""
a0c0a00f 465 done
8868edaf
CR
466 set X $ldta_result; shift
467 eval $ldta_list=\"$@\"
a0c0a00f
CR
468}
469
470
8868edaf
CR
471# \f Language auxiliary functions.
472#
473# out_lang_set LANG - set $out_lang to LANG (dvi, pdf, etc.), or error.
a0c0a00f
CR
474out_lang_set ()
475{
476 case $1 in
477 dvi|dvipdf|html|info|pdf|ps|text) out_lang=$1;;
478 *) error 1 "invalid output format: $1";;
479 esac
480}
481
8868edaf 482# out_lang_tex - Return the tex output language (DVI or PDF) for $out_lang.
a0c0a00f
CR
483out_lang_tex ()
484{
485 case $out_lang in
486 dvi | ps | dvipdf ) echo dvi;;
487 pdf ) echo $out_lang;;
488 html | info | text ) echo $out_lang;;
489 *) error 1 "invalid out_lang: $1";;
490 esac
491}
492
8868edaf 493# out_lang_ext - Return the extension for $out_lang (pdf, dvi, etc.).
a0c0a00f
CR
494out_lang_ext ()
495{
496 case $out_lang in
497 dvipdf ) echo pdf;;
498 dvi | html | info | pdf | ps | text ) echo $out_lang;;
499 *) error 1 "invalid out_lang: $1";;
500 esac
501}
502
503
8868edaf
CR
504# \f TeX file auxiliary functions.
505#
506# absolute_filenames TEX-PATH -> TEX-PATH - Convert relative paths to
507# absolute, so we can run in another directory (e.g., in tidy build
508# mode, or during the macro-support detection).
a0c0a00f
CR
509absolute_filenames ()
510{
511 # Empty path components are meaningful to tex. We rewrite them as
512 # `EMPTY' so they don't get lost when we split on $path_sep.
513 # Hopefully no one will have an actual directory named EMPTY.
8868edaf
CR
514 af_replace_empty="-e 's/^$path_sep/EMPTY$path_sep/g' \
515 -e 's/$path_sep\$/${path_sep}EMPTY/g' \
516 -e 's/$path_sep$path_sep/${path_sep}EMPTY${path_sep}/g'"
517 af_result=`echo "$1" | eval $SED $af_replace_empty`
a0c0a00f
CR
518 save_IFS=$IFS
519 IFS=$path_sep
8868edaf
CR
520 set x $af_result; shift
521 af_result=
522 af_path_sep=
a0c0a00f
CR
523 for dir
524 do
525 case $dir in
526 EMPTY)
8868edaf 527 af_result=$af_result$af_path_sep
a0c0a00f
CR
528 ;;
529 *)
530 if test -d "$dir"; then
8868edaf 531 af_result=$af_result$af_path_sep`absolute "$dir"`
a0c0a00f
CR
532 else
533 # Even if $dir is not a directory, preserve it in the path.
534 # It might contain metacharacters that TeX will expand in
535 # turn, e.g., /some/path/{a,b,c}. This will not get the
536 # implicit absolutification of the path, but we can't help that.
8868edaf 537 af_result=$af_result$af_path_sep$dir
a0c0a00f
CR
538 fi
539 ;;
540 esac
8868edaf 541 af_path_sep=$path_sep
a0c0a00f 542 done
8868edaf 543 echo "$af_result"
a0c0a00f
CR
544}
545
546
8868edaf
CR
547# output_base_name FILE - Return the name of FILE, possibly renamed to
548# satisfy --output. FILE is local, i.e., without any directory part.
a0c0a00f
CR
549output_base_name ()
550{
551 case $oname in
552 '') echo "$1";;
8868edaf
CR
553 *) obn_out_noext=`noext "$oname"`
554 obn_file_ext=`echo "$1" | $SED 's/^.*\.//'`
555 echo "$obn_out_noext.$obn_file_ext"
a0c0a00f
CR
556 ;;
557 esac
558}
559
560
8868edaf 561# destdir - Return the directory where the output is expected.
a0c0a00f
CR
562destdir ()
563{
564 case $oname in
565 '') echo "$orig_pwd";;
566 *) dirname "$oname";;
567 esac
568}
569
570
8868edaf
CR
571# move_to_dest FILE... - Move FILE(s) to the place where the user expects.
572# Truly move it, that is, it must not remain in its build location
573# unless that is also the output location. (Otherwise it might appear
574# as an extra file in make distcheck.)
a0c0a00f 575#
8868edaf
CR
576# FILE can be the principal output (in which case -o directly applies),
577# or an auxiliary file with the same base name.
a0c0a00f
CR
578move_to_dest ()
579{
580# echo "move_to_dest $*, tidy=$tidy, oname=$oname"
581
582 # If we built in place and have no output name, there is nothing to
583 # do, so just return.
584 case $tidy:$oname in
585 false:) return;;
586 esac
587
a0c0a00f
CR
588 for file
589 do
590 test -f "$file" \
591 || error 1 "no such file or directory: $file"
592 case $tidy:$oname in
8868edaf
CR
593 true:) mtd_destdir=$orig_pwd
594 mtd_destfile=$mtd_destdir/$file;;
595 true:*) mtd_destfile=`output_base_name "$file"`
596 mtd_destdir=`dirname "$mtd_destfile"`;;
597 false:*) mtd_destfile=$oname
598 mtd_destdir=`dirname "$mtd_destfile"`;;
a0c0a00f
CR
599 esac
600
601 # We want to compare the source location and the output location,
602 # and if they are different, do the move. But if they are the
603 # same, we must preserve the source. Since we can't assume
604 # stat(1) or test -ef is available, resort to comparing the
605 # directory names, canonicalized with pwd. We can't use cmp -s
606 # since the output file might not actually change from run to run;
607 # e.g., TeX DVI output is timestamped to only the nearest minute.
8868edaf
CR
608 mtd_destdir=`cd "$mtd_destdir" && pwd`
609 mtd_destbase=`basename "$mtd_destfile"`
610
611 mtd_sourcedir=`dirname "$file"`
612 mtd_sourcedir=`cd "$mtd_sourcedir" && pwd`
613 mtd_sourcebase=`basename "$file"`
614
615 if test "$mtd_sourcedir/$mtd_sourcebase" != "$mtd_destdir/$mtd_destbase"
616 then
617 verbose "Moving $file to $mtd_destfile"
618 rm -f "$mtd_destfile"
619 mv "$file" "$mtd_destfile"
a0c0a00f
CR
620 fi
621 done
622}
623
624
8868edaf
CR
625# \f Managing xref files.
626#
627# aux_file_p FILE - Echo FILE if FILE is an aux file.
a0c0a00f
CR
628aux_file_p ()
629{
8868edaf 630 test -f "$1" || return 0
a0c0a00f 631 case $1 in
8868edaf
CR
632 *.aux) echo "$1";;
633 *) return 0;;
a0c0a00f
CR
634 esac
635}
636
8868edaf 637# bibaux_file_p FILE - Echo FILE if FILE contains citation requests.
a0c0a00f
CR
638bibaux_file_p ()
639{
8868edaf 640 test -s "$1" || return 0
a0c0a00f
CR
641 if (grep '^\\bibstyle[{]' "$1" \
642 && grep '^\\bibdata[{]' "$1" \
643 ## The following line is suspicious: fails when there
644 ## are citations in sub aux files. We need to be
645 ## smarter in this case.
646 ## && grep '^\\citation[{]' "$f"
647 ) >&6 2>&1;
648 then
8868edaf 649 echo "$1"
a0c0a00f 650 fi
8868edaf 651 return 0
a0c0a00f
CR
652}
653
8868edaf 654# index_file_p FILE - Echo FILE if FILE is an index file.
a0c0a00f
CR
655index_file_p ()
656{
8868edaf 657 test -f "$1" || return 0
a0c0a00f
CR
658 case $in_lang:$latex2html:`out_lang_tex`:`$SED '1q' "$1"` in
659 # When working with TeX4HT, *.idx are created by LaTeX. They must
660 # be processed to produce *.4ix, *.4dx files. The *.4dx file is
661 # passed to makeindex to produce the *.ind file. This sequence is
662 # handled by run_index, so we are only interested in the *.idx
663 # files, which have each "\indexentry" preceded by a
664 # "\beforeentry".
8868edaf 665 latex:tex4ht:html:"\\beforeentry {"*) echo $1;;
a0c0a00f
CR
666
667 # When index.sty is used, there is a space before the brace.
8868edaf 668 latex:*:*:"\\indexentry{"*|latex:*:*:"\\indexentry {"*) echo $1;;
a0c0a00f 669
8868edaf
CR
670 texinfo:*:*:"\\entry{"*) echo $1;;
671 texinfo:*:*:"@entry{"*) echo $1;;
672 # @entry is output from newer versions of texinfo.tex
a0c0a00f 673 esac
8868edaf 674 return 0
a0c0a00f
CR
675}
676
8868edaf
CR
677########### not used currently
678# xref_file_p FILE - Return success if FILE is an xref file (indexes,
679# tables and lists).
a0c0a00f
CR
680xref_file_p ()
681{
682 test -f "$1" || return 1
683 # If the file is not suitable to be an index or xref file, don't
684 # process it. It's suitable if the first character is a
685 # backslash or right quote or at, as long as the first line isn't
686 # \input texinfo.
687 case `$SED '1q' "$1"` in
688 "\\input texinfo"*) return 1;;
689 [\\''@]*) return 0;;
690 *) return 1;;
691 esac
692}
693
694
8868edaf
CR
695# Used in generated_files_get
696generated_files_get_from_log ()
a0c0a00f 697{
8868edaf
CR
698 if test -f "$1.log"; then
699 # Usually the output is like: \openout1 = `foobar.tex'.
700 # (including the final period)
701 # but luatex outputs: \openout1 = foobar.tex
702 # (no quotes, no period).
703 # So we have to make the punctuation optional.
704 grep '^\\openout[0-9]' "$1.log" \
705 | $SED -e "s/\\\\openout[^=]*= *[\`']*//" \
706 -e "s/'\.$//"
a0c0a00f 707 fi
8868edaf 708}
a0c0a00f 709
8868edaf
CR
710# Used in generated_files_get
711generated_files_get_from_fls ()
712{
713 if test -f "$1.fls"; then
714 grep '^OUTPUT ' "$1.fls" | cut -b 8- \
715 | grep -v '\.dvi$' | grep -v '\.log$' | grep -v '\.pdf$' || true
716 fi
717}
718
719# generated_files_get - Output the list of files generated by the TeX
720# compilation.
721generated_files_get ()
722{
723 $generated_files_get_method "$in_noext"
724 if test $generated_files_get_method = generated_files_get_from_fls; then
725 if test -r "$in_noext.fl"; then
726 report 'WARNING!! The fl index may typeset as garbage!' # goes to stderr
727 report 'Try upgrading your version of texinfo.tex, or else try setting'
728 report 'the environment variable TEXI2DVI_USE_RECORDER to '\''no'\''.'
729report 'Once you'\''ve done that, delete the file with an '\''fl'\'' extension.'
a0c0a00f 730 fi
8868edaf 731 fi
a0c0a00f
CR
732}
733
734
8868edaf
CR
735# xref_files_save - set xref_files_orig from xref_files_new, and save xref
736# files in $work_bak.
a0c0a00f
CR
737xref_files_save ()
738{
739 # Save copies of auxiliary files for later comparison.
8868edaf 740 xref_files_orig=$xref_files_new
a0c0a00f
CR
741 if test -n "$xref_files_orig"; then
742 verbose "Backing up xref files: $xref_files_orig"
743 # The following line improves `cp $xref_files_orig "$work_bak"'
744 # by preserving the directory parts. Think of
745 # cp chap1/main.aux chap2/main.aux $work_bak.
746 #
747 # Users may have, e.g., --keep-old-files. Don't let this interfere.
748 # (Don't use unset for the sake of ancient shells.)
749 TAR_OPTIONS=; export TAR_OPTIONS
8868edaf
CR
750 tar cf - $xref_files_orig | (cd "$rel$work_bak" && tar xf -)
751 fi
752
753 # Remove auxiliary files in same directory as main input file. Otherwise,
754 # these will likely be read instead of those in the build dir.
755 if $tidy ; then
756 secondary_xref_files=`sorted_index_files`
757 for f in $xref_files_new $secondary_xref_files ; do
758 if test -f "$rel$in_dir/$f" ; then
759 remove $rel$in_dir/$f
760 fi
761 done
a0c0a00f
CR
762 fi
763}
764
765
8868edaf
CR
766# xref_files_changed - Return success if the xref files have changed
767# since the previous run.
a0c0a00f
CR
768xref_files_changed ()
769{
770 # LaTeX (and the package changebar) report in the LOG file if it
771 # should be rerun. This is needed for files included from
772 # subdirs, since texi2dvi does not try to compare xref files in
773 # subdirs. Performing xref files test is still good since LaTeX
774 # does not report changes in xref files.
775 if grep "Rerun to get" "$in_noext.log" >&6 2>&1; then
776 return 0
777 fi
8868edaf 778 # Similarly, check for biblatex report of whether rerunning is needed.
a0c0a00f
CR
779 if grep "biblatex.*(re)run" "$in_noext.log" >&6 2>&1; then
780 return 0
781 fi
782
783 # If old and new lists don't have the same file list,
784 # then something has definitely changed.
8868edaf 785 xref_files_new=`generated_files_get`
a0c0a00f
CR
786 verbose "Original xref files = $xref_files_orig"
787 verbose "New xref files = $xref_files_new"
788 if test "x$xref_files_orig" != "x$xref_files_new"; then
789 return 0
790 fi
791
792 # Compare each file until we find a difference.
793 for this_file in $xref_files_new; do
794 verbose "Comparing xref file `echo $this_file | $SED 's|\./||g'` ..."
795 # cmp -s returns nonzero exit status if files differ.
8868edaf 796 if cmp -s "$this_file" "$rel$work_bak/$this_file"; then :; else
a0c0a00f
CR
797 verbose "xref file `echo $this_file | $SED 's|\./||g'` differed ..."
798 if $debug; then
8868edaf 799 diff -u "$rel$work_bak/$this_file" "$this_file"
a0c0a00f
CR
800 fi
801 return 0
802 fi
803 done
804
8868edaf
CR
805 secondary_xref_files=`sorted_index_files`
806 verbose "Secondary xref files = $secondary_xref_files"
807 for this_file in $secondary_xref_files; do
808 if test -f $this_file; then :; else
809 verbose "$this_file missing ..."
810 return 0
811 fi
812 done
813
a0c0a00f
CR
814 # No change.
815 return 1
816}
817
8868edaf
CR
818# \f Running the TeX suite.
819#
820# Set tex_cmd variable, for running TeX.
821make_tex_cmd ()
a0c0a00f
CR
822{
823 case $in_lang:$latex2html:`out_lang_tex` in
824 latex:*:dvi|latex:tex4ht:html)
825 tex=${LATEX:-latex};;
826 latex:*:pdf)
827 tex=${PDFLATEX:-pdflatex};;
828 texinfo:*:dvi)
829 # MetaPost also uses the TEX environment variable. If the user
830 # has set TEX=latex for that reason, don't bomb out.
831 case $TEX in
832 *latex) tex=tex;; # don't bother trying to find etex
833 *) tex=$TEX
834 esac;;
835 texinfo:*:pdf) tex=$PDFTEX;;
a0c0a00f
CR
836 *) error 1 "$out_lang not supported for $in_lang";;
837 esac
838
a0c0a00f
CR
839 # Beware of aux files in subdirectories that require the
840 # subdirectory to exist.
841 case $in_lang:$tidy in
842 latex:true)
843 $SED -n 's|^[ ]*\\include{\(.*\)/.*}.*|\1|p' "$in_input" |
844 sort -u |
845 while read d
846 do
847 ensure_dir "$work_build/$d"
848 done
849 ;;
850 esac
851
852 # Note that this will be used via an eval: quote properly.
8868edaf 853 tex_cmd="$tex"
a0c0a00f
CR
854
855 # If possible, make TeX report error locations in GNU format.
856 if $line_error; then
857 if test "${tex_help:+set}" != set; then
858 # Go to a temporary directory to try --help, since old versions that
859 # don't accept --help will generate a texput.log.
860 tex_help_dir=$t2ddir/tex_help
861 ensure_dir "$tex_help_dir"
862 tex_help=`cd "$tex_help_dir" >&6 && $tex --help </dev/null 2>&1 || true`
863 fi
864 # The mk program and perhaps others want to parse TeX's
865 # original error messages.
866 case $tex_help in
8868edaf 867 *file-line-error*) tex_cmd="$tex_cmd --file-line-error";;
a0c0a00f
CR
868 esac
869 fi
870
8868edaf
CR
871 # Tell TeX about -recorder option, if specified
872 # recorder_option_maybe is in { " -recorder", "" }
873 tex_cmd="$tex_cmd$recorder_option_maybe"
874
875
a0c0a00f 876 # Tell TeX about TCX file, if specified.
8868edaf
CR
877 test -n "$translate_file" \
878 && tex_cmd="$tex_cmd --translate-file=$translate_file"
a0c0a00f
CR
879
880 # Tell TeX to make source specials (for backtracking from output to
881 # source, given a sufficiently smart editor), if specified.
8868edaf 882 test -n "$src_specials" && tex_cmd="$tex_cmd $src_specials"
a0c0a00f
CR
883
884 # Tell TeX to allow running external executables
8868edaf 885 test -n "$shell_escape" && tex_cmd="$tex_cmd $shell_escape"
a0c0a00f 886
8868edaf
CR
887 # Run without interaction.
888 # \batchmode does not show terminal output at all, so we don't
889 # want that. And even in batch mode, TeX insists on having input
890 # from the user. Close its stdin to make it impossible.
891 tex_cmd="$tex_cmd </dev/null '${escape}nonstopmode'"
892}
a0c0a00f 893
a0c0a00f 894
8868edaf
CR
895# run_tex - Run TeX, taking care of errors and logs.
896run_tex ()
897{
898 # Check for any unusual characters in the filename.
899 # However, >, \ and any whitespace characters are not supported
900 # filenames.
901 in_input_funnies=`echo "$in_input" \
902 | $SED -e 's![^}#$%&^_{~]!!g' -e 's!\(.\)!\1\''
903!g' | uniq`
904
905 if test -n "$in_input_funnies" ; then
906 # Make > an end group character, as it's unlikely to appear in
907 # a filename.
908 tex_cmd="$tex_cmd '${escape}bgroup${escape}catcode62=2${escape}relax'"
909
910 # If the filename has funny characters, change the TeX category codes of
911 # some characters within a group, and use \expandafter to input the file
912 # outside of the group.
913 for w in $in_input_funnies ; do
914 tex_cmd="$tex_cmd '${escape}catcode\`${escape}$w=12${escape}relax'"
915 done
916
917 # Set \toks0 to "\input FILENAME\relax"
918 tex_cmd="$tex_cmd '${escape}toks0${escape}bgroup${escape}input' '$rel$in_input' '${escape}relax>"
919
920 # Expand \toks0 after the end of the group
921 tex_cmd="$tex_cmd${escape}expandafter${escape}egroup"
922 tex_cmd="$tex_cmd${escape}the${escape}toks0${escape}relax'"
923 else
924 # In the case of a simple filename, just pass the filename
925 # with no funny tricks.
926 tex_cmd="$tex_cmd '${escape}input' '$rel$in_input'"
927 fi
928
929 verbose "$0: Running $tex_cmd ..."
930 if (eval "$tex_cmd" >&5); then
a0c0a00f
CR
931 case $out_lang in
932 dvi | pdf ) move_to_dest "$in_noext.$out_lang";;
933 esac
934 else
8868edaf 935 tex_failed=true
a0c0a00f
CR
936 fi
937}
938
8868edaf
CR
939
940# run_bibtex - Run bibtex (or biber) on current file
941# - if its input (AUX) exists,
942# - or if some citations are missing (LOG contains `Citation'),
943# - or if the LOG complains of a missing .bbl.
a0c0a00f
CR
944#
945# Don't try to be too smart:
946# 1. Running bibtex only if the bbl file exists and is older than
947# the LaTeX file is wrong, since the document might include files
948# that have changed.
949#
8868edaf 950# 2. Because there can be several AUX (if there are \include's),
a0c0a00f
CR
951# but a single LOG, looking for missing citations in LOG is
952# easier, though we take the risk of matching false messages.
953run_bibtex ()
954{
955 case $in_lang in
956 latex) bibtex=${BIBTEX:-bibtex};;
957 texinfo) return;;
958 esac
959
960 # "Citation undefined" is for LaTeX, "Undefined citation" for btxmac.tex.
961 # The no .aux && \bibdata test is also for btxmac, in case it was the
962 # first run of a bibtex-using document. Otherwise, it's possible that
963 # bibtex would never be run.
964 if test -r "$in_noext.aux" \
965 && test -r "$in_noext.log" \
966 && ( (grep 'Warning:.*Citation.*undefined' "$in_noext.log" \
967 || grep '.*Undefined citation' "$in_noext.log" \
968 || grep 'No file .*\.bbl\.' "$in_noext.log") \
969 || (grep 'No \.aux file' "$in_noext.log" \
970 && grep '^\\bibdata' "$in_noext.aux") ) \
971 >&6 2>&1; \
972 then
8868edaf 973 bibtex_aux=`filter_files bibaux_file_p`
a0c0a00f
CR
974 for f in $bibtex_aux; do
975 run $bibtex "$f"
976 done
977 fi
978
979 # biber(+biblatex) check.
980 if test -r "$in_noext.bcf" \
981 && grep '</bcf:controlfile>' "$in_noext.bcf" >/dev/null; then
982 run ${BIBER:-biber} "$in_noext"
983 fi
984}
985
8868edaf
CR
986
987# filter_file PREDICATE - Go through the list of files in xref_files_new
988# and use PREDICATE on each one to optionally print it or print other files
989# based on the filename.
990filter_files ()
991{
992 test -n "$xref_files_new" || return 0
993 echo "$xref_files_new" |
994 # Filter existing files matching the criterion.
995 #
996 while read file; do
997 $1 "$file"
998 done |
999 sort |
1000 # Some files are opened several times, e.g., listings.sty's *.vrb.
1001 uniq
1002}
1003
1004# run_index - Run texindex (or makeindex or texindy) on current index
1005# files. If they already exist, and after running TeX a first time the
1006# index files don't change, then there's no reason to run TeX again.
1007# But we won't know that if the index files are out of date or nonexistent.
a0c0a00f
CR
1008run_index ()
1009{
8868edaf 1010 index_files=`filter_files index_file_p`
a0c0a00f
CR
1011 test -n "$index_files" \
1012 || return 0
1013
1014 : ${MAKEINDEX:=makeindex}
1015 : ${TEXINDEX:=texindex}
1016 : ${TEXINDY:=texindy}
1017
a0c0a00f
CR
1018 case $in_lang:$latex2html:`out_lang_tex` in
1019 latex:tex4ht:html)
1020 for index_file in $index_files
1021 do
1022 index_noext=`noext "$index_file"`
1023 run tex \
1024 '\def\filename{{'"$index_noext"'}{idx}{4dx}{ind}}
1025 \input idxmake.4ht'
1026 run $MAKEINDEX -o $index_noext.ind $index_noext.4dx
1027 done
1028 ;;
1029
1030 latex:*)
1031 if $TEXINDY --version >&6 2>&1; then
1032 run $TEXINDY $index_files
1033 else
1034 run $MAKEINDEX $index_files
1035 fi
1036 ;;
1037
1038 texinfo:*)
1039 run $TEXINDEX $index_files
1040 ;;
1041 esac
1042}
1043
1044
8868edaf
CR
1045# run_tex4ht - Run the last two phases of TeX4HT: tex4ht extracts the
1046# HTML from the instrumented DVI file, and t4ht converts the figures and
1047# installs the files when given -d.
a0c0a00f
CR
1048#
1049# Because knowing exactly which files are created is complex (in
1050# addition the names are not simple to compute), which makes it
8868edaf
CR
1051# difficult to install the output files in a second step, we
1052# tell t4ht to install the output files.
a0c0a00f
CR
1053run_tex4ht ()
1054{
1055 case $in_lang:$latex2html:`out_lang_tex` in
1056 latex:tex4ht:html)
1057 : ${TEX4HT:=tex4ht} ${T4HT:=t4ht}
1058 run "$TEX4HT" "-f/$in_noext"
1059 # Do not remove the / after the destdir.
1060 run "$T4HT" "-d`destdir`/" "-f/$in_noext"
1061 ;;
1062 esac
1063}
1064
1065
8868edaf 1066# run_thumbpdf - Run thumbpdf.
a0c0a00f
CR
1067run_thumbpdf ()
1068{
1069 if test `out_lang_tex` = pdf \
1070 && test -r "$in_noext.log" \
1071 && grep 'thumbpdf\.sty' "$in_noext.log" >&6 2>&1; \
1072 then
1073 thumbpdf=${THUMBPDF_CMD:-thumbpdf}
1074 thumbcmd="$thumbpdf $in_dir/$in_noext"
1075 verbose "Running $thumbcmd ..."
1076 if $thumbcmd >&5; then
1077 run_tex
1078 else
1079 report "$thumbpdf exited with bad status." \
1080 "Ignoring its output."
1081 fi
1082 fi
1083}
1084
1085
8868edaf 1086# run_dvipdf FILE.dvi - Convert FILE.dvi to FILE.pdf.
a0c0a00f
CR
1087run_dvipdf ()
1088{
1089 # Find which dvi->pdf program is available.
8868edaf
CR
1090 if test -n "$DVIPDF"; then
1091 dvipdf=$DVIPDF # user envvar, use it without checking
1092
1093 elif test -z "$dvipdf"; then
1094 for i in dvipdfmx dvipdfm dvipdf dvi2pdf dvitopdf; do
a0c0a00f
CR
1095 if findprog $i; then
1096 dvipdf=$i
1097 fi
1098 done
1099 fi
1100 # These tools have varying interfaces, some 'input output', others
1101 # 'input -o output'. They all seem to accept 'input' only,
1102 # outputting using the expected file name.
1103 run $dvipdf "$1"
1104 if test ! -f `echo "$1" | $SED -e 's/\.dvi$/.pdf/'`; then
1105 error 1 "cannot find output file"
1106 fi
1107}
1108
8868edaf 1109# run_tex_suite - Run the TeX tools until a stable point is reached.
a0c0a00f
CR
1110run_tex_suite ()
1111{
8868edaf
CR
1112 make_tex_cmd
1113
a0c0a00f
CR
1114 # Move to the working directory.
1115 if $tidy; then
1116 verbose "cd $work_build"
8868edaf 1117 cd_dir "$work_build" || exit 1
a0c0a00f
CR
1118 fi
1119
1120 # Count the number of cycles.
8868edaf
CR
1121 suite_cycle=0
1122
1123 # Start by checking the log files for what files were created last
1124 # time. This will mean that if they don't change, we finish in 1 cycle.
1125 xref_files_new=`generated_files_get`
1126 xref_files_save
a0c0a00f
CR
1127
1128 while :; do
8868edaf
CR
1129 # check for (probably) LaTeX loop (e.g. varioref)
1130 if test $suite_cycle -eq "$max_iters"; then
a0c0a00f
CR
1131 error 0 "Maximum of $max_iters cycles exceeded"
1132 break
1133 fi
726f6388 1134
a0c0a00f 1135 # report progress
8868edaf
CR
1136 suite_cycle=`expr $suite_cycle + 1`
1137 verbose "Cycle $suite_cycle for $command_line_filename"
ccc6cda3 1138
8868edaf
CR
1139 tex_failed=false
1140 run_core_conversion
1141 xref_files_changed || break
a0c0a00f 1142 xref_files_save
726f6388 1143
a0c0a00f
CR
1144 # We run bibtex first, because it's more likely for the indexes
1145 # to change after bibtex is run than the reverse, though either
1146 # would be rare.
1147 run_bibtex
1148 run_index
a0c0a00f 1149 done
ccc6cda3 1150
8868edaf
CR
1151 if $tex_failed ; then
1152 # TeX failed, and the xref files did not change.
1153 error 1 "$tex exited with bad status, quitting."
1154 fi
1155
a0c0a00f
CR
1156 # If we were using thumbpdf and producing PDF, then run thumbpdf
1157 # and TeX one last time.
1158 run_thumbpdf
b80f6443 1159
a0c0a00f
CR
1160 # If we are using tex4ht, call it.
1161 run_tex4ht
f73dda09 1162
a0c0a00f
CR
1163 # Install the result if we didn't already (i.e., if the output is
1164 # dvipdf or ps).
1165 case $latex2html:$out_lang in
1166 *:dvipdf)
8868edaf
CR
1167 run_dvipdf "$in_noext.`out_lang_tex`"
1168 move_to_dest "$in_noext.`out_lang_ext`"
1169 ;;
1170 *:ps)
1171 : ${DVIPS:=dvips}
1172 run $DVIPS -o "$in_noext.`out_lang_ext`" "$in_noext.`out_lang_tex`"
1173 move_to_dest "$in_noext.`out_lang_ext`"
1174 ;;
1175 esac
a0c0a00f 1176
8868edaf
CR
1177 cd_orig
1178}
a0c0a00f
CR
1179
1180
8868edaf
CR
1181# \f TeX processing auxiliary tools.
1182#
1183# run_makeinfo - Expand macro commands in the original source file using
1184# Makeinfo. Always use `end' footnote style, since the `separate' style
a0c0a00f
CR
1185# generates different output (arguably this is a bug in -E). Discard
1186# main info output, the user asked to run TeX, not makeinfo.
1187run_makeinfo ()
1188{
1189 test $in_lang = texinfo \
1190 || return 0
1191
1192 # Unless required by the user, makeinfo expansion is wanted only
1193 # if texinfo.tex is too old.
1194 if $expand; then
1195 makeinfo=${MAKEINFO:-makeinfo}
1196 else
1197 # Check if texinfo.tex performs macro expansion by looking for
1198 # its version. The version is a date of the form YEAR-MO-DA.
1199 # We don't need to use [0-9] to match the digits since anyway
1200 # the comparison with $txiprereq, a number, will fail with non-digits.
1201 # Run in a temporary directory to avoid leaving files.
1202 version_test_dir=$t2ddir/version_test
1203 ensure_dir "$version_test_dir"
1204 if (
1205 cd "$version_test_dir"
1206 echo '\input texinfo.tex @bye' >txiversion.tex
1207 # Be sure that if tex wants to fail, it is not interactive:
1208 # close stdin.
1209 $TEX txiversion.tex </dev/null >txiversion.out 2>txiversion.err
1210 ); then :; else
1211 report "texinfo.tex appears to be broken.
1212This may be due to the environment variable TEX set to something
1213other than (plain) tex, a corrupt texinfo.tex file, or
1214to tex itself simply not working."
1215 cat "$version_test_dir/txiversion.out"
1216 cat "$version_test_dir/txiversion.err" >&2
1217 error 1 "quitting."
1218 fi
1219 eval `$SED -n 's/^.*\[\(.*\)version \(....\)-\(..\)-\(..\).*$/txiformat=\1 txiversion="\2\3\4"/p' "$version_test_dir/txiversion.out"`
1220 verbose "texinfo.tex preloaded as \`$txiformat', version is \`$txiversion' ..."
1221 if test "$txiprereq" -le "$txiversion" >&6 2>&1; then
1222 makeinfo=
1223 else
1224 makeinfo=${MAKEINFO:-makeinfo}
1225 fi
1226 # If TeX is preloaded, offer the user this convenience:
1227 if test "$txiformat" = Texinfo; then
1228 escape=@
1229 fi
1230 fi
1231
1232 if test -n "$makeinfo"; then
1233 # in_src: the file with macros expanded.
1234 # Use the same basename to generate the same aux file names.
1235 work_src=$workdir/src
1236 ensure_dir "$work_src"
1237 in_src=$work_src/$in_base
8868edaf 1238 run_mi_includes=`list_prefix includes -I`
a0c0a00f
CR
1239 verbose "Macro-expanding $command_line_filename to $in_src ..."
1240 # eval $makeinfo because it might be defined as something complex
1241 # (running missing) and then we end up with things like '"-I"',
1242 # and "-I" (including the quotes) is not an option name. This
1243 # happens with gettext 0.14.5, at least.
1244 $SED "$comment_iftex" "$command_line_filename" \
8868edaf 1245 | eval $makeinfo --footnote-style=end -I "$in_dir" $run_mi_includes \
a0c0a00f
CR
1246 -o /dev/null --macro-expand=- \
1247 | $SED "$uncomment_iftex" >"$in_src"
1248 # Continue only if everything succeeded.
1249 if test $? -ne 0 \
1250 || test ! -r "$in_src"; then
1251 verbose "Expansion failed, ignored...";
1252 else
1253 in_input=$in_src
1254 fi
1255 fi
1256}
1257
8868edaf
CR
1258# Unfortunately, makeinfo --iftex --no-ifinfo doesn't work well enough
1259# in versions before 5.0, as makeinfo can't parse the TeX commands
1260# inside @tex blocks, so work around with sed.
1261#
1262# This sed script preprocesses Texinfo sources in order to keep the
1263# iftex sections only. We want to remove non-TeX sections, and comment
1264# (with `@c _texi2dvi') TeX sections so that makeinfo does not try to
1265# parse them. Nevertheless, while commenting TeX sections, don't
1266# comment @macro/@end macro so that makeinfo does propagate them.
1267# Similarly, preserve the @top node to avoid makeinfo complaining about
1268# it being missed. Comment it out after preprocessing, so that it does
1269# not appear in the generated document.
1270#
1271# We assume that `@c _texi2dvi' or `@c (_texi2dvi)' starting a line is
1272# not present in the document. Additionally, conditionally defined
1273# macros inside the @top node may end up with the wrong value, although
1274# this is unlikely in practice.
1275#
1276comment_iftex=\
1277'/^@tex/,/^@end tex/{
1278 s/^/@c _texi2dvi/
1279}
1280/^@iftex/,/^@end iftex/{
1281 s/^/@c _texi2dvi/
1282 /^@c _texi2dvi@macro/,/^@c _texi2dvi@end macro/{
1283 s/^@c _texi2dvi//
1284 }
1285}
1286/^@ifnottex/,/^@end ifnottex/{
1287 s/^/@c (_texi2dvi)/
1288 /^@c (_texi2dvi)@node Top/,/^@c (_texi2dvi)@end ifnottex/ {
1289 /^@c (_texi2dvi)@end ifnottex/b
1290 s/^@c (_texi2dvi)//
1291 }
1292}
1293/^@ifinfo/,/^@end ifinfo/{
1294 /^@node/p
1295 /^@menu/,/^@end menu/p
1296 t
1297 s/^/@c (_texi2dvi)/
1298}
1299s/^@ifnotinfo/@c _texi2dvi@ifnotinfo/
1300s/^@end ifnotinfo/@c _texi2dvi@end ifnotinfo/'
1301
1302# Uncomment @iftex blocks by removing any leading `@c texi2dvi' (repeated
1303# copies can sneak in via macro invocations). Likewise, comment out
1304# the @top node inside a @ifnottex block.
1305uncomment_iftex=\
1306's/^@c _texi2dvi\(@c _texi2dvi\)*//
1307/^@c (_texi2dvi)@ifnottex/,/^@c (_texi2dvi)@end ifnottex/{
1308 s/^/@c (_texi2dvi)/
1309}'
1310
1311
1312# insert_commands - Insert $textra commands at the beginning of the file.
1313# Recommended to be used for @finalout, @smallbook, etc.
a0c0a00f
CR
1314insert_commands ()
1315{
1316 if test -n "$textra"; then
1317 # _xtr. The file with the user's extra commands.
1318 work_xtr=$workdir/xtr
1319 in_xtr=$work_xtr/$in_base
1320 ensure_dir "$work_xtr"
1321 verbose "Inserting extra commands: $textra"
a0c0a00f
CR
1322 case $in_lang in
1323 latex) textra_cmd=1i;;
8868edaf
CR
1324 texinfo)
1325 textra_cmd='/^\\input texinfo/a'
1326 # insert after @setfilename line if present
1327 if head -n 10 $in_input | grep '^@setfilename' ; then
1328 textra_cmd='/^@setfilename/a'
1329 fi
1330 ;;
a0c0a00f
CR
1331 *) error 1 "internal error, unknown language: $in_lang";;
1332 esac
1333 $SED "$textra_cmd\\
1334$textra" "$in_input" >"$in_xtr"
1335 in_input=$in_xtr
1336 fi
b80f6443 1337
a0c0a00f
CR
1338 case $in_lang:$latex2html:`out_lang_tex` in
1339 latex:tex4ht:html)
1340 # _tex4ht. The file with the added \usepackage{tex4ht}.
1341 work_tex4ht=$workdir/tex4ht
1342 in_tex4ht=$work_tex4ht/$in_base
1343 ensure_dir "$work_tex4ht"
1344 verbose "Inserting \\usepackage{tex4ht}"
1345 perl -pe 's<\\documentclass(?:\[.*\])?{.*}>
1346 <$&\\usepackage[xhtml]{tex4ht}>' \
1347 "$in_input" >"$in_tex4ht"
1348 in_input=$in_tex4ht
1349 ;;
1350 esac
1351}
1352
8868edaf
CR
1353
1354# compute_language FILENAME - Return the short string for the language
1355# in which FILENAME is written: `texinfo' or `latex'.
a0c0a00f
CR
1356compute_language ()
1357{
1358 # If the user explicitly specified the language, use that.
1359 # Otherwise, if the first line is \input texinfo, assume it's texinfo.
1360 # Otherwise, guess from the file extension.
1361 if test -n "$set_language"; then
1362 echo $set_language
1363 elif $SED 1q "$1" | grep 'input texinfo' >&6; then
1364 echo texinfo
1365 else
1366 # Get the type of the file (latex or texinfo) from the given language
1367 # we just guessed, or from the file extension if not set yet.
1368 case $1 in
1369 *.ltx | *.tex | *.drv | *.dtx) echo latex;;
1370 *) echo texinfo;;
1371 esac
1372 fi
1373}
1374
1375
8868edaf 1376# run_hevea (MODE) - Convert to HTML/INFO/TEXT.
a0c0a00f
CR
1377#
1378# Don't pass `-noiso' to hevea: it's useless in HTML since anyway the
1379# charset is set to latin1, and troublesome in other modes since
1380# accented characters loose their accents.
1381#
1382# Don't pass `-o DEST' to hevea because in that case it leaves all its
1383# auxiliary files there too... Too bad, because it means we will need
1384# to handle images some day.
1385run_hevea ()
1386{
8868edaf
CR
1387 run_hevea_name="${HEVEA:-hevea}"
1388 run_hevea_cmd="$run_hevea_name"
a0c0a00f
CR
1389
1390 case $1 in
1391 html) ;;
8868edaf
CR
1392 text|info) run_hevea_cmd="$run_hevea_cmd -$1";;
1393 *) error 1 "run_hevea_cmd: invalid argument: $1";;
a0c0a00f
CR
1394 esac
1395
1396 # Compiling to the tmp directory enables to preserve a previous
1397 # successful compilation.
8868edaf
CR
1398 run_hevea_cmd="$run_hevea_cmd -fix -O -o '$out_base'"
1399 run_hevea_cmd="$run_hevea_cmd `list_prefix includes -I` -I '$orig_pwd' "
1400 run_hevea_cmd="$run_hevea_cmd '$rel$in_input'"
a0c0a00f
CR
1401
1402 if $debug; then
8868edaf 1403 run_hevea_cmd="$run_hevea_cmd -v -v"
a0c0a00f
CR
1404 fi
1405
8868edaf
CR
1406 verbose "running $run_hevea_cmd"
1407 if eval "$run_hevea_cmd" >&5; then
a0c0a00f
CR
1408 # hevea leaves trailing white spaces, this is annoying.
1409 case $1 in text|info)
1410 perl -pi -e 's/[ \t]+$//g' "$out_base"*;;
1411 esac
1412 case $1 in
1413 html|text) move_to_dest "$out_base";;
1414 info) # There can be foo.info-1, foo.info-2 etc.
1415 move_to_dest "$out_base"*;;
1416 esac
1417 else
8868edaf 1418 error 1 "$run_hevea_name exited with bad status, quitting."
a0c0a00f
CR
1419 fi
1420}
1421
1422
8868edaf 1423# run_core_conversion - Run TeX (or HeVeA).
a0c0a00f
CR
1424run_core_conversion ()
1425{
1426 case $in_lang:$latex2html:`out_lang_tex` in
1427 *:dvi|*:pdf|latex:tex4ht:html)
1428 run_tex;;
1429 latex:*:html|latex:*:text|latex:*:info)
1430 run_hevea $out_lang;;
1431 *)
1432 error 1 "invalid input/output combination: $in_lang/$out_lang";;
1433 esac
1434}
1435
1436
8868edaf
CR
1437# compile - Run the full compilation chain, from pre-processing to
1438# installation of the output at its expected location.
a0c0a00f
CR
1439compile ()
1440{
8868edaf
CR
1441 # Set include path for tools:
1442 # . Include current directory in case there are files there already, so
1443 # we don't have more TeX runs than necessary. orig_pwd is used in case
1444 # we are in clean build mode, where we have cd'd to a temp directory.
1445 # . Include directory containing file, in case there are other
1446 # files @include'd.
1447 # . Keep a final path_sep to get the default (system) TeX
1448 # directories included.
1449 # . If we have any includes, put those at the end.
1450
a0c0a00f
CR
1451 common="$orig_pwd$path_sep$in_dir$path_sep"
1452 #
a0c0a00f
CR
1453 txincludes=`list_infix includes $path_sep`
1454 test -n "$txincludes" && common="$common$txincludes$path_sep"
1455 #
1456 for var in $tex_envvars; do
1457 eval val="\$common\$${var}_orig"
1458 # Convert relative paths to absolute paths, so we can run in another
1459 # directory (e.g., in clean build mode, or during the macro-support
8868edaf 1460 # detection).
a0c0a00f
CR
1461 val=`absolute_filenames "$val"`
1462 eval $var="\"$val\""
1463 export $var
1464 eval verbose \"$var=\'\$${var}\'\"
1465 done
1466
1467 # --expand
1468 run_makeinfo
1469
1470 # --command, --texinfo
1471 insert_commands
1472
8868edaf 1473 # Run until a fixed point is reached.
a0c0a00f
CR
1474 run_tex_suite
1475}
1476
8868edaf
CR
1477# make_openout_test FLAGS EXTENSION
1478# - Run TeX with an input file that performs an \openout. Pass FLAGS to TeX.
1479#
1480make_openout_test ()
1481{
1482 recorder_option_maybe="$1"
1483 make_tex_cmd
1484
1485 ensure_dir "$workdir"/check_recorder
1486 cd_dir "$workdir"/check_recorder
1487
1488 cat > openout.tex <<EOF
1489\newwrite\ourwrite
1490\immediate\openout\ourwrite dum.dum
1491\bye
1492EOF
1493 # \bye doesn't work for LaTeX, but it will cause latex
1494 # to exit with an input error.
1495 tex_cmd="$tex_cmd '${escape}input' ./openout.tex"
1496 # ./ in case . isn't in path
1497 verbose "$0: running $tex_cmd ..."
1498 rm -fr "openout.$2"
1499 (eval "$tex_cmd" >/dev/null 2>&1)
1500}
1501
1502# Check tex supports -recorder option
1503check_recorder_support ()
1504{
1505 verbose "Checking TeX recorder support..."
1506 make_openout_test " -recorder" fls
1507 if test -f openout.fls && grep '^OUTPUT dum.dum$' openout.fls > /dev/null
1508 then
1509 cd_orig
1510 verbose "Checking TeX recorder support... yes"
1511 return 0
1512 else
1513 cd_orig
1514 verbose "Checking TeX recorder support... no"
1515 return 1
1516 fi
1517}
1518
1519# Check tex supports \openout traces in log
1520check_openout_in_log_support ()
1521{
1522 verbose "Checking TeX \openout in log support..."
1523 make_openout_test "" log
1524 if test -f openout.log \
1525 && grep '^\\openout..\? *= *`\?dum\.dum'\''\?' openout.log >/dev/null
1526 then
1527 cd_orig
1528 verbose "Checking TeX \openout in log support... yes"
1529 return 0
1530 else
1531 cd_orig
1532 verbose "Checking TeX \openout in log support... no"
1533 return 1
1534 fi
1535}
1536
1537# Set that output auxiliary files are detected with the -recorder option,
1538# which creates a file JOBNAME.fls which is a machine-readable listing of
1539# files read and written during the job.
1540set_aux_files_from_fls ()
1541{
1542 recorder_option_maybe=" -recorder"
1543 generated_files_get_method=generated_files_get_from_fls
1544}
1545
1546# Set that output auxiliary files are detected with searching for \openout
1547# in the log file.
1548set_aux_files_from_log ()
1549{
1550 recorder_option_maybe=''
1551 generated_files_get_method=generated_files_get_from_log
1552}
1553
1554# Decide whether output auxiliary files are detected with the -recorder
1555# option, or by searching for \openout in the log file.
1556decide_aux_files_method ()
1557{
1558 # Select output file detection method
1559 # Valid values of TEXI2DVI_USE_RECORDER are:
1560 # yes use the -recorder option, no checks.
1561 # no scan for \openout in the log file, no checks.
1562 # yesmaybe check whether -recorder option is supported, and if yes
1563 # use it, otherwise check for tracing \openout in the
1564 # log file is supported, and if yes use it, else it is an
1565 # error.
1566 # nomaybe same as `yesmaybe', except that the \openout trace in
1567 # log file is checked first.
1568 #
1569 # The default behaviour is `nomaybe'.
1570
1571 test -n "$TEXI2DVI_USE_RECORDER" || TEXI2DVI_USE_RECORDER=nomaybe
a0c0a00f 1572
8868edaf
CR
1573 case $TEXI2DVI_USE_RECORDER in
1574 yes) set_aux_files_from_fls;;
1575
1576 no) set_aux_files_from_log;;
1577
1578 yesmaybe)
1579 if check_recorder_support; then
1580 set_aux_files_from_fls
1581 elif check_openout_in_log_support; then
1582 set_aux_files_from_log
1583 else
1584 error 1 "TeX neither supports -recorder nor outputs \\openout lines in its log file"
1585 fi
1586 ;;
1587
1588 nomaybe)
1589 if check_openout_in_log_support; then
1590 set_aux_files_from_log
1591 elif check_recorder_support; then
1592 set_aux_files_from_fls
1593 else
1594 error 1 "TeX neither supports -recorder nor outputs \\openout lines in its log file"
1595 fi
1596 ;;
1597
1598 *) error 1 "Invalid value of TEXI2DVI_USE_RECORDER environment variable : $TEXI2DVI_USE_RECORDER.";;
1599
1600 esac
1601}
1602
1603# remove FILE...
a0c0a00f
CR
1604remove ()
1605{
1606 verbose "Removing" "$@"
1607 rm -rf "$@"
1608}
1609
1610
8868edaf
CR
1611# all_files - Echo the names of all files generated, including those by
1612# auxiliary tools like texindex.
1613all_files ()
1614{
1615 echo $in_noext.log
1616 echo $in_noext.fls
1617 echo $xref_files_new
1618 echo `sorted_index_files`
1619}
1620
1621sorted_index_files ()
1622{
1623 filter_files sorted_index_filter
1624}
1625
1626# Print the name of a generated file based on FILE if there is one.
1627sorted_index_filter ()
1628{
1629 case $in_lang in
1630 texinfo)
1631 # texindex: texinfo.cp -> texinfo.cps
1632 if test -n "`index_file_p $1`" ; then
1633 echo $1s
1634 fi
1635 ;;
1636 esac
1637}
1638
1639
1640# Not currently used - use with filter_files to add secondary files created by
1641# bibtex
1642bibtex_secondary_files ()
1643{
1644 case $in_lang in
1645 latex)
1646 if test -n "`aux_file_p $1`"; then
1647 # bibtex: *.aux -> *.bbl and *.blg.
1648 echo $1 | $SED 's/^\(.*\)\.aux$/\1.bbl/'
1649 echo $1 | $SED 's/^\(.*\)\.aux$/\1.blg/'
1650 fi
1651 ;;
1652 esac
1653}
1654
1655# mostly_clean - Remove auxiliary files and directories. Changes back to
1656# the original directory.
a0c0a00f
CR
1657mostly_clean ()
1658{
1659 cd_orig
1660 set X "$t2ddir"
1661 shift
1662 $tidy || {
8868edaf 1663 set X ${1+"$@"} `all_files`
a0c0a00f
CR
1664 shift
1665 }
1666 remove ${1+"$@"}
1667}
1668
1669
8868edaf 1670# cleanup - Remove what should be removed according to options.
a0c0a00f
CR
1671# Called at the end of each compilation cycle, and at the end of
1672# the script. Changes the current directory.
1673cleanup ()
1674{
8868edaf
CR
1675 case $clean:$tidy in
1676 true:true) mostly_clean ;; # build mode is "clean"
1677 false:false) cd_orig; remove "$t2ddir";; # build mode is "local"
1678 esac
1679}
1680
1681
1682# \f input_file_name_decode - Decode COMMAND_LINE_FILENAME, and set the
1683# following shell variables:
1684#
1685# - COMMAND_LINE_FILENAME
1686# The filename given on the commmand line, but cleaned of TeX commands.
1687# - IN_DIR
1688# The directory containing the input file.
1689# - IN_BASE
1690# The input file base name (no directory part).
1691# - IN_NOEXT
1692# The input file name with neither file extensions nor directory part.
1693# - IN_INPUT
1694# The path to the input file for passing as a command-line argument
1695# to TeX. Defaults to COMMAND_LINE_FILENAME, but might change if the
1696# input is preprocessed.
1697input_file_name_decode ()
1698{
1699 case $command_line_filename in
1700 *\\input{*}*)
1701 # Let AUC-TeX error parser deal with line numbers.
1702 line_error=false
1703 command_line_filename=`\
1704 expr X"$command_line_filename" : X'.*input{\([^}]*\)}'`
1705 ;;
a0c0a00f 1706 esac
8868edaf
CR
1707
1708 # If the COMMAND_LINE_FILENAME is not absolute (e.g., --debug.tex),
1709 # prepend `./' in order to avoid that the tools take it as an option.
1710 echo "$command_line_filename" | LC_ALL=C $EGREP '^(/|[A-Za-z]:/)' >&6 \
1711 || command_line_filename="./$command_line_filename"
1712
1713 # See if the file exists. If it doesn't we're in trouble since, even
1714 # though the user may be able to reenter a valid filename at the tex
1715 # prompt (assuming they're attending the terminal), this script won't
1716 # be able to find the right xref files and so forth.
1717 test -r "$command_line_filename" \
1718 || error 1 "cannot read $command_line_filename, skipping."
1719
1720 # Get the name of the current directory.
1721 in_dir=`func_dirname "$command_line_filename"`
1722
1723 # Strip directory part but leave extension.
1724 in_base=`basename "$command_line_filename"`
1725 # Strip extension.
1726 in_noext=`noext "$in_base"`
1727
1728 # The normalized file name to compile. Must always point to the
1729 # file to actually compile (in case of recoding, macro-expansion etc.).
1730 in_input=$in_dir/$in_base
1731
1732
1733 # Compute the output file name.
1734 if test x"$oname" != x; then
1735 out_name=$oname
1736 else
1737 out_name=$in_noext.`out_lang_ext`
1738 fi
1739 out_dir=`func_dirname "$out_name"`
1740 out_dir_abs=`absolute "$out_dir"`
1741 out_base=`basename "$out_name"`
1742 out_noext=`noext "$out_base"`
a0c0a00f
CR
1743}
1744
1745
8868edaf
CR
1746# \f
1747#################### Main program starts ##########################
a0c0a00f 1748
8868edaf
CR
1749# Initialize more variables.
1750#
1751# Save TEXINPUTS so we can construct a new TEXINPUTS path for each file.
1752# Likewise for bibtex and makeindex.
1753tex_envvars="BIBINPUTS BSTINPUTS DVIPSHEADERS INDEXSTYLE MFINPUTS MPINPUTS \
1754TEXINPUTS TFMFONTS"
1755for var in $tex_envvars; do
1756 eval ${var}_orig=\$$var
1757 export $var
1758done
f73dda09
JA
1759
1760# Push a token among the arguments that will be used to notice when we
1761# ended options/arguments parsing.
1762# Use "set dummy ...; shift" rather than 'set - ..." because on
1763# Solaris set - turns off set -x (but keeps set -e).
1764# Use ${1+"$@"} rather than "$@" because Digital Unix and Ultrix 4.3
1765# still expand "$@" to a single argument (the empty string) rather
1766# than nothing at all.
1767arg_sep="$$--$$"
1768set dummy ${1+"$@"} "$arg_sep"; shift
1769
f73dda09 1770while test x"$1" != x"$arg_sep"; do
f73dda09 1771 # Handle --option=value by splitting apart and putting back on argv.
ccc6cda3 1772 case "$1" in
f73dda09 1773 --*=*)
a0c0a00f
CR
1774 opt=`echo "$1" | $SED -e 's/=.*//'`
1775 val=`echo "$1" | $SED -e 's/[^=]*=//'`
f73dda09
JA
1776 shift
1777 set dummy "$opt" "$val" ${1+"$@"}; shift
1778 ;;
1779 esac
1780
f73dda09
JA
1781 case "$1" in
1782 -@ ) escape=@;;
8868edaf
CR
1783 -~ ) verbose "Option -~ is obsolete: texi2dvi ignores it.";;
1784 -b | --batch) ;; # Obsolete
a0c0a00f
CR
1785 --build) shift; build_mode=$1;;
1786 --build-dir) shift; build_dir=$1; build_mode=tidy;;
1787 -c | --clean) build_mode=clean;;
1788 -D | --debug) debug=true;;
1789 -e | -E | --expand) expand=true;;
1790 -h | --help) usage;;
1791 -I) shift; list_concat_dirs includes "$1";;
1792 -l | --lang | --language) shift; set_language=$1;;
1793 --mostly-clean) action=mostly-clean;;
1794 --no-line-error) line_error=false;;
1795 --max-iterations) shift; max_iters=$1;;
1796 -o | --out | --output)
f73dda09 1797 shift
a0c0a00f
CR
1798 # Make it absolute, just in case we also have --clean, or whatever.
1799 oname=`absolute "$1"`;;
1800
1801 # Output formats.
1802 -O|--output-format) shift; out_lang_set "$1";;
1803 --dvi|--dvipdf|--html|--info|--pdf|--ps|--text)
1804 out_lang_set `echo "x$1" | $SED 's/^x--//'`;;
1805
1806 -p) out_lang_set pdf;;
8868edaf 1807 -q | -s | --quiet | --silent) quiet=true;;
a0c0a00f
CR
1808 --src-specials) src_specials=--src-specials;;
1809 --shell-escape) shell_escape=--shell-escape;;
1810 --tex4ht) latex2html=tex4ht;;
1811 -t | --texinfo | --command ) shift; textra="$textra\\
1812"`echo "$1" | $SED 's/\\\\/\\\\\\\\/g'`;;
1813 --translate-file ) shift; translate_file="$1";;
1814 --tidy) build_mode=tidy;;
1815 -v | --vers*) version;;
1816 -V | --verb*) verb=true;;
f73dda09 1817 --) # What remains are not options.
ccc6cda3 1818 shift
f73dda09
JA
1819 while test x"$1" != x"$arg_sep"; do
1820 set dummy ${1+"$@"} "$1"; shift
1821 shift
1822 done
1823 break;;
1824 -*)
a0c0a00f
CR
1825 error 1 "Unknown or ambiguous option \`$1'." \
1826 "Try \`--help' for more information."
1827 ;;
f73dda09 1828 *) set dummy ${1+"$@"} "$1"; shift;;
726f6388 1829 esac
f73dda09 1830 shift
726f6388 1831done
f73dda09
JA
1832# Pop the token
1833shift
726f6388 1834
a0c0a00f
CR
1835# $tidy: compile in a t2d directory.
1836# $clean: remove all the aux files.
1837case $build_mode in
1838 local) clean=false; tidy=false;;
1839 tidy) clean=false; tidy=true;;
1840 clean) clean=true; tidy=true;;
1841 *) error 1 "invalid build mode: $build_mode";;
1842esac
1843
f73dda09 1844# Interpret remaining command line args as filenames.
b80f6443
JA
1845case $# in
1846 0)
a0c0a00f 1847 error 2 "Missing file arguments." "Try \`--help' for more information."
b80f6443
JA
1848 ;;
1849 1) ;;
1850 *)
1851 if test -n "$oname"; then
a0c0a00f 1852 error 2 "Can't use option \`--output' with more than one argument."
b80f6443
JA
1853 fi
1854 ;;
1855esac
b72432fd 1856
f73dda09 1857
a0c0a00f 1858# We can't do much without tex.
8868edaf 1859# End up with the TEX and PDFTEX variables set to what we are going to use.
a0c0a00f 1860#
8868edaf
CR
1861# If $TEX is set to a directory, don't use it.
1862test -n "$TEX" && test -d "$TEX" && unset TEX
1863
1864# But otherwise, use $TEX if it is set.
1865if test -z "$TEX"; then
1866 if findprog tex; then :; else cat <<EOM >&2
1867You don't have a working TeX binary (tex) installed anywhere in
a0c0a00f
CR
1868your PATH, and texi2dvi cannot proceed without one. If you want to use
1869this script, you'll need to install TeX (if you don't have it) or change
1870your PATH or TEX environment variable (if you do). See the --help
1871output for more details.
f73dda09 1872
a0c0a00f
CR
1873For information about obtaining TeX, please see http://tug.org/texlive,
1874or do a web search for TeX and your operating system or distro.
1875EOM
8868edaf
CR
1876 exit 1
1877 fi
f73dda09 1878
8868edaf
CR
1879 # We want to use etex (or pdftex) if they are available, and the user
1880 # didn't explicitly specify. We don't check for elatex and pdfelatex
1881 # because (as of 2003), the LaTeX team has asked that new distributions
1882 # use etex by default anyway.
1883 #
a0c0a00f
CR
1884 if findprog etex; then TEX=etex; else TEX=tex; fi
1885fi
8868edaf
CR
1886
1887# For many years, the pdftex binary has included the e-tex extensions,
1888# but for those people with ancient TeX distributions ...
a0c0a00f
CR
1889if test -z "$PDFTEX"; then
1890 if findprog pdfetex; then PDFTEX=pdfetex; else PDFTEX=pdftex; fi
1891fi
f73dda09 1892
f73dda09
JA
1893
1894# File descriptor usage:
1895# 0 standard input
1896# 1 standard output (--verbose messages)
1897# 2 standard error
f73dda09 1898# 5 tools output (turned off by --quiet)
a0c0a00f
CR
1899# 6 tracing/debugging (set -x output, etc.)
1900
a0c0a00f
CR
1901# Main tools' output (TeX, etc.) that TeX users are used to seeing.
1902#
1903# If quiet, discard, else redirect to the message flow.
1904if $quiet; then
f73dda09
JA
1905 exec 5>/dev/null
1906else
1907 exec 5>&1
1908fi
1909
a0c0a00f
CR
1910
1911# Enable tracing, and auxiliary tools output.
1912#
1913# This fd should be used where you'd typically use /dev/null to throw
1914# output away. But sometimes it is convenient to see that output (e.g.,
1915# from a grep) to aid debugging. Especially debugging at distance, via
1916# the user.
1917#
1918if $debug; then
1919 exec 6>&1
1920 set -vx
1921else
1922 exec 6>/dev/null
1923fi
726f6388 1924
f73dda09 1925
8868edaf 1926# \f Main program main loop - TeXify each file in turn.
a0c0a00f
CR
1927for command_line_filename
1928do
1929 verbose "Processing $command_line_filename ..."
f73dda09 1930
a0c0a00f 1931 input_file_name_decode
f73dda09 1932
a0c0a00f
CR
1933 # `texinfo' or `latex'?
1934 in_lang=`compute_language "$command_line_filename"`
b72432fd 1935
a0c0a00f
CR
1936 # An auxiliary directory used for all the auxiliary tasks involved
1937 # in compiling this document.
1938 case $build_dir in
1939 '' | . ) t2ddir=$out_noext.t2d ;;
1940 *) # Avoid collisions between multiple occurrences of the same
1941 # file, so depend on the output path. Remove leading `./',
1942 # at least to avoid creating a file starting with `.!', i.e.,
1943 # an invisible file. The sed expression is fragile if the cwd
1944 # has active characters. Transform / into ! so that we don't
1945 # need `mkdir -p'. It might be something to reconsider.
1946 t2ddir=$build_dir/`echo "$out_dir_abs/$out_noext.t2d" |
1947 $SED "s,^$orig_pwd/,,;s,^\./,,;s,/,!,g"`
1948 esac
1949 # Remove it at exit if clean mode.
1950 trap "cleanup" 0 1 2 15
f73dda09 1951
a0c0a00f 1952 ensure_dir "$build_dir" "$t2ddir"
f73dda09 1953
a0c0a00f
CR
1954 # Sometimes there are incompatibilities between auxiliary files for
1955 # DVI and PDF. The contents can also change whether we work on PDF
1956 # and/or DVI. So keep separate spaces for each.
1957 workdir=$t2ddir/`out_lang_tex`
1958 ensure_dir "$workdir"
f73dda09 1959
a0c0a00f
CR
1960 # _build. In a tidy build, where the auxiliary files are output.
1961 if $tidy; then
1962 work_build=$workdir/build
1963 else
1964 work_build=.
1965 fi
f73dda09 1966
a0c0a00f
CR
1967 # _bak. Copies of the previous auxiliary files (another round is
1968 # run if they differ from the new ones).
1969 work_bak=$workdir/bak
726f6388 1970
a0c0a00f
CR
1971 # Make those directories.
1972 ensure_dir "$work_build" "$work_bak"
b72432fd 1973
8868edaf
CR
1974 # Decide how to find auxiliary files created by TeX.
1975 decide_aux_files_method
1976
a0c0a00f
CR
1977 case $action in
1978 compile)
1979 # Compile the document.
1980 compile
1981 cleanup
1982 ;;
b72432fd 1983
a0c0a00f 1984 mostly-clean)
8868edaf 1985 xref_files_new=`generated_files_get`
a0c0a00f
CR
1986 mostly_clean
1987 ;;
1988 esac
726f6388
JA
1989done
1990
a0c0a00f 1991verbose "done."
f73dda09 1992exit 0 # exit successfully, not however we ended the loop.
8868edaf
CR
1993# Local Variables:
1994# sh-basic-offset: 2
1995# sh-indentation: 2
1996# End: