diff --git a/Doc/extref.tex b/Doc/extref.tex
index b7249a6..c88976c 100644
--- a/Doc/extref.tex
+++ b/Doc/extref.tex
@@ -1,5 +1,11 @@
+% cfuncdesc should be called as an \begin{cfuncdesc} ... \end{cfuncdesc}
+\newcommand{\cfuncline}[3]{\item[\code{#1 #2(\varvars{#3})}]\ttindex{#2}}
+\newcommand{\cfuncdesc}[3]{\fulllineitems\cfuncline{#1}{#2}{#3}}
+\let\endcfuncdesc\endfulllineitems
 
-\section{Extension Reference}
+\newcommand{\NULL}{\code{NULL}}
+
+\chapter{Extension Reference}
 
 From the viewpoint of of C access to Python services, we have:
 
@@ -45,486 +51,569 @@
   so new objects can be returned from C functions that otherwise treat
   objects generically.
 
-\subsubsection{Object Protocol}
-     \code{int *PyObject_Print(PyObject *o, FILE *fp, int flags)}\\
+\section{Object Protocol}
+
+     \begin{cfuncdesc}{int}{PyObject_Print}{PyObject *o, FILE *fp, int flags}
          Print an object \code{o}, on file \code{fp}.  Returns -1 on error
 	 The flags argument is used to enable certain printing
 	 options. The only option currently supported is \code{Py_Print_RAW}. 
+     \end{cfuncdesc}
 
-     \code{int PyObject_HasAttrString(PyObject *o, char *attr_name)}\\
+     \begin{cfuncdesc}{int}{PyObject_HasAttrString}{PyObject *o, char *attr_name}
          Returns 1 if o has the attribute attr_name, and 0 otherwise.
-     This is equivalent to the Python expression:
+	 This is equivalent to the Python expression:
 	 \code{hasattr(o,attr_name)}.
 	 This function always succeeds.
+     \end{cfuncdesc}
 
-     \code{PyObject* PyObject_AttrString(PyObject *o, char *attr_name)}\\
+     \begin{cfuncdesc}{PyObject*}{PyObject_AttrString}{PyObject *o, char *attr_name}
 	 Retrieve an attributed named attr_name form object o.
-	 Returns the attribute value on success, or NULL on failure.
+	 Returns the attribute value on success, or {\NULL} on failure.
 	 This is the equivalent of the Python expression: \code{o.attr_name}.
+     \end{cfuncdesc}
 
 
-     \code{int PyObject_HasAttr(PyObject *o, PyObject *attr_name)}\\
+     \begin{cfuncdesc}{int}{PyObject_HasAttr}{PyObject *o, PyObject *attr_name}
          Returns 1 if o has the attribute attr_name, and 0 otherwise.
 	 This is equivalent to the Python expression:
 	 \code{hasattr(o,attr_name)}. 
 	 This function always succeeds.
+     \end{cfuncdesc}
 
 
-     \code{PyObject* PyObject_GetAttr(PyObject *o, PyObject *attr_name)}\\
+     \begin{cfuncdesc}{PyObject*}{PyObject_GetAttr}{PyObject *o, PyObject *attr_name}
 	 Retrieve an attributed named attr_name form object o.
-	 Returns the attribute value on success, or NULL on failure.
+	 Returns the attribute value on success, or {\NULL} on failure.
 	 This is the equivalent of the Python expression: o.attr_name.
+     \end{cfuncdesc}
 
 
-     \code{int PyObject_SetAttrString(PyObject *o, char *attr_name, PyObject *v)}\\
+     \begin{cfuncdesc}{int}{PyObject_SetAttrString}{PyObject *o, char *attr_name, PyObject *v}
 	 Set the value of the attribute named \code{attr_name}, for object \code{o},
 	 to the value \code{v}. Returns -1 on failure.  This is
 	 the equivalent of the Python statement: \code{o.attr_name=v}.
+     \end{cfuncdesc}
 
 
-     \code{int PyObject_SetAttr(PyObject *o, PyObject *attr_name, PyObject *v)}\\
-	 Set the value of the attribute named \code{attr_name}, for object \code{o},
+     \begin{cfuncdesc}{int}{PyObject_SetAttr}{PyObject *o, PyObject *attr_name, PyObject *v}
+	 Set the value of the attribute named \code{attr_name}, for
+	 object \code{o},
 	 to the value \code{v}. Returns -1 on failure.  This is
 	 the equivalent of the Python statement: \code{o.attr_name=v}.
+     \end{cfuncdesc}
 
 
-     \code{int PyObject_DelAttrString(PyObject *o, char *attr_name)}\\
+     \begin{cfuncdesc}{int}{PyObject_DelAttrString}{PyObject *o, char *attr_name}
 	 Delete attribute named \code{attr_name}, for object \code{o}. Returns -1 on
 	 failure.  This is the equivalent of the Python
 	 statement: \code{del o.attr_name}.
+     \end{cfuncdesc}
 
 
-     \code{int PyObject_DelAttr(PyObject *o, PyObject *attr_name)}\\
+     \begin{cfuncdesc}{int}{PyObject_DelAttr}{PyObject *o, PyObject *attr_name}
 	 Delete attribute named \code{attr_name}, for object \code{o}. Returns -1 on
 	 failure.  This is the equivalent of the Python
 	 statement: \code{del o.attr_name}.
+     \end{cfuncdesc}
 
 
-     \code{int PyObject_Cmp(PyObject *o1, PyObject *o2, int *result)}\\
+     \begin{cfuncdesc}{int}{PyObject_Cmp}{PyObject *o1, PyObject *o2, int *result}
 	 Compare the values of \code{o1} and \code{o2} using a routine provided by
 	 \code{o1}, if one exists, otherwise with a routine provided by \code{o2}.
 	 The result of the comparison is returned in \code{result}.  Returns
 	 -1 on failure.  This is the equivalent of the Python
 	 statement: \code{result=cmp(o1,o2)}.
+     \end{cfuncdesc}
 
 
-     \code{int PyObject_Compare(PyObject *o1, PyObject *o2)}\\
+     \begin{cfuncdesc}{int}{PyObject_Compare}{PyObject *o1, PyObject *o2}
 	 Compare the values of \code{o1} and \code{o2} using a routine provided by
 	 \code{o1}, if one exists, otherwise with a routine provided by \code{o2}.
 	 Returns the result of the comparison on success.  On error,
 	 the value returned is undefined. This is equivalent to the
 	 Python expression: \code{cmp(o1,o2)}.
+     \end{cfuncdesc}
 
 
-     \code{PyObject *PyObject_Repr(PyObject *o)}\\
+     \begin{cfuncdesc}{PyObject*}{PyObject_Repr}{PyObject *o}
 	 Compute the string representation of object, \code{o}.  Returns the
-	 string representation on success, NULL on failure.  This is
+	 string representation on success, {\NULL} on failure.  This is
 	 the equivalent of the Python expression: \code{repr(o)}.
 	 Called by the \code{repr()} built-in function and by reverse quotes.
+     \end{cfuncdesc}
 
 
-     \code{PyObject *PyObject_Str(PyObject *o)}\\
+     \begin{cfuncdesc}{PyObject*}{PyObject_Str}{PyObject *o}
 	 Compute the string representation of object, \code{o}.  Returns the
-	 string representation on success, NULL on failure.  This is
+	 string representation on success, {\NULL} on failure.  This is
 	 the equivalent of the Python expression: \code{str(o)}.
 	 Called by the \code{str()} built-in function and by the \code{print}
 	 statement.
+     \end{cfuncdesc}
 
 
-     \code{int *PyCallable_Check(PyObject *o))}\\
+     \begin{cfuncdesc}{int}{PyCallable_Check}{PyObject *o}
 	 Determine if the object \code{o}, is callable.  Return 1 if the
 	 object is callable and 0 otherwise.
 	 This function always succeeds.
+     \end{cfuncdesc}
 
 
-     \code{PyObject *PyObject_CallObject(PyObject *callable_object, PyObject *args)}\\
+     \begin{cfuncdesc}{PyObject*}{PyObject_CallObject}{PyObject *callable_object, PyObject *args}
 	 Call a callable Python object \code{callable_object}, with
 	 arguments given by the tuple \code{args}.  If no arguments are
-	 needed, then args may be NULL.  Returns the result of the
-	 call on success, or NULL on failure.  This is the equivalent
-	 of the Python expression: \code{apply(o,args)}.
+	 needed, then args may be {\NULL}.  Returns the result of the
+	 call on success, or {\NULL} on failure.  This is the equivalent
+	 of the Python expression: \code{apply(o, args)}.
+     \end{cfuncdesc}
 
-     \code{PyObject *PyObject_CallFunction(PyObject *callable_object, char *format, ...)}\\
+     \begin{cfuncdesc}{PyObject*}{PyObject_CallFunction}{PyObject *callable_object, char *format, ...}
          Call a callable Python object \code{callable_object}, with a
          variable number of C arguments. The C arguments are described
-         using a mkvalue-style format string. The format may be NULL,
+         using a mkvalue-style format string. The format may be {\NULL},
          indicating that no arguments are provided.  Returns the
-         result of the call on success, or NULL on failure.  This is
+         result of the call on success, or {\NULL} on failure.  This is
          the equivalent of the Python expression: \code{apply(o,args)}.
+     \end{cfuncdesc}
 
 
-     \code{PyObject *PyObject_CallMethod(PyObject *o, char *m, char *format, ...)}\\
+     \begin{cfuncdesc}{PyObject*}{PyObject_CallMethod}{PyObject *o, char *m, char *format, ...}
          Call the method named \code{m} of object \code{o} with a variable number of
          C arguments.  The C arguments are described by a mkvalue
-         format string.  The format may be NULL, indicating that no
+         format string.  The format may be {\NULL}, indicating that no
          arguments are provided. Returns the result of the call on
-         success, or NULL on failure.  This is the equivalent of the
+         success, or {\NULL} on failure.  This is the equivalent of the
          Python expression: \code{o.method(args)}.
          Note that Special method names, such as "\code{__add__}",
          "\code{__getitem__}", and so on are not supported. The specific
          abstract-object routines for these must be used.
+     \end{cfuncdesc}
 
 
-     \code{int PyObject_Hash(PyObject *o)}\\
+     \begin{cfuncdesc}{int}{PyObject_Hash}{PyObject *o}
          Compute and return the hash value of an object \code{o}.  On
          failure, return -1.  This is the equivalent of the Python
          expression: \code{hash(o)}.
+     \end{cfuncdesc}
 
 
-     \code{int *PyObject_IsTrue(PyObject *o)}\\
+     \begin{cfuncdesc}{int}{PyObject_IsTrue}{PyObject *o}
 	 Returns 1 if the object \code{o} is considered to be true, and
 	 0 otherwise. This is equivalent to the Python expression:
 	 \code{not not o}.
 	 This function always succeeds.
+     \end{cfuncdesc}
 	 
 
-     \code{PyObject *PyObject_Type(PyObject *o)}\\
+     \begin{cfuncdesc}{PyObject*}{PyObject_Type}{PyObject *o}
 	 On success, returns a type object corresponding to the object
-	 type of object \code{o}. On failure, returns NULL.  This is
+	 type of object \code{o}. On failure, returns {\NULL}.  This is
 	 equivalent to the Python expression: \code{type(o)}.
+     \end{cfuncdesc}
 
-     \code{int PyObject_Length(PyObject *o)}\\
+     \begin{cfuncdesc}{int}{PyObject_Length}{PyObject *o}
          Return the length of object \code{o}.  If the object \code{o} provides
 	 both sequence and mapping protocols, the sequence length is
 	 returned. On error, -1 is returned.  This is the equivalent
 	 to the Python expression: \code{len(o)}.
+     \end{cfuncdesc}
 
 
-     \code{PyObject *PyObject_GetItem(PyObject *o, PyObject *key)}\\
-	 Return element of \code{o} corresponding to the object \code{key} or NULL
+     \begin{cfuncdesc}{PyObject*}{PyObject_GetItem}{PyObject *o, PyObject *key}
+	 Return element of \code{o} corresponding to the object \code{key} or {\NULL}
 	 on failure. This is the equivalent of the Python expression:
 	 \code{o[key]}.
+     \end{cfuncdesc}
 
 
-     \code{int PyObject_SetItem(PyObject *o, PyObject *key, PyObject *v)}\\
+     \begin{cfuncdesc}{int}{PyObject_SetItem}{PyObject *o, PyObject *key, PyObject *v}
 	 Map the object \code{key} to the value \code{v}.
 	 Returns -1 on failure.  This is the equivalent
 	 of the Python statement: \code{o[key]=v}.
+     \end{cfuncdesc}
 
 
-     \code{int PyObject_DelItem(PyObject *o, PyObject *key, PyObject *v)}\\
+     \begin{cfuncdesc}{int}{PyObject_DelItem}{PyObject *o, PyObject *key, PyObject *v}
 	 Delete the mapping for \code{key} from \code{*o}.  Returns -1
 	 on failure.
 	 This is the equivalent of the Python statement: del o[key].
+     \end{cfuncdesc}
 
 
-\subsubsection{Number Protocol}
+\section{Number Protocol}
 
-     \code{int PyNumber_Check(PyObject *o)}\\
+     \begin{cfuncdesc}{int}{PyNumber_Check}{PyObject *o}
          Returns 1 if the object \code{o} provides numeric protocols, and
 	 false otherwise. 
 	 This function always succeeds.
+     \end{cfuncdesc}
 
 
-     \code{PyObject *PyNumber_Add(PyObject *o1, PyObject *o2)}\\
+     \begin{cfuncdesc}{PyObject*}{PyNumber_Add}{PyObject *o1, PyObject *o2}
 	 Returns the result of adding \code{o1} and \code{o2}, or null on failure.
 	 This is the equivalent of the Python expression: \code{o1+o2}.
+     \end{cfuncdesc}
 
 
-     \code{PyObject *PyNumber_Subtract(PyObject *o1, PyObject *o2)}\\
+     \begin{cfuncdesc}{PyObject*}{PyNumber_Subtract}{PyObject *o1, PyObject *o2}
 	 Returns the result of subtracting \code{o2} from \code{o1}, or null on
 	 failure.  This is the equivalent of the Python expression:
 	 \code{o1-o2}.
+     \end{cfuncdesc}
 
 
-     \code{PyObject *PyNumber_Multiply(PyObject *o1, PyObject *o2)}\\
+     \begin{cfuncdesc}{PyObject*}{PyNumber_Multiply}{PyObject *o1, PyObject *o2}
 	 Returns the result of multiplying \code{o1} and \code{o2}, or null on
 	 failure.  This is the equivalent of the Python expression:
 	 \code{o1*o2}.
+     \end{cfuncdesc}
 
 
-     \code{PyObject *PyNumber_Divide(PyObject *o1, PyObject *o2)}\\
+     \begin{cfuncdesc}{PyObject*}{PyNumber_Divide}{PyObject *o1, PyObject *o2}
 	 Returns the result of dividing \code{o1} by \code{o2}, or null on failure.
 	 This is the equivalent of the Python expression: \code{o1/o2}.
+     \end{cfuncdesc}
 
 
-     \code{PyObject *PyNumber_Remainder(PyObject *o1, PyObject *o2)}\\
+     \begin{cfuncdesc}{PyObject*}{PyNumber_Remainder}{PyObject *o1, PyObject *o2}
 	 Returns the remainder of dividing \code{o1} by \code{o2}, or null on
 	 failure.  This is the equivalent of the Python expression:
 	 \code{o1\%o2}.
+     \end{cfuncdesc}
 
 
-     \code{PyObject *PyNumber_Divmod(PyObject *o1, PyObject *o2)}\\
-	 See the built-in function divmod.  Returns NULL on failure.
+     \begin{cfuncdesc}{PyObject*}{PyNumber_Divmod}{PyObject *o1, PyObject *o2}
+	 See the built-in function divmod.  Returns {\NULL} on failure.
 	 This is the equivalent of the Python expression:
 	 \code{divmod(o1,o2)}.
+     \end{cfuncdesc}
 
 
-     \code{PyObject *PyNumber_Power(PyObject *o1, PyObject *o2, PyObject *o3)}\\
-	 See the built-in function pow.  Returns NULL on failure.
+     \begin{cfuncdesc}{PyObject*}{PyNumber_Power}{PyObject *o1, PyObject *o2, PyObject *o3}
+	 See the built-in function pow.  Returns {\NULL} on failure.
 	 This is the equivalent of the Python expression:
 	 \code{pow(o1,o2,o3)}, where \code{o3} is optional.
+     \end{cfuncdesc}
 
 
-     \code{PyObject *PyNumber_Negative(PyObject *o)}\\
+     \begin{cfuncdesc}{PyObject*}{PyNumber_Negative}{PyObject *o}
 	 Returns the negation of \code{o} on success, or null on failure.
 	 This is the equivalent of the Python expression: \code{-o}.
+     \end{cfuncdesc}
 
 
-     \code{PyObject *PyNumber_Positive(PyObject *o)}\\
-         Returns \code{o} on success, or NULL on failure.
+     \begin{cfuncdesc}{PyObject*}{PyNumber_Positive}{PyObject *o}
+         Returns \code{o} on success, or {\NULL} on failure.
 	 This is the equivalent of the Python expression: \code{+o}.
+     \end{cfuncdesc}
 
 
-     \code{PyObject *PyNumber_Absolute(PyObject *o)}\\
+     \begin{cfuncdesc}{PyObject*}{PyNumber_Absolute}{PyObject *o}
 	 Returns the absolute value of \code{o}, or null on failure.  This is
 	 the equivalent of the Python expression: \code{abs(o)}.
+     \end{cfuncdesc}
 
 
-     \code{PyObject *PyNumber_Invert(PyObject *o)}\\
-	 Returns the bitwise negation of \code{o} on success, or NULL on
+     \begin{cfuncdesc}{PyObject*}{PyNumber_Invert}{PyObject *o}
+	 Returns the bitwise negation of \code{o} on success, or {\NULL} on
 	 failure.  This is the equivalent of the Python expression:
 	 \code{~o}.
+     \end{cfuncdesc}
 
 
-     \code{PyObject *PyNumber_Lshift(PyObject *o1, PyObject *o2)}\\
+     \begin{cfuncdesc}{PyObject*}{PyNumber_Lshift}{PyObject *o1, PyObject *o2}
 	 Returns the result of left shifting \code{o1} by \code{o2} on success, or
-	 NULL on failure.  This is the equivalent of the Python
+	 {\NULL} on failure.  This is the equivalent of the Python
 	 expression: \code{o1 << o2}.
+     \end{cfuncdesc}
 
 
-     \code{PyObject *PyNumber_Rshift(PyObject *o1, PyObject *o2)}\\
+     \begin{cfuncdesc}{PyObject*}{PyNumber_Rshift}{PyObject *o1, PyObject *o2}
 	 Returns the result of right shifting \code{o1} by \code{o2} on success, or
-	 NULL on failure.  This is the equivalent of the Python
+	 {\NULL} on failure.  This is the equivalent of the Python
 	 expression: \code{o1 >> o2}.
+     \end{cfuncdesc}
 
 
-     \code{PyObject *PyNumber_And(PyObject *o1, PyObject *o2)}\\
-	 Returns the result of "anding" \code{o2} and \code{o2} on success and NULL
+     \begin{cfuncdesc}{PyObject*}{PyNumber_And}{PyObject *o1, PyObject *o2}
+	 Returns the result of "anding" \code{o2} and \code{o2} on success and {\NULL}
 	 on failure. This is the equivalent of the Python
 	 expression: \code{o1 and o2}.
+     \end{cfuncdesc}
 
 
-     \code{PyObject *PyNumber_Xor(PyObject *o1, PyObject *o2)}\\
+     \begin{cfuncdesc}{PyObject*}{PyNumber_Xor}{PyObject *o1, PyObject *o2}
 	 Returns the bitwise exclusive or of \code{o1} by \code{o2} on success, or
-	 NULL on failure.  This is the equivalent of the Python
+	 {\NULL} on failure.  This is the equivalent of the Python
 	 expression: \code{o1\^{ }o2}.
+     \end{cfuncdesc}
 
-     \code{PyObject *PyNumber_Or(PyObject *o1, PyObject *o2)}\\
-	 Returns the result or \code{o1} and \code{o2} on success, or NULL on
+     \begin{cfuncdesc}{PyObject*}{PyNumber_Or}{PyObject *o1, PyObject *o2}
+	 Returns the result or \code{o1} and \code{o2} on success, or {\NULL} on
 	 failure.  This is the equivalent of the Python expression: 
 	 \code{o1 or o2}.
+     \end{cfuncdesc}
 
 
-     \code{PyObject *PyNumber_Coerce(PyObject *o1, PyObject *o2)}\\
+     \begin{cfuncdesc}{PyObject*}{PyNumber_Coerce}{PyObject *o1, PyObject *o2}
          On success, returns a tuple containing \code{o1} and \code{o2} converted to
 	 a common numeric type, or None if no conversion is possible.
 	 Returns -1 on failure. This is equivalent to the Python
 	 expression: \code{coerce(o1,o2)}.
+     \end{cfuncdesc}
 
 
-     \code{PyObject *PyNumber_Int(PyObject *o)}\\
+     \begin{cfuncdesc}{PyObject*}{PyNumber_Int}{PyObject *o}
 	 Returns the \code{o} converted to an integer object on success, or
-	 NULL on failure.  This is the equivalent of the Python
+	 {\NULL} on failure.  This is the equivalent of the Python
 	 expression: \code{int(o)}.
+     \end{cfuncdesc}
 
 
-     \code{PyObject *PyNumber_Long(PyObject *o)}\\
+     \begin{cfuncdesc}{PyObject*}{PyNumber_Long}{PyObject *o}
 	 Returns the \code{o} converted to a long integer object on success,
-	 or NULL on failure.  This is the equivalent of the Python
+	 or {\NULL} on failure.  This is the equivalent of the Python
 	 expression: \code{long(o)}.
+     \end{cfuncdesc}
 
 
-     \code{PyObject *PyNumber_Float(PyObject *o)}\\
-	 Returns the \code{o} converted to a float object on success, or NULL
+     \begin{cfuncdesc}{PyObject*}{PyNumber_Float}{PyObject *o}
+	 Returns the \code{o} converted to a float object on success, or {\NULL}
 	 on failure.  This is the equivalent of the Python expression:
 	 \code{float(o)}.
+     \end{cfuncdesc}
 
 
-\subsubsection{Sequence protocol}
+\section{Sequence protocol}
 
-     \code{int PySequence_Check(PyObject *o)}\\
+     \begin{cfuncdesc}{int}{PySequence_Check}{PyObject *o}
          Return 1 if the object provides sequence protocol, and 0
 	 otherwise.  
 	 This function always succeeds.
+     \end{cfuncdesc}
 
 
-     \code{PyObject *PySequence_Concat(PyObject *o1, PyObject *o2)}\\
-	 Return the concatination of \code{o1} and \code{o2} on success, and NULL on
+     \begin{cfuncdesc}{PyObject*}{PySequence_Concat}{PyObject *o1, PyObject *o2}
+	 Return the concatination of \code{o1} and \code{o2} on success, and {\NULL} on
 	 failure.   This is the equivalent of the Python
 	 expression: \code{o1+o2}.
+     \end{cfuncdesc}
 
 
-     \code{PyObject *PySequence_Repeat(PyObject *o, int count)}\\
+     \begin{cfuncdesc}{PyObject*}{PySequence_Repeat}{PyObject *o, int count}
 	 Return the result of repeating sequence object \code{o} count times,
-	 or NULL on failure.  This is the equivalent of the Python
+	 or {\NULL} on failure.  This is the equivalent of the Python
 	 expression: \code{o*count}.
+     \end{cfuncdesc}
 
 
-     \code{PyObject *PySequence_GetItem(PyObject *o, int i)}\\
-	 Return the ith element of \code{o}, or NULL on failure. This is the
+     \begin{cfuncdesc}{PyObject*}{PySequence_GetItem}{PyObject *o, int i}
+	 Return the ith element of \code{o}, or {\NULL} on failure. This is the
 	 equivalent of the Python expression: \code{o[i]}.
+     \end{cfuncdesc}
 
 
-     \code{PyObject *PySequence_GetSlice(PyObject *o, int i1, int i2)}\\
+     \begin{cfuncdesc}{PyObject*}{PySequence_GetSlice}{PyObject *o, int i1, int i2}
 	 Return the slice of sequence object \code{o} between \code{i1} and \code{i2}, or
-	 NULL on failure. This is the equivalent of the Python
+	 {\NULL} on failure. This is the equivalent of the Python
 	 expression, \code{o[i1:i2]}.
+     \end{cfuncdesc}
 
 
-     \code{int PySequence_SetItem(PyObject *o, int i, PyObject *v)}\\
+     \begin{cfuncdesc}{int}{PySequence_SetItem}{PyObject *o, int i, PyObject *v}
 	 Assign object \code{v} to the \code{i}th element of \code{o}.
 Returns -1 on failure.  This is the equivalent of the Python
 	 statement, \code{o[i]=v}.
+     \end{cfuncdesc}
 
-     \code{int PySequence_DelItem(PyObject *o, int i)}\\
+     \begin{cfuncdesc}{int}{PySequence_DelItem}{PyObject *o, int i}
 	 Delete the \code{i}th element of object \code{v}.  Returns
 	 -1 on failure.  This is the equivalent of the Python
 	 statement: \code{del o[i]}.
+     \end{cfuncdesc}
 
-     \code{int PySequence_SetSlice(PyObject *o, int i1, int i2, PyObject *v)}\\
+     \begin{cfuncdesc}{int}{PySequence_SetSlice}{PyObject *o, int i1, int i2, PyObject *v}
          Assign the sequence object \code{v} to the slice in sequence
 	 object \code{o} from \code{i1} to \code{i2}.  This is the equivalent of the Python
 	 statement, \code{o[i1:i2]=v}.
+     \end{cfuncdesc}
 
-     \code{int PySequence_DelSlice(PyObject *o, int i1, int i2)}\\
+     \begin{cfuncdesc}{int}{PySequence_DelSlice}{PyObject *o, int i1, int i2}
 	 Delete the slice in sequence object, \code{o}, from \code{i1} to \code{i2}.
 	 Returns -1 on failure. This is the equivalent of the Python
 	 statement: \code{del o[i1:i2]}.
+     \end{cfuncdesc}
 
-     \code{PyObject *PySequence_Tuple(PyObject *o)}\\
-	 Returns the \code{o} as a tuple on success, and NULL on failure.
+     \begin{cfuncdesc}{PyObject*}{PySequence_Tuple}{PyObject *o}
+	 Returns the \code{o} as a tuple on success, and {\NULL} on failure.
 	 This is equivalent to the Python expression: \code{tuple(o)}.
+     \end{cfuncdesc}
 
-     \code{int PySequence_Count(PyObject *o, PyObject *value)}\\
+     \begin{cfuncdesc}{int}{PySequence_Count}{PyObject *o, PyObject *value}
          Return the number of occurrences of \code{value} on \code{o}, that is,
 	 return the number of keys for which \code{o[key]==value}.  On
 	 failure, return -1.  This is equivalent to the Python
 	 expression: \code{o.count(value)}.
+     \end{cfuncdesc}
 
-     \code{int PySequence_In(PyObject *o, PyObject *value)}\\
+     \begin{cfuncdesc}{int}{PySequence_In}{PyObject *o, PyObject *value}
 	 Determine if \code{o} contains \code{value}.  If an item in \code{o} is equal to
 	 \code{value}, return 1, otherwise return 0.  On error, return -1.  This
 	 is equivalent to the Python expression: \code{value in o}.
+     \end{cfuncdesc}
 
-     \code{int PySequence_Index(PyObject *o, PyObject *value)}\\
+     \begin{cfuncdesc}{int}{PySequence_Index}{PyObject *o, PyObject *value}
 	 Return the first index for which \code{o[i]=value}.  On error,
 	 return -1.    This is equivalent to the Python
 	 expression: \code{o.index(value)}.
+     \end{cfuncdesc}
 
-\subsubsection{Mapping protocol}
+\section{Mapping protocol}
 
-     \code{int PyMapping_Check(PyObject *o)}\\
+     \begin{cfuncdesc}{int}{PyMapping_Check}{PyObject *o}
          Return 1 if the object provides mapping protocol, and 0
 	 otherwise.  
 	 This function always succeeds.
+     \end{cfuncdesc}
 
 
-     \code{int PyMapping_Length(PyObject *o)}\\
+     \begin{cfuncdesc}{int}{PyMapping_Length}{PyObject *o}
          Returns the number of keys in object \code{o} on success, and -1 on
 	 failure.  For objects that do not provide sequence protocol,
 	 this is equivalent to the Python expression: \code{len(o)}.
+     \end{cfuncdesc}
 
 
-     \code{int PyMapping_DelItemString(PyObject *o, char *key)}\\
+     \begin{cfuncdesc}{int}{PyMapping_DelItemString}{PyObject *o, char *key}
 	 Remove the mapping for object \code{key} from the object \code{o}.
 	 Return -1 on failure.  This is equivalent to
 	 the Python statement: \code{del o[key]}.
+     \end{cfuncdesc}
 
 
-     \code{int PyMapping_DelItem(PyObject *o, PyObject *key)}\\
+     \begin{cfuncdesc}{int}{PyMapping_DelItem}{PyObject *o, PyObject *key}
 	 Remove the mapping for object \code{key} from the object \code{o}.
 	 Return -1 on failure.  This is equivalent to
 	 the Python statement: \code{del o[key]}.
+     \end{cfuncdesc}
 
 
-     \code{int PyMapping_HasKeyString(PyObject *o, char *key)}\\
+     \begin{cfuncdesc}{int}{PyMapping_HasKeyString}{PyObject *o, char *key}
 	 On success, return 1 if the mapping object has the key \code{key}
 	 and 0 otherwise.  This is equivalent to the Python expression:
 	 \code{o.has_key(key)}. 
 	 This function always succeeds.
+     \end{cfuncdesc}
 
 
-     \code{int PyMapping_HasKey(PyObject *o, PyObject *key)}\\
+     \begin{cfuncdesc}{int}{PyMapping_HasKey}{PyObject *o, PyObject *key}
 	 Return 1 if the mapping object has the key \code{key}
 	 and 0 otherwise.  This is equivalent to the Python expression:
 	 \code{o.has_key(key)}. 
 	 This function always succeeds.
+     \end{cfuncdesc}
 
 
-     \code{PyObject *PyMapping_Keys(PyObject *o)}\\
+     \begin{cfuncdesc}{PyObject*}{PyMapping_Keys}{PyObject *o}
          On success, return a list of the keys in object \code{o}.  On
-	 failure, return NULL. This is equivalent to the Python
+	 failure, return {\NULL}. This is equivalent to the Python
 	 expression: \code{o.keys()}.
+     \end{cfuncdesc}
 
 
-     \code{PyObject *PyMapping_Values(PyObject *o)}\\
+     \begin{cfuncdesc}{PyObject*}{PyMapping_Values}{PyObject *o}
          On success, return a list of the values in object \code{o}.  On
-	 failure, return NULL. This is equivalent to the Python
+	 failure, return {\NULL}. This is equivalent to the Python
 	 expression: \code{o.values()}.
+     \end{cfuncdesc}
 
 
-     \code{PyObject *PyMapping_Items(PyObject *o)}\\
+     \begin{cfuncdesc}{PyObject*}{PyMapping_Items}{PyObject *o}
          On success, return a list of the items in object \code{o}, where
 	 each item is a tuple containing a key-value pair.  On
-	 failure, return NULL. This is equivalent to the Python
+	 failure, return {\NULL}. This is equivalent to the Python
 	 expression: \code{o.items()}.
+     \end{cfuncdesc}
 
-     \code{int PyMapping_Clear(PyObject *o)}\\
+     \begin{cfuncdesc}{int}{PyMapping_Clear}{PyObject *o}
          Make object \code{o} empty.  Returns 1 on success and 0 on failure.
 	 This is equivalent to the Python statement:
 	 \code{for key in o.keys(): del o[key]}
+     \end{cfuncdesc}
 
 
-     \code{PyObject *PyMapping_GetItemString(PyObject *o, char *key)}\\
-	 Return element of \code{o} corresponding to the object \code{key} or NULL
+     \begin{cfuncdesc}{PyObject*}{PyMapping_GetItemString}{PyObject *o, char *key}
+	 Return element of \code{o} corresponding to the object \code{key} or {\NULL}
 	 on failure. This is the equivalent of the Python expression:
 	 \code{o[key]}.
+     \end{cfuncdesc}
 
-     \code{PyObject *PyMapping_SetItemString(PyObject *o, char *key, PyObject *v)}\\
+     \begin{cfuncdesc}{PyObject*}{PyMapping_SetItemString}{PyObject *o, char *key, PyObject *v}
          Map the object \code{key} to the value \code{v} in object \code{o}.  Returns 
          -1 on failure.  This is the equivalent of the Python
          statement: \code{o[key]=v}.
+     \end{cfuncdesc}
 
 
-\subsubsection{Constructors}
+\section{Constructors}
 
-     \code{PyObject *PyFile_FromString(char *file_name, char *mode)}\\
+     \begin{cfuncdesc}{PyObject*}{PyFile_FromString}{char *file_name, char *mode}
 	 On success, returns a new file object that is opened on the
 	 file given by \code{file_name}, with a file mode given by \code{mode},
 	 where \code{mode} has the same semantics as the standard C routine,
 	 fopen.  On failure, return -1.
+     \end{cfuncdesc}
      
-     \code{PyObject *PyFile_FromFile(FILE *fp, char *file_name, char *mode, int close_on_del)}\\
+     \begin{cfuncdesc}{PyObject*}{PyFile_FromFile}{FILE *fp, char *file_name, char *mode, int close_on_del}
 	 Return a new file object for an already opened standard C
 	 file pointer, \code{fp}.  A file name, \code{file_name}, and open mode,
 	 \code{mode}, must be provided as well as a flag, \code{close_on_del}, that
 	 indicates whether the file is to be closed when the file
 	 object is destroyed.  On failure, return -1.
+     \end{cfuncdesc}
 
-     \code{PyObject *PyFloat_FromDouble(double v)}\\
+     \begin{cfuncdesc}{PyObject*}{PyFloat_FromDouble}{double v}
 	 Returns a new float object with the value \code{v} on success, and
-	 NULL on failure.
+	 {\NULL} on failure.
+     \end{cfuncdesc}
      
-     \code{PyObject *PyInt_FromLong(long v)}\\
+     \begin{cfuncdesc}{PyObject*}{PyInt_FromLong}{long v}
 	 Returns a new int object with the value \code{v} on success, and
-	 NULL on failure.
+	 {\NULL} on failure.
+     \end{cfuncdesc}
 
-     \code{PyObject *PyList_New(int l)}\\
-	 Returns a new list of length \code{l} on success, and NULL on
+     \begin{cfuncdesc}{PyObject*}{PyList_New}{int l}
+	 Returns a new list of length \code{l} on success, and {\NULL} on
 	 failure.
+     \end{cfuncdesc}
 
-     \code{PyObject *PyLong_FromLong(long v)}\\
+     \begin{cfuncdesc}{PyObject*}{PyLong_FromLong}{long v}
 	 Returns a new long object with the value \code{v} on success, and
-	 NULL on failure.
+	 {\NULL} on failure.
+     \end{cfuncdesc}
 
-     \code{PyObject *PyLong_FromDouble(double v)}\\
+     \begin{cfuncdesc}{PyObject*}{PyLong_FromDouble}{double v}
 	 Returns a new long object with the value \code{v} on success, and
-	 NULL on failure.
+	 {\NULL} on failure.
+     \end{cfuncdesc}
 
-     \code{PyObject *PyDict_New()}\\
-	 Returns a new empty dictionary on success, and NULL on
+     \begin{cfuncdesc}{PyObject*}{PyDict_New}{}
+	 Returns a new empty dictionary on success, and {\NULL} on
 	 failure.
+     \end{cfuncdesc}
 
-     \code{PyObject *PyString_FromString(char *v)}\\
+     \begin{cfuncdesc}{PyObject*}{PyString_FromString}{char *v}
 	 Returns a new string object with the value \code{v} on success, and
-	 NULL on failure.
+	 {\NULL} on failure.
+     \end{cfuncdesc}
 
-     \code{PyObject *PyString_FromStringAndSize(char *v, int l)}\\
+     \begin{cfuncdesc}{PyObject*}{PyString_FromStringAndSize}{char *v, int l}
 	 Returns a new string object with the value \code{v} and length \code{l}
-	 on success, and NULL on failure.
+	 on success, and {\NULL} on failure.
+     \end{cfuncdesc}
 
-     \code{PyObject *PyTuple_New(int l)}\\
-	 Returns a new tuple of length \code{l} on success, and NULL on
+     \begin{cfuncdesc}{PyObject*}{PyTuple_New}{int l}
+	 Returns a new tuple of length \code{l} on success, and {\NULL} on
 	 failure.
+     \end{cfuncdesc}
 
