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