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