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