1944 lines
		
	
	
	
		
			56 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			1944 lines
		
	
	
	
		
			56 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable file
		
	
	
	
	
#! /bin/sh
 | 
						||
# texi2dvi --- produce DVI (or PDF) files from Texinfo (or (La)TeX) sources.
 | 
						||
# $Id: texi2dvi 5704 2014-07-07 17:45:16Z karl $
 | 
						||
#
 | 
						||
# Copyright 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002,
 | 
						||
# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014
 | 
						||
# Free Software Foundation, Inc.
 | 
						||
#
 | 
						||
# This program is free software; you can redistribute it and/or modify
 | 
						||
# it under the terms of the GNU General Public License as published by
 | 
						||
# the Free Software Foundation; either version 3 of the License,
 | 
						||
# or (at your option) any later version.
 | 
						||
#
 | 
						||
# This program is distributed in the hope that it will be useful,
 | 
						||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
						||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
						||
# GNU General Public License for more details.
 | 
						||
#
 | 
						||
# You should have received a copy of the GNU General Public License
 | 
						||
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
						||
#
 | 
						||
# Originally written by Noah Friedman.
 | 
						||
#
 | 
						||
# Please send bug reports, etc. to bug-texinfo@gnu.org.
 | 
						||
# If possible, please send a copy of the output of the script called with
 | 
						||
# the `--debug' option when making a bug report.
 | 
						||
 | 
						||
test -f /bin/ksh && test -z "$RUNNING_KSH" \
 | 
						||
  && { UNAMES=`uname -s`; test "x$UNAMES" = xULTRIX; } 2>/dev/null \
 | 
						||
  && { RUNNING_KSH=true; export RUNNING_KSH; exec /bin/ksh $0 ${1+"$@"}; }
 | 
						||
unset RUNNING_KSH
 | 
						||
 | 
						||
# No failure shall remain unpunished.
 | 
						||
set -e
 | 
						||
 | 
						||
# In case the default sed doesn't suffice.
 | 
						||
: ${SED=sed}
 | 
						||
 | 
						||
# This string is expanded automatically when this file is checked out.
 | 
						||
rcs_revision='$Revision: 5704 $'
 | 
						||
rcs_version=`set - $rcs_revision; echo $2`
 | 
						||
program=`echo $0 | $SED -e 's!.*/!!'`
 | 
						||
 | 
						||
build_mode=${TEXI2DVI_BUILD_MODE:-local}
 | 
						||
build_dir=${TEXI2DVI_BUILD_DIRECTORY:-.}
 | 
						||
 | 
						||
# Initialize variables for option overriding and otherwise.
 | 
						||
# Don't use `unset' since old bourne shells don't have this command.
 | 
						||
# Instead, assign them an empty value.
 | 
						||
action=compile
 | 
						||
batch=false     # interact normally
 | 
						||
catcode_special=maybe
 | 
						||
debug=false
 | 
						||
escape="\\"
 | 
						||
expand=false    # true for expansion via makeinfo
 | 
						||
includes=
 | 
						||
line_error=true # pass --file-line-error to TeX
 | 
						||
max_iters=7     # when to quit
 | 
						||
oname=          # --output
 | 
						||
out_lang=dvi
 | 
						||
quiet=false     # let the tools' message be displayed
 | 
						||
set_language=
 | 
						||
src_specials=
 | 
						||
shell_escape=
 | 
						||
latex2html=hevea  # or set to tex4ht
 | 
						||
textra=         # Extra TeX commands to insert in the input file.
 | 
						||
txiprereq=19990129 # minimum texinfo.tex version with macro expansion
 | 
						||
verb=false      # true for verbose mode
 | 
						||
translate_file= # name of charset translation file
 | 
						||
 | 
						||
orig_pwd=`pwd`
 | 
						||
 | 
						||
# We have to initialize IFS to space tab newline since we save and
 | 
						||
# restore IFS and apparently POSIX allows stupid/broken behavior with
 | 
						||
# empty-but-set IFS.
 | 
						||
# http://lists.gnu.org/archive/html/automake-patches/2006-05/msg00008.html
 | 
						||
# We need space, tab and new line, in precisely that order.  And don't leave
 | 
						||
# trailing blanks.
 | 
						||
space=' '
 | 
						||
tab='	'
 | 
						||
newline='
 | 
						||
'
 | 
						||
IFS="$space$tab$newline"
 | 
						||
 | 
						||
# In case someone pedantic insists on using grep -E.
 | 
						||
: ${EGREP=egrep}
 | 
						||
 | 
						||
# Systems which define $COMSPEC or $ComSpec use semicolons to separate
 | 
						||
# directories in TEXINPUTS -- except for Cygwin et al., where COMSPEC
 | 
						||
# might be inherited, but : is used.
 | 
						||
if test -n "$COMSPEC$ComSpec" \
 | 
						||
   && uname | $EGREP -iv 'cygwin|mingw|djgpp' >/dev/null; then
 | 
						||
  path_sep=";"
 | 
						||
else
 | 
						||
  path_sep=":"
 | 
						||
fi
 | 
						||
 | 
						||
# Pacify verbose cds.
 | 
						||
CDPATH=${ZSH_VERSION+.}$path_sep
 | 
						||
 | 
						||
# If $TEX is set to a directory, don't use it.
 | 
						||
test -n "$TEX" && test -d "$TEX" && unset TEX
 | 
						||
 | 
						||
# 
 | 
						||
## --------------------- ##
 | 
						||
## Auxiliary functions.  ##
 | 
						||
## --------------------- ##
 | 
						||
 | 
						||
# In case `local' is not supported by the shell, provide a function
 | 
						||
# that simulates it by simply performing the assignments.  This means
 | 
						||
# that we must not expect `local' to work, i.e., we must not (i) rely
 | 
						||
# on it during recursion, and (ii) have two local declarations of the
 | 
						||
# same variable.  (ii) is easy to check statically, and our test suite
 | 
						||
# does make sure there is never twice a static local declaration of a
 | 
						||
# variable.  (i) cannot be checked easily, so just be careful.
 | 
						||
#
 | 
						||
# Note that since we might use a function simulating `local', we can
 | 
						||
# no longer rely on the fact that no IFS-splitting is performed.  So,
 | 
						||
# while
 | 
						||
#
 | 
						||
# foo=$bar
 | 
						||
#
 | 
						||
# is fine (no IFS-splitting), never write
 | 
						||
#
 | 
						||
# local foo=$bar
 | 
						||
#
 | 
						||
# but rather
 | 
						||
#
 | 
						||
# local foo="$bar"
 | 
						||
(
 | 
						||
  foo=bar
 | 
						||
  test_local () {
 | 
						||
    local foo=foo
 | 
						||
  }
 | 
						||
  test_local >/dev/null 2>&1
 | 
						||
  test $foo = bar
 | 
						||
) || eval '
 | 
						||
local () {
 | 
						||
  case $1 in
 | 
						||
    *=*) eval "$1";;
 | 
						||
  esac
 | 
						||
}
 | 
						||
'
 | 
						||
 | 
						||
 | 
						||
# cd_orig
 | 
						||
# -------
 | 
						||
# Return to the original directory.
 | 
						||
cd_orig ()
 | 
						||
{
 | 
						||
  # In case $orig_pwd is on a different drive (for DOS).
 | 
						||
  cd /
 | 
						||
 | 
						||
  # Return to the original directory so that
 | 
						||
  # - the next file is processed in correct conditions
 | 
						||
  # - the temporary file can be removed
 | 
						||
  cd "$orig_pwd" || exit 1
 | 
						||
}
 | 
						||
 | 
						||
# func_dirname FILE
 | 
						||
# -----------------
 | 
						||
# Return the directory part of FILE.
 | 
						||
func_dirname ()
 | 
						||
{
 | 
						||
  dirname "$1" 2>/dev/null \
 | 
						||
  || { echo "$1" | $SED 's!/[^/]*$!!;s!^$!.!'; }
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
# noexit FILE
 | 
						||
# -----------
 | 
						||
# Return FILE with one extension remove.  foo.bar.baz -> foo.bar.
 | 
						||
noext ()
 | 
						||
{
 | 
						||
  echo "$1" | $SED -e 's/\.[^/.][^/.]*$//'
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
# absolute NAME -> ABS-NAME
 | 
						||
# -------------------------
 | 
						||
# Return an absolute path to NAME.
 | 
						||
absolute ()
 | 
						||
{
 | 
						||
  case $1 in
 | 
						||
   [\\/]* | ?:[\\/]*)
 | 
						||
      # Absolute paths don't need to be expanded.
 | 
						||
      echo "$1"
 | 
						||
      ;;
 | 
						||
   *) local slashes
 | 
						||
      slashes=`echo "$1" | $SED -n 's,.*[^/]\(/*\)$,\1,p'`
 | 
						||
      local rel
 | 
						||
      rel=$orig_pwd/`func_dirname "$1"`
 | 
						||
      if test -d "$rel"; then
 | 
						||
        (cd "$rel" 2>/dev/null \
 | 
						||
         && local n
 | 
						||
         n=`pwd`/`basename "$1"`"$slashes"
 | 
						||
         echo "$n")
 | 
						||
      else
 | 
						||
        error 1 "not a directory: $rel"
 | 
						||
      fi
 | 
						||
      ;;
 | 
						||
  esac
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
# ensure_dir DIR1 DIR2...
 | 
						||
# -----------------------
 | 
						||
# Make sure the directories exist.
 | 
						||
ensure_dir ()
 | 
						||
{
 | 
						||
  for dir
 | 
						||
  do
 | 
						||
    # Beware that in parallel builds we may have several concurrent
 | 
						||
    # attempts to create the directory.  So fail only if "mkdir"
 | 
						||
    # failed *and* the directory still does not exist.
 | 
						||
    test -d "$dir" \
 | 
						||
      || mkdir "$dir" \
 | 
						||
      || test -d "$dir" \
 | 
						||
      || error 1 "cannot create directory: $dir"
 | 
						||
  done
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
# error EXIT_STATUS LINE1 LINE2...
 | 
						||
# --------------------------------
 | 
						||
# Report an error and exit with failure if EXIT_STATUS is non-null.
 | 
						||
error ()
 | 
						||
{
 | 
						||
  local s="$1"
 | 
						||
  shift
 | 
						||
  report "$@"
 | 
						||
  if test "$s" != 0; then
 | 
						||
    exit $s
 | 
						||
  fi
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
# findprog PROG
 | 
						||
# -------------
 | 
						||
# Return true if PROG is somewhere in PATH, else false.
 | 
						||
findprog ()
 | 
						||
{
 | 
						||
  local saveIFS="$IFS"
 | 
						||
  IFS=$path_sep  # break path components at the path separator
 | 
						||
  for dir in $PATH; do
 | 
						||
    IFS=$saveIFS
 | 
						||
    # The basic test for an executable is `test -f $f && test -x $f'.
 | 
						||
    # (`test -x' is not enough, because it can also be true for directories.)
 | 
						||
    # We have to try this both for $1 and $1.exe.
 | 
						||
    #
 | 
						||
    # Note: On Cygwin and DJGPP, `test -x' also looks for .exe.  On Cygwin,
 | 
						||
    # also `test -f' has this enhancement, but not on DJGPP.  (Both are
 | 
						||
    # design decisions, so there is little chance to make them consistent.)
 | 
						||
    # Thusly, it seems to be difficult to make use of these enhancements.
 | 
						||
    #
 | 
						||
    if   { test -f "$dir/$1"     && test -x "$dir/$1"; } \
 | 
						||
      || { test -f "$dir/$1.exe" && test -x "$dir/$1.exe"; }; then
 | 
						||
      return 0
 | 
						||
    fi
 | 
						||
  done
 | 
						||
  return 1
 | 
						||
}
 | 
						||
 | 
						||
# report LINE1 LINE2...
 | 
						||
# ---------------------
 | 
						||
# Report some information on stderr.
 | 
						||
report ()
 | 
						||
{
 | 
						||
  for i in "$@"
 | 
						||
  do
 | 
						||
    echo >&2 "$0: $i"
 | 
						||
  done
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
# run COMMAND-LINE
 | 
						||
# ----------------
 | 
						||
# Run the COMMAND-LINE verbosely, and catching errors as failures.
 | 
						||
run ()
 | 
						||
{
 | 
						||
  verbose "Running $@"
 | 
						||
  "$@" 2>&5 1>&2 \
 | 
						||
  || error 1 "$1 failed"
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
# usage
 | 
						||
# -----
 | 
						||
# Display usage and exit successfully.
 | 
						||
usage ()
 | 
						||
{
 | 
						||
  # We used to simply have `echo "$usage"', but coping with the
 | 
						||
  # changing behavior of `echo' is much harder than simply using a
 | 
						||
  # here-doc.
 | 
						||
  #
 | 
						||
  #             echo '\noto'   echo '\\noto'   echo -e '\\noto'
 | 
						||
  # bash 3.1      \noto           \\noto          \noto
 | 
						||
  # bash 3.2       %oto           \noto           -e \noto
 | 
						||
  #
 | 
						||
  # where % denotes the eol character.
 | 
						||
  cat <<EOF
 | 
						||
Usage: $program [OPTION]... FILE...
 | 
						||
  or:  texi2pdf [OPTION]... FILE...
 | 
						||
  or:  pdftexi2dvi [OPTION]... FILE...
 | 
						||
 | 
						||
Run each Texinfo or (La)TeX FILE through TeX in turn until all
 | 
						||
cross-references are resolved, building all indices.  The directory
 | 
						||
containing each FILE is searched for included files.  The suffix of FILE
 | 
						||
is used to determine its language ((La)TeX or Texinfo).  To process
 | 
						||
(e)plain TeX files, set the environment variable LATEX=tex.
 | 
						||
 | 
						||
In order to make texi2dvi a drop-in replacement of TeX/LaTeX in AUC-TeX,
 | 
						||
the FILE may also be composed of the following simple TeX commands.
 | 
						||
  \`\\input{FILE}'     the actual file to compile
 | 
						||
  \`\\nonstopmode'     same as --batch
 | 
						||
 | 
						||
When invoked as \`texi2pdf' or \`pdftexi2dvi', or given the option --pdf
 | 
						||
or --dvipdf, generate PDF output.  Otherwise, generate DVI.
 | 
						||
 | 
						||
General options:
 | 
						||
  -b, --batch         no interaction
 | 
						||
  -D, --debug         turn on shell debugging (set -x)
 | 
						||
  -h, --help          display this help and exit successfully
 | 
						||
  -o, --output=OFILE  leave output in OFILE; only one input FILE is allowed
 | 
						||
  -q, --quiet         no output unless errors (implies --batch)
 | 
						||
  -s, --silent        same as --quiet
 | 
						||
  -v, --version       display version information and exit successfully
 | 
						||
  -V, --verbose       report on what is done
 | 
						||
 | 
						||
Output format:
 | 
						||
      --dvi     output a DVI file [default]
 | 
						||
      --dvipdf  output a PDF file via DVI (using a dvi-to-pdf program)
 | 
						||
      --html    output an HTML file from LaTeX, using HeVeA
 | 
						||
      --info    output an Info file from LaTeX, using HeVeA
 | 
						||
  -p, --pdf     use pdftex or pdflatex for processing
 | 
						||
      --ps      output a PostScript file via DVI (using dvips)
 | 
						||
      --text    output a plain text file from LaTeX, using HeVeA
 | 
						||
 | 
						||
TeX tuning:
 | 
						||
  -@                         use @input instead of \input for preloaded Texinfo
 | 
						||
  -e, -E, --expand           force macro expansion using makeinfo
 | 
						||
  -I DIR                     search DIR for Texinfo files
 | 
						||
  -l, --language=LANG        specify LANG for FILE, either latex or texinfo
 | 
						||
      --no-line-error        do not pass --file-line-error to TeX
 | 
						||
      --shell-escape         pass --shell-escape to TeX
 | 
						||
      --src-specials         pass --src-specials to TeX
 | 
						||
  -t, --command=CMD          insert CMD in copy of input file
 | 
						||
   or --texinfo=CMD          multiple values accumulate
 | 
						||
      --translate-file=FILE  use given charset translation file for TeX
 | 
						||
 | 
						||
Build modes:
 | 
						||
  --build=MODE         specify the treatment of auxiliary files [$build_mode]
 | 
						||
      --tidy           same as --build=tidy
 | 
						||
  -c, --clean          same as --build=clean
 | 
						||
      --build-dir=DIR  specify where the tidy compilation is performed;
 | 
						||
                         implies --tidy;
 | 
						||
                         defaults to TEXI2DVI_BUILD_DIRECTORY [$build_dir]
 | 
						||
  --mostly-clean       remove the auxiliary files and directories
 | 
						||
                         but not the output
 | 
						||
  --max-iterations=N   don't process files more than N times [$max_iters]
 | 
						||
 | 
						||
The MODE specifies where the TeX compilation takes place, and, as a
 | 
						||
consequence, how auxiliary files are treated.  The build mode
 | 
						||
can also be set using the environment variable TEXI2DVI_BUILD_MODE.
 | 
						||
 | 
						||
Valid MODEs are:
 | 
						||
  \`local'      compile in the current directory, leaving all the auxiliary
 | 
						||
               files around.  This is the traditional TeX use.
 | 
						||
  \`tidy'       compile in a local *.t2d directory, where the auxiliary files
 | 
						||
               are left.  Output files are copied back to the original file.
 | 
						||
  \`clean'      same as \`tidy', but remove the auxiliary directory afterwards.
 | 
						||
               Every compilation therefore requires the full cycle.
 | 
						||
 | 
						||
Using the \`tidy' mode brings several advantages:
 | 
						||
  - the current directory is not cluttered with plethora of temporary files.
 | 
						||
  - clutter can be even further reduced using --build-dir=dir: all the *.t2d
 | 
						||
    directories are stored there.
 | 
						||
  - clutter can be reduced to zero using, e.g., --build-dir=/tmp/\$USER.t2d
 | 
						||
    or --build-dir=\$HOME/.t2d.
 | 
						||
  - the output file is updated after every successful TeX run, for
 | 
						||
    sake of concurrent visualization of the output.  In a \`local' build
 | 
						||
    the viewer stops during the whole TeX run.
 | 
						||
  - if the compilation fails, the previous state of the output file
 | 
						||
    is preserved.
 | 
						||
  - PDF and DVI compilation are kept in separate subdirectories
 | 
						||
    preventing any possibility of auxiliary file incompatibility.
 | 
						||
 | 
						||
On the other hand, because \`tidy' compilation takes place in another
 | 
						||
directory, occasionally TeX won't be able to find some files (e.g., when
 | 
						||
using \\graphicspath): in that case, use -I to specify the additional
 | 
						||
directories to consider.
 | 
						||
 | 
						||
The values of the BIBER, BIBTEX, DVIPDF, DVIPS, HEVEA, LATEX, MAKEINDEX,
 | 
						||
MAKEINFO, PDFLATEX, PDFTEX, SED, T4HT, TEX, TEX4HT, TEXINDEX, and THUMBPDF_CMD
 | 
						||
environment variables are used to run those commands, if they are set.
 | 
						||
 | 
						||
Regarding --dvipdf, if DVIPDF is not set in the environment, the
 | 
						||
following programs are looked for (in this order): dvipdfmx dvipdfm
 | 
						||
dvipdf dvi2pdf dvitopdf.
 | 
						||
 | 
						||
Any CMD strings are added after @setfilename for Texinfo input, or in
 | 
						||
the first line for LaTeX input.
 | 
						||
 | 
						||
Report bugs to bug-texinfo@gnu.org,
 | 
						||
general questions and discussion to help-texinfo@gnu.org.
 | 
						||
GNU Texinfo home page: <http://www.gnu.org/software/texinfo/>
 | 
						||
General help using GNU software: <http://www.gnu.org/gethelp/>
 | 
						||
EOF
 | 
						||
  exit 0
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
# verbose WORD1 WORD2
 | 
						||
# -------------------
 | 
						||
# Report some verbose information.
 | 
						||
verbose ()
 | 
						||
{
 | 
						||
  if $verb; then
 | 
						||
    echo >&2 "$0: $@"
 | 
						||
  fi
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
# version
 | 
						||
# -------
 | 
						||
# Display version info and exit successfully.
 | 
						||
version ()
 | 
						||
{
 | 
						||
  cat <<EOF
 | 
						||
texi2dvi (GNU Texinfo 5.2) $rcs_version
 | 
						||
 | 
						||
Copyright (C) 2014 Free Software Foundation, Inc.
 | 
						||
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
 | 
						||
This is free software: you are free to change and redistribute it.
 | 
						||
There is NO WARRANTY, to the extent permitted by law.
 | 
						||
EOF
 | 
						||
  exit 0
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
## ---------------- ##
 | 
						||
## Handling lists.  ##
 | 
						||
## ---------------- ##
 | 
						||
 | 
						||
 | 
						||
# list_append LIST-NAME ELEM
 | 
						||
# --------------------------
 | 
						||
# Set LIST-NAME to its former contents, with ELEM appended.
 | 
						||
list_append ()
 | 
						||
{
 | 
						||
  local la_l="$1"
 | 
						||
  shift
 | 
						||
  eval set X \$$la_l "$@"
 | 
						||
  shift
 | 
						||
  eval $la_l=\""$@"\"
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
# list_concat_dirs LIST-NAME DIR-LIST
 | 
						||
# -----------------------------------
 | 
						||
# Append to LIST-NAME all the components (included empty) from
 | 
						||
# the $path_sep separated list DIR-LIST.  Make the paths absolute.
 | 
						||
list_concat_dirs ()
 | 
						||
{
 | 
						||
  local lcd_list="$1"
 | 
						||
  # Empty path components are meaningful to tex.  We rewrite them as
 | 
						||
  # `EMPTY' so they don't get lost when we split on $path_sep.
 | 
						||
  # Hopefully no one will have an actual directory named EMPTY.
 | 
						||
  local replace_EMPTY="-e 's/^$path_sep/EMPTY$path_sep/g' \
 | 
						||
                       -e 's/$path_sep\$/${path_sep}EMPTY/g' \
 | 
						||
                       -e 's/$path_sep$path_sep/${path_sep}EMPTY:/g'"
 | 
						||
  save_IFS=$IFS
 | 
						||
  IFS=$path_sep
 | 
						||
  set x `echo "$2" | eval $SED $replace_EMPTY`; shift
 | 
						||
  IFS=$save_IFS
 | 
						||
  local dir
 | 
						||
  for dir
 | 
						||
  do
 | 
						||
    case $dir in
 | 
						||
      EMPTY)
 | 
						||
       list_append $lcd_list ""
 | 
						||
       ;;
 | 
						||
      *)
 | 
						||
       if test -d $dir; then
 | 
						||
          dir=`absolute "$dir"`
 | 
						||
         list_append $lcd_list "$dir"
 | 
						||
       fi
 | 
						||
       ;;
 | 
						||
    esac
 | 
						||
  done
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
# list_prefix LIST-NAME SEP -> STRING
 | 
						||
# -----------------------------------
 | 
						||
# Return a string that is composed of the LIST-NAME with each item
 | 
						||
# preceded by SEP.
 | 
						||
list_prefix ()
 | 
						||
{
 | 
						||
  local lp_p="$2"
 | 
						||
  eval set X \$$1
 | 
						||
  shift
 | 
						||
  local lp_res
 | 
						||
  for i
 | 
						||
  do
 | 
						||
    lp_res="$lp_res \"$lp_p\" \"$i\""
 | 
						||
  done
 | 
						||
  echo "$lp_res"
 | 
						||
}
 | 
						||
 | 
						||
# list_infix LIST-NAME SEP -> STRING
 | 
						||
# ----------------------------------
 | 
						||
# Same as list_prefix, but a separator.
 | 
						||
list_infix ()
 | 
						||
{
 | 
						||
  eval set X \$$1
 | 
						||
  shift
 | 
						||
  local la_IFS="$IFS"
 | 
						||
  IFS=$path_sep
 | 
						||
  echo "$*"
 | 
						||
  IFS=$la_IFS
 | 
						||
}
 | 
						||
 | 
						||
# list_dir_to_abs LIST-NAME
 | 
						||
# -------------------------
 | 
						||
# Convert the list to using only absolute dir names.
 | 
						||
# Currently unused, but should replace absolute_filenames some day.
 | 
						||
list_dir_to_abs ()
 | 
						||
{
 | 
						||
  local ld_l="$1"
 | 
						||
  eval set X \$$ld_l
 | 
						||
  shift
 | 
						||
  local ld_res
 | 
						||
  for dir
 | 
						||
  do
 | 
						||
    dir=`absolute "$dir"`
 | 
						||
    test -d "$dir" || continue
 | 
						||
    ld_res="$ld_res \"$dir\""
 | 
						||
  done
 | 
						||
  set X $ld_res; shift
 | 
						||
  eval $ld_l=\"$@\"
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
## ------------------------------ ##
 | 
						||
## Language auxiliary functions.  ##
 | 
						||
## ------------------------------ ##
 | 
						||
 | 
						||
 | 
						||
# out_lang_set LANG
 | 
						||
# -----------------
 | 
						||
out_lang_set ()
 | 
						||
{
 | 
						||
  case $1 in
 | 
						||
    dvi|dvipdf|html|info|pdf|ps|text) out_lang=$1;;
 | 
						||
    *) error 1 "invalid output format: $1";;
 | 
						||
  esac
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
# out_lang_tex
 | 
						||
# ------------
 | 
						||
# Return the tex output language (DVI or PDF) for $OUT_LANG.
 | 
						||
out_lang_tex ()
 | 
						||
{
 | 
						||
  case $out_lang in
 | 
						||
    dvi | ps | dvipdf ) echo dvi;;
 | 
						||
    pdf ) echo $out_lang;;
 | 
						||
    html | info | text ) echo $out_lang;;
 | 
						||
    *)    error 1 "invalid out_lang: $1";;
 | 
						||
  esac
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
# out_lang_ext
 | 
						||
# ------------
 | 
						||
# Return the extension for $OUT_LANG.
 | 
						||
out_lang_ext ()
 | 
						||
{
 | 
						||
  case $out_lang in
 | 
						||
    dvipdf ) echo pdf;;
 | 
						||
    dvi | html | info | pdf | ps | text ) echo $out_lang;;
 | 
						||
    *)    error 1 "invalid out_lang: $1";;
 | 
						||
  esac
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
## ------------------------- ##
 | 
						||
## TeX auxiliary functions.  ##
 | 
						||
## ------------------------- ##
 | 
						||
 | 
						||
# Save TEXINPUTS so we can construct a new TEXINPUTS path for each file.
 | 
						||
# Likewise for bibtex and makeindex.
 | 
						||
tex_envvars="BIBINPUTS BSTINPUTS DVIPSHEADERS INDEXSTYLE MFINPUTS MPINPUTS \
 | 
						||
TEXINPUTS TFMFONTS"
 | 
						||
for var in $tex_envvars; do
 | 
						||
  eval ${var}_orig=\$$var
 | 
						||
  export $var
 | 
						||
done
 | 
						||
 | 
						||
 | 
						||
# absolute_filenames TEX-PATH -> TEX-PATH
 | 
						||
# ---------------------------------------
 | 
						||
# Convert relative paths to absolute paths, so we can run in another
 | 
						||
# directory (e.g., in tidy build mode, or during the macro-support
 | 
						||
# detection).  Prepend ".".
 | 
						||
absolute_filenames ()
 | 
						||
{
 | 
						||
  # Empty path components are meaningful to tex.  We rewrite them as
 | 
						||
  # `EMPTY' so they don't get lost when we split on $path_sep.
 | 
						||
  # Hopefully no one will have an actual directory named EMPTY.
 | 
						||
  local replace_empty="-e 's/^$path_sep/EMPTY$path_sep/g' \
 | 
						||
                       -e 's/$path_sep\$/${path_sep}EMPTY/g' \
 | 
						||
                       -e 's/$path_sep$path_sep/${path_sep}EMPTY:/g'"
 | 
						||
  local res
 | 
						||
  res=`echo "$1" | eval $SED $replace_empty`
 | 
						||
  save_IFS=$IFS
 | 
						||
  IFS=$path_sep
 | 
						||
  set x $res; shift
 | 
						||
  res=.
 | 
						||
  for dir
 | 
						||
  do
 | 
						||
    case $dir in
 | 
						||
      EMPTY)
 | 
						||
        res=$res$path_sep
 | 
						||
        ;;
 | 
						||
      *)
 | 
						||
        if test -d "$dir"; then
 | 
						||
          res=$res$path_sep`absolute "$dir"`
 | 
						||
        else
 | 
						||
          # Even if $dir is not a directory, preserve it in the path.
 | 
						||
          # It might contain metacharacters that TeX will expand in
 | 
						||
          # turn, e.g., /some/path/{a,b,c}.  This will not get the
 | 
						||
          # implicit absolutification of the path, but we can't help that.
 | 
						||
          res=$res$path_sep$dir
 | 
						||
        fi
 | 
						||
        ;;
 | 
						||
    esac
 | 
						||
  done
 | 
						||
  echo "$res"
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
# output_base_name FILE
 | 
						||
# ---------------------
 | 
						||
# The name of FILE, possibly renamed to satisfy --output.
 | 
						||
# FILE is local, there is no directory part.
 | 
						||
output_base_name ()
 | 
						||
{
 | 
						||
  case $oname in
 | 
						||
    '') echo "$1";;
 | 
						||
     *) local out_noext
 | 
						||
        out_noext=`noext "$oname"`
 | 
						||
        local file_ext
 | 
						||
        file_ext=`echo "$1" | $SED 's/^.*\.//'`
 | 
						||
        echo "$out_noext.$file_ext"
 | 
						||
      ;;
 | 
						||
  esac
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
# destdir
 | 
						||
# -------
 | 
						||
# Return the name of the directory where the output is expected.
 | 
						||
destdir ()
 | 
						||
{
 | 
						||
  case $oname in
 | 
						||
    '')  echo "$orig_pwd";;
 | 
						||
    *)   dirname "$oname";;
 | 
						||
  esac
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
# move_to_dest FILE...
 | 
						||
# --------------------
 | 
						||
# Move FILE to the place where the user expects it.  Truly move it, that
 | 
						||
# is, it must not remain in its build location unless that is also the
 | 
						||
# output location.  (Otherwise it might appear as an extra file in make
 | 
						||
# distcheck.)
 | 
						||
#
 | 
						||
# FILE can be the principal output (in which case -o directly applies), or
 | 
						||
# an auxiliary file with the same base name.
 | 
						||
move_to_dest ()
 | 
						||
{
 | 
						||
#  echo "move_to_dest $*, tidy=$tidy, oname=$oname"
 | 
						||
 | 
						||
  # If we built in place and have no output name, there is nothing to
 | 
						||
  # do, so just return.
 | 
						||
  case $tidy:$oname in
 | 
						||
    false:) return;;
 | 
						||
  esac
 | 
						||
 | 
						||
  local destfile
 | 
						||
  local destdir
 | 
						||
  local destbase
 | 
						||
  local sourcedir
 | 
						||
  local sourcebase
 | 
						||
 | 
						||
  for file
 | 
						||
  do
 | 
						||
    test -f "$file" \
 | 
						||
    || error 1 "no such file or directory: $file"
 | 
						||
    case $tidy:$oname in
 | 
						||
      true:)  destdir=$orig_pwd
 | 
						||
              destfile=$destdir/$file;;
 | 
						||
      true:*) destfile=`output_base_name "$file"`
 | 
						||
              destdir=`dirname "$destfile"`;;
 | 
						||
      false:*) destfile=$oname
 | 
						||
               destdir=`dirname "$destfile"`;;
 | 
						||
    esac
 | 
						||
 
 | 
						||
    # We want to compare the source location and the output location,
 | 
						||
    # and if they are different, do the move.  But if they are the
 | 
						||
    # same, we must preserve the source.  Since we can't assume
 | 
						||
    # stat(1) or test -ef is available, resort to comparing the
 | 
						||
    # directory names, canonicalized with pwd.  We can't use cmp -s
 | 
						||
    # since the output file might not actually change from run to run;
 | 
						||
    # e.g., TeX DVI output is timestamped to only the nearest minute.
 | 
						||
    destdir=`cd "$destdir" && pwd`
 | 
						||
    destbase=`basename "$destfile"`
 | 
						||
 | 
						||
    sourcedir=`dirname "$file"`
 | 
						||
    sourcedir=`cd "$sourcedir" && pwd`
 | 
						||
    sourcebase=`basename "$file"`
 | 
						||
 | 
						||
    if test "$sourcedir/$sourcebase" != "$destdir/$destbase"; then
 | 
						||
      verbose "Moving $file to $destfile"
 | 
						||
      rm -f "$destfile"
 | 
						||
      mv "$file" "$destfile"
 | 
						||
    fi
 | 
						||
  done
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
## --------------------- ##
 | 
						||
## Managing xref files.  ##
 | 
						||
## --------------------- ##
 | 
						||
 | 
						||
# aux_file_p FILE
 | 
						||
# ---------------
 | 
						||
# Return with success if FILE is an aux file.
 | 
						||
aux_file_p ()
 | 
						||
{
 | 
						||
  test -f "$1" || return 1
 | 
						||
  case $1 in
 | 
						||
    *.aux) return 0;;
 | 
						||
    *)     return 1;;
 | 
						||
  esac
 | 
						||
}
 | 
						||
 | 
						||
# bibaux_file_p FILE
 | 
						||
# ------------------
 | 
						||
# Return with success if FILE is an aux file containing citation
 | 
						||
# requests.
 | 
						||
bibaux_file_p ()
 | 
						||
{
 | 
						||
  test -s "$1" || return 1
 | 
						||
  if (grep '^\\bibstyle[{]' "$1"   \
 | 
						||
      && grep '^\\bibdata[{]' "$1" \
 | 
						||
      ## The following line is suspicious: fails when there
 | 
						||
      ## are citations in sub aux files.  We need to be
 | 
						||
      ## smarter in this case.
 | 
						||
      ## && grep '^\\citation[{]' "$f"
 | 
						||
      ) >&6 2>&1;
 | 
						||
  then
 | 
						||
    return 0
 | 
						||
  fi
 | 
						||
  return 1
 | 
						||
}
 | 
						||
 | 
						||
# index_file_p FILE
 | 
						||
# -----------------
 | 
						||
# Return with success if FILE is an index file.
 | 
						||
index_file_p ()
 | 
						||
{
 | 
						||
  test -f "$1" || return 1
 | 
						||
  case $in_lang:$latex2html:`out_lang_tex`:`$SED '1q' "$1"` in
 | 
						||
    # When working with TeX4HT, *.idx are created by LaTeX.  They must
 | 
						||
    # be processed to produce *.4ix, *.4dx files.  The *.4dx file is
 | 
						||
    # passed to makeindex to produce the *.ind file.  This sequence is
 | 
						||
    # handled by run_index, so we are only interested in the *.idx
 | 
						||
    # files, which have each "\indexentry" preceded by a
 | 
						||
    # "\beforeentry".
 | 
						||
    latex:tex4ht:html:"\\beforeentry {"*) return 0;;
 | 
						||
 | 
						||
    # When index.sty is used, there is a space before the brace.
 | 
						||
    latex:*:*:"\\indexentry{"*|latex:*:*:"\\indexentry {"*) return 0;;
 | 
						||
 | 
						||
    texinfo:*:*:"\\entry{"*) return 0;;
 | 
						||
 | 
						||
    *) return 1;;
 | 
						||
  esac
 | 
						||
}
 | 
						||
 | 
						||
# xref_file_p FILE
 | 
						||
# ----------------
 | 
						||
# Return with success if FILE is an xref file (indexes, tables and lists).
 | 
						||
xref_file_p ()
 | 
						||
{
 | 
						||
  test -f "$1" || return 1
 | 
						||
  # If the file is not suitable to be an index or xref file, don't
 | 
						||
  # process it.  It's suitable if the first character is a
 | 
						||
  # backslash or right quote or at, as long as the first line isn't
 | 
						||
  # \input texinfo.
 | 
						||
  case `$SED '1q' "$1"` in
 | 
						||
    "\\input texinfo"*) return 1;;
 | 
						||
    [\\''@]*)           return 0;;
 | 
						||
           *)           return 1;;
 | 
						||
  esac
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
# generated_files_get FILENAME-NOEXT [PREDICATE-FILTER]
 | 
						||
# -----------------------------------------------------
 | 
						||
# Return the list of files generated by the TeX compilation of FILENAME-NOEXT.
 | 
						||
generated_files_get ()
 | 
						||
{
 | 
						||
  local filter=true
 | 
						||
  if test -n "$2"; then
 | 
						||
    filter=$2
 | 
						||
  fi
 | 
						||
 | 
						||
  # Gather the files created by TeX.
 | 
						||
  (
 | 
						||
    if test -f "$1.log"; then
 | 
						||
      $SED -n -e "s,^\\\\openout.* = \`\\(.*\\)'\\.,\\1,p" "$1.log"
 | 
						||
    fi
 | 
						||
    echo "$1.log"
 | 
						||
  ) |
 | 
						||
  # Depending on these files, infer outputs from other tools.
 | 
						||
  while read file; do
 | 
						||
    echo $file
 | 
						||
    case $in_lang in
 | 
						||
      texinfo)
 | 
						||
        # texindex: texinfo.cp -> texinfo.cps
 | 
						||
       if index_file_p $file; then
 | 
						||
         echo ${file}s
 | 
						||
       fi
 | 
						||
       ;;
 | 
						||
      latex)
 | 
						||
        if aux_file_p $file; then
 | 
						||
          # bibtex: *.aux -> *.bbl and *.blg.
 | 
						||
          echo $file | $SED 's/^\(.*\)\.aux$/\1.bbl/'
 | 
						||
          echo $file | $SED 's/^\(.*\)\.aux$/\1.blg/'
 | 
						||
          # -recorder: .fls
 | 
						||
          echo $file | $SED 's/^\(.*\)\.aux$/\1.fls/'
 | 
						||
       fi
 | 
						||
       ;;
 | 
						||
    esac
 | 
						||
  done |
 | 
						||
  # Filter existing files matching the criterion.
 | 
						||
  #
 | 
						||
  # With an input file name containing a space, this produces a
 | 
						||
  # "command not found" message (and filtering is ineffective).
 | 
						||
  # The situation with a newline is presumably even worse.
 | 
						||
  while read file; do
 | 
						||
    if $filter "$file"; then
 | 
						||
      echo $file
 | 
						||
    fi
 | 
						||
  done |
 | 
						||
  sort |
 | 
						||
  # Some files are opened several times, e.g., listings.sty's *.vrb.
 | 
						||
  uniq
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
# xref_files_save
 | 
						||
# ---------------
 | 
						||
# Save the xref files.
 | 
						||
xref_files_save ()
 | 
						||
{
 | 
						||
  # Save copies of auxiliary files for later comparison.
 | 
						||
  xref_files_orig=`generated_files_get "$in_noext" xref_file_p`
 | 
						||
  if test -n "$xref_files_orig"; then
 | 
						||
    verbose "Backing up xref files: $xref_files_orig"
 | 
						||
    # The following line improves `cp $xref_files_orig "$work_bak"'
 | 
						||
    # by preserving the directory parts.  Think of
 | 
						||
    # cp chap1/main.aux chap2/main.aux $work_bak.
 | 
						||
    #
 | 
						||
    # Users may have, e.g., --keep-old-files.  Don't let this interfere.
 | 
						||
    # (Don't use unset for the sake of ancient shells.)
 | 
						||
    TAR_OPTIONS=; export TAR_OPTIONS
 | 
						||
    tar cf - $xref_files_orig | (cd "$work_bak" && tar xf -)
 | 
						||
  fi
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
# xref_files_changed
 | 
						||
# ------------------
 | 
						||
# Whether the xref files were changed since the previous run.
 | 
						||
xref_files_changed ()
 | 
						||
{
 | 
						||
  # LaTeX (and the package changebar) report in the LOG file if it
 | 
						||
  # should be rerun.  This is needed for files included from
 | 
						||
  # subdirs, since texi2dvi does not try to compare xref files in
 | 
						||
  # subdirs.  Performing xref files test is still good since LaTeX
 | 
						||
  # does not report changes in xref files.
 | 
						||
  if grep "Rerun to get" "$in_noext.log" >&6 2>&1; then
 | 
						||
    return 0
 | 
						||
  fi
 | 
						||
  # biblatex report of whether rerunning is needed.
 | 
						||
  if grep "biblatex.*(re)run" "$in_noext.log" >&6 2>&1; then
 | 
						||
    return 0
 | 
						||
  fi
 | 
						||
 | 
						||
  # If old and new lists don't have the same file list,
 | 
						||
  # then something has definitely changed.
 | 
						||
  xref_files_new=`generated_files_get "$in_noext" xref_file_p`
 | 
						||
  verbose "Original xref files = $xref_files_orig"
 | 
						||
  verbose "New xref files      = $xref_files_new"
 | 
						||
  if test "x$xref_files_orig" != "x$xref_files_new"; then
 | 
						||
    return 0
 | 
						||
  fi
 | 
						||
 | 
						||
  # Compare each file until we find a difference.
 | 
						||
  for this_file in $xref_files_new; do
 | 
						||
    verbose "Comparing xref file `echo $this_file | $SED 's|\./||g'` ..."
 | 
						||
    # cmp -s returns nonzero exit status if files differ.
 | 
						||
    if cmp -s "$this_file" "$work_bak/$this_file"; then :; else
 | 
						||
      verbose "xref file `echo $this_file | $SED 's|\./||g'` differed ..."
 | 
						||
      if $debug; then
 | 
						||
        diff -u "$work_bak/$this_file" "$this_file"
 | 
						||
      fi
 | 
						||
      return 0
 | 
						||
    fi
 | 
						||
  done
 | 
						||
 | 
						||
  # No change.
 | 
						||
  return 1
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
 | 
						||
## ----------------------- ##
 | 
						||
## Running the TeX suite.  ##
 | 
						||
## ----------------------- ##
 | 
						||
 | 
						||
 | 
						||
 | 
						||
# run_tex ()
 | 
						||
# ----------
 | 
						||
# Run TeX as "$tex $in_input", taking care of errors and logs.
 | 
						||
run_tex ()
 | 
						||
{
 | 
						||
  case $in_lang:$latex2html:`out_lang_tex` in
 | 
						||
    latex:*:dvi|latex:tex4ht:html)
 | 
						||
        tex=${LATEX:-latex};;
 | 
						||
    latex:*:pdf)
 | 
						||
        tex=${PDFLATEX:-pdflatex};;
 | 
						||
    texinfo:*:dvi)
 | 
						||
        # MetaPost also uses the TEX environment variable.  If the user
 | 
						||
        # has set TEX=latex for that reason, don't bomb out.
 | 
						||
        case $TEX in
 | 
						||
          *latex) tex=tex;; # don't bother trying to find etex
 | 
						||
               *) tex=$TEX
 | 
						||
        esac;;
 | 
						||
    texinfo:*:pdf) tex=$PDFTEX;;
 | 
						||
 | 
						||
    *) error 1 "$out_lang not supported for $in_lang";;
 | 
						||
  esac
 | 
						||
 | 
						||
  # do the special catcode trick for ~ in filenames only for Texinfo,
 | 
						||
  # not LaTeX.
 | 
						||
  if test x"$in_lang" = xtexinfo && test $catcode_special = maybe; then
 | 
						||
    catcode_special=true
 | 
						||
  else
 | 
						||
    catcode_special=false
 | 
						||
  fi
 | 
						||
 | 
						||
  # Beware of aux files in subdirectories that require the
 | 
						||
  # subdirectory to exist.
 | 
						||
  case $in_lang:$tidy in
 | 
						||
    latex:true)
 | 
						||
       $SED -n 's|^[ ]*\\include{\(.*\)/.*}.*|\1|p' "$in_input" |
 | 
						||
       sort -u |
 | 
						||
       while read d
 | 
						||
       do
 | 
						||
         ensure_dir "$work_build/$d"
 | 
						||
       done
 | 
						||
       ;;
 | 
						||
  esac
 | 
						||
 | 
						||
  # Note that this will be used via an eval: quote properly.
 | 
						||
  local cmd="$tex"
 | 
						||
 | 
						||
  # If possible, make TeX report error locations in GNU format.
 | 
						||
  if $line_error; then
 | 
						||
    if test "${tex_help:+set}" != set; then
 | 
						||
      # Go to a temporary directory to try --help, since old versions that
 | 
						||
      # don't accept --help will generate a texput.log.
 | 
						||
      tex_help_dir=$t2ddir/tex_help
 | 
						||
      ensure_dir "$tex_help_dir"
 | 
						||
      tex_help=`cd "$tex_help_dir" >&6 && $tex --help </dev/null 2>&1 || true`
 | 
						||
    fi
 | 
						||
    # The mk program and perhaps others want to parse TeX's
 | 
						||
    # original error messages.
 | 
						||
    case $tex_help in
 | 
						||
      *file-line-error*) cmd="$cmd --file-line-error";;
 | 
						||
    esac
 | 
						||
  fi
 | 
						||
 | 
						||
  # Tell TeX about TCX file, if specified.
 | 
						||
  test -n "$translate_file" && cmd="$cmd --translate-file=$translate_file"
 | 
						||
 | 
						||
  # Tell TeX to make source specials (for backtracking from output to
 | 
						||
  # source, given a sufficiently smart editor), if specified.
 | 
						||
  test -n "$src_specials" && cmd="$cmd $src_specials"
 | 
						||
 | 
						||
  # Tell TeX to allow running external executables
 | 
						||
  test -n "$shell_escape" && cmd="$cmd $shell_escape"
 | 
						||
 | 
						||
  # Tell TeX to be batch if requested.
 | 
						||
  if $batch; then
 | 
						||
    # \batchmode does not show terminal output at all, so we don't
 | 
						||
    # want that.  And even in batch mode, TeX insists on having input
 | 
						||
    # from the user.  Close its stdin to make it impossible.
 | 
						||
    cmd="$cmd </dev/null '${escape}nonstopmode'"
 | 
						||
  fi
 | 
						||
 | 
						||
  # we'd like to handle arbitrary input file names, especially
 | 
						||
  # foo~bar/a~b.tex, since Debian likes ~ characters.
 | 
						||
  if $catcode_special; then
 | 
						||
    # $normaltilde is just to reduce line length in this source file.
 | 
						||
    # The idea is to define \normaltilde as a catcode other ~ character,
 | 
						||
    # then make the active ~ be equivalent to that, instead of the plain
 | 
						||
    # TeX tie.  Then when the active ~ appears in the filename, it will
 | 
						||
    # be expanded to itself, as far as \input will see.  (This is the
 | 
						||
    # same thing that texinfo.tex does in general, BTW.)
 | 
						||
    normaltilde="${escape}catcode126=12 ${escape}def${escape}normaltilde{~}"
 | 
						||
    cmd="$cmd '$normaltilde${escape}catcode126=13 ${escape}let~\normaltilde '"
 | 
						||
  fi
 | 
						||
  # Other special (non-active) characters could be supported by
 | 
						||
  # resetting their catcodes to other on the command line and changing
 | 
						||
  # texinfo.tex to initialize everything to plain catcodes.  Maybe someday.
 | 
						||
 | 
						||
  # append the \input command.
 | 
						||
  cmd="$cmd '${escape}input'"
 | 
						||
 | 
						||
  # TeX's \input does not (easily or reliably) support whitespace
 | 
						||
  # characters or other special characters in file names.  Our intensive
 | 
						||
  # use of absolute file names makes this worse: the enclosing directory
 | 
						||
  # names may include white spaces.  Improve the situation using a
 | 
						||
  # symbolic link to the filename in the current directory, in tidy mode
 | 
						||
  # only.  Do not alter in_input.
 | 
						||
  #
 | 
						||
  # The filename is almost always tokenized using plain TeX conventions
 | 
						||
  # (the exception would be if the user made a texinfo.fmt file).  Not
 | 
						||
  # all the plain TeX special characters cause trouble, but there's no
 | 
						||
  # harm in making the link.
 | 
						||
  #
 | 
						||
  case $tidy:`func_dirname "$in_input"` in
 | 
						||
    true:*["$space$tab$newline\"#\$%\\^_{}~"]*)
 | 
						||
      _run_tex_file_name=`basename "$in_input"`
 | 
						||
      if test ! -f "$_run_tex_file_name"; then
 | 
						||
        # It might not be a file, clear it.
 | 
						||
        run rm -f "$_run_tex_file_name"
 | 
						||
        run ln -s "$in_input"
 | 
						||
      fi
 | 
						||
      cmd="$cmd '$_run_tex_file_name'"
 | 
						||
      ;;
 | 
						||
 | 
						||
    *)
 | 
						||
      cmd="$cmd '$in_input'"
 | 
						||
      ;;
 | 
						||
  esac
 | 
						||
 | 
						||
  verbose "$0: Running $cmd ..."
 | 
						||
  if eval "$cmd" >&5; then
 | 
						||
    case $out_lang in
 | 
						||
      dvi | pdf ) move_to_dest "$in_noext.$out_lang";;
 | 
						||
    esac
 | 
						||
  else
 | 
						||
    error 1 "$tex exited with bad status, quitting."
 | 
						||
  fi
 | 
						||
}
 | 
						||
 | 
						||
# run_bibtex ()
 | 
						||
# -------------
 | 
						||
# Run bibtex on (or biber) current file.
 | 
						||
# - If its input (AUX) exists.
 | 
						||
# - If some citations are missing (LOG contains `Citation').
 | 
						||
#   or the LOG complains of a missing .bbl
 | 
						||
#
 | 
						||
# Don't try to be too smart:
 | 
						||
# 1. Running bibtex only if the bbl file exists and is older than
 | 
						||
# the LaTeX file is wrong, since the document might include files
 | 
						||
# that have changed.
 | 
						||
#
 | 
						||
# 3. Because there can be several AUX (if there are \include's),
 | 
						||
# but a single LOG, looking for missing citations in LOG is
 | 
						||
# easier, though we take the risk of matching false messages.
 | 
						||
run_bibtex ()
 | 
						||
{
 | 
						||
  case $in_lang in
 | 
						||
    latex)   bibtex=${BIBTEX:-bibtex};;
 | 
						||
    texinfo) return;;
 | 
						||
  esac
 | 
						||
 | 
						||
  # "Citation undefined" is for LaTeX, "Undefined citation" for btxmac.tex.
 | 
						||
  # The no .aux && \bibdata test is also for btxmac, in case it was the
 | 
						||
  # first run of a bibtex-using document.  Otherwise, it's possible that
 | 
						||
  # bibtex would never be run.
 | 
						||
  if test -r "$in_noext.aux" \
 | 
						||
     && test -r "$in_noext.log" \
 | 
						||
     && ( (grep 'Warning:.*Citation.*undefined' "$in_noext.log" \
 | 
						||
          || grep '.*Undefined citation' "$in_noext.log" \
 | 
						||
          || grep 'No file .*\.bbl\.' "$in_noext.log") \
 | 
						||
          || (grep 'No \.aux file' "$in_noext.log" \
 | 
						||
              && grep '^\\bibdata' "$in_noext.aux") ) \
 | 
						||
        >&6 2>&1; \
 | 
						||
  then
 | 
						||
    bibtex_aux=`generated_files_get "$in_noext" bibaux_file_p`
 | 
						||
    for f in $bibtex_aux; do
 | 
						||
      run $bibtex "$f"
 | 
						||
    done
 | 
						||
  fi
 | 
						||
 | 
						||
  # biber(+biblatex) check.
 | 
						||
  if test -r "$in_noext.bcf" \
 | 
						||
     && grep '</bcf:controlfile>' "$in_noext.bcf" >/dev/null; then
 | 
						||
    run ${BIBER:-biber} "$in_noext"
 | 
						||
  fi
 | 
						||
}
 | 
						||
 | 
						||
# run_index ()
 | 
						||
# ------------
 | 
						||
# Run texindex (or makeindex or texindy) on current index files.  If
 | 
						||
# they already exist, and after running TeX a first time the index
 | 
						||
# files don't change, then there's no reason to run TeX again.  But we
 | 
						||
# won't know that if the index files are out of date or nonexistent.
 | 
						||
run_index ()
 | 
						||
{
 | 
						||
  local index_files
 | 
						||
  index_files=`generated_files_get $in_noext index_file_p`
 | 
						||
  test -n "$index_files" \
 | 
						||
  || return 0
 | 
						||
 | 
						||
  : ${MAKEINDEX:=makeindex}
 | 
						||
  : ${TEXINDEX:=texindex}
 | 
						||
  : ${TEXINDY:=texindy}
 | 
						||
 | 
						||
  local index_file
 | 
						||
  local index_noext
 | 
						||
  case $in_lang:$latex2html:`out_lang_tex` in
 | 
						||
    latex:tex4ht:html)
 | 
						||
      for index_file in $index_files
 | 
						||
      do
 | 
						||
        index_noext=`noext "$index_file"`
 | 
						||
        run tex \
 | 
						||
            '\def\filename{{'"$index_noext"'}{idx}{4dx}{ind}}
 | 
						||
             \input idxmake.4ht'
 | 
						||
        run $MAKEINDEX -o $index_noext.ind $index_noext.4dx
 | 
						||
      done
 | 
						||
      ;;
 | 
						||
 | 
						||
    latex:*)
 | 
						||
      if $TEXINDY --version >&6 2>&1; then
 | 
						||
        run $TEXINDY $index_files
 | 
						||
      else
 | 
						||
        run $MAKEINDEX $index_files
 | 
						||
      fi
 | 
						||
      ;;
 | 
						||
 | 
						||
    texinfo:*)
 | 
						||
      run $TEXINDEX $index_files
 | 
						||
      ;;
 | 
						||
  esac
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
# run_tex4ht ()
 | 
						||
# -------------
 | 
						||
# Run the last two phases of TeX4HT: tex4ht extracts the HTML from the
 | 
						||
# instrumented DVI file, and t4ht converts the figures and installs
 | 
						||
# the files when given -d.
 | 
						||
#
 | 
						||
# Because knowing exactly which files are created is complex (in
 | 
						||
# addition the names are not simple to compute), which makes it
 | 
						||
# difficult to install the output files in a second step, it is much
 | 
						||
# simpler to install directly the output files.
 | 
						||
run_tex4ht ()
 | 
						||
{
 | 
						||
  case $in_lang:$latex2html:`out_lang_tex` in
 | 
						||
    latex:tex4ht:html)
 | 
						||
      : ${TEX4HT:=tex4ht} ${T4HT:=t4ht}
 | 
						||
      run "$TEX4HT" "-f/$in_noext"
 | 
						||
      # Do not remove the / after the destdir.
 | 
						||
      run "$T4HT" "-d`destdir`/" "-f/$in_noext"
 | 
						||
      ;;
 | 
						||
  esac
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
# run_thumbpdf ()
 | 
						||
# ---------------
 | 
						||
run_thumbpdf ()
 | 
						||
{
 | 
						||
  if test `out_lang_tex` = pdf \
 | 
						||
     && test -r "$in_noext.log" \
 | 
						||
     && grep 'thumbpdf\.sty'  "$in_noext.log" >&6 2>&1; \
 | 
						||
  then
 | 
						||
    thumbpdf=${THUMBPDF_CMD:-thumbpdf}
 | 
						||
    thumbcmd="$thumbpdf $in_dir/$in_noext"
 | 
						||
    verbose "Running $thumbcmd ..."
 | 
						||
    if $thumbcmd >&5; then
 | 
						||
      run_tex
 | 
						||
    else
 | 
						||
      report "$thumbpdf exited with bad status." \
 | 
						||
             "Ignoring its output."
 | 
						||
    fi
 | 
						||
  fi
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
# run_dvipdf FILE.dvi
 | 
						||
# -------------------
 | 
						||
# Convert FILE.dvi to FILE.pdf.
 | 
						||
run_dvipdf ()
 | 
						||
{
 | 
						||
  # Find which dvi->pdf program is available.
 | 
						||
  if test -z "$dvipdf"; then
 | 
						||
    for i in "$DVIPDF" dvipdfmx dvipdfm dvipdf dvi2pdf dvitopdf; do
 | 
						||
      if findprog $i; then
 | 
						||
        dvipdf=$i
 | 
						||
      fi
 | 
						||
    done
 | 
						||
  fi
 | 
						||
  # These tools have varying interfaces, some 'input output', others
 | 
						||
  # 'input -o output'.  They all seem to accept 'input' only,
 | 
						||
  # outputting using the expected file name.
 | 
						||
  run $dvipdf "$1"
 | 
						||
  if test ! -f `echo "$1" | $SED -e 's/\.dvi$/.pdf/'`; then
 | 
						||
    error 1 "cannot find output file"
 | 
						||
  fi
 | 
						||
}
 | 
						||
 | 
						||
# run_tex_suite ()
 | 
						||
# ----------------
 | 
						||
# Run the TeX tools until a fix point is reached.
 | 
						||
run_tex_suite ()
 | 
						||
{
 | 
						||
  # Move to the working directory.
 | 
						||
  if $tidy; then
 | 
						||
    verbose "cd $work_build"
 | 
						||
    cd "$work_build" || exit 1
 | 
						||
  fi
 | 
						||
 | 
						||
  # Count the number of cycles.
 | 
						||
  local cycle=0
 | 
						||
 | 
						||
  while :; do
 | 
						||
    # check for probably LaTeX loop (e.g. varioref)
 | 
						||
    if test $cycle -eq "$max_iters"; then
 | 
						||
      error 0 "Maximum of $max_iters cycles exceeded"
 | 
						||
      break
 | 
						||
    fi
 | 
						||
 | 
						||
    # report progress
 | 
						||
    cycle=`expr $cycle + 1`
 | 
						||
    verbose "Cycle $cycle for $command_line_filename"
 | 
						||
 | 
						||
    xref_files_save
 | 
						||
 | 
						||
    # We run bibtex first, because it's more likely for the indexes
 | 
						||
    # to change after bibtex is run than the reverse, though either
 | 
						||
    # would be rare.
 | 
						||
    run_bibtex
 | 
						||
    run_index
 | 
						||
    run_core_conversion
 | 
						||
 | 
						||
    xref_files_changed || break
 | 
						||
  done
 | 
						||
 | 
						||
  # If we were using thumbpdf and producing PDF, then run thumbpdf
 | 
						||
  # and TeX one last time.
 | 
						||
  run_thumbpdf
 | 
						||
 | 
						||
  # If we are using tex4ht, call it.
 | 
						||
  run_tex4ht
 | 
						||
 | 
						||
  # Install the result if we didn't already (i.e., if the output is
 | 
						||
  # dvipdf or ps).
 | 
						||
  case $latex2html:$out_lang in
 | 
						||
    *:dvipdf)
 | 
						||
      run_dvipdf "$in_noext.`out_lang_tex`"
 | 
						||
      move_to_dest "$in_noext.`out_lang_ext`"
 | 
						||
      ;;
 | 
						||
    *:ps)
 | 
						||
      : ${DVIPS:=dvips}
 | 
						||
      run $DVIPS -o "$in_noext.`out_lang_ext`" "$in_noext.`out_lang_tex`"
 | 
						||
      move_to_dest "$in_noext.`out_lang_ext`"
 | 
						||
      ;;
 | 
						||
  esac
 | 
						||
 | 
						||
  cd_orig
 | 
						||
}
 | 
						||
 | 
						||
## -------------------------------- ##
 | 
						||
## TeX processing auxiliary tools.  ##
 | 
						||
## -------------------------------- ##
 | 
						||
 | 
						||
 | 
						||
# A sed script that preprocesses Texinfo sources in order to keep the
 | 
						||
# iftex sections only.  We want to remove non-TeX sections, and comment
 | 
						||
# (with `@c _texi2dvi') TeX sections so that makeinfo does not try to
 | 
						||
# parse them.  Nevertheless, while commenting TeX sections, don't
 | 
						||
# comment @macro/@end macro so that makeinfo does propagate them.
 | 
						||
# Unfortunately makeinfo --iftex --no-ifinfo doesn't work well enough
 | 
						||
# (yet), makeinfo can't parse the TeX commands, so work around with sed.
 | 
						||
#
 | 
						||
# We assume that `@c _texi2dvi' starting a line is not present in the
 | 
						||
# document.
 | 
						||
#
 | 
						||
comment_iftex=\
 | 
						||
'/^@tex/,/^@end tex/{
 | 
						||
  s/^/@c _texi2dvi/
 | 
						||
}
 | 
						||
/^@iftex/,/^@end iftex/{
 | 
						||
  s/^/@c _texi2dvi/
 | 
						||
  /^@c _texi2dvi@macro/,/^@c _texi2dvi@end macro/{
 | 
						||
    s/^@c _texi2dvi//
 | 
						||
  }
 | 
						||
}
 | 
						||
/^@ifnottex/,/^@end ifnottex/{
 | 
						||
  s/^/@c (_texi2dvi)/
 | 
						||
}
 | 
						||
/^@ifinfo/,/^@end ifinfo/{
 | 
						||
  /^@node/p
 | 
						||
  /^@menu/,/^@end menu/p
 | 
						||
  t
 | 
						||
  s/^/@c (_texi2dvi)/
 | 
						||
}
 | 
						||
s/^@ifnotinfo/@c _texi2dvi@ifnotinfo/
 | 
						||
s/^@end ifnotinfo/@c _texi2dvi@end ifnotinfo/'
 | 
						||
 | 
						||
# Uncommenting is simpler: remove any leading `@c texi2dvi'; repeated
 | 
						||
# copies can sneak in via macro invocations.
 | 
						||
uncomment_iftex='s/^@c _texi2dvi\(@c _texi2dvi\)*//'
 | 
						||
 | 
						||
 | 
						||
# run_makeinfo ()
 | 
						||
# ---------------
 | 
						||
# Expand macro commands in the original source file using Makeinfo.
 | 
						||
# Always use `end' footnote style, since the `separate' style
 | 
						||
# generates different output (arguably this is a bug in -E).  Discard
 | 
						||
# main info output, the user asked to run TeX, not makeinfo.
 | 
						||
run_makeinfo ()
 | 
						||
{
 | 
						||
  test $in_lang = texinfo \
 | 
						||
    || return 0
 | 
						||
 | 
						||
  # Unless required by the user, makeinfo expansion is wanted only
 | 
						||
  # if texinfo.tex is too old.
 | 
						||
  if $expand; then
 | 
						||
    makeinfo=${MAKEINFO:-makeinfo}
 | 
						||
  else
 | 
						||
    # Check if texinfo.tex performs macro expansion by looking for
 | 
						||
    # its version.  The version is a date of the form YEAR-MO-DA.
 | 
						||
    # We don't need to use [0-9] to match the digits since anyway
 | 
						||
    # the comparison with $txiprereq, a number, will fail with non-digits.
 | 
						||
    # Run in a temporary directory to avoid leaving files.
 | 
						||
    version_test_dir=$t2ddir/version_test
 | 
						||
    ensure_dir "$version_test_dir"
 | 
						||
    if (
 | 
						||
       cd "$version_test_dir"
 | 
						||
       echo '\input texinfo.tex @bye' >txiversion.tex
 | 
						||
       # Be sure that if tex wants to fail, it is not interactive:
 | 
						||
       # close stdin.
 | 
						||
       $TEX txiversion.tex </dev/null >txiversion.out 2>txiversion.err
 | 
						||
    ); then :; else
 | 
						||
      report "texinfo.tex appears to be broken.
 | 
						||
This may be due to the environment variable TEX set to something
 | 
						||
other than (plain) tex, a corrupt texinfo.tex file, or 
 | 
						||
to tex itself simply not working."
 | 
						||
      cat "$version_test_dir/txiversion.out"
 | 
						||
      cat "$version_test_dir/txiversion.err" >&2
 | 
						||
      error 1 "quitting."
 | 
						||
    fi
 | 
						||
    eval `$SED -n 's/^.*\[\(.*\)version \(....\)-\(..\)-\(..\).*$/txiformat=\1 txiversion="\2\3\4"/p' "$version_test_dir/txiversion.out"`
 | 
						||
    verbose "texinfo.tex preloaded as \`$txiformat', version is \`$txiversion' ..."
 | 
						||
    if test "$txiprereq" -le "$txiversion" >&6 2>&1; then
 | 
						||
      makeinfo=
 | 
						||
    else
 | 
						||
      makeinfo=${MAKEINFO:-makeinfo}
 | 
						||
    fi
 | 
						||
    # If TeX is preloaded, offer the user this convenience:
 | 
						||
    if test "$txiformat" = Texinfo; then
 | 
						||
      escape=@
 | 
						||
    fi
 | 
						||
  fi
 | 
						||
 | 
						||
  if test -n "$makeinfo"; then
 | 
						||
    # in_src: the file with macros expanded.
 | 
						||
    # Use the same basename to generate the same aux file names.
 | 
						||
    work_src=$workdir/src
 | 
						||
    ensure_dir "$work_src"
 | 
						||
    in_src=$work_src/$in_base
 | 
						||
    local miincludes
 | 
						||
    miincludes=`list_prefix includes -I`
 | 
						||
    verbose "Macro-expanding $command_line_filename to $in_src ..."
 | 
						||
    # eval $makeinfo because it might be defined as something complex
 | 
						||
    # (running missing) and then we end up with things like '"-I"',
 | 
						||
    # and "-I" (including the quotes) is not an option name.  This
 | 
						||
    # happens with gettext 0.14.5, at least.
 | 
						||
    $SED "$comment_iftex" "$command_line_filename" \
 | 
						||
      | eval $makeinfo --footnote-style=end -I "$in_dir" $miincludes \
 | 
						||
        -o /dev/null --macro-expand=- \
 | 
						||
      | $SED "$uncomment_iftex" >"$in_src"
 | 
						||
    # Continue only if everything succeeded.
 | 
						||
    if test $? -ne 0 \
 | 
						||
       || test ! -r "$in_src"; then
 | 
						||
      verbose "Expansion failed, ignored...";
 | 
						||
    else
 | 
						||
      in_input=$in_src
 | 
						||
    fi
 | 
						||
  fi
 | 
						||
}
 | 
						||
 | 
						||
# insert_commands ()
 | 
						||
# ------------------
 | 
						||
# Used most commonly for @finalout, @smallbook, etc.
 | 
						||
insert_commands ()
 | 
						||
{
 | 
						||
  if test -n "$textra"; then
 | 
						||
    # _xtr.  The file with the user's extra commands.
 | 
						||
    work_xtr=$workdir/xtr
 | 
						||
    in_xtr=$work_xtr/$in_base
 | 
						||
    ensure_dir "$work_xtr"
 | 
						||
    verbose "Inserting extra commands: $textra"
 | 
						||
    local textra_cmd
 | 
						||
    case $in_lang in
 | 
						||
      latex)   textra_cmd=1i;;
 | 
						||
      texinfo) textra_cmd='/^@setfilename/a';;
 | 
						||
      *)       error 1 "internal error, unknown language: $in_lang";;
 | 
						||
    esac
 | 
						||
    $SED "$textra_cmd\\
 | 
						||
$textra" "$in_input" >"$in_xtr"
 | 
						||
    in_input=$in_xtr
 | 
						||
  fi
 | 
						||
 | 
						||
  case $in_lang:$latex2html:`out_lang_tex` in
 | 
						||
    latex:tex4ht:html)
 | 
						||
      # _tex4ht.  The file with the added \usepackage{tex4ht}.
 | 
						||
      work_tex4ht=$workdir/tex4ht
 | 
						||
      in_tex4ht=$work_tex4ht/$in_base
 | 
						||
      ensure_dir "$work_tex4ht"
 | 
						||
      verbose "Inserting \\usepackage{tex4ht}"
 | 
						||
      perl -pe 's<\\documentclass(?:\[.*\])?{.*}>
 | 
						||
                 <$&\\usepackage[xhtml]{tex4ht}>' \
 | 
						||
        "$in_input" >"$in_tex4ht"
 | 
						||
      in_input=$in_tex4ht
 | 
						||
      ;;
 | 
						||
  esac
 | 
						||
}
 | 
						||
 | 
						||
# compute_language FILENAME
 | 
						||
# -------------------------
 | 
						||
# Return the short string describing the language in which FILENAME
 | 
						||
# is written: `texinfo' or `latex'.
 | 
						||
compute_language ()
 | 
						||
{
 | 
						||
  # If the user explicitly specified the language, use that.
 | 
						||
  # Otherwise, if the first line is \input texinfo, assume it's texinfo.
 | 
						||
  # Otherwise, guess from the file extension.
 | 
						||
  if test -n "$set_language"; then
 | 
						||
    echo $set_language
 | 
						||
  elif $SED 1q "$1" | grep 'input texinfo' >&6; then
 | 
						||
    echo texinfo
 | 
						||
  else
 | 
						||
    # Get the type of the file (latex or texinfo) from the given language
 | 
						||
    # we just guessed, or from the file extension if not set yet.
 | 
						||
    case $1 in
 | 
						||
      *.ltx | *.tex | *.drv | *.dtx) echo latex;;
 | 
						||
      *)                             echo texinfo;;
 | 
						||
    esac
 | 
						||
  fi
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
# run_hevea (MODE)
 | 
						||
# ----------------
 | 
						||
# Convert to HTML/INFO/TEXT.
 | 
						||
#
 | 
						||
# Don't pass `-noiso' to hevea: it's useless in HTML since anyway the
 | 
						||
# charset is set to latin1, and troublesome in other modes since
 | 
						||
# accented characters loose their accents.
 | 
						||
#
 | 
						||
# Don't pass `-o DEST' to hevea because in that case it leaves all its
 | 
						||
# auxiliary files there too...  Too bad, because it means we will need
 | 
						||
# to handle images some day.
 | 
						||
run_hevea ()
 | 
						||
{
 | 
						||
  local hevea="${HEVEA:-hevea}"
 | 
						||
  local run_hevea="$hevea"
 | 
						||
 | 
						||
  case $1 in
 | 
						||
    html) ;;
 | 
						||
    text|info) run_hevea="$run_hevea -$1";;
 | 
						||
    *) error 1 "run_hevea: invalid argument: $1";;
 | 
						||
  esac
 | 
						||
 | 
						||
  # Compiling to the tmp directory enables to preserve a previous
 | 
						||
  # successful compilation.
 | 
						||
  run_hevea="$run_hevea -fix -O -o '$out_base'"
 | 
						||
  run_hevea="$run_hevea `list_prefix includes -I` -I '$orig_pwd' "
 | 
						||
  run_hevea="$run_hevea '$in_input'"
 | 
						||
 | 
						||
  if $debug; then
 | 
						||
    run_hevea="$run_hevea -v -v"
 | 
						||
  fi
 | 
						||
 | 
						||
  verbose "running $run_hevea"
 | 
						||
  if eval "$run_hevea" >&5; then
 | 
						||
    # hevea leaves trailing white spaces, this is annoying.
 | 
						||
    case $1 in text|info)
 | 
						||
      perl -pi -e 's/[ \t]+$//g' "$out_base"*;;
 | 
						||
    esac
 | 
						||
    case $1 in
 | 
						||
    html|text) move_to_dest "$out_base";;
 | 
						||
    info) # There can be foo.info-1, foo.info-2 etc.
 | 
						||
               move_to_dest "$out_base"*;;
 | 
						||
    esac
 | 
						||
  else
 | 
						||
    error 1 "$hevea exited with bad status, quitting."
 | 
						||
  fi
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
# run_core_conversion ()
 | 
						||
# ----------------------
 | 
						||
# Run the TeX (or HeVeA).
 | 
						||
run_core_conversion ()
 | 
						||
{
 | 
						||
  case $in_lang:$latex2html:`out_lang_tex` in
 | 
						||
    *:dvi|*:pdf|latex:tex4ht:html)
 | 
						||
        run_tex;;
 | 
						||
    latex:*:html|latex:*:text|latex:*:info)
 | 
						||
        run_hevea $out_lang;;
 | 
						||
    *)
 | 
						||
        error 1 "invalid input/output combination: $in_lang/$out_lang";;
 | 
						||
  esac
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
# compile ()
 | 
						||
# ----------
 | 
						||
# Run the full compilation chain, from pre-processing to installation
 | 
						||
# of the output at its expected location.
 | 
						||
compile ()
 | 
						||
{
 | 
						||
  # Source file might include additional sources.
 | 
						||
  # We want `.:$orig_pwd' before anything else.  (We'll add `.:' later
 | 
						||
  # after all other directories have been turned into absolute paths.)
 | 
						||
  # `.' goes first to ensure that any old .aux, .cps,
 | 
						||
  # etc. files in ${directory} don't get used in preference to fresher
 | 
						||
  # files in `.'.  Include orig_pwd in case we are in clean build mode, where
 | 
						||
  # we have cd'd to a temp directory.
 | 
						||
  common="$orig_pwd$path_sep$in_dir$path_sep"
 | 
						||
  #
 | 
						||
  # If we have any includes, put those at the end.
 | 
						||
  # Keep a final path_sep to get the default (system) TeX directories included.
 | 
						||
  txincludes=`list_infix includes $path_sep`
 | 
						||
  test -n "$txincludes" && common="$common$txincludes$path_sep"
 | 
						||
  #
 | 
						||
  for var in $tex_envvars; do
 | 
						||
    eval val="\$common\$${var}_orig"
 | 
						||
    # Convert relative paths to absolute paths, so we can run in another
 | 
						||
    # directory (e.g., in clean build mode, or during the macro-support
 | 
						||
    # detection). ".:" is added here.
 | 
						||
    val=`absolute_filenames "$val"`
 | 
						||
    eval $var="\"$val\""
 | 
						||
    export $var
 | 
						||
    eval verbose \"$var=\'\$${var}\'\"
 | 
						||
  done
 | 
						||
 | 
						||
  # --expand
 | 
						||
  run_makeinfo
 | 
						||
 | 
						||
  # --command, --texinfo
 | 
						||
  insert_commands
 | 
						||
 | 
						||
  # Run until a fix point is reached.
 | 
						||
  run_tex_suite
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
# remove FILES
 | 
						||
# ------------
 | 
						||
remove ()
 | 
						||
{
 | 
						||
  verbose "Removing" "$@"
 | 
						||
  rm -rf "$@"
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
# mostly_clean
 | 
						||
# ------------
 | 
						||
# Remove auxiliary files and directories.  Changes the current directory.
 | 
						||
mostly_clean ()
 | 
						||
{
 | 
						||
  cd_orig
 | 
						||
  set X "$t2ddir"
 | 
						||
  shift
 | 
						||
  $tidy || {
 | 
						||
    local log="$work_build/$in_noext.log"
 | 
						||
    set X ${1+"$@"} "$log" `generated_files_get "$work_build/$in_noext"`
 | 
						||
    shift
 | 
						||
  }
 | 
						||
  remove ${1+"$@"}
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
# cleanup ()
 | 
						||
# ----------
 | 
						||
# Remove what should be removed according to options.
 | 
						||
# Called at the end of each compilation cycle, and at the end of
 | 
						||
# the script.  Changes the current directory.
 | 
						||
cleanup ()
 | 
						||
{
 | 
						||
  case $build_mode in
 | 
						||
    local) cd_orig; remove "$t2ddir";;
 | 
						||
    clean) mostly_clean;;
 | 
						||
    tidy)  ;;
 | 
						||
  esac
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
 | 
						||
## ---------------------- ##
 | 
						||
## Command line parsing.  ##
 | 
						||
## ---------------------- ##
 | 
						||
 | 
						||
# Push a token among the arguments that will be used to notice when we
 | 
						||
# ended options/arguments parsing.
 | 
						||
# Use "set dummy ...; shift" rather than 'set - ..." because on
 | 
						||
# Solaris set - turns off set -x (but keeps set -e).
 | 
						||
# Use ${1+"$@"} rather than "$@" because Digital Unix and Ultrix 4.3
 | 
						||
# still expand "$@" to a single argument (the empty string) rather
 | 
						||
# than nothing at all.
 | 
						||
arg_sep="$$--$$"
 | 
						||
set dummy ${1+"$@"} "$arg_sep"; shift
 | 
						||
 | 
						||
# 
 | 
						||
# Parse command line arguments.
 | 
						||
while test x"$1" != x"$arg_sep"; do
 | 
						||
 | 
						||
  # Handle --option=value by splitting apart and putting back on argv.
 | 
						||
  case "$1" in
 | 
						||
    --*=*)
 | 
						||
      opt=`echo "$1" | $SED -e 's/=.*//'`
 | 
						||
      val=`echo "$1" | $SED -e 's/[^=]*=//'`
 | 
						||
      shift
 | 
						||
      set dummy "$opt" "$val" ${1+"$@"}; shift
 | 
						||
      ;;
 | 
						||
  esac
 | 
						||
 | 
						||
  case "$1" in
 | 
						||
    -@ ) escape=@;;
 | 
						||
    -~ ) catcode_special=false;;
 | 
						||
    # Silently and without documentation accept -b and --b[atch] as synonyms.
 | 
						||
    -b | --batch) batch=true;;
 | 
						||
         --build)      shift; build_mode=$1;;
 | 
						||
         --build-dir)  shift; build_dir=$1; build_mode=tidy;;
 | 
						||
    -c | --clean) build_mode=clean;;
 | 
						||
    -D | --debug) debug=true;;
 | 
						||
    -e | -E | --expand) expand=true;;
 | 
						||
    -h | --help) usage;;
 | 
						||
    -I)   shift; list_concat_dirs includes "$1";;
 | 
						||
    -l | --lang | --language) shift; set_language=$1;;
 | 
						||
    --mostly-clean) action=mostly-clean;;
 | 
						||
    --no-line-error) line_error=false;;
 | 
						||
    --max-iterations) shift; max_iters=$1;;
 | 
						||
    -o | --out  | --output)
 | 
						||
      shift
 | 
						||
      # Make it absolute, just in case we also have --clean, or whatever.
 | 
						||
      oname=`absolute "$1"`;;
 | 
						||
 | 
						||
    # Output formats.
 | 
						||
    -O|--output-format) shift; out_lang_set "$1";;
 | 
						||
       --dvi|--dvipdf|--html|--info|--pdf|--ps|--text)
 | 
						||
       out_lang_set `echo "x$1" | $SED 's/^x--//'`;;
 | 
						||
 | 
						||
    -p) out_lang_set pdf;;
 | 
						||
    -q | -s | --quiet | --silent) quiet=true; batch=true;;
 | 
						||
    --src-specials) src_specials=--src-specials;;
 | 
						||
    --shell-escape) shell_escape=--shell-escape;;  
 | 
						||
    --tex4ht) latex2html=tex4ht;;
 | 
						||
    -t | --texinfo | --command ) shift; textra="$textra\\
 | 
						||
"`echo "$1" | $SED 's/\\\\/\\\\\\\\/g'`;;
 | 
						||
    --translate-file ) shift; translate_file="$1";;
 | 
						||
    --tidy) build_mode=tidy;;
 | 
						||
    -v | --vers*) version;;
 | 
						||
    -V | --verb*) verb=true;;
 | 
						||
    --) # What remains are not options.
 | 
						||
      shift
 | 
						||
      while test x"$1" != x"$arg_sep"; do
 | 
						||
        set dummy ${1+"$@"} "$1"; shift
 | 
						||
        shift
 | 
						||
      done
 | 
						||
      break;;
 | 
						||
    -*)
 | 
						||
      error 1 "Unknown or ambiguous option \`$1'." \
 | 
						||
              "Try \`--help' for more information."
 | 
						||
      ;;
 | 
						||
    *) set dummy ${1+"$@"} "$1"; shift;;
 | 
						||
   esac
 | 
						||
   shift
 | 
						||
done
 | 
						||
# Pop the token
 | 
						||
shift
 | 
						||
 | 
						||
# $tidy:  compile in a t2d directory.
 | 
						||
# $clean: remove all the aux files.
 | 
						||
case $build_mode in
 | 
						||
  local) clean=false; tidy=false;;
 | 
						||
  tidy)  clean=false; tidy=true;;
 | 
						||
  clean) clean=true;  tidy=true;;
 | 
						||
      *) error 1 "invalid build mode: $build_mode";;
 | 
						||
esac
 | 
						||
 | 
						||
# Interpret remaining command line args as filenames.
 | 
						||
case $# in
 | 
						||
 0)
 | 
						||
  error 2 "Missing file arguments." "Try \`--help' for more information."
 | 
						||
  ;;
 | 
						||
 1) ;;
 | 
						||
 *)
 | 
						||
  if test -n "$oname"; then
 | 
						||
    error 2 "Can't use option \`--output' with more than one argument."
 | 
						||
  fi
 | 
						||
  ;;
 | 
						||
esac
 | 
						||
 | 
						||
 | 
						||
# We can't do much without tex.
 | 
						||
#
 | 
						||
if findprog ${TEX:-tex}; then :; else cat <<EOM
 | 
						||
You don't have a working TeX binary (${TEX:-tex}) installed anywhere in
 | 
						||
your PATH, and texi2dvi cannot proceed without one.  If you want to use
 | 
						||
this script, you'll need to install TeX (if you don't have it) or change
 | 
						||
your PATH or TEX environment variable (if you do).  See the --help
 | 
						||
output for more details.
 | 
						||
 | 
						||
For information about obtaining TeX, please see http://tug.org/texlive,
 | 
						||
or do a web search for TeX and your operating system or distro.
 | 
						||
EOM
 | 
						||
  exit 1
 | 
						||
fi
 | 
						||
 | 
						||
 | 
						||
# We want to use etex (or pdftex) if they are available, and the user
 | 
						||
# didn't explicitly specify.  We don't check for elatex and pdfelatex
 | 
						||
# because (as of 2003), the LaTeX team has asked that new distributions
 | 
						||
# use etex by default anyway.
 | 
						||
#
 | 
						||
# End up with the TEX and PDFTEX variables set to what we are going to use.
 | 
						||
if test -z "$TEX"; then
 | 
						||
  if findprog etex; then TEX=etex; else TEX=tex; fi
 | 
						||
fi
 | 
						||
#
 | 
						||
if test -z "$PDFTEX"; then
 | 
						||
  if findprog pdfetex; then PDFTEX=pdfetex; else PDFTEX=pdftex; fi
 | 
						||
fi
 | 
						||
 | 
						||
 | 
						||
# File descriptor usage:
 | 
						||
# 0 standard input
 | 
						||
# 1 standard output (--verbose messages)
 | 
						||
# 2 standard error
 | 
						||
# 3 some systems may open it to /dev/tty
 | 
						||
# 4 used on the Kubota Titan
 | 
						||
# 5 tools output (turned off by --quiet)
 | 
						||
# 6 tracing/debugging (set -x output, etc.)
 | 
						||
 | 
						||
 | 
						||
# Main tools' output (TeX, etc.) that TeX users are used to seeing.
 | 
						||
#
 | 
						||
# If quiet, discard, else redirect to the message flow.
 | 
						||
if $quiet; then
 | 
						||
  exec 5>/dev/null
 | 
						||
else
 | 
						||
  exec 5>&1
 | 
						||
fi
 | 
						||
 | 
						||
 | 
						||
# Enable tracing, and auxiliary tools output.
 | 
						||
# 
 | 
						||
# This fd should be used where you'd typically use /dev/null to throw
 | 
						||
# output away.  But sometimes it is convenient to see that output (e.g.,
 | 
						||
# from a grep) to aid debugging.  Especially debugging at distance, via
 | 
						||
# the user.
 | 
						||
# 
 | 
						||
if $debug; then
 | 
						||
  exec 6>&1
 | 
						||
  set -vx
 | 
						||
else
 | 
						||
  exec 6>/dev/null
 | 
						||
fi
 | 
						||
 | 
						||
# 
 | 
						||
 | 
						||
# input_file_name_decode
 | 
						||
# ----------------------
 | 
						||
# Decode COMMAND_LINE_FILENAME, and compute:
 | 
						||
# - COMMAND_LINE_FILENAME clean of TeX commands
 | 
						||
# - IN_DIR
 | 
						||
#   The directory to the input file, possibly absolute if needed.
 | 
						||
# - IN_DIR_ABS
 | 
						||
#   The absolute directory of the input file.
 | 
						||
# - IN_BASE
 | 
						||
#   The input file base name (no directory part).
 | 
						||
# - IN_NOEXT
 | 
						||
#   The input file name without extensions (nor directory part).
 | 
						||
# - IN_INPUT
 | 
						||
#   Defaults to COMMAND_LINE_FILENAME, but might change if the
 | 
						||
#   input is preprocessed.  With directory, possibly absolute.
 | 
						||
input_file_name_decode ()
 | 
						||
{
 | 
						||
  # See if we are run from within AUC-Tex, in which case we are
 | 
						||
  # passed `\input{FOO.tex}' or even `\nonstopmode\input{FOO.tex}'.
 | 
						||
  case $command_line_filename in
 | 
						||
    *\\nonstopmode*)
 | 
						||
      batch=true;;
 | 
						||
  esac
 | 
						||
  case $command_line_filename in
 | 
						||
    *\\input{*}*)
 | 
						||
      # Let AUC-TeX error parser deal with line numbers.
 | 
						||
      line_error=false
 | 
						||
      command_line_filename=`\
 | 
						||
        expr X"$command_line_filename" : X'.*input{\([^}]*\)}'`
 | 
						||
      ;;
 | 
						||
  esac
 | 
						||
 | 
						||
  # If the COMMAND_LINE_FILENAME is not absolute (e.g., --debug.tex),
 | 
						||
  # prepend `./' in order to avoid that the tools take it as an option.
 | 
						||
  echo "$command_line_filename" | LC_ALL=C $EGREP '^(/|[A-Za-z]:/)' >&6 \
 | 
						||
  || command_line_filename="./$command_line_filename"
 | 
						||
 | 
						||
  # See if the file exists.  If it doesn't we're in trouble since, even
 | 
						||
  # though the user may be able to reenter a valid filename at the tex
 | 
						||
  # prompt (assuming they're attending the terminal), this script won't
 | 
						||
  # be able to find the right xref files and so forth.
 | 
						||
  test -r "$command_line_filename" \
 | 
						||
  || error 1 "cannot read $command_line_filename, skipping."
 | 
						||
 | 
						||
  # Get the name of the current directory.
 | 
						||
  in_dir=`func_dirname "$command_line_filename"`
 | 
						||
  in_dir_abs=`absolute "$in_dir"`
 | 
						||
  # In a clean build, we `cd', so get an absolute file name.
 | 
						||
  if $tidy; then
 | 
						||
    in_dir=$in_dir_abs
 | 
						||
  fi
 | 
						||
 | 
						||
  # Strip directory part but leave extension.
 | 
						||
  in_base=`basename "$command_line_filename"`
 | 
						||
  # Strip extension.
 | 
						||
  in_noext=`noext "$in_base"`
 | 
						||
 | 
						||
  # The normalized file name to compile.  Must always point to the
 | 
						||
  # file to actually compile (in case of recoding, macro-expansion etc.).
 | 
						||
  in_input=$in_dir/$in_base
 | 
						||
 | 
						||
 | 
						||
  # Compute the output file name.
 | 
						||
  if test x"$oname" != x; then
 | 
						||
    out_name=$oname
 | 
						||
  else
 | 
						||
    out_name=$in_noext.`out_lang_ext`
 | 
						||
  fi
 | 
						||
  out_dir=`func_dirname "$out_name"`
 | 
						||
  out_dir_abs=`absolute "$out_dir"`
 | 
						||
  out_base=`basename "$out_name"`
 | 
						||
  out_noext=`noext "$out_base"`
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
## -------------- ##
 | 
						||
## TeXify files.  ##
 | 
						||
## -------------- ##
 | 
						||
 | 
						||
for command_line_filename
 | 
						||
do
 | 
						||
  verbose "Processing $command_line_filename ..."
 | 
						||
 | 
						||
  input_file_name_decode
 | 
						||
 | 
						||
  # `texinfo' or `latex'?
 | 
						||
  in_lang=`compute_language "$command_line_filename"`
 | 
						||
 | 
						||
  # An auxiliary directory used for all the auxiliary tasks involved
 | 
						||
  # in compiling this document.
 | 
						||
  case $build_dir in
 | 
						||
      '' | . ) t2ddir=$out_noext.t2d ;;
 | 
						||
      *) # Avoid collisions between multiple occurrences of the same
 | 
						||
         # file, so depend on the output path.  Remove leading `./',
 | 
						||
         # at least to avoid creating a file starting with `.!', i.e.,
 | 
						||
         # an invisible file. The sed expression is fragile if the cwd
 | 
						||
         # has active characters.  Transform / into ! so that we don't
 | 
						||
         # need `mkdir -p'.  It might be something to reconsider.
 | 
						||
         t2ddir=$build_dir/`echo "$out_dir_abs/$out_noext.t2d" |
 | 
						||
             $SED "s,^$orig_pwd/,,;s,^\./,,;s,/,!,g"`
 | 
						||
  esac
 | 
						||
  # Remove it at exit if clean mode.
 | 
						||
  trap "cleanup" 0 1 2 15
 | 
						||
 | 
						||
  ensure_dir "$build_dir" "$t2ddir"
 | 
						||
 | 
						||
  # We will change directory, better work with an absolute path...
 | 
						||
  t2ddir=`absolute "$t2ddir"`
 | 
						||
  # Sometimes there are incompatibilities between auxiliary files for
 | 
						||
  # DVI and PDF.  The contents can also change whether we work on PDF
 | 
						||
  # and/or DVI.  So keep separate spaces for each.
 | 
						||
  workdir=$t2ddir/`out_lang_tex`
 | 
						||
  ensure_dir "$workdir"
 | 
						||
 | 
						||
  # _build.  In a tidy build, where the auxiliary files are output.
 | 
						||
  if $tidy; then
 | 
						||
    work_build=$workdir/build
 | 
						||
  else
 | 
						||
    work_build=.
 | 
						||
  fi
 | 
						||
 | 
						||
  # _bak.  Copies of the previous auxiliary files (another round is
 | 
						||
  # run if they differ from the new ones).
 | 
						||
  work_bak=$workdir/bak
 | 
						||
 | 
						||
  # Make those directories.
 | 
						||
  ensure_dir "$work_build" "$work_bak"
 | 
						||
 | 
						||
  case $action in
 | 
						||
    compile)
 | 
						||
      # Compile the document.
 | 
						||
      compile
 | 
						||
      cleanup
 | 
						||
      ;;
 | 
						||
 | 
						||
    mostly-clean)
 | 
						||
      mostly_clean
 | 
						||
      ;;
 | 
						||
  esac
 | 
						||
done
 | 
						||
 | 
						||
verbose "done."
 | 
						||
exit 0 # exit successfully, not however we ended the loop.
 |