Commit | Line | Data |
---|---|---|
d60d9f65 | 1 | #! /bin/sh |
775e241e TT |
2 | # texi2dvi --- produce DVI (or PDF) files from Texinfo (or (La)TeX) sources. |
3 | # $Id: texi2dvi 5704 2014-07-07 17:45:16Z karl $ | |
c862e87b | 4 | # |
775e241e TT |
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. | |
c862e87b | 8 | # |
775e241e TT |
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. | |
d60d9f65 | 13 | # |
775e241e TT |
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. | |
d60d9f65 | 18 | # |
775e241e TT |
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/>. | |
c862e87b | 21 | # |
775e241e | 22 | # Originally written by Noah Friedman. |
c862e87b JM |
23 | # |
24 | # Please send bug reports, etc. to bug-texinfo@gnu.org. | |
d60d9f65 SS |
25 | # If possible, please send a copy of the output of the script called with |
26 | # the `--debug' option when making a bug report. | |
d60d9f65 | 27 | |
775e241e TT |
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 $' | |
5836a818 | 41 | rcs_version=`set - $rcs_revision; echo $2` |
775e241e TT |
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 | |
4a11f206 | 1257 | |
775e241e TT |
1258 | # report progress |
1259 | cycle=`expr $cycle + 1` | |
1260 | verbose "Cycle $cycle for $command_line_filename" | |
4a11f206 | 1261 | |
775e241e | 1262 | xref_files_save |
4a11f206 | 1263 | |
775e241e TT |
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 | |
4a11f206 | 1270 | |
775e241e TT |
1271 | xref_files_changed || break |
1272 | done | |
4a11f206 | 1273 | |
775e241e TT |
1274 | # If we were using thumbpdf and producing PDF, then run thumbpdf |
1275 | # and TeX one last time. | |
1276 | run_thumbpdf | |
4a11f206 | 1277 | |
775e241e TT |
1278 | # If we are using tex4ht, call it. |
1279 | run_tex4ht | |
4a11f206 | 1280 | |
775e241e TT |
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 | |
4a11f206 | 1294 | |
775e241e TT |
1295 | cd_orig |
1296 | } | |
4a11f206 | 1297 | |
775e241e TT |
1298 | ## -------------------------------- ## |
1299 | ## TeX processing auxiliary tools. ## | |
1300 | ## -------------------------------- ## | |
4a11f206 PP |
1301 | |
1302 | ||
775e241e TT |
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 | |
4a11f206 | 1440 | |
775e241e TT |
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 | ## ---------------------- ## | |
9255ee31 EZ |
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 | |
d60d9f65 | 1644 | # Parse command line arguments. |
9255ee31 EZ |
1645 | while test x"$1" != x"$arg_sep"; do |
1646 | ||
1647 | # Handle --option=value by splitting apart and putting back on argv. | |
d60d9f65 | 1648 | case "$1" in |
9255ee31 | 1649 | --*=*) |
775e241e TT |
1650 | opt=`echo "$1" | $SED -e 's/=.*//'` |
1651 | val=`echo "$1" | $SED -e 's/[^=]*=//'` | |
9255ee31 EZ |
1652 | shift |
1653 | set dummy "$opt" "$val" ${1+"$@"}; shift | |
1654 | ;; | |
1655 | esac | |
1656 | ||
9255ee31 EZ |
1657 | case "$1" in |
1658 | -@ ) escape=@;; | |
775e241e | 1659 | -~ ) catcode_special=false;; |
9255ee31 | 1660 | # Silently and without documentation accept -b and --b[atch] as synonyms. |
775e241e TT |
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) | |
9255ee31 | 1674 | shift |
775e241e TT |
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;; | |
9255ee31 | 1694 | --) # What remains are not options. |
d60d9f65 | 1695 | shift |
9255ee31 EZ |
1696 | while test x"$1" != x"$arg_sep"; do |
1697 | set dummy ${1+"$@"} "$1"; shift | |
1698 | shift | |
1699 | done | |
1700 | break;; | |
1701 | -*) | |
775e241e TT |
1702 | error 1 "Unknown or ambiguous option \`$1'." \ |
1703 | "Try \`--help' for more information." | |
1704 | ;; | |
9255ee31 | 1705 | *) set dummy ${1+"$@"} "$1"; shift;; |
d60d9f65 | 1706 | esac |
9255ee31 | 1707 | shift |
d60d9f65 | 1708 | done |
9255ee31 EZ |
1709 | # Pop the token |
1710 | shift | |
d60d9f65 | 1711 | |
775e241e TT |
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 | ||
9255ee31 | 1721 | # Interpret remaining command line args as filenames. |
5bdf8622 DJ |
1722 | case $# in |
1723 | 0) | |
775e241e | 1724 | error 2 "Missing file arguments." "Try \`--help' for more information." |
5bdf8622 DJ |
1725 | ;; |
1726 | 1) ;; | |
1727 | *) | |
1728 | if test -n "$oname"; then | |
775e241e | 1729 | error 2 "Can't use option \`--output' with more than one argument." |
5bdf8622 DJ |
1730 | fi |
1731 | ;; | |
1732 | esac | |
c862e87b | 1733 | |
9255ee31 | 1734 | |
775e241e TT |
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. | |
9255ee31 | 1743 | |
775e241e TT |
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 | |
9255ee31 | 1749 | |
9255ee31 | 1750 | |
775e241e TT |
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 | |
9255ee31 | 1764 | |
9255ee31 EZ |
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) | |
775e241e TT |
1773 | # 6 tracing/debugging (set -x output, etc.) |
1774 | ||
9255ee31 | 1775 | |
775e241e TT |
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 | |
9255ee31 EZ |
1780 | exec 5>/dev/null |
1781 | else | |
1782 | exec 5>&1 | |
1783 | fi | |
1784 | ||
775e241e TT |
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 | |
d60d9f65 | 1799 | |
9255ee31 | 1800 | # \f |
9255ee31 | 1801 | |
775e241e TT |
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 | |
c862e87b | 1833 | |
9255ee31 EZ |
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. | |
775e241e | 1836 | echo "$command_line_filename" | LC_ALL=C $EGREP '^(/|[A-Za-z]:/)' >&6 \ |
9255ee31 EZ |
1837 | || command_line_filename="./$command_line_filename" |
1838 | ||
1839 | # See if the file exists. If it doesn't we're in trouble since, even | |
c862e87b JM |
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 | |
9255ee31 | 1842 | # be able to find the right xref files and so forth. |
775e241e TT |
1843 | test -r "$command_line_filename" \ |
1844 | || error 1 "cannot read $command_line_filename, skipping." | |
9255ee31 | 1845 | |
775e241e TT |
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 | |
5836a818 | 1853 | |
9255ee31 | 1854 | # Strip directory part but leave extension. |
775e241e | 1855 | in_base=`basename "$command_line_filename"` |
9255ee31 | 1856 | # Strip extension. |
775e241e | 1857 | in_noext=`noext "$in_base"` |
9255ee31 | 1858 | |
775e241e TT |
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 | |
c862e87b | 1862 | |
5bdf8622 | 1863 | |
775e241e TT |
1864 | # Compute the output file name. |
1865 | if test x"$oname" != x; then | |
1866 | out_name=$oname | |
9255ee31 | 1867 | else |
775e241e | 1868 | out_name=$in_noext.`out_lang_ext` |
5836a818 | 1869 | fi |
775e241e TT |
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 | } | |
9255ee31 | 1875 | |
9255ee31 | 1876 | |
775e241e TT |
1877 | ## -------------- ## |
1878 | ## TeXify files. ## | |
1879 | ## -------------- ## | |
9255ee31 | 1880 | |
775e241e TT |
1881 | for command_line_filename |
1882 | do | |
1883 | verbose "Processing $command_line_filename ..." | |
c862e87b | 1884 | |
775e241e | 1885 | input_file_name_decode |
9255ee31 | 1886 | |
775e241e TT |
1887 | # `texinfo' or `latex'? |
1888 | in_lang=`compute_language "$command_line_filename"` | |
9255ee31 | 1889 | |
775e241e TT |
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 | |
9255ee31 | 1905 | |
775e241e | 1906 | ensure_dir "$build_dir" "$t2ddir" |
9255ee31 | 1907 | |
775e241e TT |
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" | |
d60d9f65 | 1915 | |
775e241e TT |
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 | |
c862e87b | 1922 | |
775e241e TT |
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 | |
c862e87b | 1926 | |
775e241e TT |
1927 | # Make those directories. |
1928 | ensure_dir "$work_build" "$work_bak" | |
5836a818 | 1929 | |
775e241e TT |
1930 | case $action in |
1931 | compile) | |
1932 | # Compile the document. | |
1933 | compile | |
1934 | cleanup | |
1935 | ;; | |
5836a818 | 1936 | |
775e241e TT |
1937 | mostly-clean) |
1938 | mostly_clean | |
1939 | ;; | |
1940 | esac | |
d60d9f65 SS |
1941 | done |
1942 | ||
775e241e | 1943 | verbose "done." |
9255ee31 | 1944 | exit 0 # exit successfully, not however we ended the loop. |