Many bug fixes
authorTom Tromey <tromey@redhat.com>
Sun, 6 Oct 1996 03:55:55 +0000 (03:55 +0000)
committerTom Tromey <tromey@redhat.com>
Sun, 6 Oct 1996 03:55:55 +0000 (03:55 +0000)
53 files changed:
ChangeLog
Makefile.am
Makefile.in
NEWS
TODO
aclocal.in
automake.in
automake.texi
comp-vars.am [moved from compile-vars.am with 100% similarity]
lib/am/Makefile.am
lib/am/comp-vars.am [new file with mode: 0644]
lib/am/libs.am [moved from libraries.am with 100% similarity]
lib/am/progs.am [moved from programs.am with 100% similarity]
lib/am/texi-vers.am [moved from texi-version.am with 100% similarity]
lib/texinfo.tex
lib/ylwrap
libs-clean.am [moved from libraries-clean.am with 100% similarity]
libs.am [new file with mode: 0644]
m4/Makefile.am
m4/Makefile.in
m4/ccsanity.m4 [moved from m4/AM_SANITY_CHECK_CC.m4 with 100% similarity]
m4/ccstdc.m4 [moved from m4/AM_PROG_CC_STDC.m4 with 100% similarity]
m4/dmalloc.m4 [moved from m4/AM_WITH_DMALLOC.m4 with 100% similarity]
m4/error.m4 [new file with mode: 0644]
m4/fnmatch.m4 [moved from m4/AM_FUNC_FNMATCH.m4 with 100% similarity]
m4/init.m4 [moved from m4/AM_INIT_AUTOMAKE.m4 with 100% similarity]
m4/install.m4 [moved from m4/AM_PROG_INSTALL.m4 with 100% similarity]
m4/lispdir.m4 [moved from m4/AM_PATH_LISPDIR.m4 with 100% similarity]
m4/maintainer.m4 [moved from m4/AM_MAINTAINER_MODE.m4 with 100% similarity]
m4/mktime.m4 [new file with mode: 0644]
m4/obstack.m4 [new file with mode: 0644]
m4/protos.m4 [moved from m4/AM_C_PROTOTYPES.m4 with 100% similarity]
m4/ptrdiff.m4 [moved from m4/AM_TYPE_PTRDIFF_T.m4 with 100% similarity]
m4/regex.m4 [moved from m4/AM_WITH_REGEX.m4 with 100% similarity]
m4/strtod.m4 [moved from m4/AM_FUNC_STRTOD.m4 with 100% similarity]
m4/termios.m4 [moved from m4/AM_SYS_POSIX_TERMIOS.m4 with 100% similarity]
m4/winsz.m4 [moved from m4/AM_HEADER_TIOCGWINSZ_NEEDS_SYS_IOCTL.m4 with 100% similarity]
progs-clean.am [moved from programs-clean.am with 100% similarity]
progs.am [new file with mode: 0644]
tests/ChangeLog
tests/Makefile.am
tests/Makefile.in
tests/checkall.test
tests/defun.test
tests/discover.test [new file with mode: 0755]
tests/error.test
tests/mkinst2.test [moved from tests/mkinstall2.test with 100% similarity]
tests/symlink.test [new file with mode: 0755]
texi-vars.am [moved from texinfos-vars.am with 100% similarity]
texi-vers.am [new file with mode: 0644]
texinfo.tex
version.texi
ylwrap

index a802ddf..3b708db 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,67 @@
+Sat Oct  5 11:29:48 1996  Tom Tromey  <tromey@cygnus.com>
+
+       * automake.in (generate_makefile): Put BUILT_SOURCES onto @all if
+       appropriate.
+       (handle_source_transform): Error if discovered source file is
+       mentioned.
+       (do_one_merge_target): Move all-vs-check test here.
+
+       * m4/obstack.m4: New file.
+       * m4/error.m4: New file.
+
+       * automake.in (scan_configure): Support AM_FUNC_MKTIME,
+       AM_FUNC_ERROR_AT_LINE, AM_FUNC_OBSTACK.
+
+       * texinfo.tex: New version from texinfo 3.9.
+
+       * automake.in (handle_yacc_lex_cxx): Updated for new ylwrap.
+       Also, handle y.tab.h file when "yacc -d" is used.
+       (do_one_merge_target): Use pretty_print_rule.
+
+       * ylwrap: Changed usage.
+
+       * m4/mktime.m4: New file.
+
+       * m4: Renamed all .m4 files to fit into 14-char limits.
+
+       * m4/Makefile.am (EXTRA_DIST): New macro.
+
+       * aclocal.in ($ac_defun_rx, %map, %file_contents): New globals.
+       (scan_m4_files): Use $ac_defun_rx.
+       (add_file): Ditto.
+       Run scan_m4_files.
+       (scan_configure): Scan acinclude.m4 before anything else.
+       (scan_file): New sub.
+       (check_acinclude): New sub.
+       (add_file): Rewrote.
+
+       * progs-clean.am, progs.am: Renamed from programs-clean.am,
+       programs.am.
+       * libs-clean.am, libs.am: Renamed from libraries-clean.am,
+       libraries.am.
+       * texi-vars: Renamed from texinfos-vars.am.
+       * comp-vars.am: Renamed from compile-vars.am.
+       * texi-vers.am: Renamed from texi-version.am.
+
+       * automake.in (require_file_internal): Give error if symlink can't
+       be made.
+       (require_config_file): Error message references configure.in.
+       (handle_yacc_lex_cxx): Fix order of arguments to ylwrap; from
+       Joerg-Martin Schwarz.
+       (handle_texinfo): Use texi-vers, not texi-version.
+       (get_object_extension): Use comp-vars, not compile-vars.
+       (handle_texinfo): Use texi-vars, not texinfos-vars.
+       (handle_libraries): Use `libs' prefix, not `libraries'.
+       (handle_programs): Use `progs' prefix, not `programs'.
+
+Fri Oct  4 01:14:08 1996  Tom Tromey  <tromey@cygnus.com>
+
+       * aclocal.in (scan_m4_files): New sub.
+
+       * m4/AM_FUNC_STRTOD.m4 (am_cv_func_strtod_needs_libm): Set
+       am_cv_func_strtod_needs_libm, so we can avoid linking with -lm
+       everywhere.
+
 Thu Oct  3 20:11:16 1996  Tom Tromey  <tromey@cygnus.com>
 
        * texinfos.am (uninstall-info): Run install-info --remove.
index 2ad35ce..a689a26 100644 (file)
@@ -9,13 +9,13 @@ SUBDIRS = tests m4
 bin_SCRIPTS = automake aclocal
 info_TEXINFOS = automake.texi
 
-pkgdata_DATA = clean-kr.am clean.am compile-kr.am compile-vars.am \
+pkgdata_DATA = clean-kr.am clean.am compile-kr.am comp-vars.am \
 compile.am data.am dejagnu.am depend.am depend2.am dist-vars.am footer.am \
-header.am header-vars.am kr-extra.am libraries.am library.am \
-mans-vars.am program.am programs.am remake-hdr.am remake-subd.am \
+header.am header-vars.am kr-extra.am libs.am library.am \
+mans-vars.am program.am progs.am remake-hdr.am remake-subd.am \
 remake.am scripts.am subdirs.am tags.am tags-subd.am tags-clean.am \
-texi-version.am texinfos-vars.am texinfos.am libraries-clean.am \
-programs-clean.am data-clean.am COPYING INSTALL texinfo.tex ansi2knr.c \
+texi-vers.am texi-vars.am texinfos.am libs-clean.am \
+progs-clean.am data-clean.am COPYING INSTALL texinfo.tex ansi2knr.c \
 ansi2knr.1 aclocal.m4 lisp.am lisp-clean.am
 
 ## These must all be executable when installed.
index 3e6bd04..55afae3 100644 (file)
@@ -47,13 +47,13 @@ SUBDIRS = tests m4
 bin_SCRIPTS = automake aclocal
 info_TEXINFOS = automake.texi
 
-pkgdata_DATA = clean-kr.am clean.am compile-kr.am compile-vars.am \
+pkgdata_DATA = clean-kr.am clean.am compile-kr.am comp-vars.am \
 compile.am data.am dejagnu.am depend.am depend2.am dist-vars.am footer.am \
-header.am header-vars.am kr-extra.am libraries.am library.am \
-mans-vars.am program.am programs.am remake-hdr.am remake-subd.am \
+header.am header-vars.am kr-extra.am libs.am library.am \
+mans-vars.am program.am progs.am remake-hdr.am remake-subd.am \
 remake.am scripts.am subdirs.am tags.am tags-subd.am tags-clean.am \
-texi-version.am texinfos-vars.am texinfos.am libraries-clean.am \
-programs-clean.am data-clean.am COPYING INSTALL texinfo.tex ansi2knr.c \
+texi-vers.am texi-vars.am texinfos.am libs-clean.am \
+progs-clean.am data-clean.am COPYING INSTALL texinfo.tex ansi2knr.c \
 ansi2knr.1 aclocal.m4 lisp.am lisp-clean.am
 
 pkgdata_SCRIPTS = config.guess config.sub install-sh interlock mdate-sh \
@@ -199,10 +199,20 @@ install-info: $(INFO_DEPS)
            else : ; fi; \
          done; \
        done
+       $(POST_INSTALL)
+       if $(SHELL) -c 'install-info --version' >/dev/null 2>&1; then \
+         for file in $(INFO_DEPS); do \
+           install-info --info-dir=$(infodir) $$file; \
+         done; \
+       else : ; fi
 
 uninstall-info:
-       cd $(srcdir) && for file in *.info*; do \
-         rm -f $(infodir)/$$file; \
+       if $(SHELL) -c 'install-info --version' >/dev/null 2>&1; then \
+         ii=yes; \
+       else ii=; fi; \
+       for file in $(INFO_DEPS); do \
+         (cd $(infodir) && rm -f $$file $$file-[0-9] $$file-[0-9][0-9]); \
+         test -z $ii || install-info --info-dir=$(infodir) --remove $$file; \
        done
 
 mostlyclean-info:
@@ -334,13 +344,10 @@ distdir: $(DEP_DISTFILES)
            || exit 1; \
        done
 info: $(INFO_DEPS) info-recursive
-
 dvi: $(DVIS) dvi-recursive
-
-check: check-recursive
-
+check: all
+       $(MAKE) check-recursive
 installcheck: installcheck-recursive installcheck-local
-
 all-am: $(INFO_DEPS) $(SCRIPTS) $(DATA) Makefile
 
 install-exec-am: install-binSCRIPTS
diff --git a/NEWS b/NEWS
index 13995f5..91c8c23 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,4 +1,4 @@
-New in 1.1e:
+New in 1.1f:
 * Bug fixes
 * Better DejaGNU support
 * Added no-installinfo option
diff --git a/TODO b/TODO
index 2969736..19cf634 100644 (file)
--- a/TODO
+++ b/TODO
@@ -1,15 +1,12 @@
 Priorities for release:
-- Jim's macro updates
-- yacc -vs- .h
-- documentation
-
-* test install-info
-  add install-info --remove
+!! documentation (eg new macros)
 
 Further:
 - texinfo/info changes
 - Per's suggestion
 - man page fixes
+- consider adding "echo"s to installs again.
+  users can use make SHELL='sh -x' to get the full dirt
 
 Avoid loops when installing; instead unroll them in automake
 
@@ -84,6 +81,11 @@ fixing configure target name (no $srcdir)
    Such files should be removed explicitly after the copy step!
    Doing this requires rewriting macros before generating Makefile.in.
 
+from joerg-martin schwarz:
+ -- If Makefile.am contains $(CC), $(COMPILE), $(YLWRAP), .... 
+    in an explicitly written rule,  you should emit the corresponding
+    Makefile variables automatically.
+
 add support for Makefile.tmpl that is auto-included in every
 Makefile.am.  That makes it easier to do some non-std thing in every
 subdirectory.
@@ -331,6 +333,8 @@ Karl> generally uses lowercase. Not that it matters :-).
 
 Stuff for aclocal:
 
+Should ignore ## comments.
+
 probably should put each group of m4 files into a subdir owned by the
 containing application.
 
index 034c764..adf622d 100644 (file)
@@ -51,6 +51,12 @@ $output_file = 'aclocal.m4';
 # Which files have been seen.
 %file_seen = ();
 
+# Map macro names to file names.
+%map = ();
+
+# Map file names to file contents.
+%file_contents = ();
+
 # How much to say.
 $verbosity = 0;
 
@@ -79,14 +85,22 @@ $verbosity = 0;
 
 $obsolete_rx = '(' . join ('|', @obsolete_macros) . ')';
 
+# Matches a macro definition.
+$ac_defun_rx = "AC_DEFUN\\(\\[?([^],)\n]+)\\]?";
+
+# Matches an AC_REQUIRE line.
+$ac_require_rx = "AC_REQUIRE\\(\\[?([^])]*)\\]?\\)";
+
 \f
 
 &parse_arguments (@ARGV);
+&scan_m4_files ($acdir);
 &scan_configure;
 if (! $exit_status)
 {
     &write_aclocal;
 }
+&check_acinclude;
 
 exit $exit_status;
 
@@ -145,7 +159,7 @@ sub parse_arguments
        }
        else
        {
-           &usage (1);
+           die "aclocal: unrecognized option -- \`$arglist[0]'\n";
        }
 
        shift (@arglist);
@@ -156,34 +170,19 @@ sub parse_arguments
 
 sub scan_configure
 {
-    # First, construct list of regexps to match the things we actually
-    # have.
-    opendir (DIR, $acdir)
-       || die "aclocal: couldn't open directory \`$acdir': $!\n";
-    local ($search, $elt);
-    foreach (sort grep (! /^\./, readdir (DIR)))
-    {
-       # Only examine .m4 files.
-       next unless s/\.m4$//;
-
-       # Skip some files when running out of srcdir.  Eg "aclocal.m4"
-       # must be skipped.
-       next unless /^[A-Za-z]+_[A-Z_]+$/;
-
-       print STDERR "Finding $_\n" if $verbosity;
-       ($elt = $_) =~ s/(\W)/\\$1/g;
-       $search .= "&add_file (\"$elt\") if /$elt/;\n";
-    }
-    closedir (DIR);
-
-    # Construct a new function that does the searching.  We use a
-    # function (instead of just evalling $search in the loop) so that
-    # "die" is correctly and easily propagated if run.
-    eval 'sub search { ' . $search . '};';
-
     open (CONFIGURE, "configure.in")
        || die "aclocal: couldn't open \`configure.in': $!\n";
 
+    # Add acinclude.m4 first.  That way it can override installed
+    # macros.
+    if (-f 'acinclude.m4')
+    {
+       # Do it this way so that any AC_REQUIRE in acinclude.m4 will
+       # take effect.
+       &scan_file ('acinclude.m4');
+       &add_file ('acinclude.m4');
+    }
+
     while (<CONFIGURE>)
     {
        # Remove comments from current line.
@@ -204,72 +203,140 @@ sub scan_configure
     }
 
     close (CONFIGURE);
+}
 
-    # Include this file if it exists
-    if (-f 'acinclude.m4')
+################################################################
+
+# Check macros in acinclude.m4.  If one is not used, warn.
+sub check_acinclude
+{
+    local ($key);
+
+    foreach $key (keys %map)
     {
-       &add_file ('acinclude.m4');
+       next unless $map{$key} eq 'acinclude.m4';
+       if (! $macro_seen{$key})
+       {
+           warn "aclocal: macro \`$key' defined in acinclude.m4 but never used\n";
+       }
     }
 }
 
 ################################################################
 
+# Scan all the installed m4 files and construct a map.
+sub scan_m4_files
+{
+    local ($m4dir) = @_;
+
+    opendir (DIR, $m4dir)
+       || die "aclocal: couldn't open directory \`$m4dir': $!\n";
+    local ($file, $fullfile, $expr);
+    foreach $file (sort grep (! /^\./, readdir (DIR)))
+    {
+       # Only examine .m4 files.
+       next unless $file =~ /\.m4$/;
+
+       # Skip some files when running out of srcdir.
+       next if $file eq 'aclocal.m4';
+
+       $fullfile = $m4dir . '/' . $file;
+       $file_contents{$fullfile} = &scan_file ($fullfile);
+    }
+    closedir (DIR);
+
+    # Construct a new function that does the searching.  We use a
+    # function (instead of just evalling $search in the loop) so that
+    # "die" is correctly and easily propagated if run.
+    local ($search, $expr, $key);
+    foreach $key (keys %map)
+    {
+       # acinclude.m4 doesn't matter for the search, since it is
+       # unconditionally included.
+       next if $map{$key} eq 'acinclude.m4';
+
+       # EXPR is a regexp matching the name of the macro.
+       ($expr = $key) =~ s/(\W)/\\$1/g;
+       $search .= "&add_macro ('" . $key . "') if /" . $expr . "/;\n";
+    }
+    eval 'sub search { ' . $search . '};';
+    die "internal error: $@\n search is $search " if $@;
+}
+
+################################################################
+
+# Add a macro to the output.
+sub add_macro
+{
+    local ($macro) = @_;
+
+    # Ignore AC_ macros.
+    return if $macro =~ /^AC_/;
+
+    if (! defined $map{$macro})
+    {
+       warn "aclocal: macro \`$macro' required but not defined\n";
+       $exit_status = 1;
+       return;
+    }
+
+    $macro_seen{$macro} = 1;
+    &add_file ($map{$macro});
+}
+
 # Add a file to output.
 sub add_file
 {
     local ($file) = @_;
-    local ($fullfile) = $file;
 
+    # Only add a file once.
     return if ($file_seen{$file});
     $file_seen{$file} = 1;
 
-    if (! -f $file)
+    $output .= $file_contents{$file} . "\n";
+    local (@rlist);
+    while ($file_contents{$file} =~ /$ac_require_rx/g)
     {
-       $fullfile = $acdir . '/' . $file . '.m4';
-       if (! -f $fullfile)
-       {
-           # Maybe the file is an Autoconf built-in.  Check the only
-           # way we know how.  Suggestions on how to make this better
-           # are welcome.  FIXME should give file and line number of
-           # enclosing file.
-           return if $file =~ /^AC_[A-Z_]+$/;
-           die "aclocal: file \`$file' not found\n";
-       }
+       print "pushing $1\n";
+       push (@rlist, $1);
     }
 
-    open (FILE, $fullfile)
-       || die "aclocal: couldn't open \`$fullfile': $!\n";
+    local ($macro);
+    foreach $macro (@rlist)
+    {
+       &add_macro ($macro);
+    }
+}
 
-    local (@rlist);
+# Scan a single M4 file.  Return contents.
+sub scan_file
+{
+    local ($file) = @_;
+
+    open (FILE, $file)
+       || die "aclocal: couldn't open \`$file': $!\n";
+    local ($contents) = '';
     while (<FILE>)
     {
-       $output .= $_;
+       # Ignore `##' lines.
+       next if /^##/;
+
+       $contents .= $_;
 
-       # See if we're defining a macro that was already seen.  This
-       # is mostly a special case for `acinclude.m4'.
-       if (/AC_DEFUN\(\[?([^])\n]+)\]?/)
-        {
-           if ($1 ne $file && $file_seen{$1})
+       if (/$ac_defun_rx/)
+       {
+           if (defined $map{$1})
            {
-               warn "aclocal: $fullfile: $.: duplicated macro \`$1'\n";
+               warn "aclocal: $file: $.: duplicated macro \`$1'\n";
                $exit_status = 1;
            }
-           $macro_seen{$1} = 1;
-       }
-
-       # See if some other macro is required.
-       if (/AC_REQUIRE\(\[?([^])]*)\]?\)/)
-       {
-           push (@rlist, $1) unless defined $macro_seen{$1};
+           print STDERR "Found macro $1 in $file\n" if $verbosity;
+           $map{$1} = $file;
        }
     }
-    $output .= "\n";
     close (FILE);
 
-    foreach $file (@rlist)
-    {
-       &add_file ($file);
-    }
+    return $contents;
 }
 
 ################################################################
@@ -277,7 +344,7 @@ sub add_file
 # Write output.
 sub write_aclocal
 {
-    return if ! $output;
+    return if ! length ($output);
 
     print STDERR "Writing aclocal.m4\n" if $verbosity;
 
index f415151..000e762 100755 (executable)
@@ -445,6 +445,12 @@ sub generate_makefile
     # This must be run after all the sources are scanned.
     &handle_yacc_lex_cxx;
 
+    # This is here for lack of a better place to put it.
+    if (&variable_defined ('BUILT_SOURCES'))
+    {
+       push (@all, '$(BUILT_SOURCES)');
+    }
+
     # Re-init SOURCES and OBJECTS.  FIXME: other code shouldn't depend
     # on this (but currently does).
     $contents{'SOURCES'} = join (' ', @sources);
@@ -581,7 +587,7 @@ sub get_object_extension
        }
        $xform = 's/\@CONFIG_INCLUDE_SPEC\@/' . $xform . '/go';
        $output_vars .= &file_contents_with_transform ($xform,
-                                                      'compile-vars');
+                                                      'comp-vars');
        $output_rules .= &file_contents ('compile');
        &push_phony_cleaners ('compile');
 
@@ -662,7 +668,7 @@ sub handle_yacc_lex_cxx
        $output_rules .= ".y.c:\n\t";
        if ($yacc_count > 1)
        {
-           $output_rules .= '$(INTERLOCK) =yacclockdir $(YLWRAP) y.tab.c $@ $(YACC) $(YFLAGS) $<';
+           $output_rules .= '$(INTERLOCK) =yacclockdir $(YLWRAP) "$(YACC)" y.tab.c $*.c y.tab.h $*.h -- $(YFLAGS) $<';
        }
        else
        {
@@ -685,7 +691,7 @@ sub handle_yacc_lex_cxx
        $output_rules .= ".l.c:\n\t";
        if ($lex_count > 1)
        {
-           $output_rules .= '$(INTERLOCK) =lexlockdir $(YLWRAP) $(LEX_OUTPUT_ROOT).c $@ $(LEX) $(LFLAGS) $<';
+           $output_rules .= '$(INTERLOCK) =lexlockdir $(YLWRAP) "$(LEX)" $(LEX_OUTPUT_ROOT).c $@ -- $(LFLAGS) $<';
        }
        else
        {
@@ -810,6 +816,17 @@ sub handle_source_transform
            local (@result) = ();
            foreach (@files)
            {
+               # If an automatically-discovered source file is
+               # mentioned, that is an error.
+               if (defined $libsources{$_})
+               {
+                   # FIXME: saving $_ is stupid.
+                   local ($save) = $_;
+                   &am_line_error ($prefix . $one_file . '_SOURCES',
+                                   "automatically discovered file \`$_' should not be explicitly mentioned");
+                   $_ = $save;
+               }
+
                # Skip header files, including C++-ish ones.  The list
                # of C++ header extensions comes from Emacs 19.32
                # etags.
@@ -959,7 +976,7 @@ sub handle_lib_objects
 sub handle_programs
 {
     local (@proglist) = &am_install_var ('-clean',
-                                        'programs', 'PROGRAMS',
+                                        'progs', 'PROGRAMS',
                                         'bin', 'sbin', 'libexec', 'pkglib',
                                         'noinst', 'check');
     return if ! @proglist;
@@ -1033,7 +1050,7 @@ sub handle_programs
 sub handle_libraries
 {
     local (@liblist) = &am_install_var ('-no-all', '-clean',
-                                       'libraries', 'LIBRARIES',
+                                       'libs', 'LIBRARIES',
                                        'lib', 'pkglib', 'noinst', 'check');
     return if ! @liblist;
 
@@ -1275,7 +1292,7 @@ sub handle_texinfo
                     . 's/\@VTI\@/' . $vti . '/g; '
                     . 's/\@VTEXI\@/' . $vtexi . '/g;'
                     . 's,\@MDDIR\@,' . $conf_pat . ',g;',
-                    'texi-version');
+                    'texi-vers');
 
            &push_phony_cleaners ($vti);
        }
@@ -1318,7 +1335,7 @@ sub handle_texinfo
     }
 
     # Some boilerplate.
-    $output_vars .= &file_contents ('texinfos-vars');
+    $output_vars .= &file_contents ('texi-vars');
     $output_rules .= &file_contents ('texinfos');
     push (@phony, 'install-info', 'uninstall-info');
 
@@ -2217,14 +2234,6 @@ sub handle_merge_targets
 
     &do_one_merge_target ('info', @info);
     &do_one_merge_target ('dvi', @dvi);
-
-    if (! &variable_defined ('SUBDIRS') || $relative_dir ne '.')
-    {
-       # 'check' must depend on 'all', but not at top level.
-       # Ditto install.
-       unshift (@check, 'all');
-       unshift (@install, 'all');
-    }
     &do_one_merge_target ('check', @check);
     &do_one_merge_target ('installcheck', @installcheck);
 
@@ -2410,12 +2419,27 @@ sub do_one_merge_target
        push (@phony, $name . '-local');
     }
 
-    $output_rules .= $name . ":";
-    if (@values)
+    local ($done) = 0;
+    if ($name eq 'check')
     {
-       $output_rules .= ' ' . join (' ', @values);
+       if (! &variable_defined ('SUBDIRS'))
+       {
+           # 'check' must depend on 'all', but not when doing
+           # recursive build.
+           unshift (@values, 'all');
+       }
+       else
+       {
+           # When subdirs are used, do the `all' build and then do
+           # all the recursive stuff.
+           $output_rules .= "check: all\n";
+           &pretty_print_rule ("\t\$(MAKE)", "\t  ", @values);
+           $done = 1;
+       }
     }
-    $output_rules .= "\n\n";
+
+    &pretty_print_rule ($name . ":", "\t\t", @values)
+       unless $done;
     push (@phony, $name);
 }
 
@@ -2692,6 +2716,20 @@ sub scan_configure
            $libsources{'regex.c'} = 1;
            $libsources{'regex.h'} = 1;
        }
+       elsif (/AM_FUNC_MKTIME/)
+       {
+           $libsources{'mktime.c'} = 1;
+       }
+       elsif (/AM_FUNC_ERROR_AT_LINE/)
+       {
+           $libsources{'error.c'} = 1;
+           $libsources{'error.h'} = 1;
+       }
+       elsif (/AM_FUNC_OBSTACK/)
+       {
+           $libsources{'obstack.c'} = 1;
+           $libsources{'obstack.h'} = 1;
+       }
        elsif (/LIBOBJS="(.*)\s+\$LIBOBJS"/
               || /LIBOBJS="\$LIBOBJS\s+(.*)"/)
        {
@@ -3810,51 +3848,49 @@ sub require_file_internal
        {
            if ($strictness >= $mystrict)
            {
+               local ($trailer) = '';
+               local ($suppress) = 0;
+
                # Only install missing files according to our desired
                # strictness level.
                if ($add_missing && -f ($am_dir . '/' . $file))
                {
+                   $trailer = "; installing";
+                   $suppress = 1;
                    # Install the missing file.  Symlink if we can, copy
                    # if we must.
                    if ($symlink_exists)
                    {
-                       symlink ($am_dir . '/' . $file, $errfile);
+                       if (! symlink ($am_dir . '/' . $file, $errfile))
+                       {
+                           $suppress = 0;
+                           $trailer .= "; error while making link: $!\n";
+                       }
                    }
                    else
                    {
-                       system ('cp', $am_dir . '/' . $file, $errfile);
+                       if (! system ('cp', $am_dir . '/' . $file, $errfile))
+                       {
+                           $suppress = 0;
+                           $trailer .= "\n    error while making link: $!\n";
+                       }
                    }
+               }
 
-                   # FIXME: this is a hack.  Should have am_warn.
-                   local ($save) = $exit_status;
-                   if ($is_configure)
-                   {
-                       &am_conf_line_error
-                           ($line,
-                            "required file \"$errfile\" not found; installing");
-                   }
-                   else
-                   {
-                       &am_line_error
-                           ($line,
-                            "required file \"$errfile\" not found; installing");
-                   }
-                   $exit_status = $save;
+               local ($save) = $exit_status;
+               if ($is_configure)
+               {
+                   &am_conf_line_error
+                       ($line,
+                        "required file \"$errfile\" not found$trailer");
                }
                else
                {
-                   # Only an error if strictness constraint violated.
-                   if ($is_configure)
-                   {
-                       &am_conf_line_error
-                           ($line, "required file \"$errfile\" not found");
-                   }
-                   else
-                   {
-                       &am_line_error
-                           ($line, "required file \"$errfile\" not found");
-                   }
+                   &am_line_error
+                       ($line,
+                        "required file \"$errfile\" not found$trailer");
                }
+               $exit_status = $save if $suppress;
            }
        }
     }
@@ -3885,7 +3921,7 @@ sub require_file
 sub require_config_file
 {
     @require_file_paths = @config_aux_path;
-    &require_file_internal (0, '', @_);
+    &require_file_internal (1, '', @_);
     local ($dir) = $require_file_paths[0];
     @config_aux_path = @require_file_paths;
     if ($dir eq '.')
index 394646c..c22bcda 100644 (file)
 @set Francois Fran\noexpand\ptexc cois
 @end tex
 
-@ifinfo
-@format
-START-INFO-DIR-ENTRY
+@dircategory GNU admin
+@direntry
 * automake: (automake).                Making Makefile.in's
-END-INFO-DIR-ENTRY
-@end format
-@end ifinfo
+@end direntry
+
+@dircategory Individual utilities
+@direntry
+* aclocal: (automake)Invoking aclocal           Generating aclocal.m4
+@end direntry
 
 @ifinfo
 This file documents GNU automake @value{VERSION}
@@ -157,7 +159,7 @@ fully GNU standards-compliant, and do not require @code{perl} in order
 to be built.
 
 Mail suggestions and bug reports for Automake to
-bug-gnu-utils@@prep.ai.mit.edu.
+@email{bug-gnu-utils@@prep.ai.mit.edu}.
 
 
 @node Invoking Automake
@@ -680,8 +682,9 @@ This is required when using automatic de-ANSI-fication, see @ref{ANSI}.
 
 @item ud_GNU_GETTEXT
 This macro is required for packages which use GNU gettext
-(@pxref{gettext}).  It is distributed with gettext.  Automake uses this
-macro to ensure that the package meets some of gettext's requirements.
+(@pxref{gettext}).  It is distributed with gettext.  If Automake sees
+this macro it ensures that the package meets some of gettext's
+requirements.
 @cvindex ud_GNU_GETTEXT
 
 @item AM_MAINTAINER_MODE
@@ -739,6 +742,10 @@ If the @code{strtod} function is not available, or does not work
 correctly (like the one on SunOS 5.4), add @samp{strtod.o} to output
 variable @code{LIBOBJS}.
 
+@item AM_FUNC_ERROR_AT_LINE
+@item AM_FUNC_MKTIME
+@item AM_FUNC_OBSTACK
+
 @item AM_C_PROTOTYPES
 @item AM_HEADER_TIOCGWINSZ_NEEDS_SYS_IOCTL
 @item AM_INIT_AUTOMAKE
@@ -784,7 +791,6 @@ distribution:
 
 @example
 SUBDIRS = lib src doc man
-EXTRA_DIST = @@README_ALPHA@@
 @end example
 
 @code{SUBDIRS} can contain configure substitutions (eg @samp{@@DIRS@@});
@@ -1066,6 +1072,9 @@ Note that the directory holding the @code{ansi2knr} support files must
 be built before all other directories using these files.  Automake does
 not currently check that this is the case.
 
+Note also that @code{ansi2knr} assumes the source code will be formatted
+in a particular way.  See the @code{ansi2knr} man page for details.
+
 
 @node Dependencies
 @section Automatic dependency tracking
@@ -1596,6 +1605,13 @@ notify GNU Make of the new suffixes.  This can be done by putting a list
 of new suffixes in the @code{SUFFIXES} variable.
 @vindex SUFFIXES
 
+For instance, currently automake does not provide any Java support.  If
+you wrote a macro to generate @samp{.class} files from @samp{.java}
+source files, you would also need to add these suffixes to the list:
+
+@example
+SUFFIXES = .java .class
+@end example
 
 @node Built
 @section Built sources
similarity index 100%
rename from compile-vars.am
rename to comp-vars.am
index 2ad35ce..a689a26 100644 (file)
@@ -9,13 +9,13 @@ SUBDIRS = tests m4
 bin_SCRIPTS = automake aclocal
 info_TEXINFOS = automake.texi
 
-pkgdata_DATA = clean-kr.am clean.am compile-kr.am compile-vars.am \
+pkgdata_DATA = clean-kr.am clean.am compile-kr.am comp-vars.am \
 compile.am data.am dejagnu.am depend.am depend2.am dist-vars.am footer.am \
-header.am header-vars.am kr-extra.am libraries.am library.am \
-mans-vars.am program.am programs.am remake-hdr.am remake-subd.am \
+header.am header-vars.am kr-extra.am libs.am library.am \
+mans-vars.am program.am progs.am remake-hdr.am remake-subd.am \
 remake.am scripts.am subdirs.am tags.am tags-subd.am tags-clean.am \
-texi-version.am texinfos-vars.am texinfos.am libraries-clean.am \
-programs-clean.am data-clean.am COPYING INSTALL texinfo.tex ansi2knr.c \
+texi-vers.am texi-vars.am texinfos.am libs-clean.am \
+progs-clean.am data-clean.am COPYING INSTALL texinfo.tex ansi2knr.c \
 ansi2knr.1 aclocal.m4 lisp.am lisp-clean.am
 
 ## These must all be executable when installed.
diff --git a/lib/am/comp-vars.am b/lib/am/comp-vars.am
new file mode 100644 (file)
index 0000000..801b235
--- /dev/null
@@ -0,0 +1,22 @@
+## automake - create Makefile.in from Makefile.am
+## Copyright (C) 1994, 1995, 1996 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 2, 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, write to the Free Software
+## Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+## 02111-1307, USA.
+
+DEFS = @DEFS@ -I. -I$(srcdir) @CONFIG_INCLUDE_SPEC@
+CPPFLAGS = @CPPFLAGS@
+LDFLAGS = @LDFLAGS@
+LIBS = @LIBS@
similarity index 100%
rename from libraries.am
rename to lib/am/libs.am
similarity index 100%
rename from programs.am
rename to lib/am/progs.am
similarity index 100%
rename from texi-version.am
rename to lib/am/texi-vers.am
index 4e2a181..a579fc6 100644 (file)
@@ -35,7 +35,7 @@
 
 % This automatically updates the version number based on RCS.
 \def\deftexinfoversion$#1: #2 ${\def\texinfoversion{#2}}
-\deftexinfoversion$Revision: 1.4 $
+\deftexinfoversion$Revision: 1.5 $
 \message{Loading texinfo package [Version \texinfoversion]:}
 
 % If in a .fmt file, print the version number
 
 % Save some parts of plain tex whose names we will redefine.
 
-\let\ptextilde=\~
-\let\ptexlbrace=\{
-\let\ptexrbrace=\}
-\let\ptexdots=\dots
-\let\ptexdot=\.
-\let\ptexstar=\*
-\let\ptexend=\end
-\let\ptexbullet=\bullet
 \let\ptexb=\b
+\let\ptexbullet=\bullet
 \let\ptexc=\c
+\let\ptexcomma=\,
+\let\ptexdot=\.
+\let\ptexdots=\dots
+\let\ptexend=\end
+\let\ptexequiv = \equiv
 \let\ptexi=\i
+\let\ptexlbrace=\{
+\let\ptexrbrace=\}
+\let\ptexstar=\*
 \let\ptext=\t
-\let\ptexl=\l
-\let\ptexL=\L
+\let\ptextilde=\~
 
 % Be sure we're in horizontal mode when doing a tie, since we make space
 % equivalent to this in @example-like environments. Otherwise, a space
@@ -74,6 +74,7 @@
 }
 \let\~ = \tie                  % And make it available as @~.
 
+
 \message{Basics,}
 \chardef\other=12
 
 \hyphenation{eshell}
 
 % Margin to add to right of even pages, to left of odd pages.
-\newdimen \bindingoffset  \bindingoffset=0pt
-\newdimen \normaloffset   \normaloffset=\hoffset
+\newdimen \bindingoffset  
+\newdimen \normaloffset   
 \newdimen\pagewidth \newdimen\pageheight
-\pagewidth=\hsize \pageheight=\vsize
 
 % Sometimes it is convenient to have everything in the transcript file
 % and nothing on the terminal.  We don't just call \tracingall here,
 \newdimen\cornerlong \newdimen\cornerthick
 \newdimen \topandbottommargin
 \newdimen \outerhsize \newdimen \outervsize
-\cornerlong=1pc\cornerthick=.3pt       % These set size of cropmarks
+\cornerlong=1pc\cornerthick=.3pt        % These set size of cropmarks
 \outerhsize=7in
 %\outervsize=9.5in
 % Alternative @smallbook page size is 9.25in
 %---------------------End change-----------------------
 
 % \onepageout takes a vbox as an argument.  Note that \pagecontents
-% does insertions itself, but you have to call it yourself.
+% does insertions, but you have to call it yourself.
 \chardef\PAGE=255  \output={\onepageout{\pagecontents\PAGE}}
-\def\onepageout#1{\hoffset=\normaloffset
-\ifodd\pageno  \advance\hoffset by \bindingoffset
-\else \advance\hoffset by -\bindingoffset\fi
-{\escapechar=`\\\relax % makes sure backslash is used in output files.
-\shipout\vbox{{\let\hsize=\pagewidth \makeheadline} \pagebody{#1}%
-{\let\hsize=\pagewidth \makefootline}}}%
-\advancepageno \ifnum\outputpenalty>-20000 \else\dosupereject\fi}
+\def\onepageout#1{%
+  \hoffset=\normaloffset
+  \ifodd\pageno  \advance\hoffset by \bindingoffset
+  \else \advance\hoffset by -\bindingoffset\fi
+  {%
+    \escapechar = `\\ % use backslash in output files.
+    \indexdummies
+    \shipout\vbox{%
+      {\let\hsize=\pagewidth \makeheadline}%
+      \pagebody{#1}%
+      {\let\hsize=\pagewidth \makefootline}%
+    }%
+  }%
+  \advancepageno
+  \ifnum\outputpenalty>-20000 \else\dosupereject\fi
+}
 
 %%%% For @cropmarks command %%%%
 
 %
 \def\croppageout#1{\hoffset=0pt % make sure this doesn't mess things up
 {\escapechar=`\\\relax % makes sure backslash is used in output files.
-                \shipout
-                \vbox to \outervsize{\hsize=\outerhsize
+                 \shipout
+                 \vbox to \outervsize{\hsize=\outerhsize
                  \vbox{\line{\ewtop\hfill\ewtop}}
                  \nointerlineskip
                  \line{\vbox{\moveleft\cornerthick\nstop}
                        \vbox{\moveright\cornerthick\nstop}}
                  \vskip \topandbottommargin
                  \centerline{\ifodd\pageno\hskip\bindingoffset\fi
-                       \vbox{
-                       {\let\hsize=\pagewidth \makeheadline}
-                       \pagebody{#1}
-                       {\let\hsize=\pagewidth \makefootline}}
-                       \ifodd\pageno\else\hskip\bindingoffset\fi}
-                \vskip \topandbottommargin plus1fill minus1fill
+                        \vbox{
+                        {\let\hsize=\pagewidth \makeheadline}
+                        \pagebody{#1}
+                        {\let\hsize=\pagewidth \makefootline}}
+                        \ifodd\pageno\else\hskip\bindingoffset\fi}
+                 \vskip \topandbottommargin plus1fill minus1fill
                  \boxmaxdepth\cornerthick
                  \line{\vbox{\moveleft\cornerthick\nsbot}
                        \hfill
                        \vbox{\moveright\cornerthick\nsbot}}
                  \nointerlineskip
                  \vbox{\line{\ewbot\hfill\ewbot}}
-       }}
+        }}
   \advancepageno
   \ifnum\outputpenalty>-20000 \else\dosupereject\fi}
 %
 %\def\'{{'}}
 
 % Used to generate quoted braces.
-
 \def\mylbrace {{\tt \char '173}}
 \def\myrbrace {{\tt \char '175}}
 \let\{=\mylbrace
 \let\}=\myrbrace
+\begingroup
+  % Definitions to produce actual \{ & \} command in an index.
+  \catcode`\{ = 12 \catcode`\} = 12
+  \catcode`\[ = 1 \catcode`\] = 2
+  \catcode`\@ = 0 \catcode`\\ = 12
+  @gdef@lbracecmd[\{]%
+  @gdef@rbracecmd[\}]%
+@endgroup
+
+% Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent
+% Others are defined by plain TeX: @` @' @" @^ @~ @= @v @H.
+\let\, = \c
+\let\dotaccent = \.
+\def\ringaccent#1{{\accent23 #1}}
+\let\tieaccent = \t
+\let\ubaraccent = \b
+\let\udotaccent = \d
+
+% Other special characters: @questiondown @exclamdown
+% Plain TeX defines: @AA @AE @O @OE @L (and lowercase versions) @ss.
+\def\questiondown{?`}
+\def\exclamdown{!`}
+
+% Dotless i and dotless j, used for accents.
+\def\imacro{i}
+\def\jmacro{j}
+\def\dotless#1{%
+  \def\temp{#1}%
+  \ifx\temp\imacro \ptexi
+  \else\ifx\temp\jmacro \j
+  \else \errmessage{@dotless can be used only with i or j}%
+  \fi\fi
+}
 
 % @: forces normal size whitespace following.
 \def\:{\spacefactor=1000 }
@@ -579,7 +620,7 @@ where each line of input produces a line of output.}
 % @sp n   outputs n lines of vertical space
 
 \def\sp{\parsearg\spxxx}
-\def\spxxx #1{\par \vskip #1\baselineskip}
+\def\spxxx #1{\vskip #1\baselineskip}
 
 % @comment ...line which is ignored...
 % @c is the same as @comment
@@ -592,6 +633,9 @@ where each line of input produces a line of output.}
 
 \let\c=\comment
 
+% @paragraphindent  is defined for the Info formatting commands only.
+\let\paragraphindent=\comment
+
 % Prevent errors for section commands.
 % Used in @ignore and in failing conditionals.
 \def\ignoresections{%
@@ -681,10 +725,15 @@ where each line of input produces a line of output.}
 \def\menu{\doignore{menu}}
 \def\direntry{\doignore{direntry}}
 
+% Also ignore @macro ... @end macro.  The user must run texi2dvi,
+% which runs makeinfo to do macro expansion.  Ignore @unmacro, too.
+\def\macro{\doignore{macro}}
+\let\unmacro = \comment
+
+
 % @dircategory CATEGORY  -- specify a category of the dir file
 % which this file should belong to.  Ignore this in TeX.
-
-\def\dircategory{\comment}
+\let\dircategory = \comment
 
 % Ignore text until a line `@end #1'.
 %
@@ -717,6 +766,7 @@ where each line of input produces a line of output.}
     \immediate\write16{If you are running another version of TeX, relax.}
     \immediate\write16{If you are running Unix TeX 3.0, kill this TeX process.}
     \immediate\write16{  Then upgrade your TeX installation if you can.}
+    \immediate\write16{  (See ftp://ftp.gnu.ai.mit.edu/pub/gnu/TeX.README.)}
     \immediate\write16{If you are stuck with version 3.0, run the}
     \immediate\write16{  script ``tex3patch'' from the Texinfo distribution}
     \immediate\write16{  to use a workaround.}
@@ -822,9 +872,9 @@ where each line of input produces a line of output.}
 % @value{foo} gets the text saved in variable foo.
 %
 \def\value#1{\expandafter
-               \ifx\csname SET#1\endcsname\relax
-                       {\{No value for ``#1''\}}
-               \else \csname SET#1\endcsname \fi}
+                \ifx\csname SET#1\endcsname\relax
+                        {\{No value for ``#1''\}}
+                \else \csname SET#1\endcsname \fi}
 
 % @ifset VAR ... @end ifset reads the `...' iff VAR has been defined
 % with @set.
@@ -924,6 +974,7 @@ where each line of input produces a line of output.}
 \expandafter\expandafter\expandafter\appendixsetref{\lastnode}\fi
 \global\let\lastnode=\relax}
 
+% @refill is a no-op.
 \let\refill=\relax
 
 % @setfilename is done at the beginning of every texinfo file.
@@ -938,16 +989,13 @@ where each line of input produces a line of output.}
    \comment % Ignore the actual filename.
 }
 
+% @bye.
 \outer\def\bye{\pagealignmacro\tracingstats=1\ptexend}
 
-\def\inforef #1{\inforefzzz #1,,,,**}
-\def\inforefzzz #1,#2,#3,#4**{\putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}},
-  node \samp{\ignorespaces#1{}}}
-
-\def\macro#1{\begingroup\ignoresections\catcode`\#=6\def\macrotemp{#1}\parsearg\macroxxx}
-\def\macroxxx#1#2 \end macro{%
-\expandafter\gdef\macrotemp#1{#2}%
-\endgroup}
+% \def\macro#1{\begingroup\ignoresections\catcode`\#=6\def\macrotemp{#1}\parsearg\macroxxx}
+% \def\macroxxx#1#2 \end macro{%
+% \expandafter\gdef\macrotemp#1{#2}%
+% \endgroup}
 
 %\def\linemacro#1{\begingroup\ignoresections\catcode`\#=6\def\macrotemp{#1}\parsearg\linemacroxxx}
 %\def\linemacroxxx#1#2 \end linemacro{%
@@ -959,6 +1007,7 @@ where each line of input produces a line of output.}
 
 %\def\butfirst#1{}
 
+
 \message{fonts,}
 
 % Font-change commands.
@@ -988,7 +1037,7 @@ where each line of input produces a line of output.}
 \fi
 % Support font families that don't use the same naming scheme as CM.
 \def\rmshape{r}
-\def\rmbshape{bx}              %where the normal face is bold
+\def\rmbshape{bx}               %where the normal face is bold
 \def\bfshape{b}
 \def\bxshape{bx}
 \def\ttshape{tt}
@@ -1028,7 +1077,7 @@ where each line of input produces a line of output.}
 \setfont\deftt\ttshape{10}{\magstep1}
 \def\df{\let\tentt=\deftt \let\tenbf = \defbf \bf}
 
-% Fonts for indices and small examples.
+% Fonts for indices and small examples (9pt).
 % We actually use the slanted font rather than the italic,
 % because texinfo normally uses the slanted fonts for that.
 % Do not make many font distinctions in general in the index, since they
@@ -1045,7 +1094,7 @@ where each line of input produces a line of output.}
 \font\indi=cmmi9
 \font\indsy=cmsy9
 
-% Fonts for headings
+% Chapter (and unnumbered) fonts (17.28pt).
 \setfont\chaprm\rmbshape{12}{\magstep2}
 \setfont\chapit\itbshape{10}{\magstep3}
 \setfont\chapsl\slbshape{10}{\magstep3}
@@ -1057,6 +1106,7 @@ where each line of input produces a line of output.}
 \font\chapi=cmmi12 scaled \magstep2
 \font\chapsy=cmsy10 scaled \magstep3
 
+% Section fonts (14.4pt).
 \setfont\secrm\rmbshape{12}{\magstep1}
 \setfont\secit\itbshape{10}{\magstep2}
 \setfont\secsl\slbshape{10}{\magstep2}
@@ -1074,14 +1124,15 @@ where each line of input produces a line of output.}
 % \setfont\ssectt\ttshape{10}{\magstep1}
 % \setfont\ssecsf\sfshape{10}{\magstep1}
 
-%\setfont\ssecrm\bfshape{10}{1315}     % Note the use of cmb rather than cmbx.
-%\setfont\ssecit\itshape{10}{1315}     % Also, the size is a little larger than
-%\setfont\ssecsl\slshape{10}{1315}     % being scaled magstep1.
+%\setfont\ssecrm\bfshape{10}{1315}      % Note the use of cmb rather than cmbx.
+%\setfont\ssecit\itshape{10}{1315}      % Also, the size is a little larger than
+%\setfont\ssecsl\slshape{10}{1315}      % being scaled magstep1.
 %\setfont\ssectt\ttshape{10}{1315}
 %\setfont\ssecsf\sfshape{10}{1315}
 
 %\let\ssecbf=\ssecrm
 
+% Subsection fonts (13.15pt).
 \setfont\ssecrm\rmbshape{12}{\magstephalf}
 \setfont\ssecit\itbshape{10}{1315}
 \setfont\ssecsl\slbshape{10}{1315}
@@ -1127,22 +1178,23 @@ where each line of input produces a line of output.}
   \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl
   \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc
   \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy \let\tenttsl=\chapttsl
-  \resetmathfonts}
+  \resetmathfonts \setleading{19pt}}
 \def\secfonts{%
   \let\tenrm=\secrm \let\tenit=\secit \let\tensl=\secsl
   \let\tenbf=\secbf \let\tentt=\sectt \let\smallcaps=\secsc
   \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy \let\tenttsl=\secttsl
-  \resetmathfonts}
+  \resetmathfonts \setleading{16pt}}
 \def\subsecfonts{%
   \let\tenrm=\ssecrm \let\tenit=\ssecit \let\tensl=\ssecsl
   \let\tenbf=\ssecbf \let\tentt=\ssectt \let\smallcaps=\ssecsc
   \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy \let\tenttsl=\ssecttsl
-  \resetmathfonts}
+  \resetmathfonts \setleading{15pt}}
+\let\subsubsecfonts = \subsecfonts % Maybe make sssec fonts scaled magstephalf?
 \def\indexfonts{%
   \let\tenrm=\indrm \let\tenit=\indit \let\tensl=\indsl
   \let\tenbf=\indbf \let\tentt=\indtt \let\smallcaps=\indsc
   \let\tensf=\indsf \let\teni=\indi \let\tensy=\indsy \let\tenttsl=\indttsl
-  \resetmathfonts}
+  \resetmathfonts \setleading{12pt}}
 
 % Set up the default fonts, so we can use them for creating boxes.
 %
@@ -1186,11 +1238,21 @@ where each line of input produces a line of output.}
 }
 \let\ttfont=\t
 \def\samp #1{`\tclose{#1}'\null}
-\def\key #1{{\ttsl \nohyphenation \uppercase{#1}}\null}
+\setfont\smallrm\rmshape{8}{1000}
+\font\smallsy=cmsy9
+\def\key#1{{\smallrm\textfont2=\smallsy \leavevmode\hbox{%
+  \raise0.4pt\hbox{$\langle$}\kern-.08em\vtop{%
+    \vbox{\hrule\kern-0.4pt
+     \hbox{\raise0.4pt\hbox{\vphantom{$\langle$}}#1}}%
+    \kern-0.4pt\hrule}%
+  \kern-.06em\raise0.4pt\hbox{$\rangle$}}}}
+% The old definition, with no lozenge:
+%\def\key #1{{\ttsl \nohyphenation \uppercase{#1}}\null}
 \def\ctrl #1{{\tt \rawbackslash \hat}#1}
 
 \let\file=\samp
 \let\url=\samp % perhaps include a hypertex \special eventually
+\def\email#1{$\langle${\tt #1}$\rangle$}
 
 % @code is a modification of @t,
 % which makes spaces the same size as normal in the surrounding text.
@@ -1222,7 +1284,7 @@ where each line of input produces a line of output.}
 % Unfortunately, TeX uses one parameter (\hyphenchar) to control
 % both hyphenation at - and hyphenation within words.
 % We must therefore turn them both off (\tclose does that)
-% and arrange explicitly to hyphenate an a dash.
+% and arrange explicitly to hyphenate at a dash.
 %  -- rms.
 {
 \catcode`\-=\active
@@ -1267,12 +1329,19 @@ where each line of input produces a line of output.}
 
 \def\kbd#1{\def\look{#1}\expandafter\kbdfoo\look??\par}
 
-\def\l#1{{\li #1}\null}                %
+% @l was never documented to mean ``switch to the Lisp font'',
+% and it is not used as such in any manual I can find.  We need it for
+% Polish suppressed-l.  --karl, 22sep96.
+%\def\l#1{{\li #1}\null}
 
-\def\r#1{{\rm #1}}             % roman font
+\def\r#1{{\rm #1}}              % roman font
 % Use of \lowercase was suggested.
-\def\sc#1{{\smallcaps#1}}      % smallcaps font
-\def\ii#1{{\it #1}}            % italic font
+\def\sc#1{{\smallcaps#1}}       % smallcaps font
+\def\ii#1{{\it #1}}             % italic font
+
+% @pounds{} is a sterling sign.
+\def\pounds{{\it\$}}
+
 
 \message{page headings,}
 
@@ -1287,7 +1356,7 @@ where each line of input produces a line of output.}
 
 \def\shorttitlepage{\parsearg\shorttitlepagezzz}
 \def\shorttitlepagezzz #1{\begingroup\hbox{}\vskip 1.5in \chaprm \centerline{#1}%
-       \endgroup\page\hbox{}\page}
+        \endgroup\page\hbox{}\page}
 
 \def\titlepage{\begingroup \parindent=0pt \textfonts
    \let\subtitlerm=\tenrm
@@ -1304,9 +1373,9 @@ where each line of input produces a line of output.}
    % Now you can print the title using @title.
    \def\title{\parsearg\titlezzz}%
    \def\titlezzz##1{\leftline{\titlefont{##1}}
-                   % print a rule at the page bottom also.
-                   \finishedtitlepagefalse
-                   \vskip4pt \hrule height 4pt width \hsize \vskip4pt}%
+                    % print a rule at the page bottom also.
+                    \finishedtitlepagefalse
+                    \vskip4pt \hrule height 4pt width \hsize \vskip4pt}%
    % No rule at page bottom unless we print one at the top with @title.
    \finishedtitlepagetrue
    %
@@ -1324,7 +1393,7 @@ where each line of input produces a line of output.}
    \let\oldpage = \page
    \def\page{%
       \iffinishedtitlepage\else
-        \finishtitlepage
+         \finishtitlepage
       \fi
       \oldpage
       \let\page = \oldpage
@@ -1412,14 +1481,15 @@ where each line of input produces a line of output.}
 %
 }% unbind the catcode of @.
 
-% @headings double     turns headings on for double-sided printing.
-% @headings single     turns headings on for single-sided printing.
-% @headings off                turns them off.
-% @headings on         same as @headings double, retained for compatibility.
-% @headings after      turns on double-sided headings after this page.
-% @headings doubleafter        turns on double-sided headings after this page.
+% @headings double      turns headings on for double-sided printing.
+% @headings single      turns headings on for single-sided printing.
+% @headings off         turns them off.
+% @headings on          same as @headings double, retained for compatibility.
+% @headings after       turns on double-sided headings after this page.
+% @headings doubleafter turns on double-sided headings after this page.
 % @headings singleafter turns on single-sided headings after this page.
-% By default, they are off.
+% By default, they are off at the start of a document,
+% and turned `on' after @end titlepage.
 
 \def\headings #1 {\csname HEADINGS#1\endcsname}
 
@@ -1433,22 +1503,24 @@ where each line of input produces a line of output.}
 % title on inside top of left hand pages, and page numbers on outside top
 % edge of all pages.
 \def\HEADINGSdouble{
-%\pagealignmacro
 \global\pageno=1
 \global\evenfootline={\hfil}
 \global\oddfootline={\hfil}
 \global\evenheadline={\line{\folio\hfil\thistitle}}
 \global\oddheadline={\line{\thischapter\hfil\folio}}
+\global\let\contentsalignmacro = \chapoddpage
 }
+\let\contentsalignmacro = \chappager
+
 % For single-sided printing, chapter title goes across top left of page,
 % page number on top right.
 \def\HEADINGSsingle{
-%\pagealignmacro
 \global\pageno=1
 \global\evenfootline={\hfil}
 \global\oddfootline={\hfil}
 \global\evenheadline={\line{\thischapter\hfil\folio}}
 \global\oddheadline={\line{\thischapter\hfil\folio}}
+\global\let\contentsalignmacro = \chappager
 }
 \def\HEADINGSon{\HEADINGSdouble}
 
@@ -1459,6 +1531,7 @@ where each line of input produces a line of output.}
 \global\oddfootline={\hfil}
 \global\evenheadline={\line{\folio\hfil\thistitle}}
 \global\oddheadline={\line{\thischapter\hfil\folio}}
+\global\let\contentsalignmacro = \chapoddpage
 }
 
 \def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsinglex}
@@ -1467,6 +1540,7 @@ where each line of input produces a line of output.}
 \global\oddfootline={\hfil}
 \global\evenheadline={\line{\thischapter\hfil\folio}}
 \global\oddheadline={\line{\thischapter\hfil\folio}}
+\global\let\contentsalignmacro = \chappager
 }
 
 % Subroutines used in generating headings
@@ -1490,6 +1564,7 @@ July\or August\or September\or October\or November\or December\fi
 \def\settitle{\parsearg\settitlezzz}
 \def\settitlezzz #1{\gdef\thistitle{#1}}
 
+
 \message{tables,}
 
 % @tabs -- simple alignment
@@ -1812,6 +1887,7 @@ July\or August\or September\or October\or November\or December\fi
 %   current hsize to be used for each column. You may use as many
 %   columns as desired.
 
+
 % Or use a template:
 %   @multitable {Column 1 template} {Column 2 template} {Column 3 template}
 %   @item ...
@@ -1832,7 +1908,7 @@ July\or August\or September\or October\or November\or December\fi
 % with nothing between them for as many times as empty columns are needed,
 % ie, @tab@tab@tab will produce two empty columns.
 
-% @item, @tab, @multicolumn or @endmulticolumn do not need to be on their
+% @item, @tab, @multitable or @end multitable do not need to be on their
 % own lines, but it will not hurt if they are.
 
 % Sample multitable:
@@ -1898,7 +1974,8 @@ July\or August\or September\or October\or November\or December\fi
                                      % We don't need this so we don't use it.
     \else
        \global\advance\colcount by1
-       \setbox0=\hbox{#1}%
+       \setbox0=\hbox{#1 }% Add a normal word space as a separator;
+                          % typically that is always in the input, anyway.
        \expandafter\xdef\csname col\the\colcount\endcsname{\the\wd0}%
     \fi%
   \fi%
@@ -1959,7 +2036,7 @@ July\or August\or September\or October\or November\or December\fi
  % In either case we will make \leftskip=\multitablecolspace:
 \leftskip=\multitablecolspace
 \fi
-\noindent##}\cr%
+\noindent##\multistrut}\cr%
  % \everycr will reset column counter, \colcount, at the end of
  % each line. Every column  entry will cause \colcount to advance by one. 
  % The table preamble
@@ -1972,11 +2049,10 @@ July\or August\or September\or October\or November\or December\fi
 \def\setmultitablespacing{% test to see if user has set \multitablelinespace.
 % If so, do nothing. If not, give it an appropriate dimension based on
 % current baselineskip.
-\setbox0=\vbox{Xy}
 \ifdim\multitablelinespace=0pt
 %% strut to put in table in case some entry doesn't have descenders,
 %% to keep lines equally spaced
-\gdef\multistrut{\vrule height\ht0 depth\dp0 width0pt\relax}
+\let\multistrut = \strut
 %% Test to see if parskip is larger than space between lines of
 %% table. If not, do nothing. 
 %%        If so, set to same dimension as multitablelinespace.
@@ -1993,6 +2069,8 @@ width0pt\relax} \fi
 \global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller
                                       %% than skip between lines in the table.
 \fi}
+
+
 \message{indexing,}
 % Index generation facilities
 
@@ -2005,14 +2083,14 @@ width0pt\relax} \fi
 % It automatically defines \fooindex such that
 % \fooindex ...rest of line... puts an entry in the index foo.
 % It also defines \fooindfile to be the number of the output channel for
-% the file that        accumulates this index.  The file's extension is foo.
+% the file that accumulates this index.  The file's extension is foo.
 % The name of an index should be no more than 2 characters long
 % for the sake of vms.
 
 \def\newindex #1{
 \expandafter\newwrite \csname#1indfile\endcsname% Define number for output file
-\openout \csname#1indfile\endcsname \jobname.#1        % Open the file
-\expandafter\xdef\csname#1index\endcsname{%    % Define \xxxindex
+\openout \csname#1indfile\endcsname \jobname.#1 % Open the file
+\expandafter\xdef\csname#1index\endcsname{%     % Define \xxxindex
 \noexpand\doindex {#1}}
 }
 
@@ -2024,8 +2102,8 @@ width0pt\relax} \fi
 
 \def\newcodeindex #1{
 \expandafter\newwrite \csname#1indfile\endcsname% Define number for output file
-\openout \csname#1indfile\endcsname \jobname.#1        % Open the file
-\expandafter\xdef\csname#1index\endcsname{%    % Define \xxxindex
+\openout \csname#1indfile\endcsname \jobname.#1 % Open the file
+\expandafter\xdef\csname#1index\endcsname{%     % Define \xxxindex
 \noexpand\docodeindex {#1}}
 }
 
@@ -2036,7 +2114,7 @@ width0pt\relax} \fi
 \def\synindex #1 #2 {%
 \expandafter\let\expandafter\synindexfoo\expandafter=\csname#2indfile\endcsname
 \expandafter\let\csname#1indfile\endcsname=\synindexfoo
-\expandafter\xdef\csname#1index\endcsname{%    % Define \xxxindex
+\expandafter\xdef\csname#1index\endcsname{%     % Define \xxxindex
 \noexpand\doindex {#2}}%
 }
 
@@ -2045,7 +2123,7 @@ width0pt\relax} \fi
 \def\syncodeindex #1 #2 {%
 \expandafter\let\expandafter\synindexfoo\expandafter=\csname#2indfile\endcsname
 \expandafter\let\csname#1indfile\endcsname=\synindexfoo
-\expandafter\xdef\csname#1index\endcsname{%    % Define \xxxindex
+\expandafter\xdef\csname#1index\endcsname{%     % Define \xxxindex
 \noexpand\docodeindex {#2}}%
 }
 
@@ -2093,24 +2171,31 @@ width0pt\relax} \fi
 \def\L{\realbackslash L}%
 \def\ss{\realbackslash ss}%
 % Take care of texinfo commands likely to appear in an index entry.
+% (Must be a way to avoid doing expansion at all, and thus not have to
+% laboriously list every single command here.)
+\def\@{@}% will be @@ when we switch to @ as escape char.
+%\let\{ = \lbracecmd
+%\let\} = \rbracecmd
 \def\_{{\realbackslash _}}%
 \def\w{\realbackslash w }%
 \def\bf{\realbackslash bf }%
-\def\rm{\realbackslash rm }%
+%\def\rm{\realbackslash rm }%
 \def\sl{\realbackslash sl }%
 \def\sf{\realbackslash sf}%
 \def\tt{\realbackslash tt}%
 \def\gtr{\realbackslash gtr}%
 \def\less{\realbackslash less}%
 \def\hat{\realbackslash hat}%
-\def\char{\realbackslash char}%
+%\def\char{\realbackslash char}%
 \def\TeX{\realbackslash TeX}%
 \def\dots{\realbackslash dots }%
 \def\copyright{\realbackslash copyright }%
 \def\tclose##1{\realbackslash tclose {##1}}%
 \def\code##1{\realbackslash code {##1}}%
+\def\dotless##1{\realbackslash dotless {##1}}%
 \def\samp##1{\realbackslash samp {##1}}%
-\def\t##1{\realbackslash r {##1}}%
+\def\,##1{\realbackslash ,{##1}}%
+\def\t##1{\realbackslash t {##1}}%
 \def\r##1{\realbackslash r {##1}}%
 \def\i##1{\realbackslash i {##1}}%
 \def\b##1{\realbackslash b {##1}}%
@@ -2138,6 +2223,7 @@ width0pt\relax} \fi
 
 \def\indexnofonts{%
 % Just ignore accents.
+\let\,=\indexdummyfont
 \let\"=\indexdummyfont
 \let\`=\indexdummyfont
 \let\'=\indexdummyfont
@@ -2150,6 +2236,7 @@ width0pt\relax} \fi
 \let\u=\indexdummyfont
 \let\v=\indexdummyfont
 \let\H=\indexdummyfont
+\let\dotless=\indexdummyfont
 % Take care of the plain tex special European modified letters.
 \def\oe{oe}%
 \def\ae{ae}%
@@ -2183,6 +2270,7 @@ width0pt\relax} \fi
 \let\var=\indexdummyfont
 \let\TeX=\indexdummytex
 \let\dots=\indexdummydots
+\def\@{@}%
 }
 
 % To define \realbackslash, we must make \ not be an escape.
@@ -2198,29 +2286,37 @@ width0pt\relax} \fi
 % workhorse for all \fooindexes
 % #1 is name of index, #2 is stuff to put there
 \def\doind #1#2{%
-% Put the index entry in the margin if desired.
-\ifx\SETmarginindex\relax\else%
-\insert\margin{\hbox{\vrule height8pt depth3pt width0pt #2}}%
-\fi%
-{\count10=\lastpenalty %
-{\indexdummies % Must do this here, since \bf, etc expand at this stage
-\escapechar=`\\%
-{\let\folio=0% Expand all macros now EXCEPT \folio
-\def\rawbackslashxx{\indexbackslash}% \indexbackslash isn't defined now
-% so it will be output as is; and it will print as backslash in the indx.
-%
-% Now process the index-string once, with all font commands turned off,
-% to get the string to sort the index by.
-{\indexnofonts
-\xdef\temp1{#2}%
-}%
-% Now produce the complete index entry.  We process the index-string again,
-% this time with font commands expanded, to get what to print in the index.
-\edef\temp{%
-\write \csname#1indfile\endcsname{%
-\realbackslash entry {\temp1}{\folio}{#2}}}%
-\temp }%
-}\penalty\count10}}
+  % Put the index entry in the margin if desired.
+  \ifx\SETmarginindex\relax\else
+    \insert\margin{\hbox{\vrule height8pt depth3pt width0pt #2}}%
+  \fi
+  {%
+    \count255=\lastpenalty
+    {%
+      \indexdummies % Must do this here, since \bf, etc expand at this stage
+      \escapechar=`\\
+      {%
+        \let\folio=0 % We will expand all macros now EXCEPT \folio.
+        \def\rawbackslashxx{\indexbackslash}% \indexbackslash isn't defined now
+        % so it will be output as is; and it will print as backslash.
+        %
+        % First process the index-string with all font commands turned off
+        % to get the string to sort by.
+        {\indexnofonts \xdef\indexsorttmp{#2}}%
+        %
+        % Now produce the complete index entry, with both the sort key and the
+        % original text, including any font commands.
+        \toks0 = {#2}%
+        \edef\temp{%
+          \write\csname#1indfile\endcsname{%
+            \realbackslash entry{\indexsorttmp}{\folio}{\the\toks0}}%
+        }%
+        \temp
+      }%
+    }%
+    \penalty\count255
+  }%
+}
 
 \def\dosubind #1#2#3{%
 {\count10=\lastpenalty %
@@ -2281,26 +2377,19 @@ width0pt\relax} \fi
 
 \def\printindex{\parsearg\doprintindex}
 
-\def\doprintindex#1{%
-  \tex
-  \dobreak \chapheadingskip {10000}
-  \catcode`\%=\other\catcode`\&=\other\catcode`\#=\other
-  \catcode`\$=\other
-  \catcode`\~=\other
-  \indexbreaks
+\def\doprintindex#1{\begingroup
+  \dobreak \chapheadingskip{10000}%
   %
-  % The following don't help, since the chars were translated
-  % when the raw index was written, and their fonts were discarded
-  % due to \indexnofonts.
-  %\catcode`\"=\active
-  %\catcode`\^=\active
-  %\catcode`\_=\active
-  %\catcode`\|=\active
-  %\catcode`\<=\active
-  %\catcode`\>=\active
-  % %
-  \def\indexbackslash{\rawbackslashxx}
-  \indexfonts\rm \tolerance=9500 \advance\baselineskip -1pt
+  \indexfonts \rm
+  \tolerance = 9500
+  \indexbreaks
+  \def\indexbackslash{\rawbackslashxx}%
+  % Index files are almost Texinfo source, but we use \ as the escape
+  % character.  It would be better to use @, but that's too big a change
+  % to make right now.
+  \catcode`\\ = 0
+  \catcode`\@ = 11
+  \escapechar = `\\
   \begindoublecolumns
   %
   % See if the index file exists and is nonempty.
@@ -2311,7 +2400,7 @@ width0pt\relax} \fi
     % index.  The easiest way to prevent this problem is to make sure
     % there is some text.
     (Index is nonexistent)
-    \else
+  \else
     %
     % If the index file exists but is empty, then \openin leaves \ifeof
     % false.  We have to make TeX try to read something from the file, so
@@ -2325,8 +2414,7 @@ width0pt\relax} \fi
   \fi
   \closein 1
   \enddoublecolumns
-  \Etex
-}
+\endgroup}
 
 % These macros are used by the sorted index file itself.
 % Change them to control the appearance of the index.
@@ -2417,15 +2505,15 @@ width0pt\relax} \fi
 \noindent\hskip\secondaryindent\hbox{#1}\indexdotfill #2\par
 }}
 
-%% Define two-column mode, which is used in indexes.
-%% Adapted from the TeXbook, page 416.
-\catcode `\@=11
+% Define two-column mode, which we use to typeset indexes.
+% Adapted from the TeXbook, page 416, which is to say,
+% the manmac.tex format used to print the TeXbook itself.
+\catcode`\@=11
 
 \newbox\partialpage
-
 \newdimen\doublecolumnhsize
 
-\def\begindoublecolumns{\begingroup
+\def\begindoublecolumns{\begingroup % ended by \enddoublecolumns
   % Grab any single-column material above us.
   \output = {\global\setbox\partialpage
     =\vbox{\unvbox255\kern -\topskip \kern \baselineskip}}%
@@ -2458,51 +2546,51 @@ width0pt\relax} \fi
   % Double the \vsize as well.  (We don't need a separate register here,
   % since nobody clobbers \vsize.)
   \vsize = 2\vsize
-  \doublecolumnpagegoal
 }
-
-\def\enddoublecolumns{\eject \endgroup \pagegoal=\vsize \unvbox\partialpage}
-
-\def\doublecolumnsplit{\splittopskip=\topskip \splitmaxdepth=\maxdepth
-  \global\dimen@=\pageheight \global\advance\dimen@ by-\ht\partialpage
-  \global\setbox1=\vsplit255 to\dimen@ \global\setbox0=\vbox{\unvbox1}
-  \global\setbox3=\vsplit255 to\dimen@ \global\setbox2=\vbox{\unvbox3}
-  \ifdim\ht0>\dimen@ \setbox255=\vbox{\unvbox0\unvbox2} \global\setbox255=\copy5 \fi
-  \ifdim\ht2>\dimen@ \setbox255=\vbox{\unvbox0\unvbox2} \global\setbox255=\copy5 \fi
+\def\doublecolumnout{%
+  \splittopskip=\topskip \splitmaxdepth=\maxdepth
+  % Get the available space for the double columns -- the normal
+  % (undoubled) page height minus any material left over from the
+  % previous page.
+  \dimen@=\pageheight \advance\dimen@ by-\ht\partialpage
+  % box0 will be the left-hand column, box1 the right.
+  \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@
+  \onepageout\pagesofar
+  \unvbox255 \penalty\outputpenalty
 }
-\def\doublecolumnpagegoal{%
-  \dimen@=\vsize \advance\dimen@ by-2\ht\partialpage \global\pagegoal=\dimen@
+\def\pagesofar{%
+  % The contents of the output page -- any previous material,
+  % followed by the two boxes we just split.
+  \unvbox\partialpage
+  \hsize = \doublecolumnhsize
+  \wd0=\hsize \wd2=\hsize \hbox to\pagewidth{\box0\hfil\box2}%
 }
-\def\pagesofar{\unvbox\partialpage %
-  \hsize=\doublecolumnhsize % have to restore this since output routine
-  \wd0=\hsize \wd2=\hsize \hbox to\pagewidth{\box0\hfil\box2}}
-\def\doublecolumnout{%
-  \setbox5=\copy255
-  {\vbadness=10000 \doublecolumnsplit}
-  \ifvbox255
-    \setbox0=\vtop to\dimen@{\unvbox0}
-    \setbox2=\vtop to\dimen@{\unvbox2}
-    \onepageout\pagesofar \unvbox255 \penalty\outputpenalty
-  \else
-    \setbox0=\vbox{\unvbox5}
-    \ifvbox0
-      \dimen@=\ht0 \advance\dimen@ by\topskip \advance\dimen@ by-\baselineskip
-      \divide\dimen@ by2 \splittopskip=\topskip \splitmaxdepth=\maxdepth
-      {\vbadness=10000
-       \loop \global\setbox5=\copy0
-          \setbox1=\vsplit5 to\dimen@
-          \setbox3=\vsplit5 to\dimen@
-          \ifvbox5 \global\advance\dimen@ by1pt \repeat
-        \setbox0=\vbox to\dimen@{\unvbox1}
-        \setbox2=\vbox to\dimen@{\unvbox3}
-        \global\setbox\partialpage=\vbox{\pagesofar}
-        \doublecolumnpagegoal
-      }
-    \fi
-  \fi
+\def\enddoublecolumns{%
+  \output={\balancecolumns}\eject % split what we have
+  \endgroup
+  % Back to normal single-column typesetting, but take account of the
+  % fact that we just accumulated some stuff on the output page.
+  \pagegoal=\vsize 
+}
+\def\balancecolumns{%
+  % Called on the last page of the double column material.
+  \setbox0=\vbox{\unvbox255}%
+  \dimen@ = \ht0
+  \advance\dimen@ by \topskip
+  \advance\dimen@ by-\baselineskip
+  \divide\dimen@ by 2
+  \splittopskip = \topskip
+  % Loop until we get a decent breakpoint.
+  {\vbadness=10000 \loop \global\setbox3=\copy0
+    \global\setbox1=\vsplit3 to\dimen@
+    \ifdim\ht3>\dimen@ \global\advance\dimen@ by1pt \repeat}%
+  \setbox0=\vbox to\dimen@{\unvbox1}%
+  \setbox2=\vbox to\dimen@{\unvbox3}%
+  \pagesofar
 }
-
 \catcode `\@=\other
+
+
 \message{sectioning,}
 % Define chapters, sections, etc.
 
@@ -2780,7 +2868,7 @@ width0pt\relax} \fi
 \outer\def\unnumberedsubsec{\parsearg\unnumberedsubsecyyy}
 \def\unnumberedsubsecyyy #1{\unnmhead2{#1}} %normally calls unnumberedsubseczzz
 \def\unnumberedsubseczzz #1{\seccheck{unnumberedsubsec}%
-\plainsecheading {#1}\gdef\thissection{#1}%
+\plainsubsecheading {#1}\gdef\thissection{#1}%
 {\chapternofonts%
 \edef\temp{{\realbackslash unnumbsubsecentry{#1}{\noexpand\folio}}}%
 \escapechar=`\\%
@@ -2825,7 +2913,7 @@ width0pt\relax} \fi
 \outer\def\unnumberedsubsubsec{\parsearg\unnumberedsubsubsecyyy}
 \def\unnumberedsubsubsecyyy #1{\unnmhead3{#1}} %normally unnumberedsubsubseczzz
 \def\unnumberedsubsubseczzz #1{\seccheck{unnumberedsubsubsec}%
-\plainsecheading {#1}\gdef\thissection{#1}%
+\plainsubsubsecheading {#1}\gdef\thissection{#1}%
 {\chapternofonts%
 \edef\temp{{\realbackslash unnumbsubsubsecentry{#1}{\noexpand\folio}}}%
 \escapechar=`\\%
@@ -2863,10 +2951,10 @@ width0pt\relax} \fi
 
 % NOTE on use of \vbox for chapter headings, section headings, and
 % such:
-%      1) We use \vbox rather than the earlier \line to permit
-%         overlong headings to fold.
-%      2) \hyphenpenalty is set to 10000 because hyphenation in a
-%         heading is obnoxious; this forbids it.
+%       1) We use \vbox rather than the earlier \line to permit
+%          overlong headings to fold.
+%       2) \hyphenpenalty is set to 10000 because hyphenation in a
+%          heading is obnoxious; this forbids it.
 %       3) Likewise, headings look best if no \parindent is used, and
 %          if justification is not attempted.  Hence \raggedright.
 
@@ -2884,11 +2972,10 @@ width0pt\relax} \fi
                   \parindent=0pt\raggedright
                   \rm #1\hfill}}\bigskip \par\penalty 200}
 
-\def\heading{\parsearg\secheadingi}
-
-\def\subheading{\parsearg\subsecheadingi}
-
-\def\subsubheading{\parsearg\subsubsecheadingi}
+% @heading, @subheading, @subsubheading.
+\def\heading{\parsearg\plainsecheading}
+\def\subheading{\parsearg\plainsubsecheading}
+\def\subsubheading{\parsearg\plainsubsubsecheading}
 
 % These macros generate a chapter, section, etc. heading only
 % (including whitespace, linebreaking, etc. around it),
@@ -2902,7 +2989,7 @@ width0pt\relax} \fi
 %%% Define plain chapter starts, and page on/off switching for it
 % Parameter controlling skip before chapter headings (if needed)
 
-\newskip \chapheadingskip \chapheadingskip = 30pt plus 8pt minus 4pt
+\newskip\chapheadingskip
 
 \def\chapbreak{\dobreak \chapheadingskip {-4000}}
 \def\chappager{\par\vfill\supereject}
@@ -2911,15 +2998,18 @@ width0pt\relax} \fi
 \def\setchapternewpage #1 {\csname CHAPPAG#1\endcsname}
 
 \def\CHAPPAGoff{
+\global\let\contentsalignmacro = \chappager
 \global\let\pchapsepmacro=\chapbreak
 \global\let\pagealignmacro=\chappager}
 
 \def\CHAPPAGon{
+\global\let\contentsalignmacro = \chappager
 \global\let\pchapsepmacro=\chappager
 \global\let\pagealignmacro=\chappager
 \global\def\HEADINGSon{\HEADINGSsingle}}
 
 \def\CHAPPAGodd{
+\global\let\contentsalignmacro = \chapoddpage
 \global\let\pchapsepmacro=\chapoddpage
 \global\let\pagealignmacro=\chapoddpage
 \global\def\HEADINGSon{\HEADINGSdouble}}
@@ -2931,30 +3021,35 @@ width0pt\relax} \fi
 \global\let\unnumbchapmacro=\unnchfplain
 \global\let\centerchapmacro=\centerchfplain}
 
-\def\chfplain #1#2{%
+% Plain chapter opening.
+% #1 is the text, #2 the chapter number or empty if unnumbered.
+\def\chfplain#1#2{%
   \pchapsepmacro
   {%
-    \chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
-                     \parindent=0pt\raggedright
-                     \rm #2\enspace #1}%
+    \chapfonts \rm
+    \def\chapnum{#2}%
+    \setbox0 = \hbox{#2\ifx\chapnum\empty\else\enspace\fi}%
+    \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright
+          \hangindent = \wd0 \centerparametersmaybe
+          \unhbox0 #1\par}%
   }%
-  \bigskip
-  \penalty5000
+  \nobreak\bigskip % no page break after a chapter title
+  \nobreak
 }
 
-\def\unnchfplain #1{%
-\pchapsepmacro %
-{\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
-                  \parindent=0pt\raggedright
-                  \rm #1\hfill}}\bigskip \par\penalty 10000 %
-}
+% Plain opening for unnumbered.
+\def\unnchfplain#1{\chfplain{#1}{}}
 
-\def\centerchfplain #1{%
-\pchapsepmacro %
-{\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
-                  \parindent=0pt
-                  {\rm #1}\hfill}}\bigskip \par\penalty 10000 %
-}
+% @centerchap -- centered and unnumbered.
+\let\centerparametersmaybe = \relax
+\def\centerchfplain#1{{%
+  \def\centerparametersmaybe{%
+    \advance\rightskip by 3\rightskip
+    \leftskip = \rightskip
+    \parfillskip = 0pt
+  }%
+  \chfplain{#1}{}%
+}}
 
 \CHAPFplain % The default
 
@@ -2980,69 +3075,70 @@ width0pt\relax} \fi
 \global\let\unnumbchapmacro=\unnchfopen
 \global\let\centerchapmacro=\centerchfopen}
 
-% Parameter controlling skip before section headings.
 
-\newskip \subsecheadingskip  \subsecheadingskip = 17pt plus 8pt minus 4pt
+% Section titles.
+\newskip\secheadingskip
+\def\secheadingbreak{\dobreak \secheadingskip {-1000}}
+\def\secheading#1#2#3{\sectionheading{sec}{#2.#3}{#1}}
+\def\plainsecheading#1{\sectionheading{sec}{}{#1}}
+
+% Subsection titles.
+\newskip \subsecheadingskip
 \def\subsecheadingbreak{\dobreak \subsecheadingskip {-500}}
+\def\subsecheading#1#2#3#4{\sectionheading{subsec}{#2.#3.#4}{#1}}
+\def\plainsubsecheading#1{\sectionheading{subsec}{}{#1}}
 
-\newskip \secheadingskip  \secheadingskip = 21pt plus 8pt minus 4pt
-\def\secheadingbreak{\dobreak \secheadingskip {-1000}}
+% Subsubsection titles.
+\let\subsubsecheadingskip = \subsecheadingskip
+\let\subsubsecheadingbreak = \subsecheadingbreak
+\def\subsubsecheading#1#2#3#4#5{\sectionheading{subsubsec}{#2.#3.#4.#5}{#1}}
+\def\plainsubsubsecheading#1{\sectionheading{subsubsec}{}{#1}}
 
-% @paragraphindent  is defined for the Info formatting commands only.
-\let\paragraphindent=\comment
 
-% Section fonts are the base font at magstep2, which produces
-% a size a bit more than 14 points in the default situation.
-
-\def\secheading #1#2#3{\secheadingi {#2.#3\enspace #1}}
-\def\plainsecheading #1{\secheadingi {#1}}
-\def\secheadingi #1{{\advance \secheadingskip by \parskip %
-\secheadingbreak}%
-{\secfonts \vbox{\hyphenpenalty=10000\tolerance=5000
-                 \parindent=0pt\raggedright
-                 \rm #1\hfill}}%
-\ifdim \parskip<10pt \kern 10pt\kern -\parskip\fi \penalty 10000 }
-
-
-% Subsection fonts are the base font at magstep1,
-% which produces a size of 12 points.
-
-\def\subsecheading #1#2#3#4{\subsecheadingi {#2.#3.#4\enspace #1}}
-\def\subsecheadingi #1{{\advance \subsecheadingskip by \parskip %
-\subsecheadingbreak}%
-{\subsecfonts \vbox{\hyphenpenalty=10000\tolerance=5000
-                     \parindent=0pt\raggedright
-                     \rm #1\hfill}}%
-\ifdim \parskip<10pt \kern 10pt\kern -\parskip\fi \penalty 10000 }
-
-\def\subsubsecfonts{\subsecfonts} % Maybe this should change:
-                                 % Perhaps make sssec fonts scaled
-                                 % magstep half
-\def\subsubsecheading #1#2#3#4#5{\subsubsecheadingi {#2.#3.#4.#5\enspace #1}}
-\def\subsubsecheadingi #1{{\advance \subsecheadingskip by \parskip %
-\subsecheadingbreak}%
-{\subsubsecfonts \vbox{\hyphenpenalty=10000\tolerance=5000
-                       \parindent=0pt\raggedright
-                       \rm #1\hfill}}%
-\ifdim \parskip<10pt \kern 10pt\kern -\parskip\fi \penalty 10000}
+% Print any size section title.
+% 
+% #1 is the section type (sec/subsec/subsubsec), #2 is the section
+% number (maybe empty), #3 the text.
+\def\sectionheading#1#2#3{%
+  {%
+    \expandafter\advance\csname #1headingskip\endcsname by \parskip
+    \csname #1headingbreak\endcsname
+  }%
+  {%
+    % Switch to the right set of fonts.
+    \csname #1fonts\endcsname \rm
+    %
+    % Only insert the separating space if we have a section number.
+    \def\secnum{#2}%
+    \setbox0 = \hbox{#2\ifx\secnum\empty\else\enspace\fi}%
+    %
+    \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright
+          \hangindent = \wd0 % zero if no section number
+          \unhbox0 #3}%
+  }%
+  \ifdim\parskip<10pt \nobreak\kern10pt\nobreak\kern-\parskip\fi \nobreak
+}
 
 
 \message{toc printing,}
-
 % Finish up the main text and prepare to read what we've written
 % to \contentsfile.
 
 \newskip\contentsrightmargin \contentsrightmargin=1in
 \def\startcontents#1{%
-   \pagealignmacro
+   % If @setchapternewpage on, and @headings double, the contents should
+   % start on an odd page, unlike chapters.  Thus, we maintain
+   % \contentsalignmacro in parallel with \pagealignmacro.
+   % From: Torbjorn Granlund <tege@matematik.su.se>
+   \contentsalignmacro
    \immediate\closeout \contentsfile
    \ifnum \pageno>0
-      \pageno = -1             % Request roman numbered pages.
+      \pageno = -1              % Request roman numbered pages.
    \fi
    % Don't need to put `Contents' or `Short Contents' in the headline.
    % It is abundantly clear what they are.
    \unnumbchapmacro{#1}\def\thischapter{}%
-   \begingroup                 % Set up to handle contents files properly.
+   \begingroup                  % Set up to handle contents files properly.
       \catcode`\\=0  \catcode`\{=1  \catcode`\}=2  \catcode`\@=11
       \catcode`\^=7 % to see ^^e4 as \"a etc. juha@piuha.ydi.vtt.fi
       \raggedbottom             % Worry more about breakpoints than the bottom.
@@ -3068,6 +3164,7 @@ width0pt\relax} \fi
       \secfonts
       \let\rm=\shortcontrm \let\bf=\shortcontbf \let\sl=\shortcontsl
       \rm
+      \hyphenpenalty = 10000
       \advance\baselineskip by 1pt % Open it up a little.
       \def\secentry ##1##2##3##4{}
       \def\unnumbsecentry ##1##2{}
@@ -3111,7 +3208,7 @@ width0pt\relax} \fi
   % This space should be plenty, since a single number is .5em, and the
   % widest letter (M) is 1em, at least in the Computer Modern fonts.
   % (This space doesn't include the extra space that gets added after
-  % the label; that gets put in in \shortchapentry above.)
+  % the label; that gets put in by \shortchapentry above.)
   \advance\dimen0 by 1.1em
   \hbox to \dimen0{#1\hfil}%
 }
@@ -3132,22 +3229,21 @@ width0pt\relax} \fi
   \dosubsubsecentry{#2.#3.#4.#5\labelspace#1}{#6}}
 \def\unnumbsubsubsecentry#1#2{\dosubsubsecentry{#1}{#2}}
 
-
 % This parameter controls the indentation of the various levels.
 \newdimen\tocindent \tocindent = 3pc
 
 % Now for the actual typesetting. In all these, #1 is the text and #2 is the
 % page number.
 %
-% If the toc has to be broken over pages, we would want to be at chapters
+% If the toc has to be broken over pages, we want it to be at chapters
 % if at all possible; hence the \penalty.
 \def\dochapentry#1#2{%
-   \penalty-300 \vskip\baselineskip
+   \penalty-300 \vskip1\baselineskip plus.33\baselineskip minus.25\baselineskip
    \begingroup
      \chapentryfonts
      \tocentry{#1}{\dopageno{#2}}%
    \endgroup
-   \nobreak\vskip .25\baselineskip
+   \nobreak\vskip .25\baselineskip plus.1\baselineskip
 }
 
 \def\dosecentry#1#2{\begingroup
@@ -3172,7 +3268,7 @@ width0pt\relax} \fi
 %
 % \turnoffactive is for the sake of @" used for umlauts.
 \def\tocentry#1#2{\begingroup
-  \hyphenpenalty = 10000
+  \vskip 0pt plus1pt % allow a little stretch for the sake of nice page breaks
   \entry{\turnoffactive #1}{\turnoffactive #2}%
 \endgroup}
 
@@ -3197,8 +3293,6 @@ width0pt\relax} \fi
 \newbox\pushcharbox    \newbox\bullbox
 \newbox\equivbox       \newbox\errorbox
 
-\let\ptexequiv = \equiv
-
 %{\tentt
 %\global\setbox\dblarrowbox = \hbox to 1em{\hfil$\Rightarrow$\hfil}
 %\global\setbox\longdblarrowbox = \hbox to 1em{\hfil$\mapsto$\hfil}
@@ -3209,12 +3303,11 @@ width0pt\relax} \fi
 %                                      depth .1ex\hfil}
 %}
 
+% @point{}, @result{}, @expansion{}, @print{}, @equiv{}.
 \def\point{$\star$}
-
 \def\result{\leavevmode\raise.15ex\hbox to 1em{\hfil$\Rightarrow$\hfil}}
 \def\expansion{\leavevmode\raise.1ex\hbox to 1em{\hfil$\mapsto$\hfil}}
 \def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}}
-
 \def\equiv{\leavevmode\lower.1ex\hbox to 1em{\hfil$\ptexequiv$\hfil}}
 
 % Adapted from the TeXbook's \boxit.
@@ -3246,7 +3339,7 @@ width0pt\relax} \fi
 \catcode `\$=3 \catcode `\&=4 \catcode `\#=6
 \catcode `\^=7 \catcode `\_=8 \catcode `\~=13 \let~=\tie
 \catcode `\%=14
-\catcode 43=12
+\catcode 43=12 % plus
 \catcode`\"=12
 \catcode`\==12
 \catcode`\|=12
@@ -3254,6 +3347,7 @@ width0pt\relax} \fi
 \catcode`\>=12
 \escapechar=`\\
 %
+\let\,=\ptexcomma
 \let\~=\ptextilde
 \let\{=\ptexlbrace
 \let\}=\ptexrbrace
@@ -3264,8 +3358,7 @@ width0pt\relax} \fi
 \def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}
 \def\@{@}%
 \let\bullet=\ptexbullet
-\let\b=\ptexb \let\c=\ptexc \let\i=\ptexi \let\t=\ptext \let\l=\ptexl
-\let\L=\ptexL
+\let\b=\ptexb \let\c=\ptexc \let\i=\ptexi \let\t=\ptext
 %
 \let\Etex=\endgroup}
 
@@ -3324,50 +3417,50 @@ width0pt\relax} \fi
 \def\cbl{{\circle\char'012\hskip -6pt}}
 \def\cbr{{\hskip 6pt\circle\char'011}}
 \def\carttop{\hbox to \cartouter{\hskip\lskip
-       \ctl\leaders\hrule height\circthick\hfil\ctr
-       \hskip\rskip}}
+        \ctl\leaders\hrule height\circthick\hfil\ctr
+        \hskip\rskip}}
 \def\cartbot{\hbox to \cartouter{\hskip\lskip
-       \cbl\leaders\hrule height\circthick\hfil\cbr
-       \hskip\rskip}}
+        \cbl\leaders\hrule height\circthick\hfil\cbr
+        \hskip\rskip}}
 %
 \newskip\lskip\newskip\rskip
 
 \long\def\cartouche{%
 \begingroup
-       \lskip=\leftskip \rskip=\rightskip
-       \leftskip=0pt\rightskip=0pt %we want these *outside*.
-       \cartinner=\hsize \advance\cartinner by-\lskip
-                         \advance\cartinner by-\rskip
-       \cartouter=\hsize
-       \advance\cartouter by 18pt % allow for 3pt kerns on either
-%                                   side, and for 6pt waste from
-%                                   each corner char
-       \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip
-       % Flag to tell @lisp, etc., not to narrow margin.
-       \let\nonarrowing=\comment
-       \vbox\bgroup
-               \baselineskip=0pt\parskip=0pt\lineskip=0pt
-               \carttop
-               \hbox\bgroup
-                       \hskip\lskip
-                       \vrule\kern3pt
-                       \vbox\bgroup
-                               \hsize=\cartinner
-                               \kern3pt
-                               \begingroup
-                                       \baselineskip=\normbskip
-                                       \lineskip=\normlskip
-                                       \parskip=\normpskip
-                                       \vskip -\parskip
+        \lskip=\leftskip \rskip=\rightskip
+        \leftskip=0pt\rightskip=0pt %we want these *outside*.
+        \cartinner=\hsize \advance\cartinner by-\lskip
+                          \advance\cartinner by-\rskip
+        \cartouter=\hsize
+        \advance\cartouter by 18pt % allow for 3pt kerns on either
+%                                    side, and for 6pt waste from
+%                                    each corner char
+        \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip
+        % Flag to tell @lisp, etc., not to narrow margin.
+        \let\nonarrowing=\comment
+        \vbox\bgroup
+                \baselineskip=0pt\parskip=0pt\lineskip=0pt
+                \carttop
+                \hbox\bgroup
+                        \hskip\lskip
+                        \vrule\kern3pt
+                        \vbox\bgroup
+                                \hsize=\cartinner
+                                \kern3pt
+                                \begingroup
+                                        \baselineskip=\normbskip
+                                        \lineskip=\normlskip
+                                        \parskip=\normpskip
+                                        \vskip -\parskip
 \def\Ecartouche{%
-                               \endgroup
-                               \kern3pt
-                       \egroup
-                       \kern3pt\vrule
-                       \hskip\rskip
-               \egroup
-               \cartbot
-       \egroup
+                                \endgroup
+                                \kern3pt
+                        \egroup
+                        \kern3pt\vrule
+                        \hskip\rskip
+                \egroup
+                \cartbot
+        \egroup
 \endgroup
 }}
 
@@ -3430,8 +3523,7 @@ width0pt\relax} \fi
   \let\Esmalllisp = \nonfillfinish
   \let\Esmallexample = \nonfillfinish
   %
-  % Smaller interline space and fonts for small examples.
-  \setleading{10pt}%
+  % Smaller fonts for small examples.
   \indexfonts \tt
   \rawbackslash % make \ output the \ character from the current font (tt)
   \gobble
@@ -3959,6 +4051,7 @@ width0pt\relax} \fi
 
 \def\deftpx #1 {\errmessage{@deftpx in invalid context}}
 
+
 \message{cross reference,}
 % Define cross-reference macros
 \newwrite \auxfile
@@ -3966,6 +4059,11 @@ width0pt\relax} \fi
 \newif\ifhavexrefs  % True if xref values are known.
 \newif\ifwarnedxrefs  % True if we warned once that they aren't known.
 
+% @inforef is simple.
+\def\inforef #1{\inforefzzz #1,,,,**}
+\def\inforefzzz #1,#2,#3,#4**{\putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}},
+  node \samp{\ignorespaces#1{}}}
+
 % \setref{foo} defines a cross-reference point named foo.
 
 \def\setref#1{%
@@ -4201,7 +4299,8 @@ width0pt\relax} \fi
 % The trailing space in the following definition for supereject is
 % vital for proper filling; pages come out unaligned when you do a
 % pagealignmacro call if that space before the closing brace is
-% removed.
+% removed. (Generally, numeric constants should always be followed by a
+% space to prevent strange expansion errors.)
 \def\supereject{\par\penalty -20000\footnoteno =0 }
 
 % @footnotestyle is meaningful for info output only..
@@ -4326,13 +4425,18 @@ width0pt\relax} \fi
 
 % Set some numeric style parameters, for 8.5 x 11 format.
 
-%\hsize = 6.5in
+\hsize = 6in
+\hoffset = .25in
 \newdimen\defaultparindent \defaultparindent = 15pt
 \parindent = \defaultparindent
-\parskip 18pt plus 1pt
-\setleading{15pt}
+\parskip 3pt plus 2pt minus 1pt
+\setleading{13.2pt}
 \advance\topskip by 1.2cm
 
+\chapheadingskip = 15pt plus 4pt minus 2pt
+\secheadingskip = 12pt plus 3pt minus 2pt
+\subsecheadingskip = 9pt plus 2pt minus 2pt
+
 % Prevent underfull vbox error messages.
 \vbadness=10000
 
@@ -4355,30 +4459,28 @@ width0pt\relax} \fi
 
 % Use @smallbook to reset parameters for 7x9.5 format  (or else 7x9.25)
 \def\smallbook{
-
-% These values for secheadingskip and subsecheadingskip are
-% experiments.  RJC 7 Aug 1992
-\global\secheadingskip = 17pt plus 6pt minus 3pt
-\global\subsecheadingskip = 14pt plus 6pt minus 3pt
-
-\global\lispnarrowing = 0.3in
-\setleading{12pt}
-\advance\topskip by -1cm
-\global\parskip 3pt plus 1pt
-\global\hsize = 5in
-\global\vsize=7.5in
-\global\tolerance=700
-\global\hfuzz=1pt
-\global\contentsrightmargin=0pt
-\global\deftypemargin=0pt
-\global\defbodyindent=.5cm
-
-\global\pagewidth=\hsize
-\global\pageheight=\vsize
-
-\global\let\smalllisp=\smalllispx
-\global\let\smallexample=\smalllispx
-\global\def\Esmallexample{\Esmalllisp}
+  \global\chapheadingskip = 15pt plus 4pt minus 2pt
+  \global\secheadingskip = 12pt plus 3pt minus 2pt
+  \global\subsecheadingskip = 9pt plus 2pt minus 2pt
+  %
+  \global\lispnarrowing = 0.3in
+  \setleading{12pt}
+  \advance\topskip by -1cm
+  \global\parskip 2pt plus 1pt
+  \global\hsize = 5in
+  \global\vsize=7.5in
+  \global\tolerance=700
+  \global\hfuzz=1pt
+  \global\contentsrightmargin=0pt
+  \global\deftypemargin=0pt
+  \global\defbodyindent=.5cm
+  %
+  \global\pagewidth=\hsize
+  \global\pageheight=\vsize
+  %
+  \global\let\smalllisp=\smalllispx
+  \global\let\smallexample=\smalllispx
+  \global\def\Esmallexample{\Esmalllisp}
 }
 
 % Use @afourpaper to print on European A4 paper.
@@ -4401,6 +4503,11 @@ width0pt\relax} \fi
 \global\pageheight=\vsize
 }
 
+\bindingoffset=0pt
+\normaloffset=\hoffset
+\pagewidth=\hsize
+\pageheight=\vsize
+
 % Allow control of the text dimensions.  Parameters in order: textheight;
 % textwidth; voffset; hoffset; binding offset; topskip.
 % All require a dimension;
index 83ce13f..9a484df 100755 (executable)
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 
+# Usage:
+#     ylwrap PROG [OUTPUT DESIRED]... -- [ARGS]...
+# * PROG is program to run.
+# * OUTPUT is file PROG generates
+# * DESIRED is file we actually want
+# * ARGS are passed to PROG
+# Any number of OUTPUT,DESIRED pairs may be used.
+
 # The program to run.
 prog="$1"
-
-# The output file the program generates, eg `y.tab.c'.
-progoutput="$2"
-
-# The output file we actually want.
-realoutput="$3"
-
-# Strip arguments we've used; remaining arguments go to PROG.
-shift
-shift
 shift
 
+pairlist=
+while test "$#" -ne 0; do
+   if test "$1" = "--"; then
+      break
+   fi
+   pairlist="$pairlist $1"
+   shift
+done
+
 $prog ${1+"$@"} || exit $?
 
-if test -f "$progoutput"; then
-   mv "$progoutput" "$realoutput" || exit $?
-else
-   exit 1
-fi
-exit 0
+set X $pairlist
+shift
+status=0
+first=yes
+while "$#" -ne 0; do
+   if test -f "$1"; then
+      mv "$1" "$2" || status=$?
+   else
+      # A missing file is only an error for the first file.  This is a
+      # blatant hack to let us support using "yacc -d".  If -d is not
+      # specified, we don't want an error when the header file is
+      # "missing".
+      if test $first = yes; then
+        status=1
+      fi
+   fi
+   shift
+   shift
+   first=no
+done
+exit $status
similarity index 100%
rename from libraries-clean.am
rename to libs-clean.am
diff --git a/libs.am b/libs.am
new file mode 100644 (file)
index 0000000..324128d
--- /dev/null
+++ b/libs.am
@@ -0,0 +1,44 @@
+## automake - create Makefile.in from Makefile.am
+## Copyright (C) 1994, 1995, 1996 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 2, 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, write to the Free Software
+## Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+## 02111-1307, USA.
+install-@DIR@LIBRARIES: $(@DIR@_LIBFILES)
+       $(NORMAL_INSTALL)
+       $(mkinstalldirs) $(@DIR@dir)
+## Funny invocation because Makefile variable can be empty, leading to
+## a syntax error in sh.
+       list="$(@DIR@_LIBFILES)"; for p in $$list; do \
+         if test -f $$p; then \
+           $(INSTALL_DATA) $$p $(@DIR@dir)/$$p; \
+         else :; fi; \
+       done
+## We do two loops here so that $(POST_INSTALL) can be empty.  If we
+## merge the two loops, we get a syntax error from sh.  Anyway, having
+## $(POST_INSTALL) in the middle of the loop essentially renders it
+## useless; sh never actually executes this command.  Read the GNU
+## Standards for a little enlightenment on this.
+       $(POST_INSTALL)
+       list="$(@DIR@_LIBFILES)"; for p in $$list; do \
+         if test -f $$p; then \
+## Must ranlib after installing because mod time changes.
+           $(RANLIB) $(@DIR@dir)/$$p; \
+         else :; fi; \
+       done
+
+uninstall-@DIR@LIBRARIES:
+       list="$(@DIR@_LIBFILES)"; for p in $$list; do \
+         rm -f $(@DIR@dir)/$$p; \
+       done
index 924f648..9602db7 100644 (file)
@@ -4,8 +4,9 @@ AUTOMAKE_OPTIONS = gnits
 MAINT_CHARSET = latin1
 
 m4datadir = $(datadir)/aclocal
-m4data_DATA = AM_C_PROTOTYPES.m4 AM_FUNC_FNMATCH.m4 AM_FUNC_STRTOD.m4 \
-AM_HEADER_TIOCGWINSZ_NEEDS_SYS_IOCTL.m4 AM_INIT_AUTOMAKE.m4 \
-AM_MAINTAINER_MODE.m4 AM_PATH_LISPDIR.m4 AM_PROG_CC_STDC.m4 \
-AM_PROG_INSTALL.m4 AM_SANITY_CHECK_CC.m4 AM_SYS_POSIX_TERMIOS.m4 \
-AM_TYPE_PTRDIFF_T.m4 AM_WITH_DMALLOC.m4 AM_WITH_REGEX.m4
+m4data_DATA = ccsanity.m4 ccstdc.m4 dmalloc.m4 fnmatch.m4 init.m4 install.m4 \
+lispdir.m4 maintainer.m4 protos.m4 ptrdiff.m4 regex.m4 strtod.m4 termios.m4 \
+winsz.m4 mktime.m4 error.m4 obstack.m4
+
+
+EXTRA_DIST = $(m4data_DATA)
index 9b9fdbb..bd5ee21 100644 (file)
@@ -42,11 +42,11 @@ AUTOMAKE_OPTIONS = gnits
 MAINT_CHARSET = latin1
 
 m4datadir = $(datadir)/aclocal
-m4data_DATA = AM_C_PROTOTYPES.m4 AM_FUNC_FNMATCH.m4 AM_FUNC_STRTOD.m4 \
-AM_HEADER_TIOCGWINSZ_NEEDS_SYS_IOCTL.m4 AM_INIT_AUTOMAKE.m4 \
-AM_MAINTAINER_MODE.m4 AM_PATH_LISPDIR.m4 AM_PROG_CC_STDC.m4 \
-AM_PROG_INSTALL.m4 AM_SANITY_CHECK_CC.m4 AM_SYS_POSIX_TERMIOS.m4 \
-AM_TYPE_PTRDIFF_T.m4 AM_WITH_DMALLOC.m4 AM_WITH_REGEX.m4
+m4data_DATA = ccsanity.m4 ccstdc.m4 dmalloc.m4 fnmatch.m4 init.m4 install.m4 \
+lispdir.m4 maintainer.m4 protos.m4 ptrdiff.m4 regex.m4 strtod.m4 termios.m4 \
+winsz.m4 mktime.m4 error.m4 obstack.m4
+
+EXTRA_DIST = $(m4data_DATA)
 mkinstalldirs = $(top_srcdir)/mkinstalldirs
 CONFIG_CLEAN_FILES = 
 DATA =  $(m4data_DATA)
@@ -101,13 +101,9 @@ distdir: $(DEP_DISTFILES)
          || cp -p $(srcdir)/$$file $(distdir)/$$file; \
        done
 info:
-
 dvi:
-
-check: all
-
+check:
 installcheck:
-
 install-exec: 
        $(NORMAL_INSTALL)
 
similarity index 100%
rename from m4/AM_SANITY_CHECK_CC.m4
rename to m4/ccsanity.m4
similarity index 100%
rename from m4/AM_PROG_CC_STDC.m4
rename to m4/ccstdc.m4
similarity index 100%
rename from m4/AM_WITH_DMALLOC.m4
rename to m4/dmalloc.m4
diff --git a/m4/error.m4 b/m4/error.m4
new file mode 100644 (file)
index 0000000..eac272a
--- /dev/null
@@ -0,0 +1,13 @@
+dnl From Jim Meyering.  Use this if you use the GNU error.[ch].
+dnl FIXME: Migrate into libit
+
+AC_DEFUN(AM_FUNC_ERROR_AT_LINE,
+[AC_CACHE_CHECK([for error_at_line], am_cv_lib_error_at_line,
+ [AC_TRY_LINK([],[error_at_line(0, 0, "", 0, "");],
+              am_cv_lib_error_at_line=yes,
+             am_cv_lib_error_at_line=no)])
+ if test $am_cv_lib_error_at_line = no; then
+   LIBOBJS="$LIBOBJS error.o"
+ fi
+ AC_SUBST(LIBOBJS)dnl
+])
similarity index 100%
rename from m4/AM_FUNC_FNMATCH.m4
rename to m4/fnmatch.m4
similarity index 100%
rename from m4/AM_INIT_AUTOMAKE.m4
rename to m4/init.m4
similarity index 100%
rename from m4/AM_PROG_INSTALL.m4
rename to m4/install.m4
similarity index 100%
rename from m4/AM_PATH_LISPDIR.m4
rename to m4/lispdir.m4
similarity index 100%
rename from m4/AM_MAINTAINER_MODE.m4
rename to m4/maintainer.m4
diff --git a/m4/mktime.m4 b/m4/mktime.m4
new file mode 100644 (file)
index 0000000..9a5e63f
--- /dev/null
@@ -0,0 +1,39 @@
+dnl From Jim Meyering.
+dnl FIXME: this should migrate into libit.
+
+dnl This little macro is solely so AM_FUNC_MKTIME can require
+dnl that AC_CHECK_HEADERS(sys/time.h) has been run.
+AC_DEFUN(AC_HEADER_SYS_TIME_H,
+ [AC_CHECK_HEADERS(sys/time.h)])
+
+AC_DEFUN(AM_FUNC_MKTIME,
+[AC_REQUIRE([AC_HEADER_TIME])dnl
+ AC_REQUIRE([AC_HEADER_SYS_TIME_H])dnl
+ AC_CACHE_CHECK([for working mktime], am_cv_func_working_mktime,
+  [AC_TRY_RUN([/* Test program from Tony Leneis (tony@plaza.ds.adp.com).  */
+#if TIME_WITH_SYS_TIME
+# include <sys/time.h>
+# include <time.h>
+#else
+# if HAVE_SYS_TIME_H
+#  include <sys/time.h>
+# else
+#  include <time.h>
+# endif
+#endif
+int
+main ()
+{
+  time_t today = time (0);
+  struct tm *local = localtime (&today);
+  exit (mktime (local) != today);
+}
+             ],
+            am_cv_func_working_mktime=yes, am_cv_func_working_mktime=no,
+            dnl When crosscompiling, assume mktime is missing or broken.
+            am_cv_func_working_mktime=no)
+  ])
+  if test $am_cv_func_working_mktime = no; then
+    LIBOBJS="$LIBOBJS mktime.o"
+  fi
+])
diff --git a/m4/obstack.m4 b/m4/obstack.m4
new file mode 100644 (file)
index 0000000..b702aee
--- /dev/null
@@ -0,0 +1,15 @@
+dnl From Jim Meyering.
+dnl FIXME: migrate into libit.
+
+AC_DEFUN(AM_FUNC_OBSTACK,
+[AC_CACHE_CHECK([for obstacks], am_cv_func_obstack,
+ [AC_TRY_LINK([#include "obstack.h"],
+             [struct obstack *mem;obstack_free(mem,(char *) 0)],
+             am_cv_func_obstack=yes,
+             am_cv_func_obstack=no)])
+ if test $am_cv_func_obstack = yes; then
+   AC_DEFINE(HAVE_OBSTACK)
+ else
+   LIBOBJS="$LIBOBJS obstack.o"
+ fi
+])
similarity index 100%
rename from m4/AM_C_PROTOTYPES.m4
rename to m4/protos.m4
similarity index 100%
rename from m4/AM_TYPE_PTRDIFF_T.m4
rename to m4/ptrdiff.m4
similarity index 100%
rename from m4/AM_WITH_REGEX.m4
rename to m4/regex.m4
similarity index 100%
rename from m4/AM_FUNC_STRTOD.m4
rename to m4/strtod.m4
similarity index 100%
rename from m4/AM_SYS_POSIX_TERMIOS.m4
rename to m4/termios.m4
similarity index 100%
rename from programs-clean.am
rename to progs-clean.am
diff --git a/progs.am b/progs.am
new file mode 100644 (file)
index 0000000..406b2f8
--- /dev/null
+++ b/progs.am
@@ -0,0 +1,32 @@
+## automake - create Makefile.in from Makefile.am
+## Copyright (C) 1994, 1995, 1996 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 2, 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, write to the Free Software
+## Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+## 02111-1307, USA.
+install-@DIR@PROGRAMS: $(@DIR@_PROGRAMS)
+       $(NORMAL_INSTALL)
+       $(mkinstalldirs) $(@DIR@dir)
+## Funny invocation because Makefile variable can be empty, leading to
+## a syntax error in sh.
+       list="$(@DIR@_PROGRAMS)"; for p in $$list; do \
+         if test -f $$p; then \
+           $(INSTALL_PROGRAM) $$p $(@DIR@dir)/`echo $$p|sed '$(transform)'`; \
+         else :; fi; \
+       done
+
+uninstall-@DIR@PROGRAMS:
+       list="$(@DIR@_PROGRAMS)"; for p in $$list; do \
+         rm -f $(@DIR@dir)/`echo $$p|sed '$(transform)'`; \
+       done
index d172e7a..2aafaff 100644 (file)
@@ -1,3 +1,11 @@
+Sat Oct  5 11:31:38 1996  Tom Tromey  <tromey@cygnus.com>
+
+       * discover.test: New file.
+
+       * mkinst2.test: Renamed from mkinstall2.test.
+
+       * symlink.test: New file.
+
 Thu Oct  3 19:55:23 1996  Tom Tromey  <tromey@cygnus.com>
 
        * vpath.test: New file.
index 37433d5..92801b2 100644 (file)
@@ -9,13 +9,13 @@ canon.test installsh.test empty.test rulepat.test insh.test canon2.test \
 target.test extra.test noinst.test instman.test mkinstall.test auxdir.test \
 canon3.test mdate2.test subdir.test backsl.test package.test number.test \
 insh2.test outdir.test fpinstall.test fpinst2.test texinfo.test dejagnu.test \
-yacc.test mkinstall2.test texinfo2.test ansi.test depacl.test depacl2.test \
+yacc.test mkinst2.test texinfo2.test ansi.test depacl.test depacl2.test \
 error.test colon.test vtexi2.test tags.test comment.test libfiles.test \
 man.test info.test obsolete.test lex.test scripts.test subdir2.test \
 exsource.test canon4.test dup.test defun.test cxxlink.test cxxnoc.test \
 order.test libobj2.test interp.test alllib.test block.test libobj3.test \
 gnits.test interp2.test colneq.test implicit.test spell.test spell2.test \
 confsub.test primary.test primary2.test depend2.test spell3.test \
-comment2.test vpath.test
+comment2.test vpath.test symlink.test discover.test
 
 EXTRA_DIST = defs $(TESTS)
index a1a58da..7c67f56 100644 (file)
@@ -47,14 +47,14 @@ canon.test installsh.test empty.test rulepat.test insh.test canon2.test \
 target.test extra.test noinst.test instman.test mkinstall.test auxdir.test \
 canon3.test mdate2.test subdir.test backsl.test package.test number.test \
 insh2.test outdir.test fpinstall.test fpinst2.test texinfo.test dejagnu.test \
-yacc.test mkinstall2.test texinfo2.test ansi.test depacl.test depacl2.test \
+yacc.test mkinst2.test texinfo2.test ansi.test depacl.test depacl2.test \
 error.test colon.test vtexi2.test tags.test comment.test libfiles.test \
 man.test info.test obsolete.test lex.test scripts.test subdir2.test \
 exsource.test canon4.test dup.test defun.test cxxlink.test cxxnoc.test \
 order.test libobj2.test interp.test alllib.test block.test libobj3.test \
 gnits.test interp2.test colneq.test implicit.test spell.test spell2.test \
 confsub.test primary.test primary2.test depend2.test spell3.test \
-comment2.test vpath.test
+comment2.test vpath.test symlink.test discover.test
 
 EXTRA_DIST = defs $(TESTS)
 mkinstalldirs = $(top_srcdir)/mkinstalldirs
@@ -114,13 +114,9 @@ check-TESTS: $(TESTS)
          echo "$$failed of $$all tests failed"; \
        fi
 info:
-
 dvi:
-
-check: all check-TESTS
-
+check: check-TESTS
 installcheck:
-
 install-exec: 
        $(NORMAL_INSTALL)
 
index e276f2d..bd70958 100755 (executable)
@@ -25,6 +25,11 @@ $AUTOMAKE || exit 1
 
 : > source
 
+# This hack fakes out the Makefile dependencies.
+: > configure
+: > config.status
+: > Makefile
+
 # Bogus.
 make -f Makefile.in check
 
index dae8540..c11e06e 100755 (executable)
@@ -6,7 +6,7 @@
 
 cat > acinclude.m4 << 'END'
 AC_DEFUN([AM_FUNC_TWO],)
-AC_DEFUN([AM_FUNC_STRTOD],
+AC_DEFUN([AM_FUNC_ONE],
 AC_REQUIRE([AM_FUNC_TWO]))
 END
 
diff --git a/tests/discover.test b/tests/discover.test
new file mode 100755 (executable)
index 0000000..a91aa95
--- /dev/null
@@ -0,0 +1,26 @@
+#! /bin/sh
+
+# Test to make sure LIBOBJS file cannot be mentioned explicitly.
+
+. $srcdir/defs || exit 1
+
+cat > configure.in << 'END'
+PACKAGE=nonesuch
+VERSION=nonesuch
+AC_ARG_PROGRAM
+AC_PROG_INSTALL
+AC_PROG_RANLIB
+LIBOBJS="$LIBOBJS fsusage.o"
+AC_OUTPUT(Makefile)
+END
+
+cat > Makefile.am << 'END'
+noinst_LIBRARIES = tu
+tu_SOURCES = fsusage.c
+tu_LIBADD = @LIBOBJS@
+END
+
+: > fsusage.c
+
+$AUTOMAKE && exit 1
+exit 0
index f46a8a8..a5a9117 100755 (executable)
@@ -11,7 +11,8 @@ END
 # Set up a strange environment, where AM_C_PROTOTYPES exists but its
 # dependency does not.
 cat > AM_C_PROTOTYPES.m4 << 'END'
-AC_REQUIRE([AM_PROG_CC_STDC])
+AC_DEFUN(AM_C_PROTOTYPES,
+AC_REQUIRE([AM_PROG_CC_STDC]))
 END
 
 # Our --acdir overrides the one in $ACLOCAL.
similarity index 100%
rename from tests/mkinstall2.test
rename to tests/mkinst2.test
diff --git a/tests/symlink.test b/tests/symlink.test
new file mode 100755 (executable)
index 0000000..f2f2949
--- /dev/null
@@ -0,0 +1,18 @@
+#! /bin/sh
+
+# Make sure we get an error if symlink creation fails.
+# Reported by Joerg-Martin Schwarz
+
+. $srcdir/defs || exit 1
+
+rm install-sh
+rm mkinstalldirs
+
+: > Makefile.am
+
+cat >> configure.in << 'END'
+AC_CONFIG_AUX_DIR(aux)
+END
+
+$AUTOMAKE --add-missing && exit 1
+exit 0
similarity index 100%
rename from texinfos-vars.am
rename to texi-vars.am
diff --git a/texi-vers.am b/texi-vers.am
new file mode 100644 (file)
index 0000000..3c6f3c8
--- /dev/null
@@ -0,0 +1,42 @@
+## automake - create Makefile.in from Makefile.am
+## Copyright (C) 1994, 1995, 1996 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 2, 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, write to the Free Software
+## Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+## 02111-1307, USA.
+@VTEXI@: @MAINT@stamp-@VTI@
+
+## Depend on configure.in so that version number updates cause a
+## rebuild.
+stamp-@VTI@: @TEXI@ $(top_srcdir)/configure.in
+       echo "@set UPDATED `cd $(srcdir) \
+         && $(SHELL) @MDDIR@/mdate-sh @TEXI@`" > @VTI@.tmp
+       echo "@set EDITION $(VERSION)" >> @VTI@.tmp
+       echo "@set VERSION $(VERSION)" >> @VTI@.tmp
+## Use cp and rm here because some older "mv"s can't move across
+## filesystems.  Furthermore, GNU "mv" in the AmigaDOS environment
+## can't handle this.
+       cmp -s @VTI@.tmp $(srcdir)/@VTEXI@ || cp @VTI@.tmp $(srcdir)/@VTEXI@
+       rm @VTI@.tmp
+       echo timestamp > $(srcdir)/stamp-@VTI@
+
+mostlyclean-@VTI@:
+       rm -f @VTI@.tmp
+
+clean-@VTI@:
+
+distclean-@VTI@:
+
+maintainer-clean-@VTI@:
+       @MAINT@rm -f stamp-@VTI@ @VTEXI@
index 4e2a181..a579fc6 100644 (file)
@@ -35,7 +35,7 @@
 
 % This automatically updates the version number based on RCS.
 \def\deftexinfoversion$#1: #2 ${\def\texinfoversion{#2}}
-\deftexinfoversion$Revision: 1.4 $
+\deftexinfoversion$Revision: 1.5 $
 \message{Loading texinfo package [Version \texinfoversion]:}
 
 % If in a .fmt file, print the version number
 
 % Save some parts of plain tex whose names we will redefine.
 
-\let\ptextilde=\~
-\let\ptexlbrace=\{
-\let\ptexrbrace=\}
-\let\ptexdots=\dots
-\let\ptexdot=\.
-\let\ptexstar=\*
-\let\ptexend=\end
-\let\ptexbullet=\bullet
 \let\ptexb=\b
+\let\ptexbullet=\bullet
 \let\ptexc=\c
+\let\ptexcomma=\,
+\let\ptexdot=\.
+\let\ptexdots=\dots
+\let\ptexend=\end
+\let\ptexequiv = \equiv
 \let\ptexi=\i
+\let\ptexlbrace=\{
+\let\ptexrbrace=\}
+\let\ptexstar=\*
 \let\ptext=\t
-\let\ptexl=\l
-\let\ptexL=\L
+\let\ptextilde=\~
 
 % Be sure we're in horizontal mode when doing a tie, since we make space
 % equivalent to this in @example-like environments. Otherwise, a space
@@ -74,6 +74,7 @@
 }
 \let\~ = \tie                  % And make it available as @~.
 
+
 \message{Basics,}
 \chardef\other=12
 
 \hyphenation{eshell}
 
 % Margin to add to right of even pages, to left of odd pages.
-\newdimen \bindingoffset  \bindingoffset=0pt
-\newdimen \normaloffset   \normaloffset=\hoffset
+\newdimen \bindingoffset  
+\newdimen \normaloffset   
 \newdimen\pagewidth \newdimen\pageheight
-\pagewidth=\hsize \pageheight=\vsize
 
 % Sometimes it is convenient to have everything in the transcript file
 % and nothing on the terminal.  We don't just call \tracingall here,
 \newdimen\cornerlong \newdimen\cornerthick
 \newdimen \topandbottommargin
 \newdimen \outerhsize \newdimen \outervsize
-\cornerlong=1pc\cornerthick=.3pt       % These set size of cropmarks
+\cornerlong=1pc\cornerthick=.3pt        % These set size of cropmarks
 \outerhsize=7in
 %\outervsize=9.5in
 % Alternative @smallbook page size is 9.25in
 %---------------------End change-----------------------
 
 % \onepageout takes a vbox as an argument.  Note that \pagecontents
-% does insertions itself, but you have to call it yourself.
+% does insertions, but you have to call it yourself.
 \chardef\PAGE=255  \output={\onepageout{\pagecontents\PAGE}}
-\def\onepageout#1{\hoffset=\normaloffset
-\ifodd\pageno  \advance\hoffset by \bindingoffset
-\else \advance\hoffset by -\bindingoffset\fi
-{\escapechar=`\\\relax % makes sure backslash is used in output files.
-\shipout\vbox{{\let\hsize=\pagewidth \makeheadline} \pagebody{#1}%
-{\let\hsize=\pagewidth \makefootline}}}%
-\advancepageno \ifnum\outputpenalty>-20000 \else\dosupereject\fi}
+\def\onepageout#1{%
+  \hoffset=\normaloffset
+  \ifodd\pageno  \advance\hoffset by \bindingoffset
+  \else \advance\hoffset by -\bindingoffset\fi
+  {%
+    \escapechar = `\\ % use backslash in output files.
+    \indexdummies
+    \shipout\vbox{%
+      {\let\hsize=\pagewidth \makeheadline}%
+      \pagebody{#1}%
+      {\let\hsize=\pagewidth \makefootline}%
+    }%
+  }%
+  \advancepageno
+  \ifnum\outputpenalty>-20000 \else\dosupereject\fi
+}
 
 %%%% For @cropmarks command %%%%
 
 %
 \def\croppageout#1{\hoffset=0pt % make sure this doesn't mess things up
 {\escapechar=`\\\relax % makes sure backslash is used in output files.
-                \shipout
-                \vbox to \outervsize{\hsize=\outerhsize
+                 \shipout
+                 \vbox to \outervsize{\hsize=\outerhsize
                  \vbox{\line{\ewtop\hfill\ewtop}}
                  \nointerlineskip
                  \line{\vbox{\moveleft\cornerthick\nstop}
                        \vbox{\moveright\cornerthick\nstop}}
                  \vskip \topandbottommargin
                  \centerline{\ifodd\pageno\hskip\bindingoffset\fi
-                       \vbox{
-                       {\let\hsize=\pagewidth \makeheadline}
-                       \pagebody{#1}
-                       {\let\hsize=\pagewidth \makefootline}}
-                       \ifodd\pageno\else\hskip\bindingoffset\fi}
-                \vskip \topandbottommargin plus1fill minus1fill
+                        \vbox{
+                        {\let\hsize=\pagewidth \makeheadline}
+                        \pagebody{#1}
+                        {\let\hsize=\pagewidth \makefootline}}
+                        \ifodd\pageno\else\hskip\bindingoffset\fi}
+                 \vskip \topandbottommargin plus1fill minus1fill
                  \boxmaxdepth\cornerthick
                  \line{\vbox{\moveleft\cornerthick\nsbot}
                        \hfill
                        \vbox{\moveright\cornerthick\nsbot}}
                  \nointerlineskip
                  \vbox{\line{\ewbot\hfill\ewbot}}
-       }}
+        }}
   \advancepageno
   \ifnum\outputpenalty>-20000 \else\dosupereject\fi}
 %
 %\def\'{{'}}
 
 % Used to generate quoted braces.
-
 \def\mylbrace {{\tt \char '173}}
 \def\myrbrace {{\tt \char '175}}
 \let\{=\mylbrace
 \let\}=\myrbrace
+\begingroup
+  % Definitions to produce actual \{ & \} command in an index.
+  \catcode`\{ = 12 \catcode`\} = 12
+  \catcode`\[ = 1 \catcode`\] = 2
+  \catcode`\@ = 0 \catcode`\\ = 12
+  @gdef@lbracecmd[\{]%
+  @gdef@rbracecmd[\}]%
+@endgroup
+
+% Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent
+% Others are defined by plain TeX: @` @' @" @^ @~ @= @v @H.
+\let\, = \c
+\let\dotaccent = \.
+\def\ringaccent#1{{\accent23 #1}}
+\let\tieaccent = \t
+\let\ubaraccent = \b
+\let\udotaccent = \d
+
+% Other special characters: @questiondown @exclamdown
+% Plain TeX defines: @AA @AE @O @OE @L (and lowercase versions) @ss.
+\def\questiondown{?`}
+\def\exclamdown{!`}
+
+% Dotless i and dotless j, used for accents.
+\def\imacro{i}
+\def\jmacro{j}
+\def\dotless#1{%
+  \def\temp{#1}%
+  \ifx\temp\imacro \ptexi
+  \else\ifx\temp\jmacro \j
+  \else \errmessage{@dotless can be used only with i or j}%
+  \fi\fi
+}
 
 % @: forces normal size whitespace following.
 \def\:{\spacefactor=1000 }
@@ -579,7 +620,7 @@ where each line of input produces a line of output.}
 % @sp n   outputs n lines of vertical space
 
 \def\sp{\parsearg\spxxx}
-\def\spxxx #1{\par \vskip #1\baselineskip}
+\def\spxxx #1{\vskip #1\baselineskip}
 
 % @comment ...line which is ignored...
 % @c is the same as @comment
@@ -592,6 +633,9 @@ where each line of input produces a line of output.}
 
 \let\c=\comment
 
+% @paragraphindent  is defined for the Info formatting commands only.
+\let\paragraphindent=\comment
+
 % Prevent errors for section commands.
 % Used in @ignore and in failing conditionals.
 \def\ignoresections{%
@@ -681,10 +725,15 @@ where each line of input produces a line of output.}
 \def\menu{\doignore{menu}}
 \def\direntry{\doignore{direntry}}
 
+% Also ignore @macro ... @end macro.  The user must run texi2dvi,
+% which runs makeinfo to do macro expansion.  Ignore @unmacro, too.
+\def\macro{\doignore{macro}}
+\let\unmacro = \comment
+
+
 % @dircategory CATEGORY  -- specify a category of the dir file
 % which this file should belong to.  Ignore this in TeX.
-
-\def\dircategory{\comment}
+\let\dircategory = \comment
 
 % Ignore text until a line `@end #1'.
 %
@@ -717,6 +766,7 @@ where each line of input produces a line of output.}
     \immediate\write16{If you are running another version of TeX, relax.}
     \immediate\write16{If you are running Unix TeX 3.0, kill this TeX process.}
     \immediate\write16{  Then upgrade your TeX installation if you can.}
+    \immediate\write16{  (See ftp://ftp.gnu.ai.mit.edu/pub/gnu/TeX.README.)}
     \immediate\write16{If you are stuck with version 3.0, run the}
     \immediate\write16{  script ``tex3patch'' from the Texinfo distribution}
     \immediate\write16{  to use a workaround.}
@@ -822,9 +872,9 @@ where each line of input produces a line of output.}
 % @value{foo} gets the text saved in variable foo.
 %
 \def\value#1{\expandafter
-               \ifx\csname SET#1\endcsname\relax
-                       {\{No value for ``#1''\}}
-               \else \csname SET#1\endcsname \fi}
+                \ifx\csname SET#1\endcsname\relax
+                        {\{No value for ``#1''\}}
+                \else \csname SET#1\endcsname \fi}
 
 % @ifset VAR ... @end ifset reads the `...' iff VAR has been defined
 % with @set.
@@ -924,6 +974,7 @@ where each line of input produces a line of output.}
 \expandafter\expandafter\expandafter\appendixsetref{\lastnode}\fi
 \global\let\lastnode=\relax}
 
+% @refill is a no-op.
 \let\refill=\relax
 
 % @setfilename is done at the beginning of every texinfo file.
@@ -938,16 +989,13 @@ where each line of input produces a line of output.}
    \comment % Ignore the actual filename.
 }
 
+% @bye.
 \outer\def\bye{\pagealignmacro\tracingstats=1\ptexend}
 
-\def\inforef #1{\inforefzzz #1,,,,**}
-\def\inforefzzz #1,#2,#3,#4**{\putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}},
-  node \samp{\ignorespaces#1{}}}
-
-\def\macro#1{\begingroup\ignoresections\catcode`\#=6\def\macrotemp{#1}\parsearg\macroxxx}
-\def\macroxxx#1#2 \end macro{%
-\expandafter\gdef\macrotemp#1{#2}%
-\endgroup}
+% \def\macro#1{\begingroup\ignoresections\catcode`\#=6\def\macrotemp{#1}\parsearg\macroxxx}
+% \def\macroxxx#1#2 \end macro{%
+% \expandafter\gdef\macrotemp#1{#2}%
+% \endgroup}
 
 %\def\linemacro#1{\begingroup\ignoresections\catcode`\#=6\def\macrotemp{#1}\parsearg\linemacroxxx}
 %\def\linemacroxxx#1#2 \end linemacro{%
@@ -959,6 +1007,7 @@ where each line of input produces a line of output.}
 
 %\def\butfirst#1{}
 
+
 \message{fonts,}
 
 % Font-change commands.
@@ -988,7 +1037,7 @@ where each line of input produces a line of output.}
 \fi
 % Support font families that don't use the same naming scheme as CM.
 \def\rmshape{r}
-\def\rmbshape{bx}              %where the normal face is bold
+\def\rmbshape{bx}               %where the normal face is bold
 \def\bfshape{b}
 \def\bxshape{bx}
 \def\ttshape{tt}
@@ -1028,7 +1077,7 @@ where each line of input produces a line of output.}
 \setfont\deftt\ttshape{10}{\magstep1}
 \def\df{\let\tentt=\deftt \let\tenbf = \defbf \bf}
 
-% Fonts for indices and small examples.
+% Fonts for indices and small examples (9pt).
 % We actually use the slanted font rather than the italic,
 % because texinfo normally uses the slanted fonts for that.
 % Do not make many font distinctions in general in the index, since they
@@ -1045,7 +1094,7 @@ where each line of input produces a line of output.}
 \font\indi=cmmi9
 \font\indsy=cmsy9
 
-% Fonts for headings
+% Chapter (and unnumbered) fonts (17.28pt).
 \setfont\chaprm\rmbshape{12}{\magstep2}
 \setfont\chapit\itbshape{10}{\magstep3}
 \setfont\chapsl\slbshape{10}{\magstep3}
@@ -1057,6 +1106,7 @@ where each line of input produces a line of output.}
 \font\chapi=cmmi12 scaled \magstep2
 \font\chapsy=cmsy10 scaled \magstep3
 
+% Section fonts (14.4pt).
 \setfont\secrm\rmbshape{12}{\magstep1}
 \setfont\secit\itbshape{10}{\magstep2}
 \setfont\secsl\slbshape{10}{\magstep2}
@@ -1074,14 +1124,15 @@ where each line of input produces a line of output.}
 % \setfont\ssectt\ttshape{10}{\magstep1}
 % \setfont\ssecsf\sfshape{10}{\magstep1}
 
-%\setfont\ssecrm\bfshape{10}{1315}     % Note the use of cmb rather than cmbx.
-%\setfont\ssecit\itshape{10}{1315}     % Also, the size is a little larger than
-%\setfont\ssecsl\slshape{10}{1315}     % being scaled magstep1.
+%\setfont\ssecrm\bfshape{10}{1315}      % Note the use of cmb rather than cmbx.
+%\setfont\ssecit\itshape{10}{1315}      % Also, the size is a little larger than
+%\setfont\ssecsl\slshape{10}{1315}      % being scaled magstep1.
 %\setfont\ssectt\ttshape{10}{1315}
 %\setfont\ssecsf\sfshape{10}{1315}
 
 %\let\ssecbf=\ssecrm
 
+% Subsection fonts (13.15pt).
 \setfont\ssecrm\rmbshape{12}{\magstephalf}
 \setfont\ssecit\itbshape{10}{1315}
 \setfont\ssecsl\slbshape{10}{1315}
@@ -1127,22 +1178,23 @@ where each line of input produces a line of output.}
   \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl
   \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc
   \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy \let\tenttsl=\chapttsl
-  \resetmathfonts}
+  \resetmathfonts \setleading{19pt}}
 \def\secfonts{%
   \let\tenrm=\secrm \let\tenit=\secit \let\tensl=\secsl
   \let\tenbf=\secbf \let\tentt=\sectt \let\smallcaps=\secsc
   \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy \let\tenttsl=\secttsl
-  \resetmathfonts}
+  \resetmathfonts \setleading{16pt}}
 \def\subsecfonts{%
   \let\tenrm=\ssecrm \let\tenit=\ssecit \let\tensl=\ssecsl
   \let\tenbf=\ssecbf \let\tentt=\ssectt \let\smallcaps=\ssecsc
   \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy \let\tenttsl=\ssecttsl
-  \resetmathfonts}
+  \resetmathfonts \setleading{15pt}}
+\let\subsubsecfonts = \subsecfonts % Maybe make sssec fonts scaled magstephalf?
 \def\indexfonts{%
   \let\tenrm=\indrm \let\tenit=\indit \let\tensl=\indsl
   \let\tenbf=\indbf \let\tentt=\indtt \let\smallcaps=\indsc
   \let\tensf=\indsf \let\teni=\indi \let\tensy=\indsy \let\tenttsl=\indttsl
-  \resetmathfonts}
+  \resetmathfonts \setleading{12pt}}
 
 % Set up the default fonts, so we can use them for creating boxes.
 %
@@ -1186,11 +1238,21 @@ where each line of input produces a line of output.}
 }
 \let\ttfont=\t
 \def\samp #1{`\tclose{#1}'\null}
-\def\key #1{{\ttsl \nohyphenation \uppercase{#1}}\null}
+\setfont\smallrm\rmshape{8}{1000}
+\font\smallsy=cmsy9
+\def\key#1{{\smallrm\textfont2=\smallsy \leavevmode\hbox{%
+  \raise0.4pt\hbox{$\langle$}\kern-.08em\vtop{%
+    \vbox{\hrule\kern-0.4pt
+     \hbox{\raise0.4pt\hbox{\vphantom{$\langle$}}#1}}%
+    \kern-0.4pt\hrule}%
+  \kern-.06em\raise0.4pt\hbox{$\rangle$}}}}
+% The old definition, with no lozenge:
+%\def\key #1{{\ttsl \nohyphenation \uppercase{#1}}\null}
 \def\ctrl #1{{\tt \rawbackslash \hat}#1}
 
 \let\file=\samp
 \let\url=\samp % perhaps include a hypertex \special eventually
+\def\email#1{$\langle${\tt #1}$\rangle$}
 
 % @code is a modification of @t,
 % which makes spaces the same size as normal in the surrounding text.
@@ -1222,7 +1284,7 @@ where each line of input produces a line of output.}
 % Unfortunately, TeX uses one parameter (\hyphenchar) to control
 % both hyphenation at - and hyphenation within words.
 % We must therefore turn them both off (\tclose does that)
-% and arrange explicitly to hyphenate an a dash.
+% and arrange explicitly to hyphenate at a dash.
 %  -- rms.
 {
 \catcode`\-=\active
@@ -1267,12 +1329,19 @@ where each line of input produces a line of output.}
 
 \def\kbd#1{\def\look{#1}\expandafter\kbdfoo\look??\par}
 
-\def\l#1{{\li #1}\null}                %
+% @l was never documented to mean ``switch to the Lisp font'',
+% and it is not used as such in any manual I can find.  We need it for
+% Polish suppressed-l.  --karl, 22sep96.
+%\def\l#1{{\li #1}\null}
 
-\def\r#1{{\rm #1}}             % roman font
+\def\r#1{{\rm #1}}              % roman font
 % Use of \lowercase was suggested.
-\def\sc#1{{\smallcaps#1}}      % smallcaps font
-\def\ii#1{{\it #1}}            % italic font
+\def\sc#1{{\smallcaps#1}}       % smallcaps font
+\def\ii#1{{\it #1}}             % italic font
+
+% @pounds{} is a sterling sign.
+\def\pounds{{\it\$}}
+
 
 \message{page headings,}
 
@@ -1287,7 +1356,7 @@ where each line of input produces a line of output.}
 
 \def\shorttitlepage{\parsearg\shorttitlepagezzz}
 \def\shorttitlepagezzz #1{\begingroup\hbox{}\vskip 1.5in \chaprm \centerline{#1}%
-       \endgroup\page\hbox{}\page}
+        \endgroup\page\hbox{}\page}
 
 \def\titlepage{\begingroup \parindent=0pt \textfonts
    \let\subtitlerm=\tenrm
@@ -1304,9 +1373,9 @@ where each line of input produces a line of output.}
    % Now you can print the title using @title.
    \def\title{\parsearg\titlezzz}%
    \def\titlezzz##1{\leftline{\titlefont{##1}}
-                   % print a rule at the page bottom also.
-                   \finishedtitlepagefalse
-                   \vskip4pt \hrule height 4pt width \hsize \vskip4pt}%
+                    % print a rule at the page bottom also.
+                    \finishedtitlepagefalse
+                    \vskip4pt \hrule height 4pt width \hsize \vskip4pt}%
    % No rule at page bottom unless we print one at the top with @title.
    \finishedtitlepagetrue
    %
@@ -1324,7 +1393,7 @@ where each line of input produces a line of output.}
    \let\oldpage = \page
    \def\page{%
       \iffinishedtitlepage\else
-        \finishtitlepage
+         \finishtitlepage
       \fi
       \oldpage
       \let\page = \oldpage
@@ -1412,14 +1481,15 @@ where each line of input produces a line of output.}
 %
 }% unbind the catcode of @.
 
-% @headings double     turns headings on for double-sided printing.
-% @headings single     turns headings on for single-sided printing.
-% @headings off                turns them off.
-% @headings on         same as @headings double, retained for compatibility.
-% @headings after      turns on double-sided headings after this page.
-% @headings doubleafter        turns on double-sided headings after this page.
+% @headings double      turns headings on for double-sided printing.
+% @headings single      turns headings on for single-sided printing.
+% @headings off         turns them off.
+% @headings on          same as @headings double, retained for compatibility.
+% @headings after       turns on double-sided headings after this page.
+% @headings doubleafter turns on double-sided headings after this page.
 % @headings singleafter turns on single-sided headings after this page.
-% By default, they are off.
+% By default, they are off at the start of a document,
+% and turned `on' after @end titlepage.
 
 \def\headings #1 {\csname HEADINGS#1\endcsname}
 
@@ -1433,22 +1503,24 @@ where each line of input produces a line of output.}
 % title on inside top of left hand pages, and page numbers on outside top
 % edge of all pages.
 \def\HEADINGSdouble{
-%\pagealignmacro
 \global\pageno=1
 \global\evenfootline={\hfil}
 \global\oddfootline={\hfil}
 \global\evenheadline={\line{\folio\hfil\thistitle}}
 \global\oddheadline={\line{\thischapter\hfil\folio}}
+\global\let\contentsalignmacro = \chapoddpage
 }
+\let\contentsalignmacro = \chappager
+
 % For single-sided printing, chapter title goes across top left of page,
 % page number on top right.
 \def\HEADINGSsingle{
-%\pagealignmacro
 \global\pageno=1
 \global\evenfootline={\hfil}
 \global\oddfootline={\hfil}
 \global\evenheadline={\line{\thischapter\hfil\folio}}
 \global\oddheadline={\line{\thischapter\hfil\folio}}
+\global\let\contentsalignmacro = \chappager
 }
 \def\HEADINGSon{\HEADINGSdouble}
 
@@ -1459,6 +1531,7 @@ where each line of input produces a line of output.}
 \global\oddfootline={\hfil}
 \global\evenheadline={\line{\folio\hfil\thistitle}}
 \global\oddheadline={\line{\thischapter\hfil\folio}}
+\global\let\contentsalignmacro = \chapoddpage
 }
 
 \def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsinglex}
@@ -1467,6 +1540,7 @@ where each line of input produces a line of output.}
 \global\oddfootline={\hfil}
 \global\evenheadline={\line{\thischapter\hfil\folio}}
 \global\oddheadline={\line{\thischapter\hfil\folio}}
+\global\let\contentsalignmacro = \chappager
 }
 
 % Subroutines used in generating headings
@@ -1490,6 +1564,7 @@ July\or August\or September\or October\or November\or December\fi
 \def\settitle{\parsearg\settitlezzz}
 \def\settitlezzz #1{\gdef\thistitle{#1}}
 
+
 \message{tables,}
 
 % @tabs -- simple alignment
@@ -1812,6 +1887,7 @@ July\or August\or September\or October\or November\or December\fi
 %   current hsize to be used for each column. You may use as many
 %   columns as desired.
 
+
 % Or use a template:
 %   @multitable {Column 1 template} {Column 2 template} {Column 3 template}
 %   @item ...
@@ -1832,7 +1908,7 @@ July\or August\or September\or October\or November\or December\fi
 % with nothing between them for as many times as empty columns are needed,
 % ie, @tab@tab@tab will produce two empty columns.
 
-% @item, @tab, @multicolumn or @endmulticolumn do not need to be on their
+% @item, @tab, @multitable or @end multitable do not need to be on their
 % own lines, but it will not hurt if they are.
 
 % Sample multitable:
@@ -1898,7 +1974,8 @@ July\or August\or September\or October\or November\or December\fi
                                      % We don't need this so we don't use it.
     \else
        \global\advance\colcount by1
-       \setbox0=\hbox{#1}%
+       \setbox0=\hbox{#1 }% Add a normal word space as a separator;
+                          % typically that is always in the input, anyway.
        \expandafter\xdef\csname col\the\colcount\endcsname{\the\wd0}%
     \fi%
   \fi%
@@ -1959,7 +2036,7 @@ July\or August\or September\or October\or November\or December\fi
  % In either case we will make \leftskip=\multitablecolspace:
 \leftskip=\multitablecolspace
 \fi
-\noindent##}\cr%
+\noindent##\multistrut}\cr%
  % \everycr will reset column counter, \colcount, at the end of
  % each line. Every column  entry will cause \colcount to advance by one. 
  % The table preamble
@@ -1972,11 +2049,10 @@ July\or August\or September\or October\or November\or December\fi
 \def\setmultitablespacing{% test to see if user has set \multitablelinespace.
 % If so, do nothing. If not, give it an appropriate dimension based on
 % current baselineskip.
-\setbox0=\vbox{Xy}
 \ifdim\multitablelinespace=0pt
 %% strut to put in table in case some entry doesn't have descenders,
 %% to keep lines equally spaced
-\gdef\multistrut{\vrule height\ht0 depth\dp0 width0pt\relax}
+\let\multistrut = \strut
 %% Test to see if parskip is larger than space between lines of
 %% table. If not, do nothing. 
 %%        If so, set to same dimension as multitablelinespace.
@@ -1993,6 +2069,8 @@ width0pt\relax} \fi
 \global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller
                                       %% than skip between lines in the table.
 \fi}
+
+
 \message{indexing,}
 % Index generation facilities
 
@@ -2005,14 +2083,14 @@ width0pt\relax} \fi
 % It automatically defines \fooindex such that
 % \fooindex ...rest of line... puts an entry in the index foo.
 % It also defines \fooindfile to be the number of the output channel for
-% the file that        accumulates this index.  The file's extension is foo.
+% the file that accumulates this index.  The file's extension is foo.
 % The name of an index should be no more than 2 characters long
 % for the sake of vms.
 
 \def\newindex #1{
 \expandafter\newwrite \csname#1indfile\endcsname% Define number for output file
-\openout \csname#1indfile\endcsname \jobname.#1        % Open the file
-\expandafter\xdef\csname#1index\endcsname{%    % Define \xxxindex
+\openout \csname#1indfile\endcsname \jobname.#1 % Open the file
+\expandafter\xdef\csname#1index\endcsname{%     % Define \xxxindex
 \noexpand\doindex {#1}}
 }
 
@@ -2024,8 +2102,8 @@ width0pt\relax} \fi
 
 \def\newcodeindex #1{
 \expandafter\newwrite \csname#1indfile\endcsname% Define number for output file
-\openout \csname#1indfile\endcsname \jobname.#1        % Open the file
-\expandafter\xdef\csname#1index\endcsname{%    % Define \xxxindex
+\openout \csname#1indfile\endcsname \jobname.#1 % Open the file
+\expandafter\xdef\csname#1index\endcsname{%     % Define \xxxindex
 \noexpand\docodeindex {#1}}
 }
 
@@ -2036,7 +2114,7 @@ width0pt\relax} \fi
 \def\synindex #1 #2 {%
 \expandafter\let\expandafter\synindexfoo\expandafter=\csname#2indfile\endcsname
 \expandafter\let\csname#1indfile\endcsname=\synindexfoo
-\expandafter\xdef\csname#1index\endcsname{%    % Define \xxxindex
+\expandafter\xdef\csname#1index\endcsname{%     % Define \xxxindex
 \noexpand\doindex {#2}}%
 }
 
@@ -2045,7 +2123,7 @@ width0pt\relax} \fi
 \def\syncodeindex #1 #2 {%
 \expandafter\let\expandafter\synindexfoo\expandafter=\csname#2indfile\endcsname
 \expandafter\let\csname#1indfile\endcsname=\synindexfoo
-\expandafter\xdef\csname#1index\endcsname{%    % Define \xxxindex
+\expandafter\xdef\csname#1index\endcsname{%     % Define \xxxindex
 \noexpand\docodeindex {#2}}%
 }
 
@@ -2093,24 +2171,31 @@ width0pt\relax} \fi
 \def\L{\realbackslash L}%
 \def\ss{\realbackslash ss}%
 % Take care of texinfo commands likely to appear in an index entry.
+% (Must be a way to avoid doing expansion at all, and thus not have to
+% laboriously list every single command here.)
+\def\@{@}% will be @@ when we switch to @ as escape char.
+%\let\{ = \lbracecmd
+%\let\} = \rbracecmd
 \def\_{{\realbackslash _}}%
 \def\w{\realbackslash w }%
 \def\bf{\realbackslash bf }%
-\def\rm{\realbackslash rm }%
+%\def\rm{\realbackslash rm }%
 \def\sl{\realbackslash sl }%
 \def\sf{\realbackslash sf}%
 \def\tt{\realbackslash tt}%
 \def\gtr{\realbackslash gtr}%
 \def\less{\realbackslash less}%
 \def\hat{\realbackslash hat}%
-\def\char{\realbackslash char}%
+%\def\char{\realbackslash char}%
 \def\TeX{\realbackslash TeX}%
 \def\dots{\realbackslash dots }%
 \def\copyright{\realbackslash copyright }%
 \def\tclose##1{\realbackslash tclose {##1}}%
 \def\code##1{\realbackslash code {##1}}%
+\def\dotless##1{\realbackslash dotless {##1}}%
 \def\samp##1{\realbackslash samp {##1}}%
-\def\t##1{\realbackslash r {##1}}%
+\def\,##1{\realbackslash ,{##1}}%
+\def\t##1{\realbackslash t {##1}}%
 \def\r##1{\realbackslash r {##1}}%
 \def\i##1{\realbackslash i {##1}}%
 \def\b##1{\realbackslash b {##1}}%
@@ -2138,6 +2223,7 @@ width0pt\relax} \fi
 
 \def\indexnofonts{%
 % Just ignore accents.
+\let\,=\indexdummyfont
 \let\"=\indexdummyfont
 \let\`=\indexdummyfont
 \let\'=\indexdummyfont
@@ -2150,6 +2236,7 @@ width0pt\relax} \fi
 \let\u=\indexdummyfont
 \let\v=\indexdummyfont
 \let\H=\indexdummyfont
+\let\dotless=\indexdummyfont
 % Take care of the plain tex special European modified letters.
 \def\oe{oe}%
 \def\ae{ae}%
@@ -2183,6 +2270,7 @@ width0pt\relax} \fi
 \let\var=\indexdummyfont
 \let\TeX=\indexdummytex
 \let\dots=\indexdummydots
+\def\@{@}%
 }
 
 % To define \realbackslash, we must make \ not be an escape.
@@ -2198,29 +2286,37 @@ width0pt\relax} \fi
 % workhorse for all \fooindexes
 % #1 is name of index, #2 is stuff to put there
 \def\doind #1#2{%
-% Put the index entry in the margin if desired.
-\ifx\SETmarginindex\relax\else%
-\insert\margin{\hbox{\vrule height8pt depth3pt width0pt #2}}%
-\fi%
-{\count10=\lastpenalty %
-{\indexdummies % Must do this here, since \bf, etc expand at this stage
-\escapechar=`\\%
-{\let\folio=0% Expand all macros now EXCEPT \folio
-\def\rawbackslashxx{\indexbackslash}% \indexbackslash isn't defined now
-% so it will be output as is; and it will print as backslash in the indx.
-%
-% Now process the index-string once, with all font commands turned off,
-% to get the string to sort the index by.
-{\indexnofonts
-\xdef\temp1{#2}%
-}%
-% Now produce the complete index entry.  We process the index-string again,
-% this time with font commands expanded, to get what to print in the index.
-\edef\temp{%
-\write \csname#1indfile\endcsname{%
-\realbackslash entry {\temp1}{\folio}{#2}}}%
-\temp }%
-}\penalty\count10}}
+  % Put the index entry in the margin if desired.
+  \ifx\SETmarginindex\relax\else
+    \insert\margin{\hbox{\vrule height8pt depth3pt width0pt #2}}%
+  \fi
+  {%
+    \count255=\lastpenalty
+    {%
+      \indexdummies % Must do this here, since \bf, etc expand at this stage
+      \escapechar=`\\
+      {%
+        \let\folio=0 % We will expand all macros now EXCEPT \folio.
+        \def\rawbackslashxx{\indexbackslash}% \indexbackslash isn't defined now
+        % so it will be output as is; and it will print as backslash.
+        %
+        % First process the index-string with all font commands turned off
+        % to get the string to sort by.
+        {\indexnofonts \xdef\indexsorttmp{#2}}%
+        %
+        % Now produce the complete index entry, with both the sort key and the
+        % original text, including any font commands.
+        \toks0 = {#2}%
+        \edef\temp{%
+          \write\csname#1indfile\endcsname{%
+            \realbackslash entry{\indexsorttmp}{\folio}{\the\toks0}}%
+        }%
+        \temp
+      }%
+    }%
+    \penalty\count255
+  }%
+}
 
 \def\dosubind #1#2#3{%
 {\count10=\lastpenalty %
@@ -2281,26 +2377,19 @@ width0pt\relax} \fi
 
 \def\printindex{\parsearg\doprintindex}
 
-\def\doprintindex#1{%
-  \tex
-  \dobreak \chapheadingskip {10000}
-  \catcode`\%=\other\catcode`\&=\other\catcode`\#=\other
-  \catcode`\$=\other
-  \catcode`\~=\other
-  \indexbreaks
+\def\doprintindex#1{\begingroup
+  \dobreak \chapheadingskip{10000}%
   %
-  % The following don't help, since the chars were translated
-  % when the raw index was written, and their fonts were discarded
-  % due to \indexnofonts.
-  %\catcode`\"=\active
-  %\catcode`\^=\active
-  %\catcode`\_=\active
-  %\catcode`\|=\active
-  %\catcode`\<=\active
-  %\catcode`\>=\active
-  % %
-  \def\indexbackslash{\rawbackslashxx}
-  \indexfonts\rm \tolerance=9500 \advance\baselineskip -1pt
+  \indexfonts \rm
+  \tolerance = 9500
+  \indexbreaks
+  \def\indexbackslash{\rawbackslashxx}%
+  % Index files are almost Texinfo source, but we use \ as the escape
+  % character.  It would be better to use @, but that's too big a change
+  % to make right now.
+  \catcode`\\ = 0
+  \catcode`\@ = 11
+  \escapechar = `\\
   \begindoublecolumns
   %
   % See if the index file exists and is nonempty.
@@ -2311,7 +2400,7 @@ width0pt\relax} \fi
     % index.  The easiest way to prevent this problem is to make sure
     % there is some text.
     (Index is nonexistent)
-    \else
+  \else
     %
     % If the index file exists but is empty, then \openin leaves \ifeof
     % false.  We have to make TeX try to read something from the file, so
@@ -2325,8 +2414,7 @@ width0pt\relax} \fi
   \fi
   \closein 1
   \enddoublecolumns
-  \Etex
-}
+\endgroup}
 
 % These macros are used by the sorted index file itself.
 % Change them to control the appearance of the index.
@@ -2417,15 +2505,15 @@ width0pt\relax} \fi
 \noindent\hskip\secondaryindent\hbox{#1}\indexdotfill #2\par
 }}
 
-%% Define two-column mode, which is used in indexes.
-%% Adapted from the TeXbook, page 416.
-\catcode `\@=11
+% Define two-column mode, which we use to typeset indexes.
+% Adapted from the TeXbook, page 416, which is to say,
+% the manmac.tex format used to print the TeXbook itself.
+\catcode`\@=11
 
 \newbox\partialpage
-
 \newdimen\doublecolumnhsize
 
-\def\begindoublecolumns{\begingroup
+\def\begindoublecolumns{\begingroup % ended by \enddoublecolumns
   % Grab any single-column material above us.
   \output = {\global\setbox\partialpage
     =\vbox{\unvbox255\kern -\topskip \kern \baselineskip}}%
@@ -2458,51 +2546,51 @@ width0pt\relax} \fi
   % Double the \vsize as well.  (We don't need a separate register here,
   % since nobody clobbers \vsize.)
   \vsize = 2\vsize
-  \doublecolumnpagegoal
 }
-
-\def\enddoublecolumns{\eject \endgroup \pagegoal=\vsize \unvbox\partialpage}
-
-\def\doublecolumnsplit{\splittopskip=\topskip \splitmaxdepth=\maxdepth
-  \global\dimen@=\pageheight \global\advance\dimen@ by-\ht\partialpage
-  \global\setbox1=\vsplit255 to\dimen@ \global\setbox0=\vbox{\unvbox1}
-  \global\setbox3=\vsplit255 to\dimen@ \global\setbox2=\vbox{\unvbox3}
-  \ifdim\ht0>\dimen@ \setbox255=\vbox{\unvbox0\unvbox2} \global\setbox255=\copy5 \fi
-  \ifdim\ht2>\dimen@ \setbox255=\vbox{\unvbox0\unvbox2} \global\setbox255=\copy5 \fi
+\def\doublecolumnout{%
+  \splittopskip=\topskip \splitmaxdepth=\maxdepth
+  % Get the available space for the double columns -- the normal
+  % (undoubled) page height minus any material left over from the
+  % previous page.
+  \dimen@=\pageheight \advance\dimen@ by-\ht\partialpage
+  % box0 will be the left-hand column, box1 the right.
+  \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@
+  \onepageout\pagesofar
+  \unvbox255 \penalty\outputpenalty
 }
-\def\doublecolumnpagegoal{%
-  \dimen@=\vsize \advance\dimen@ by-2\ht\partialpage \global\pagegoal=\dimen@
+\def\pagesofar{%
+  % The contents of the output page -- any previous material,
+  % followed by the two boxes we just split.
+  \unvbox\partialpage
+  \hsize = \doublecolumnhsize
+  \wd0=\hsize \wd2=\hsize \hbox to\pagewidth{\box0\hfil\box2}%
 }
-\def\pagesofar{\unvbox\partialpage %
-  \hsize=\doublecolumnhsize % have to restore this since output routine
-  \wd0=\hsize \wd2=\hsize \hbox to\pagewidth{\box0\hfil\box2}}
-\def\doublecolumnout{%
-  \setbox5=\copy255
-  {\vbadness=10000 \doublecolumnsplit}
-  \ifvbox255
-    \setbox0=\vtop to\dimen@{\unvbox0}
-    \setbox2=\vtop to\dimen@{\unvbox2}
-    \onepageout\pagesofar \unvbox255 \penalty\outputpenalty
-  \else
-    \setbox0=\vbox{\unvbox5}
-    \ifvbox0
-      \dimen@=\ht0 \advance\dimen@ by\topskip \advance\dimen@ by-\baselineskip
-      \divide\dimen@ by2 \splittopskip=\topskip \splitmaxdepth=\maxdepth
-      {\vbadness=10000
-       \loop \global\setbox5=\copy0
-          \setbox1=\vsplit5 to\dimen@
-          \setbox3=\vsplit5 to\dimen@
-          \ifvbox5 \global\advance\dimen@ by1pt \repeat
-        \setbox0=\vbox to\dimen@{\unvbox1}
-        \setbox2=\vbox to\dimen@{\unvbox3}
-        \global\setbox\partialpage=\vbox{\pagesofar}
-        \doublecolumnpagegoal
-      }
-    \fi
-  \fi
+\def\enddoublecolumns{%
+  \output={\balancecolumns}\eject % split what we have
+  \endgroup
+  % Back to normal single-column typesetting, but take account of the
+  % fact that we just accumulated some stuff on the output page.
+  \pagegoal=\vsize 
+}
+\def\balancecolumns{%
+  % Called on the last page of the double column material.
+  \setbox0=\vbox{\unvbox255}%
+  \dimen@ = \ht0
+  \advance\dimen@ by \topskip
+  \advance\dimen@ by-\baselineskip
+  \divide\dimen@ by 2
+  \splittopskip = \topskip
+  % Loop until we get a decent breakpoint.
+  {\vbadness=10000 \loop \global\setbox3=\copy0
+    \global\setbox1=\vsplit3 to\dimen@
+    \ifdim\ht3>\dimen@ \global\advance\dimen@ by1pt \repeat}%
+  \setbox0=\vbox to\dimen@{\unvbox1}%
+  \setbox2=\vbox to\dimen@{\unvbox3}%
+  \pagesofar
 }
-
 \catcode `\@=\other
+
+
 \message{sectioning,}
 % Define chapters, sections, etc.
 
@@ -2780,7 +2868,7 @@ width0pt\relax} \fi
 \outer\def\unnumberedsubsec{\parsearg\unnumberedsubsecyyy}
 \def\unnumberedsubsecyyy #1{\unnmhead2{#1}} %normally calls unnumberedsubseczzz
 \def\unnumberedsubseczzz #1{\seccheck{unnumberedsubsec}%
-\plainsecheading {#1}\gdef\thissection{#1}%
+\plainsubsecheading {#1}\gdef\thissection{#1}%
 {\chapternofonts%
 \edef\temp{{\realbackslash unnumbsubsecentry{#1}{\noexpand\folio}}}%
 \escapechar=`\\%
@@ -2825,7 +2913,7 @@ width0pt\relax} \fi
 \outer\def\unnumberedsubsubsec{\parsearg\unnumberedsubsubsecyyy}
 \def\unnumberedsubsubsecyyy #1{\unnmhead3{#1}} %normally unnumberedsubsubseczzz
 \def\unnumberedsubsubseczzz #1{\seccheck{unnumberedsubsubsec}%
-\plainsecheading {#1}\gdef\thissection{#1}%
+\plainsubsubsecheading {#1}\gdef\thissection{#1}%
 {\chapternofonts%
 \edef\temp{{\realbackslash unnumbsubsubsecentry{#1}{\noexpand\folio}}}%
 \escapechar=`\\%
@@ -2863,10 +2951,10 @@ width0pt\relax} \fi
 
 % NOTE on use of \vbox for chapter headings, section headings, and
 % such:
-%      1) We use \vbox rather than the earlier \line to permit
-%         overlong headings to fold.
-%      2) \hyphenpenalty is set to 10000 because hyphenation in a
-%         heading is obnoxious; this forbids it.
+%       1) We use \vbox rather than the earlier \line to permit
+%          overlong headings to fold.
+%       2) \hyphenpenalty is set to 10000 because hyphenation in a
+%          heading is obnoxious; this forbids it.
 %       3) Likewise, headings look best if no \parindent is used, and
 %          if justification is not attempted.  Hence \raggedright.
 
@@ -2884,11 +2972,10 @@ width0pt\relax} \fi
                   \parindent=0pt\raggedright
                   \rm #1\hfill}}\bigskip \par\penalty 200}
 
-\def\heading{\parsearg\secheadingi}
-
-\def\subheading{\parsearg\subsecheadingi}
-
-\def\subsubheading{\parsearg\subsubsecheadingi}
+% @heading, @subheading, @subsubheading.
+\def\heading{\parsearg\plainsecheading}
+\def\subheading{\parsearg\plainsubsecheading}
+\def\subsubheading{\parsearg\plainsubsubsecheading}
 
 % These macros generate a chapter, section, etc. heading only
 % (including whitespace, linebreaking, etc. around it),
@@ -2902,7 +2989,7 @@ width0pt\relax} \fi
 %%% Define plain chapter starts, and page on/off switching for it
 % Parameter controlling skip before chapter headings (if needed)
 
-\newskip \chapheadingskip \chapheadingskip = 30pt plus 8pt minus 4pt
+\newskip\chapheadingskip
 
 \def\chapbreak{\dobreak \chapheadingskip {-4000}}
 \def\chappager{\par\vfill\supereject}
@@ -2911,15 +2998,18 @@ width0pt\relax} \fi
 \def\setchapternewpage #1 {\csname CHAPPAG#1\endcsname}
 
 \def\CHAPPAGoff{
+\global\let\contentsalignmacro = \chappager
 \global\let\pchapsepmacro=\chapbreak
 \global\let\pagealignmacro=\chappager}
 
 \def\CHAPPAGon{
+\global\let\contentsalignmacro = \chappager
 \global\let\pchapsepmacro=\chappager
 \global\let\pagealignmacro=\chappager
 \global\def\HEADINGSon{\HEADINGSsingle}}
 
 \def\CHAPPAGodd{
+\global\let\contentsalignmacro = \chapoddpage
 \global\let\pchapsepmacro=\chapoddpage
 \global\let\pagealignmacro=\chapoddpage
 \global\def\HEADINGSon{\HEADINGSdouble}}
@@ -2931,30 +3021,35 @@ width0pt\relax} \fi
 \global\let\unnumbchapmacro=\unnchfplain
 \global\let\centerchapmacro=\centerchfplain}
 
-\def\chfplain #1#2{%
+% Plain chapter opening.
+% #1 is the text, #2 the chapter number or empty if unnumbered.
+\def\chfplain#1#2{%
   \pchapsepmacro
   {%
-    \chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
-                     \parindent=0pt\raggedright
-                     \rm #2\enspace #1}%
+    \chapfonts \rm
+    \def\chapnum{#2}%
+    \setbox0 = \hbox{#2\ifx\chapnum\empty\else\enspace\fi}%
+    \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright
+          \hangindent = \wd0 \centerparametersmaybe
+          \unhbox0 #1\par}%
   }%
-  \bigskip
-  \penalty5000
+  \nobreak\bigskip % no page break after a chapter title
+  \nobreak
 }
 
-\def\unnchfplain #1{%
-\pchapsepmacro %
-{\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
-                  \parindent=0pt\raggedright
-                  \rm #1\hfill}}\bigskip \par\penalty 10000 %
-}
+% Plain opening for unnumbered.
+\def\unnchfplain#1{\chfplain{#1}{}}
 
-\def\centerchfplain #1{%
-\pchapsepmacro %
-{\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
-                  \parindent=0pt
-                  {\rm #1}\hfill}}\bigskip \par\penalty 10000 %
-}
+% @centerchap -- centered and unnumbered.
+\let\centerparametersmaybe = \relax
+\def\centerchfplain#1{{%
+  \def\centerparametersmaybe{%
+    \advance\rightskip by 3\rightskip
+    \leftskip = \rightskip
+    \parfillskip = 0pt
+  }%
+  \chfplain{#1}{}%
+}}
 
 \CHAPFplain % The default
 
@@ -2980,69 +3075,70 @@ width0pt\relax} \fi
 \global\let\unnumbchapmacro=\unnchfopen
 \global\let\centerchapmacro=\centerchfopen}
 
-% Parameter controlling skip before section headings.
 
-\newskip \subsecheadingskip  \subsecheadingskip = 17pt plus 8pt minus 4pt
+% Section titles.
+\newskip\secheadingskip
+\def\secheadingbreak{\dobreak \secheadingskip {-1000}}
+\def\secheading#1#2#3{\sectionheading{sec}{#2.#3}{#1}}
+\def\plainsecheading#1{\sectionheading{sec}{}{#1}}
+
+% Subsection titles.
+\newskip \subsecheadingskip
 \def\subsecheadingbreak{\dobreak \subsecheadingskip {-500}}
+\def\subsecheading#1#2#3#4{\sectionheading{subsec}{#2.#3.#4}{#1}}
+\def\plainsubsecheading#1{\sectionheading{subsec}{}{#1}}
 
-\newskip \secheadingskip  \secheadingskip = 21pt plus 8pt minus 4pt
-\def\secheadingbreak{\dobreak \secheadingskip {-1000}}
+% Subsubsection titles.
+\let\subsubsecheadingskip = \subsecheadingskip
+\let\subsubsecheadingbreak = \subsecheadingbreak
+\def\subsubsecheading#1#2#3#4#5{\sectionheading{subsubsec}{#2.#3.#4.#5}{#1}}
+\def\plainsubsubsecheading#1{\sectionheading{subsubsec}{}{#1}}
 
-% @paragraphindent  is defined for the Info formatting commands only.
-\let\paragraphindent=\comment
 
-% Section fonts are the base font at magstep2, which produces
-% a size a bit more than 14 points in the default situation.
-
-\def\secheading #1#2#3{\secheadingi {#2.#3\enspace #1}}
-\def\plainsecheading #1{\secheadingi {#1}}
-\def\secheadingi #1{{\advance \secheadingskip by \parskip %
-\secheadingbreak}%
-{\secfonts \vbox{\hyphenpenalty=10000\tolerance=5000
-                 \parindent=0pt\raggedright
-                 \rm #1\hfill}}%
-\ifdim \parskip<10pt \kern 10pt\kern -\parskip\fi \penalty 10000 }
-
-
-% Subsection fonts are the base font at magstep1,
-% which produces a size of 12 points.
-
-\def\subsecheading #1#2#3#4{\subsecheadingi {#2.#3.#4\enspace #1}}
-\def\subsecheadingi #1{{\advance \subsecheadingskip by \parskip %
-\subsecheadingbreak}%
-{\subsecfonts \vbox{\hyphenpenalty=10000\tolerance=5000
-                     \parindent=0pt\raggedright
-                     \rm #1\hfill}}%
-\ifdim \parskip<10pt \kern 10pt\kern -\parskip\fi \penalty 10000 }
-
-\def\subsubsecfonts{\subsecfonts} % Maybe this should change:
-                                 % Perhaps make sssec fonts scaled
-                                 % magstep half
-\def\subsubsecheading #1#2#3#4#5{\subsubsecheadingi {#2.#3.#4.#5\enspace #1}}
-\def\subsubsecheadingi #1{{\advance \subsecheadingskip by \parskip %
-\subsecheadingbreak}%
-{\subsubsecfonts \vbox{\hyphenpenalty=10000\tolerance=5000
-                       \parindent=0pt\raggedright
-                       \rm #1\hfill}}%
-\ifdim \parskip<10pt \kern 10pt\kern -\parskip\fi \penalty 10000}
+% Print any size section title.
+% 
+% #1 is the section type (sec/subsec/subsubsec), #2 is the section
+% number (maybe empty), #3 the text.
+\def\sectionheading#1#2#3{%
+  {%
+    \expandafter\advance\csname #1headingskip\endcsname by \parskip
+    \csname #1headingbreak\endcsname
+  }%
+  {%
+    % Switch to the right set of fonts.
+    \csname #1fonts\endcsname \rm
+    %
+    % Only insert the separating space if we have a section number.
+    \def\secnum{#2}%
+    \setbox0 = \hbox{#2\ifx\secnum\empty\else\enspace\fi}%
+    %
+    \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright
+          \hangindent = \wd0 % zero if no section number
+          \unhbox0 #3}%
+  }%
+  \ifdim\parskip<10pt \nobreak\kern10pt\nobreak\kern-\parskip\fi \nobreak
+}
 
 
 \message{toc printing,}
-
 % Finish up the main text and prepare to read what we've written
 % to \contentsfile.
 
 \newskip\contentsrightmargin \contentsrightmargin=1in
 \def\startcontents#1{%
-   \pagealignmacro
+   % If @setchapternewpage on, and @headings double, the contents should
+   % start on an odd page, unlike chapters.  Thus, we maintain
+   % \contentsalignmacro in parallel with \pagealignmacro.
+   % From: Torbjorn Granlund <tege@matematik.su.se>
+   \contentsalignmacro
    \immediate\closeout \contentsfile
    \ifnum \pageno>0
-      \pageno = -1             % Request roman numbered pages.
+      \pageno = -1              % Request roman numbered pages.
    \fi
    % Don't need to put `Contents' or `Short Contents' in the headline.
    % It is abundantly clear what they are.
    \unnumbchapmacro{#1}\def\thischapter{}%
-   \begingroup                 % Set up to handle contents files properly.
+   \begingroup                  % Set up to handle contents files properly.
       \catcode`\\=0  \catcode`\{=1  \catcode`\}=2  \catcode`\@=11
       \catcode`\^=7 % to see ^^e4 as \"a etc. juha@piuha.ydi.vtt.fi
       \raggedbottom             % Worry more about breakpoints than the bottom.
@@ -3068,6 +3164,7 @@ width0pt\relax} \fi
       \secfonts
       \let\rm=\shortcontrm \let\bf=\shortcontbf \let\sl=\shortcontsl
       \rm
+      \hyphenpenalty = 10000
       \advance\baselineskip by 1pt % Open it up a little.
       \def\secentry ##1##2##3##4{}
       \def\unnumbsecentry ##1##2{}
@@ -3111,7 +3208,7 @@ width0pt\relax} \fi
   % This space should be plenty, since a single number is .5em, and the
   % widest letter (M) is 1em, at least in the Computer Modern fonts.
   % (This space doesn't include the extra space that gets added after
-  % the label; that gets put in in \shortchapentry above.)
+  % the label; that gets put in by \shortchapentry above.)
   \advance\dimen0 by 1.1em
   \hbox to \dimen0{#1\hfil}%
 }
@@ -3132,22 +3229,21 @@ width0pt\relax} \fi
   \dosubsubsecentry{#2.#3.#4.#5\labelspace#1}{#6}}
 \def\unnumbsubsubsecentry#1#2{\dosubsubsecentry{#1}{#2}}
 
-
 % This parameter controls the indentation of the various levels.
 \newdimen\tocindent \tocindent = 3pc
 
 % Now for the actual typesetting. In all these, #1 is the text and #2 is the
 % page number.
 %
-% If the toc has to be broken over pages, we would want to be at chapters
+% If the toc has to be broken over pages, we want it to be at chapters
 % if at all possible; hence the \penalty.
 \def\dochapentry#1#2{%
-   \penalty-300 \vskip\baselineskip
+   \penalty-300 \vskip1\baselineskip plus.33\baselineskip minus.25\baselineskip
    \begingroup
      \chapentryfonts
      \tocentry{#1}{\dopageno{#2}}%
    \endgroup
-   \nobreak\vskip .25\baselineskip
+   \nobreak\vskip .25\baselineskip plus.1\baselineskip
 }
 
 \def\dosecentry#1#2{\begingroup
@@ -3172,7 +3268,7 @@ width0pt\relax} \fi
 %
 % \turnoffactive is for the sake of @" used for umlauts.
 \def\tocentry#1#2{\begingroup
-  \hyphenpenalty = 10000
+  \vskip 0pt plus1pt % allow a little stretch for the sake of nice page breaks
   \entry{\turnoffactive #1}{\turnoffactive #2}%
 \endgroup}
 
@@ -3197,8 +3293,6 @@ width0pt\relax} \fi
 \newbox\pushcharbox    \newbox\bullbox
 \newbox\equivbox       \newbox\errorbox
 
-\let\ptexequiv = \equiv
-
 %{\tentt
 %\global\setbox\dblarrowbox = \hbox to 1em{\hfil$\Rightarrow$\hfil}
 %\global\setbox\longdblarrowbox = \hbox to 1em{\hfil$\mapsto$\hfil}
@@ -3209,12 +3303,11 @@ width0pt\relax} \fi
 %                                      depth .1ex\hfil}
 %}
 
+% @point{}, @result{}, @expansion{}, @print{}, @equiv{}.
 \def\point{$\star$}
-
 \def\result{\leavevmode\raise.15ex\hbox to 1em{\hfil$\Rightarrow$\hfil}}
 \def\expansion{\leavevmode\raise.1ex\hbox to 1em{\hfil$\mapsto$\hfil}}
 \def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}}
-
 \def\equiv{\leavevmode\lower.1ex\hbox to 1em{\hfil$\ptexequiv$\hfil}}
 
 % Adapted from the TeXbook's \boxit.
@@ -3246,7 +3339,7 @@ width0pt\relax} \fi
 \catcode `\$=3 \catcode `\&=4 \catcode `\#=6
 \catcode `\^=7 \catcode `\_=8 \catcode `\~=13 \let~=\tie
 \catcode `\%=14
-\catcode 43=12
+\catcode 43=12 % plus
 \catcode`\"=12
 \catcode`\==12
 \catcode`\|=12
@@ -3254,6 +3347,7 @@ width0pt\relax} \fi
 \catcode`\>=12
 \escapechar=`\\
 %
+\let\,=\ptexcomma
 \let\~=\ptextilde
 \let\{=\ptexlbrace
 \let\}=\ptexrbrace
@@ -3264,8 +3358,7 @@ width0pt\relax} \fi
 \def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}
 \def\@{@}%
 \let\bullet=\ptexbullet
-\let\b=\ptexb \let\c=\ptexc \let\i=\ptexi \let\t=\ptext \let\l=\ptexl
-\let\L=\ptexL
+\let\b=\ptexb \let\c=\ptexc \let\i=\ptexi \let\t=\ptext
 %
 \let\Etex=\endgroup}
 
@@ -3324,50 +3417,50 @@ width0pt\relax} \fi
 \def\cbl{{\circle\char'012\hskip -6pt}}
 \def\cbr{{\hskip 6pt\circle\char'011}}
 \def\carttop{\hbox to \cartouter{\hskip\lskip
-       \ctl\leaders\hrule height\circthick\hfil\ctr
-       \hskip\rskip}}
+        \ctl\leaders\hrule height\circthick\hfil\ctr
+        \hskip\rskip}}
 \def\cartbot{\hbox to \cartouter{\hskip\lskip
-       \cbl\leaders\hrule height\circthick\hfil\cbr
-       \hskip\rskip}}
+        \cbl\leaders\hrule height\circthick\hfil\cbr
+        \hskip\rskip}}
 %
 \newskip\lskip\newskip\rskip
 
 \long\def\cartouche{%
 \begingroup
-       \lskip=\leftskip \rskip=\rightskip
-       \leftskip=0pt\rightskip=0pt %we want these *outside*.
-       \cartinner=\hsize \advance\cartinner by-\lskip
-                         \advance\cartinner by-\rskip
-       \cartouter=\hsize
-       \advance\cartouter by 18pt % allow for 3pt kerns on either
-%                                   side, and for 6pt waste from
-%                                   each corner char
-       \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip
-       % Flag to tell @lisp, etc., not to narrow margin.
-       \let\nonarrowing=\comment
-       \vbox\bgroup
-               \baselineskip=0pt\parskip=0pt\lineskip=0pt
-               \carttop
-               \hbox\bgroup
-                       \hskip\lskip
-                       \vrule\kern3pt
-                       \vbox\bgroup
-                               \hsize=\cartinner
-                               \kern3pt
-                               \begingroup
-                                       \baselineskip=\normbskip
-                                       \lineskip=\normlskip
-                                       \parskip=\normpskip
-                                       \vskip -\parskip
+        \lskip=\leftskip \rskip=\rightskip
+        \leftskip=0pt\rightskip=0pt %we want these *outside*.
+        \cartinner=\hsize \advance\cartinner by-\lskip
+                          \advance\cartinner by-\rskip
+        \cartouter=\hsize
+        \advance\cartouter by 18pt % allow for 3pt kerns on either
+%                                    side, and for 6pt waste from
+%                                    each corner char
+        \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip
+        % Flag to tell @lisp, etc., not to narrow margin.
+        \let\nonarrowing=\comment
+        \vbox\bgroup
+                \baselineskip=0pt\parskip=0pt\lineskip=0pt
+                \carttop
+                \hbox\bgroup
+                        \hskip\lskip
+                        \vrule\kern3pt
+                        \vbox\bgroup
+                                \hsize=\cartinner
+                                \kern3pt
+                                \begingroup
+                                        \baselineskip=\normbskip
+                                        \lineskip=\normlskip
+                                        \parskip=\normpskip
+                                        \vskip -\parskip
 \def\Ecartouche{%
-                               \endgroup
-                               \kern3pt
-                       \egroup
-                       \kern3pt\vrule
-                       \hskip\rskip
-               \egroup
-               \cartbot
-       \egroup
+                                \endgroup
+                                \kern3pt
+                        \egroup
+                        \kern3pt\vrule
+                        \hskip\rskip
+                \egroup
+                \cartbot
+        \egroup
 \endgroup
 }}
 
@@ -3430,8 +3523,7 @@ width0pt\relax} \fi
   \let\Esmalllisp = \nonfillfinish
   \let\Esmallexample = \nonfillfinish
   %
-  % Smaller interline space and fonts for small examples.
-  \setleading{10pt}%
+  % Smaller fonts for small examples.
   \indexfonts \tt
   \rawbackslash % make \ output the \ character from the current font (tt)
   \gobble
@@ -3959,6 +4051,7 @@ width0pt\relax} \fi
 
 \def\deftpx #1 {\errmessage{@deftpx in invalid context}}
 
+
 \message{cross reference,}
 % Define cross-reference macros
 \newwrite \auxfile
@@ -3966,6 +4059,11 @@ width0pt\relax} \fi
 \newif\ifhavexrefs  % True if xref values are known.
 \newif\ifwarnedxrefs  % True if we warned once that they aren't known.
 
+% @inforef is simple.
+\def\inforef #1{\inforefzzz #1,,,,**}
+\def\inforefzzz #1,#2,#3,#4**{\putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}},
+  node \samp{\ignorespaces#1{}}}
+
 % \setref{foo} defines a cross-reference point named foo.
 
 \def\setref#1{%
@@ -4201,7 +4299,8 @@ width0pt\relax} \fi
 % The trailing space in the following definition for supereject is
 % vital for proper filling; pages come out unaligned when you do a
 % pagealignmacro call if that space before the closing brace is
-% removed.
+% removed. (Generally, numeric constants should always be followed by a
+% space to prevent strange expansion errors.)
 \def\supereject{\par\penalty -20000\footnoteno =0 }
 
 % @footnotestyle is meaningful for info output only..
@@ -4326,13 +4425,18 @@ width0pt\relax} \fi
 
 % Set some numeric style parameters, for 8.5 x 11 format.
 
-%\hsize = 6.5in
+\hsize = 6in
+\hoffset = .25in
 \newdimen\defaultparindent \defaultparindent = 15pt
 \parindent = \defaultparindent
-\parskip 18pt plus 1pt
-\setleading{15pt}
+\parskip 3pt plus 2pt minus 1pt
+\setleading{13.2pt}
 \advance\topskip by 1.2cm
 
+\chapheadingskip = 15pt plus 4pt minus 2pt
+\secheadingskip = 12pt plus 3pt minus 2pt
+\subsecheadingskip = 9pt plus 2pt minus 2pt
+
 % Prevent underfull vbox error messages.
 \vbadness=10000
 
@@ -4355,30 +4459,28 @@ width0pt\relax} \fi
 
 % Use @smallbook to reset parameters for 7x9.5 format  (or else 7x9.25)
 \def\smallbook{
-
-% These values for secheadingskip and subsecheadingskip are
-% experiments.  RJC 7 Aug 1992
-\global\secheadingskip = 17pt plus 6pt minus 3pt
-\global\subsecheadingskip = 14pt plus 6pt minus 3pt
-
-\global\lispnarrowing = 0.3in
-\setleading{12pt}
-\advance\topskip by -1cm
-\global\parskip 3pt plus 1pt
-\global\hsize = 5in
-\global\vsize=7.5in
-\global\tolerance=700
-\global\hfuzz=1pt
-\global\contentsrightmargin=0pt
-\global\deftypemargin=0pt
-\global\defbodyindent=.5cm
-
-\global\pagewidth=\hsize
-\global\pageheight=\vsize
-
-\global\let\smalllisp=\smalllispx
-\global\let\smallexample=\smalllispx
-\global\def\Esmallexample{\Esmalllisp}
+  \global\chapheadingskip = 15pt plus 4pt minus 2pt
+  \global\secheadingskip = 12pt plus 3pt minus 2pt
+  \global\subsecheadingskip = 9pt plus 2pt minus 2pt
+  %
+  \global\lispnarrowing = 0.3in
+  \setleading{12pt}
+  \advance\topskip by -1cm
+  \global\parskip 2pt plus 1pt
+  \global\hsize = 5in
+  \global\vsize=7.5in
+  \global\tolerance=700
+  \global\hfuzz=1pt
+  \global\contentsrightmargin=0pt
+  \global\deftypemargin=0pt
+  \global\defbodyindent=.5cm
+  %
+  \global\pagewidth=\hsize
+  \global\pageheight=\vsize
+  %
+  \global\let\smalllisp=\smalllispx
+  \global\let\smallexample=\smalllispx
+  \global\def\Esmallexample{\Esmalllisp}
 }
 
 % Use @afourpaper to print on European A4 paper.
@@ -4401,6 +4503,11 @@ width0pt\relax} \fi
 \global\pageheight=\vsize
 }
 
+\bindingoffset=0pt
+\normaloffset=\hoffset
+\pagewidth=\hsize
+\pageheight=\vsize
+
 % Allow control of the text dimensions.  Parameters in order: textheight;
 % textwidth; voffset; hoffset; binding offset; topskip.
 % All require a dimension;
index f1d0151..648b1a2 100644 (file)
@@ -1,3 +1,3 @@
-@set UPDATED 21 September 1996
+@set UPDATED 5 October 1996
 @set EDITION 1.1f
 @set VERSION 1.1f
diff --git a/ylwrap b/ylwrap
index 83ce13f..9a484df 100755 (executable)
--- a/ylwrap
+++ b/ylwrap
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 
+# Usage:
+#     ylwrap PROG [OUTPUT DESIRED]... -- [ARGS]...
+# * PROG is program to run.
+# * OUTPUT is file PROG generates
+# * DESIRED is file we actually want
+# * ARGS are passed to PROG
+# Any number of OUTPUT,DESIRED pairs may be used.
+
 # The program to run.
 prog="$1"
-
-# The output file the program generates, eg `y.tab.c'.
-progoutput="$2"
-
-# The output file we actually want.
-realoutput="$3"
-
-# Strip arguments we've used; remaining arguments go to PROG.
-shift
-shift
 shift
 
+pairlist=
+while test "$#" -ne 0; do
+   if test "$1" = "--"; then
+      break
+   fi
+   pairlist="$pairlist $1"
+   shift
+done
+
 $prog ${1+"$@"} || exit $?
 
-if test -f "$progoutput"; then
-   mv "$progoutput" "$realoutput" || exit $?
-else
-   exit 1
-fi
-exit 0
+set X $pairlist
+shift
+status=0
+first=yes
+while "$#" -ne 0; do
+   if test -f "$1"; then
+      mv "$1" "$2" || status=$?
+   else
+      # A missing file is only an error for the first file.  This is a
+      # blatant hack to let us support using "yacc -d".  If -d is not
+      # specified, we don't want an error when the header file is
+      # "missing".
+      if test $first = yes; then
+        status=1
+      fi
+   fi
+   shift
+   shift
+   first=no
+done
+exit $status