diff --git a/Doc/lib/libstdwin.tex b/Doc/lib/libstdwin.tex
index 46ff39f..7744a51 100644
--- a/Doc/lib/libstdwin.tex
+++ b/Doc/lib/libstdwin.tex
@@ -15,16 +15,16 @@
 native toolkit interfaces for the Macintosh.
 
 \section{\module{stdwin} ---
-         None}
+         Platform-independent GUI System}
 \declaremodule{builtin}{stdwin}
 
-\modulesynopsis{None}
+\modulesynopsis{Older GUI system for X11 and Macintosh}
 
 
 This module defines several new object types and functions that
 provide access to the functionality of STDWIN.
 
-On \UNIX{} running X11, it can only be used if the \code{DISPLAY}
+On \UNIX{} running X11, it can only be used if the \envvar{DISPLAY}
 environment variable is set or an explicit \samp{-display
 \var{displayname}} argument is passed to the Python interpreter.
 
@@ -38,7 +38,7 @@
 \subsection{Functions Defined in Module \module{stdwin}}
 \nodename{STDWIN Functions}
 
-The following functions are defined in the \code{stdwin} module:
+The following functions are defined in the \module{stdwin} module:
 
 \begin{funcdesc}{open}{title}
 Open a new window whose initial title is given by the string argument.
@@ -56,8 +56,7 @@
 if it applies to no window in particular;
 the third element is type-dependent.
 Names for event types and command codes are defined in the standard
-module
-\code{stdwinevent}.
+module \module{stdwinevent}.
 \end{funcdesc}
 
 \begin{funcdesc}{pollevent}{}
@@ -154,10 +153,10 @@
 \begin{funcdesc}{setfont}{fontname}
 Set the current default font.
 This will become the default font for windows opened subsequently,
-and is also used by the text measuring functions \code{textwidth},
-\code{textbreak}, \code{lineheight} and \code{baseline} below.
-This accepts two more optional parameters, size and style:
-Size is the font size (in `points').
+and is also used by the text measuring functions \function{textwidth()},
+\function{textbreak()}, \function{lineheight()} and
+\function{baseline()} below.  This accepts two more optional
+parameters, size and style:  Size is the font size (in `points').
 Style is a single character specifying the style, as follows:
 \code{'b'} = bold,
 \code{'i'} = italic,
@@ -173,7 +172,7 @@
 all windows).
 Methods of menu objects are described below.
 Note: normally, menus are created locally; see the window method
-\code{menucreate} below.
+\method{menucreate()} below.
 \strong{Warning:} the menu only appears in a window as long as the object
 returned by this call exists.
 \end{funcdesc}
@@ -196,78 +195,53 @@
 
 \begin{funcdesc}{askync}{prompt, default}
 Display a dialog that prompts the user to answer a question with yes or
-no.
-Return 0 for no, 1 for yes.
-If the user hits the Return key, the default (which must be 0 or 1) is
-returned.
-If the user cancels the dialog, the
-\code{KeyboardInterrupt}
-exception is raised.
+no.  Return 0 for no, 1 for yes.  If the user hits the Return key, the
+default (which must be 0 or 1) is returned.  If the user cancels the
+dialog, \exception{KeyboardInterrupt} is raised.
 \end{funcdesc}
 
 \begin{funcdesc}{askstr}{prompt, default}
 Display a dialog that prompts the user for a string.
 If the user hits the Return key, the default string is returned.
-If the user cancels the dialog, the
-\code{KeyboardInterrupt}
-exception is raised.
+If the user cancels the dialog, \exception{KeyboardInterrupt} is
+raised.
 \end{funcdesc}
 
 \begin{funcdesc}{askfile}{prompt, default, new}
-Ask the user to specify a filename.
-If
-\var{new}
-is zero it must be an existing file; otherwise, it must be a new file.
-If the user cancels the dialog, the
-\code{KeyboardInterrupt}
-exception is raised.
+Ask the user to specify a filename.  If \var{new} is zero it must be
+an existing file; otherwise, it must be a new file.  If the user
+cancels the dialog, \exception{KeyboardInterrupt} is raised.
 \end{funcdesc}
 
 \begin{funcdesc}{setcutbuffer}{i, string}
-Store the string in the system's cut buffer number
-\var{i},
-where it can be found (for pasting) by other applications.
-On X11, there are 8 cut buffers (numbered 0..7).
-Cut buffer number 0 is the `clipboard' on the Macintosh.
+Store the string in the system's cut buffer number \var{i}, where it
+can be found (for pasting) by other applications.  On X11, there are 8
+cut buffers (numbered 0..7).  Cut buffer number 0 is the `clipboard'
+on the Macintosh.
 \end{funcdesc}
 
 \begin{funcdesc}{getcutbuffer}{i}
-Return the contents of the system's cut buffer number
-\var{i}.
+Return the contents of the system's cut buffer number \var{i}.
 \end{funcdesc}
 
 \begin{funcdesc}{rotatecutbuffers}{n}
-On X11, rotate the 8 cut buffers by
-\var{n}.
-Ignored on the Macintosh.
+On X11, rotate the 8 cut buffers by \var{n}.  Ignored on the
+Macintosh.
 \end{funcdesc}
 
 \begin{funcdesc}{getselection}{i}
-Return X11 selection number
-\var{i.}
-Selections are not cut buffers.
-Selection numbers are defined in module
-\code{stdwinevents}.
-Selection \code{WS_PRIMARY} is the
-\dfn{primary}
-selection (used by
-xterm,
-for instance);
-selection \code{WS_SECONDARY} is the
-\dfn{secondary}
-selection; selection \code{WS_CLIPBOARD} is the
-\dfn{clipboard}
-selection (used by
-xclipboard).
-On the Macintosh, this always returns an empty string.
+Return X11 selection number \var{i.}  Selections are not cut buffers.
+Selection numbers are defined in module \module{stdwinevents}.
+Selection \constant{WS_PRIMARY} is the \dfn{primary} selection (used
+by \program{xterm}, for instance); selection \constant{WS_SECONDARY}
+is the \dfn{secondary} selection; selection \constant{WS_CLIPBOARD} is
+the \dfn{clipboard} selection (used by \program{xclipboard}).  On the
+Macintosh, this always returns an empty string.
 \end{funcdesc}
 
 \begin{funcdesc}{resetselection}{i}
-Reset selection number
-\var{i},
-if this process owns it.
-(See window method
-\code{setselection()}).
+Reset selection number \var{i}, if this process owns it.  (See window
+method \method{setselection()}).
 \end{funcdesc}
 
 \begin{funcdesc}{baseline}{}
@@ -295,129 +269,116 @@
 (X11 under \UNIX{} only) Return the ``connection number'' used by the
 underlying X11 implementation.  (This is normally the file number of
 the socket.)  Both functions return the same value;
-\code{connectionnumber()} is named after the corresponding function in
-X11 and STDWIN, while \code{fileno()} makes it possible to use the
-\code{stdwin} module as a ``file'' object parameter to
-\code{select.select()}.  Note that if \code{select()} implies that
-input is possible on \code{stdwin}, this does not guarantee that an
+\method{connectionnumber()} is named after the corresponding function in
+X11 and STDWIN, while \method{fileno()} makes it possible to use the
+\module{stdwin} module as a ``file'' object parameter to
+\function{select.select()}.  Note that if \constant{select()} implies that
+input is possible on \module{stdwin}, this does not guarantee that an
 event is ready --- it may be some internal communication going on
 between the X server and the client library.  Thus, you should call
-\code{stdwin.pollevent()} until it returns \code{None} to check for
+\function{stdwin.pollevent()} until it returns \code{None} to check for
 events if you don't want your program to block.  Because of internal
-buffering in X11, it is also possible that \code{stdwin.pollevent()}
-returns an event while \code{select()} does not find \code{stdwin} to
+buffering in X11, it is also possible that \function{stdwin.pollevent()}
+returns an event while \function{select()} does not find \module{stdwin} to
 be ready, so you should read any pending events with
-\code{stdwin.pollevent()} until it returns \code{None} before entering
-a blocking \code{select()} call.
-\ttindex{select}
+\function{stdwin.pollevent()} until it returns \code{None} before entering
+a blocking \function{select()} call.
+\withsubitem{(in module select)}{\ttindex{select()}}
 \end{funcdesc}
 
 \subsection{Window Objects}
 \nodename{STDWIN Window Objects}
 
-Window objects are created by \code{stdwin.open()}.  They are closed
-by their \code{close()} method or when they are garbage-collected.
+Window objects are created by \function{stdwin.open()}.  They are closed
+by their \method{close()} method or when they are garbage-collected.
 Window objects have the following methods:
 
-\setindexsubitem{(window method)}
-
-\begin{funcdesc}{begindrawing}{}
+\begin{methoddesc}[window]{begindrawing}{}
 Return a drawing object, whose methods (described below) allow drawing
 in the window.
-\end{funcdesc}
+\end{methoddesc}
 
-\begin{funcdesc}{change}{rect}
+\begin{methoddesc}[window]{change}{rect}
 Invalidate the given rectangle; this may cause a draw event.
-\end{funcdesc}
+\end{methoddesc}
 
-\begin{funcdesc}{gettitle}{}
+\begin{methoddesc}[window]{gettitle}{}
 Returns the window's title string.
-\end{funcdesc}
+\end{methoddesc}
 
-\begin{funcdesc}{getdocsize}{}
+\begin{methoddesc}[window]{getdocsize}{}
 \begin{sloppypar}
 Return a pair of integers giving the size of the document as set by
-\code{setdocsize()}.
+\method{setdocsize()}.
 \end{sloppypar}
-\end{funcdesc}
+\end{methoddesc}
 
-\begin{funcdesc}{getorigin}{}
+\begin{methoddesc}[window]{getorigin}{}
 Return a pair of integers giving the origin of the window with respect
 to the document.
-\end{funcdesc}
+\end{methoddesc}
 
-\begin{funcdesc}{gettitle}{}
+\begin{methoddesc}[window]{gettitle}{}
 Return the window's title string.
-\end{funcdesc}
+\end{methoddesc}
 
-\begin{funcdesc}{getwinsize}{}
+\begin{methoddesc}[window]{getwinsize}{}
 Return a pair of integers giving the size of the window.
-\end{funcdesc}
+\end{methoddesc}
 
-\begin{funcdesc}{getwinpos}{}
+\begin{methoddesc}[window]{getwinpos}{}
 Return a pair of integers giving the position of the window's upper
 left corner (relative to the upper left corner of the screen).
-\end{funcdesc}
+\end{methoddesc}
 
-\begin{funcdesc}{menucreate}{title}
+\begin{methoddesc}[window]{menucreate}{title}
 Create a menu object referring to a local menu (a menu that appears
 only in this window).
 Methods of menu objects are described below.
 \strong{Warning:} the menu only appears as long as the object
 returned by this call exists.
-\end{funcdesc}
+\end{methoddesc}
 
-\begin{funcdesc}{scroll}{rect, point}
+\begin{methoddesc}[window]{scroll}{rect, point}
 Scroll the given rectangle by the vector given by the point.
-\end{funcdesc}
+\end{methoddesc}
 
-\begin{funcdesc}{setdocsize}{point}
+\begin{methoddesc}[window]{setdocsize}{point}
 Set the size of the drawing document.
-\end{funcdesc}
+\end{methoddesc}
 
-\begin{funcdesc}{setorigin}{point}
+\begin{methoddesc}[window]{setorigin}{point}
 Move the origin of the window (its upper left corner)
 to the given point in the document.
-\end{funcdesc}
+\end{methoddesc}
 
-\begin{funcdesc}{setselection}{i, str}
-Attempt to set X11 selection number
-\var{i}
-to the string
-\var{str}.
-(See stdwin method
-\code{getselection()}
-for the meaning of
-\var{i}.)
-Return true if it succeeds.
+\begin{methoddesc}[window]{setselection}{i, str}
+Attempt to set X11 selection number \var{i} to the string \var{str}.
+(See \module{stdwin} function \function{getselection()} for the
+meaning of \var{i}.)  Return true if it succeeds.
 If  succeeds, the window ``owns'' the selection until
 (a) another application takes ownership of the selection; or
 (b) the window is deleted; or
 (c) the application clears ownership by calling
-\code{stdwin.resetselection(\var{i})}.
-When another application takes ownership of the selection, a
-\code{WE_LOST_SEL}
-event is received for no particular window and with the selection number
-as detail.
-Ignored on the Macintosh.
-\end{funcdesc}
+\function{stdwin.resetselection(\var{i})}.  When another application
+takes ownership of the selection, a \constant{WE_LOST_SEL} event is
+received for no particular window and with the selection number as
+detail.  Ignored on the Macintosh.
+\end{methoddesc}
 
-\begin{funcdesc}{settimer}{dsecs}
-Schedule a timer event for the window in
-\code{\var{dsecs}/10}
+\begin{methoddesc}[window]{settimer}{dsecs}
+Schedule a timer event for the window in \code{\var{dsecs}/10}
 seconds.
-\end{funcdesc}
+\end{methoddesc}
 
-\begin{funcdesc}{settitle}{title}
+\begin{methoddesc}[window]{settitle}{title}
 Set the window's title string.
-\end{funcdesc}
+\end{methoddesc}
 
-\begin{funcdesc}{setwincursor}{name}
+\begin{methoddesc}[window]{setwincursor}{name}
 \begin{sloppypar}
-Set the window cursor to a cursor of the given name.
-It raises the
-\code{RuntimeError}
-exception if no cursor of the given name exists.
+Set the window cursor to a cursor of the given name.  It raises
+\exception{RuntimeError} if no cursor of the given name exists.
 Suitable names include
 \code{'ibeam'},
 \code{'arrow'},
@@ -427,151 +388,144 @@
 \code{'plus'}.
 On X11, there are many more (see \code{<X11/cursorfont.h>}).
 \end{sloppypar}
-\end{funcdesc}
+\end{methoddesc}
 
-\begin{funcdesc}{setwinpos}{h, v}
+\begin{methoddesc}[window]{setwinpos}{h, v}
 Set the the position of the window's upper left corner (relative to
 the upper left corner of the screen).
-\end{funcdesc}
+\end{methoddesc}
 
-\begin{funcdesc}{setwinsize}{width, height}
+\begin{methoddesc}[window]{setwinsize}{width, height}
 Set the window's size.
-\end{funcdesc}
+\end{methoddesc}
 
-\begin{funcdesc}{show}{rect}
+\begin{methoddesc}[window]{show}{rect}
 Try to ensure that the given rectangle of the document is visible in
 the window.
-\end{funcdesc}
+\end{methoddesc}
 
-\begin{funcdesc}{textcreate}{rect}
+\begin{methoddesc}[window]{textcreate}{rect}
 Create a text-edit object in the document at the given rectangle.
 Methods of text-edit objects are described below.
-\end{funcdesc}
+\end{methoddesc}
 
-\begin{funcdesc}{setactive}{}
+\begin{methoddesc}[window]{setactive}{}
 Attempt to make this window the active window.  If successful, this
 will generate a WE_ACTIVATE event (and a WE_DEACTIVATE event in case
 another window in this application became inactive).
-\end{funcdesc}
+\end{methoddesc}
 
-\begin{funcdesc}{close}{}
+\begin{methoddesc}[window]{close}{}
 Discard the window object.  It should not be used again.
-\end{funcdesc}
+\end{methoddesc}
 
 \subsection{Drawing Objects}
 
 Drawing objects are created exclusively by the window method
-\code{begindrawing()}.
-Only one drawing object can exist at any given time; the drawing object
-must be deleted to finish drawing.
-No drawing object may exist when
-\code{stdwin.getevent()}
-is called.
+\method{begindrawing()}.  Only one drawing object can exist at any
+given time; the drawing object must be deleted to finish drawing.  No
+drawing object may exist when \function{stdwin.getevent()} is called.
 Drawing objects have the following methods:
 
-\setindexsubitem{(drawing method)}
-
-\begin{funcdesc}{box}{rect}
+\begin{methoddesc}[drawing]{box}{rect}
 Draw a box just inside a rectangle.
-\end{funcdesc}
+\end{methoddesc}
 
-\begin{funcdesc}{circle}{center, radius}
+\begin{methoddesc}[drawing]{circle}{center, radius}
 Draw a circle with given center point and radius.
-\end{funcdesc}
+\end{methoddesc}
 
-\begin{funcdesc}{elarc}{center, \(rh, rv\), \(a1, a2\)}
+\begin{methoddesc}[drawing]{elarc}{center, (rh, rv), (a1, a2)}
 Draw an elliptical arc with given center point.
 \code{(\var{rh}, \var{rv})}
 gives the half sizes of the horizontal and vertical radii.
 \code{(\var{a1}, \var{a2})}
 gives the angles (in degrees) of the begin and end points.
 0 degrees is at 3 o'clock, 90 degrees is at 12 o'clock.
-\end{funcdesc}
+\end{methoddesc}
 
-\begin{funcdesc}{erase}{rect}
+\begin{methoddesc}[drawing]{erase}{rect}
 Erase a rectangle.
-\end{funcdesc}
+\end{methoddesc}
 
-\begin{funcdesc}{fillcircle}{center, radius}
+\begin{methoddesc}[drawing]{fillcircle}{center, radius}
 Draw a filled circle with given center point and radius.
-\end{funcdesc}
+\end{methoddesc}
 
-\begin{funcdesc}{fillelarc}{center, \(rh, rv\), \(a1, a2\)}
-Draw a filled elliptical arc; arguments as for \code{elarc}.
-\end{funcdesc}
+\begin{methoddesc}[drawing]{fillelarc}{center, (rh, rv), (a1, a2)}
+Draw a filled elliptical arc; arguments as for \method{elarc()}.
+\end{methoddesc}
 
-\begin{funcdesc}{fillpoly}{points}
+\begin{methoddesc}[drawing]{fillpoly}{points}
 Draw a filled polygon given by a list (or tuple) of points.
-\end{funcdesc}
+\end{methoddesc}
 
-\begin{funcdesc}{invert}{rect}
+\begin{methoddesc}[drawing]{invert}{rect}
 Invert a rectangle.
-\end{funcdesc}
+\end{methoddesc}
 
-\begin{funcdesc}{line}{p1, p2}
+\begin{methoddesc}[drawing]{line}{p1, p2}
 Draw a line from point
 \var{p1}
 to
 \var{p2}.
-\end{funcdesc}
+\end{methoddesc}
 
-\begin{funcdesc}{paint}{rect}
+\begin{methoddesc}[drawing]{paint}{rect}
 Fill a rectangle.
-\end{funcdesc}
+\end{methoddesc}
 
-\begin{funcdesc}{poly}{points}
+\begin{methoddesc}[drawing]{poly}{points}
 Draw the lines connecting the given list (or tuple) of points.
-\end{funcdesc}
+\end{methoddesc}
 
-\begin{funcdesc}{shade}{rect, percent}
+\begin{methoddesc}[drawing]{shade}{rect, percent}
 Fill a rectangle with a shading pattern that is about
 \var{percent}
 percent filled.
-\end{funcdesc}
+\end{methoddesc}
 
-\begin{funcdesc}{text}{p, str}
+\begin{methoddesc}[drawing]{text}{p, str}
 Draw a string starting at point p (the point specifies the
 top left coordinate of the string).
-\end{funcdesc}
+\end{methoddesc}
 
-\begin{funcdesc}{xorcircle}{center, radius}
-\funcline{xorelarc}{center, \(rh, rv\), \(a1, a2\)}
+\begin{methoddesc}[drawing]{xorcircle}{center, radius}
+\funcline{xorelarc}{center, (rh, rv), (a1, a2)}
 \funcline{xorline}{p1, p2}
 \funcline{xorpoly}{points}
 Draw a circle, an elliptical arc, a line or a polygon, respectively,
 in XOR mode.
-\end{funcdesc}
+\end{methoddesc}
 
-\begin{funcdesc}{setfgcolor}{}
+\begin{methoddesc}[drawing]{setfgcolor}{}
 \funcline{setbgcolor}{}
 \funcline{getfgcolor}{}
 \funcline{getbgcolor}{}
 These functions are similar to the corresponding functions described
-above for the
-\code{stdwin}
+above for the \module{stdwin}
 module, but affect or return the colors currently used for drawing
 instead of the global default colors.
 When a drawing object is created, its colors are set to the window's
 default colors, which are in turn initialized from the global default
 colors when the window is created.
-\end{funcdesc}
+\end{methoddesc}
 
-\begin{funcdesc}{setfont}{}
+\begin{methoddesc}[drawing]{setfont}{}
 \funcline{baseline}{}
 \funcline{lineheight}{}
 \funcline{textbreak}{}
 \funcline{textwidth}{}
 These functions are similar to the corresponding functions described
-above for the
-\code{stdwin}
+above for the \module{stdwin}
 module, but affect or use the current drawing font instead of
 the global default font.
 When a drawing object is created, its font is set to the window's
 default font, which is in turn initialized from the global default
 font when the window is created.
-\end{funcdesc}
+\end{methoddesc}
 
-\begin{funcdesc}{bitmap}{point, bitmap, mask}
+\begin{methoddesc}[drawing]{bitmap}{point, bitmap, mask}
 Draw the \var{bitmap} with its top left corner at \var{point}.
 If the optional \var{mask} argument is present, it should be either
 the same object as \var{bitmap}, to draw only those bits that are set
@@ -579,9 +533,9 @@
 bits (ones are drawn in the foreground color, zeros in the background
 color).
 Not available on the Macintosh.
-\end{funcdesc}
+\end{methoddesc}
 
-\begin{funcdesc}{cliprect}{rect}
+\begin{methoddesc}[drawing]{cliprect}{rect}
 Set the ``clipping region'' to a rectangle.
 The clipping region limits the effect of all drawing operations, until
 it is changed again or until the drawing object is closed.  When a
@@ -590,16 +544,16 @@
 region, the set of pixels drawn is the intersection of the clipping
 region and the set of pixels that would be drawn by the same operation
 in the absence of a clipping region.
-\end{funcdesc}
+\end{methoddesc}
 
-\begin{funcdesc}{noclip}{}
+\begin{methoddesc}[drawing]{noclip}{}
 Reset the clipping region to the entire window.
-\end{funcdesc}
+\end{methoddesc}
 
-\begin{funcdesc}{close}{}
+\begin{methoddesc}[drawing]{close}{}
 \funcline{enddrawing}{}
 Discard the drawing object.  It should not be used again.
-\end{funcdesc}
+\end{methoddesc}
 
 \subsection{Menu Objects}
 
@@ -607,147 +561,132 @@
 The menu is destroyed when the menu object is deleted.
 The following methods are defined:
 
-\setindexsubitem{(menu method)}
 
-\begin{funcdesc}{additem}{text, shortcut}
+\begin{methoddesc}[menu]{additem}{text, shortcut}
 Add a menu item with given text.
 The shortcut must be a string of length 1, or omitted (to specify no
 shortcut).
-\end{funcdesc}
+\end{methoddesc}
 
-\begin{funcdesc}{setitem}{i, text}
-Set the text of item number
-\var{i}.
-\end{funcdesc}
+\begin{methoddesc}[menu]{setitem}{i, text}
+Set the text of item number \var{i}.
+\end{methoddesc}
 
-\begin{funcdesc}{enable}{i, flag}
-Enable or disables item
-\var{i}.
-\end{funcdesc}
+\begin{methoddesc}[menu]{enable}{i, flag}
+Enable or disables item \var{i}.
+\end{methoddesc}
 
-\begin{funcdesc}{check}{i, flag}
-Set or clear the
-\dfn{check mark}
-for item
-\var{i}.
-\end{funcdesc}
+\begin{methoddesc}[menu]{check}{i, flag}
+Set or clear the \dfn{check mark} for item \var{i}.
+\end{methoddesc}
 
-\begin{funcdesc}{close}{}
+\begin{methoddesc}[menu]{close}{}
 Discard the menu object.  It should not be used again.
-\end{funcdesc}
+\end{methoddesc}
 
 \subsection{Bitmap Objects}
 
 A bitmap represents a rectangular array of bits.
 The top left bit has coordinate (0, 0).
-A bitmap can be drawn with the \code{bitmap} method of a drawing object.
+A bitmap can be drawn with the \method{bitmap()} method of a drawing object.
 Bitmaps are currently not available on the Macintosh.
 
 The following methods are defined:
 
-\setindexsubitem{(bitmap method)}
 
-\begin{funcdesc}{getsize}{}
+\begin{methoddesc}[bitmap]{getsize}{}
 Return a tuple representing the width and height of the bitmap.
-(This returns the values that have been passed to the \code{newbitmap}
-function.)
-\end{funcdesc}
+(This returns the values that have been passed to the
+\function{newbitmap()} function.)
+\end{methoddesc}
 
-\begin{funcdesc}{setbit}{point, bit}
+\begin{methoddesc}[bitmap]{setbit}{point, bit}
 Set the value of the bit indicated by \var{point} to \var{bit}.
-\end{funcdesc}
+\end{methoddesc}
 
-\begin{funcdesc}{getbit}{point}
+\begin{methoddesc}[bitmap]{getbit}{point}
 Return the value of the bit indicated by \var{point}.
-\end{funcdesc}
+\end{methoddesc}
 
-\begin{funcdesc}{close}{}
+\begin{methoddesc}[bitmap]{close}{}
 Discard the bitmap object.  It should not be used again.
-\end{funcdesc}
+\end{methoddesc}
 
 \subsection{Text-edit Objects}
 
 A text-edit object represents a text-edit block.
-For semantics, see the STDWIN documentation for C programmers.
+For semantics, see the STDWIN documentation for \C{} programmers.
 The following methods exist:
 
-\setindexsubitem{(text-edit method)}
 
-\begin{funcdesc}{arrow}{code}
+\begin{methoddesc}[text-edit]{arrow}{code}
 Pass an arrow event to the text-edit block.
-The
-\var{code}
-must be one of
-\code{WC_LEFT},
-\code{WC_RIGHT},
-\code{WC_UP}
-or
-\code{WC_DOWN}
-(see module
-\code{stdwinevents}).
-\end{funcdesc}
+The \var{code} must be one of \constant{WC_LEFT}, \constant{WC_RIGHT}, 
+\constant{WC_UP} or \constant{WC_DOWN} (see module
+\module{stdwinevents}).
+\end{methoddesc}
 
-\begin{funcdesc}{draw}{rect}
+\begin{methoddesc}[text-edit]{draw}{rect}
 Pass a draw event to the text-edit block.
 The rectangle specifies the redraw area.
-\end{funcdesc}
+\end{methoddesc}
 
-\begin{funcdesc}{event}{type, window, detail}
+\begin{methoddesc}[text-edit]{event}{type, window, detail}
 Pass an event gotten from
-\code{stdwin.getevent()}
+\function{stdwin.getevent()}
 to the text-edit block.
 Return true if the event was handled.
-\end{funcdesc}
+\end{methoddesc}
 
-\begin{funcdesc}{getfocus}{}
+\begin{methoddesc}[text-edit]{getfocus}{}
 Return 2 integers representing the start and end positions of the
 focus, usable as slice indices on the string returned by
-\code{gettext()}.
-\end{funcdesc}
+\method{gettext()}.
+\end{methoddesc}
 
-\begin{funcdesc}{getfocustext}{}
+\begin{methoddesc}[text-edit]{getfocustext}{}
 Return the text in the focus.
-\end{funcdesc}
+\end{methoddesc}
 
-\begin{funcdesc}{getrect}{}
+\begin{methoddesc}[text-edit]{getrect}{}
 Return a rectangle giving the actual position of the text-edit block.
 (The bottom coordinate may differ from the initial position because
 the block automatically shrinks or grows to fit.)
-\end{funcdesc}
+\end{methoddesc}
 
-\begin{funcdesc}{gettext}{}
+\begin{methoddesc}[text-edit]{gettext}{}
 Return the entire text buffer.
-\end{funcdesc}
+\end{methoddesc}
 
-\begin{funcdesc}{move}{rect}
+\begin{methoddesc}[text-edit]{move}{rect}
 Specify a new position for the text-edit block in the document.
-\end{funcdesc}
+\end{methoddesc}
 
-\begin{funcdesc}{replace}{str}
+\begin{methoddesc}[text-edit]{replace}{str}
 Replace the text in the focus by the given string.
 The new focus is an insert point at the end of the string.
-\end{funcdesc}
+\end{methoddesc}
 
-\begin{funcdesc}{setfocus}{i, j}
+\begin{methoddesc}[text-edit]{setfocus}{i, j}
 Specify the new focus.
 Out-of-bounds values are silently clipped.
-\end{funcdesc}
+\end{methoddesc}
 
-\begin{funcdesc}{settext}{str}
+\begin{methoddesc}[text-edit]{settext}{str}
 Replace the entire text buffer by the given string and set the focus
 to \code{(0, 0)}.
-\end{funcdesc}
+\end{methoddesc}
 
-\begin{funcdesc}{setview}{rect}
+\begin{methoddesc}[text-edit]{setview}{rect}
 Set the view rectangle to \var{rect}.  If \var{rect} is \code{None},
 viewing mode is reset.  In viewing mode, all output from the text-edit
 object is clipped to the viewing rectangle.  This may be useful to
 implement your own scrolling text subwindow.
-\end{funcdesc}
+\end{methoddesc}
 
-\begin{funcdesc}{close}{}
+\begin{methoddesc}[text-edit]{close}{}
 Discard the text-edit object.  It should not be used again.
-\end{funcdesc}
+\end{methoddesc}
 
 \subsection{Example}
 \nodename{STDWIN Example}
@@ -776,17 +715,17 @@
 
 main()
 \end{verbatim}
-%
+
 \section{\module{stdwinevents} ---
-         None}
+         Constants for use with \module{stdwin}}
 \declaremodule{standard}{stdwinevents}
 
-\modulesynopsis{None}
+\modulesynopsis{Constant definitions for use with \module{stdwin}}
 
 
 This module defines constants used by STDWIN for event types
-(\code{WE_ACTIVATE} etc.), command codes (\code{WC_LEFT} etc.)
-and selection types (\code{WS_PRIMARY} etc.).
+(\constant{WE_ACTIVATE} etc.), command codes (\constant{WC_LEFT} etc.)
+and selection types (\constant{WS_PRIMARY} etc.).
 Read the file for details.
 Suggested usage is
 
@@ -794,36 +733,33 @@
 >>> from stdwinevents import *
 >>> 
 \end{verbatim}
-%
+
 \section{\module{rect} ---
-         None}
+         Functions for use with \module{stdwin}}
 \declaremodule{standard}{rect}
 
-\modulesynopsis{None}
+\modulesynopsis{Geometry-related utility function for use with \module{stdwin}}
 
 
 This module contains useful operations on rectangles.
-A rectangle is defined as in module
-\code{stdwin}:
+A rectangle is defined as in module \module{stdwin}:
 a pair of points, where a point is a pair of integers.
 For example, the rectangle
 
 \begin{verbatim}
 (10, 20), (90, 80)
 \end{verbatim}
-%
+
 is a rectangle whose left, top, right and bottom edges are 10, 20, 90
-and 80, respectively.
-Note that the positive vertical axis points down (as in
-\code{stdwin}).
+and 80, respectively.  Note that the positive vertical axis points
+down (as in \module{stdwin}).
 
 The module defines the following objects:
 
 \begin{excdesc}{error}
 The exception raised by functions in this module when they detect an
-error.
-The exception argument is a string describing the problem in more
-detail.
+error.  The exception argument is a string describing the problem in
+more detail.
 \end{excdesc}
 
 \begin{datadesc}{empty}
@@ -846,74 +782,37 @@
 A rectangle
 \code{(\var{left}, \var{top}), (\var{right}, \var{bottom})}
 is empty if
-%begin{latexonly}
-\iftexi
-%end{latexonly}
-\code{\var{left} >= \var{right}} or \code{\var{top} => \var{bottom}}.
-%begin{latexonly}
-\else
-$\var{left} \geq \var{right}$ or $\var{top} \geq \var{bottom}$.
-%%JHXXX\emph{left~$\geq$~right} or \emph{top~$\leq$~bottom}.
-\fi
-%end{latexonly}
+\begin{math}\var{left} \geq \var{right}\end{math} or
+\begin{math}\var{top} \geq \var{bottom}\end{math}.
 \end{funcdesc}
 
 \begin{funcdesc}{intersect}{list}
 Returns the intersection of all rectangles in the list argument.
-It may also be called with a tuple argument.
-Raises
-\code{rect.error}
-if the list is empty.
-Returns
-\code{rect.empty}
-if the intersection of the rectangles is empty.
+It may also be called with a tuple argument.  Raises
+\exception{rect.error} if the list is empty.  Returns
+\constant{rect.empty} if the intersection of the rectangles is empty.
 \end{funcdesc}
 
 \begin{funcdesc}{union}{list}
 Returns the smallest rectangle that contains all non-empty rectangles in
-the list argument.
-It may also be called with a tuple argument or with two or more
-rectangles as arguments.
-Returns
-\code{rect.empty}
-if the list is empty or all its rectangles are empty.
+the list argument.  It may also be called with a tuple argument or
+with two or more rectangles as arguments.  Returns
+\constant{rect.empty} if the list is empty or all its rectangles are
+empty.
 \end{funcdesc}
 
 \begin{funcdesc}{pointinrect}{point, rect}
-Returns true if the point is inside the rectangle.
-By definition, a point
-\code{(\var{h}, \var{v})}
-is inside a rectangle
+Returns true if the point is inside the rectangle.  By definition, a
+point \code{(\var{h}, \var{v})} is inside a rectangle
 \code{(\var{left}, \var{top}), (\var{right}, \var{bottom})} if
-%begin{latexonly}
-\iftexi
-%end{latexonly}
-\code{\var{left} <= \var{h} < \var{right}} and
-\code{\var{top} <= \var{v} < \var{bottom}}.
-%begin{latexonly}
-\else
-$\var{left} \leq \var{h} < \var{right}$ and
-$\var{top} \leq \var{v} < \var{bottom}$.
-\fi
-%end{latexonly}
+\begin{math}\var{left} \leq \var{h} < \var{right}\end{math} and
+\begin{math}\var{top} \leq \var{v} < \var{bottom}\end{math}.
 \end{funcdesc}
 
-\begin{funcdesc}{inset}{rect, \(dh, dv\)}
-Returns a rectangle that lies inside the
-\code{rect}
-argument by
-\var{dh}
-pixels horizontally
-and
-\var{dv}
-pixels
-vertically.
-If
-\var{dh}
-or
-\var{dv}
-is negative, the result lies outside
-\var{rect}.
+\begin{funcdesc}{inset}{rect, (dh, dv)}
+Returns a rectangle that lies inside the \var{rect} argument by
+\var{dh} pixels horizontally and \var{dv} pixels vertically.  If
+\var{dh} or \var{dv} is negative, the result lies outside \var{rect}.
 \end{funcdesc}
 
 \begin{funcdesc}{rect2geom}{rect}
