This file records noteworthy changes.

3.12 (3 March 1998)
* Elisp files removed, since they are only usefully distributed with Emacs.
* Restore inclusion of compile-time $(infodir) to INFOPATH.
* install-info creates a proper dir file.
* Various portability fixes.

3.11 (31 July 1997)
* New commands:
  - @uref to make a reference to a url; @url now only indicates such.
  - @image to include graphics (epsf for TeX).
  - @deftypemethod and @deftypemethodx to document methods in strongly
    typed object-oriented languages, such as C++.
  - @html for raw HTML.
  - @ifnothtml @ifnotinfo @ifnottex for more precise conditionals.
  - @kbdinputstyle to control when @kbd uses the slanted typewriter font.
  - @email takes second optional argument.
* texinfo.tex reads texinfo.cnf (if present) for site-wide TeX
  configuration; for example, A4 paper sizes.
* info:
  - arrow keys supported.
  - trailing : in INFOPATH appends default path.
  - new option --index-search for online help support.
* makeinfo:
  - output files removed if errors unless (new option) --force.
  - new option -P to prepend to search path.
  - macro expansion file can be standard output.
* install-info creates a new dir file if necessary.
* update-info script to create a dir file from all info files.
* Elisp: texnfo-tex.el and detexinfo.el removed from the distribution;
  - texnfo-tex features are now part of standard TeX & Texinfo packages;
  - makeinfo --no-headers does a better job than detexinfo.el.
* Documentation:
  - Updates, revisions, corrections in the manual.
  - makeinfo.texi removed, as it was a copy of what was in texinfo.texi.
* gettext support in sources, French and German translations included.
* info man page removed; use the Texinfo manual.
* Automake used, other portability fixes.

3.10 (nonexistent)

3.9 (4 October 1996)
* makeinfo:
  - Give a suppressible (with --no-validate) error for references
    outside of any node.
  - Keep track of multitable output correctly for split files; this
    caused nodes after the first multitable to be ``undefined''.
* install-info:
  - Rename --infodir option to --info-dir.
  - More robust error checking to avoid various crashes.
* configure: Include replacements for memcpy and memmove functions in
  the distribution, in case they are missing.

3.8 (30 September 1996)
* Define and/or document new and/or previously existing commands:
  Accents: @" @' @, @" @= @^ @` @~ @H @d @dotaccent @dotless @ringaccent
    @tieaccent @u @ubaraccent @v
  Special characters: @AA @AE @L @O @OE @aa @ae @exclamdown @l @o @oe
    @pounds @questiondown @ss
  Special punctuation: @! @? @enddots
  dir file maintenance: @dircategory @direntry; also new program, install-info
  HTML support: @email @url @ifhtml...@end ifhtml
  Macros: @macro @unmacro
  Tables: @multitable @tab
  Hyphenation: @- @hyphenation
  Spacing: @  @<TAB> @<NEWLINE>
  Sectioning:
    @headings singleafter/doubleafter (change heading style after current page)
    @centerchap
    @setchapterstyle
  Other:
    @shorttitlepage (simple title pages)
    @detailmenu...@end detailmenu (help makeinfo parse master menus)
* Makeinfo prefers an input file named `foo.texinfo' or `foo.texi' or
  `foo.txinfo' to just `foo' (the latter most likely being an executable).
* Makeinfo implements @. @! @? correctly, as end-of-sentence punctuation.
* @key marks its argument with a lozenge in TeX and <...> in Info.
* TeX output has substantially decreased interline spacing and other
  formatting changes.
* Remove these obsolete and never-documented commands:
    @infotop
    @infoappendix @infoappendixsec @infoappendixsubsec @infoappendixsubsubsec
    @infochapter @infosection @infosubsection @infosubsubsection
    @infounnumbered @infounnumberedsec @infounnumberedsubsec
      @infounnumberedsubsubsec
    @input
    @smallbreak @medbreak
    @overfullrule
    @br
* Deprecate these obsolete commands, to be removed in the next release:
    @ctrl
    @infoinclude
    @iappendix @iappendixsection @iappendixsec @iappendixsubsec
      @iappendixsubsubsec
    @ichapter @isection @isubsection @isubsubsection 
    @iunnumbered @iunnumberedsec @iunnumberedsubsec @iunnumberedsubsubsec
    @setchapterstyle
    @titlespec

3.7 (24 December 1995)
* Have --version print texinfo release number as well as the individual
  program version.
* Better man page cleaning.
* Update Elisp files from current Emacs release.

3.6 (21 June 1995)
* Unmatched brace error reporting improved.
* Missing comment terminator prevented compilation.

3.5 (20 June 1995)
* Autoconf update.
* Support for parallel makes.
* make install does not install Elisp files.

3.4 (19 June 1995)
* Handle @ifhtml in Elisp.
* Update FSF address.

3.3 (15 June 1995)
* Portability changes.
* Compile Elisp files.
* Don't distribute .info* files.

3.2 (9 June 1995)
* Standalone Info can read Unix man pages.
* New commands: @! @? @^ @" @enddots.
* makeinfo -E does macro expansion (and nothing else).

3.1 (23 May 1993)
Just bug fixes, see ChangeLog for full details. 

texinfo-3.0: first release of Texinfo version 2, with many new commands.


Here is the separate NEWS for old releases of Info:

Version 2.11,     Sat Apr  1 09:15:21 1995

Changes since 2.7 beta:

Although the basic code remains the same, there are numerous nits
fixed, including some display bugs, and a memory leak.  Some changes
that have taken place with larger impact include the way in which the
(dir) node is built; I have added in support for "localdir"
directories among other things.  Info files may be stored in
compressed formats, and in their own subdirectories; menu items which
do not explicitly name the node to which they are attached have the
menu item name looked up as an Info file if it is not found within the
current document.  This means that the menu item:

* Info::		The Info documentation reader.

in (dir) refers to the info node "(info)Top".

Please see the ChangeLog and documentation for details on other
changes.

Version 2.7 beta, Wed Dec 30 02:02:38 1992
Version 2.6 beta, Tue Dec 22 03:58:07 1992
Version 2.5 beta, Tue Dec  8 14:50:35 1992
Version 2.4 beta, Sat Nov 28 14:34:02 1992
Version 2.3 beta, Fri Nov 27 01:04:13 1992
Version 2.2 beta, Tue Nov 24 09:36:08 1992
Version 2.1 beta, Tue Nov 17 23:29:36 1992

Changes since 2.5 beta:

Note that versions 2.6 and 2.7 Beta were only released to a select group.

* "info-" removed from the front of M-x commands.

* Automatic footnote display.  When you enter a node which contains
  footnotes, and the variable "automatic-footnotes" is "On", Info pops
  up a window containing the footnotes.  Likewise, when you leave that
  node, the window containing the footnotes goes away.

* Cleaner built in documentation, and documentation functions.

  Use:
    o `M-x describe-variable' to read a variable's documenation
    o `M-x describe-key' to find out what a particular keystroke does.
    o `M-x describe-function' to read a function's documentation.
    o `M-x where-is' to find out what keys invoke a particular function.

* Info can "tile" the displayed windows (via "M-x tile-windows").  If
  the variable "automatic-tiling" is "On", then splitting a window or
  deleting a window causes the remaining windows to be retiled.

* You can save every keystroke you type in a "dribble file" by using the
  `--dribble FILENAME' option.  You can initially read keystrokes from an
  alternate input stream with `--restore FILENAME', or by redirecting
  input on the command line `info < old-dribble'.

* New behaviour of menu items.  If the label is the same as the
  target node name, and the node couldn't be found in the current file,
  treat the label as a file name.  For example, a menu entry in "DIR"
  might contain:

    * Emacs::		Cool text-editor.

  Info would not find the node "(dir)Emacs", so just plain "(emacs)"
  would be tried.

* New variable "ISO-Latin" allows you to use European machines with
  8-bit character sets.

* Cleanups in echo area reading, and redisplay.  Cleanups in handling the
  window which shows possible completions.

* Info can now read files that have been compressed.  An array in filesys.c
  maps extensions to programs that can decompress stdin, and write the results
  to stdout.  Currently, ".Z"/uncompress, ".z"/gunzip, and ".Y"/unyabba are
  supported.  The modeline for a compressed file shows "zz" in it.

* There is a new variable "gc-compressed-files" which, if non-zero, says
  it is okay to reclaim the file buffer space allocated to a file which
  was compressed, if, and only if, that file's contents do not appear in
  any history node.

* New file `nodemenu.c' implements a few functions for manipulating
  previously visited nodes.  `C-x C-b' (list-visited-nodes) produces a
  menu of the nodes that could be reached by info-history-node in some
  window.  `C-x b' (select-visited-node) is similar, but reads one of
  the node names with completion.

* Keystroke `M-r' (move_to_screen_line) allows the user to place the cursor at
  the start of a specific screen line.  Without a numeric argument, place the
  cursor on the center line; with an arg, place the cursor on that line.

* Interruptible display implemented.  Basic display speedups and hacks.
* The message "*** Tags Out of Date ***" now means what it says.
* Index searching with `,' (info-index-next) has been improved.
* When scrolling with C-v, C-M-v, or M-v, only "Page Only" scrolling
  will happen.

* Continous scrolling (along with `]' (info-global-next) and `['
  (info-global-prev) works better.  `]' and `[' accept numeric
  arguments, moving that many nodes in that case.

* `C-x w' (info-toggle-wrap) controls how lines wider than the width
  of the screen are displayed.  If a line is too long, a `$' is
  displayed in the rightmost column of the window.

* There are some new variables for controlling the behaviour of Info
  interactively.  The current list of variables is as follows:

  Variable Name      Default Value  Description
  -------------      -------------  -----------
  `automatic-footnotes' On	    When "On", footnotes appear and
				    disappear automatically.

  `automatic-tiling'    Off	    When "On", creating of deleting a
				    window resizes other windows.

  `visible-bell'        Off	    If non-zero, try to use a visible bell.

  `errors-ring-bell'    On	    If non-zero, errors cause a ring.

  `show-index-match'    On	    If non-zero, the portion of the string
				    matched is highlighted by changing its
				    case.

  `scroll-behaviour'    Continuous  One of "Continuous", "Next Only", or
				    "Page Only".  "Page Only" prevents you from
				    scrolling past the bottom or top of a node.
				    "Next Only" causes the Next or Prev node to
				    be selected when you scroll past the bottom
				    or top of a node.  "Continous" moves
				    linearly through the files hierchichal
				    structure.

  `scroll-step'	        0	    Controls how scrolling is done for you when
				    the cursor moves out of the current window.
				    Non-zero means it is the number of lines
				    you would like the screen to shift.  A
				    value of 0 means to center the line
				    containing the cursor in the window.

  `gc-compressed-files' Off	    If non-zero means it is okay to reclaim the
				    file buffer space allocated to a file which
				    was compressed, if, and only if, that
				    file's contents do not appear in the node
				    list of any window.

  `ISO-Latin'	        Off	    Non-zero means that you are using an ISO
				    Latin character set.  By default, standard
				    ASCII characters are assumed.
________________________________________
This release of Info is version 2.5 beta.

Changes since 2.4 beta:

* Index (i) and (,) commands fully implemented.
* "configure" script now shipped with Info.
* New function "set-variable" allows users to set various variables.
* User-settable behaviour on end or beginning of node scrolling.  This
  supercedes the SPC and DEL changes in 2.3 beta.

________________________________________
This release of Info is version 2.4 beta.

Changes since 2.3 beta:

* info-last-node now means move to the last node of this info file.
* info-history-node means move backwards through this window's node history.
* info-first-node moves to the first node in the Info file.  This node is
  not necessarily "Top"!
* SPC and DEL can select the Next or Prev node after printing an informative
  message when pressed at the end/beg of a node.

----------------------------------------
This release of Info is version 2.3 beta.

Changes since 2.2 beta:

* M-x command lines if NAMED_COMMANDS is #defined.  Variable in Makefile.
* Screen height changes made quite robust.
* Interactive function "set-screen-height" implements user height changes.
* Scrolling on some terminals is faster now.
* C-l with numeric arguement is fixed.

----------------------------------------
This release of Info is version 2.2 beta.

Changes since 2.0:

* C-g can now interrupt multi-file searches.
* Incremental search is fully implemented.
* Loading large tag tables is much faster now.
* makedoc.c replaces shell script, speeding incremental builds.
* Scrolling in redisplay is implemented.
* Recursive uses of the echo area made more robust.
* Garbage collection of unreferenced nodes.

