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