diff --git a/books/bookvol10.2.pamphlet b/books/bookvol10.2.pamphlet
index 6e35d91..7a9b286 100644
--- a/books/bookvol10.2.pamphlet
+++ b/books/bookvol10.2.pamphlet
@@ -7525,6 +7525,7 @@ o )show SetCategoryWithDegree
 
 {\bf See:}
 
+\pageto{ProjectiveSpaceCategory}{PRSPCAT}
 \pagefrom{BasicType}{BASTYPE}
 \pagefrom{CoercibleTo}{KOERCE}
 \pagefrom{SetCategory}{SETCAT}
@@ -10712,6 +10713,254 @@ digraph pic {
 }
 @
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\pagehead{ProjectiveSpaceCategory}{PRSPCAT}
+\pagepic{ps/v102projectivespacecategory.ps}{PRSPCAT}{0.75}
+
+<<ProjectiveSpaceCategory.input>>=
+)set break resume
+)sys rm -f ProjectiveSpaceCategory.output
+)spool ProjectiveSpaceCategory.output
+)set message test on
+)set message auto off
+)clear all
+
+--S 1 of 1
+)show ProjectiveSpaceCategory
+--R ProjectiveSpaceCategory K: Field  is a category constructor
+--R Abbreviation for ProjectiveSpaceCategory is PRSPCAT 
+--R This constructor is exposed in this frame.
+--R Issue )edit bookvol10.2.pamphlet to see algebra source code for PRSPCAT 
+--R
+--R------------------------------- Operations --------------------------------
+--R ?=? : (%,%) -> Boolean                coerce : List K -> %
+--R coerce : % -> List K                  coerce : % -> OutputForm
+--R conjugate : % -> %                    definingField : % -> K
+--R degree : % -> PositiveInteger         ?.? : (%,Integer) -> K
+--R hash : % -> SingleInteger             homogenize : % -> %
+--R homogenize : (%,Integer) -> %         lastNonNul : % -> Integer
+--R lastNonNull : % -> Integer            latex : % -> String
+--R list : % -> List K                    orbit : % -> List %
+--R pointValue : % -> List K              projectivePoint : List K -> %
+--R rational? : % -> Boolean              setelt : (%,Integer,K) -> K
+--R ?~=? : (%,%) -> Boolean              
+--R conjugate : (%,NonNegativeInteger) -> %
+--R orbit : (%,NonNegativeInteger) -> List %
+--R rational? : (%,NonNegativeInteger) -> Boolean
+--R removeConjugate : List % -> List %
+--R removeConjugate : (List %,NonNegativeInteger) -> List %
+--R
+--E 1
+
+)spool
+)lisp (bye)
+@
+<<ProjectiveSpaceCategory.help>>=
+====================================================================
+ProjectiveSpaceCategory examples
+====================================================================
+
+See Also:
+o )show ProjectiveSpaceCategory
+
+@
+
+{\bf See:}
+
+\pagefrom{SetCategoryWithDegree}{SETCATD}
+
+{\bf Exports:}\\
+
+\begin{tabular}{llll}
+\cross{PRSPCAT}{?.?} &
+\cross{PRSPCAT}{?=?} &
+\cross{PRSPCAT}{?~=?} &
+\cross{PRSPCAT}{coerce} \\
+\cross{PRSPCAT}{conjugate} &
+\cross{PRSPCAT}{definingField} &
+\cross{PRSPCAT}{degree} &
+\cross{PRSPCAT}{hash} \\
+\cross{PRSPCAT}{homogenize} &
+\cross{PRSPCAT}{lastNonNul} &
+\cross{PRSPCAT}{lastNonNull} &
+\cross{PRSPCAT}{latex} \\
+\cross{PRSPCAT}{list} &
+\cross{PRSPCAT}{orbit} &
+\cross{PRSPCAT}{orbit} &
+\cross{PRSPCAT}{pointValue} \\
+\cross{PRSPCAT}{projectivePoint} &
+\cross{PRSPCAT}{rational?} &
+\cross{PRSPCAT}{removeConjugate} &
+\cross{PRSPCAT}{setelt} \\
+\end{tabular}
+
+These are directly exported but not implemented:
+\begin{verbatim}
+ ?.? : (%,Integer) -> K
+ coerce : % -> List K                 
+ coerce : List K -> %
+ conjugate : % -> %                   
+ conjugate : (%,NonNegativeInteger) -> %
+ definingField : % -> K
+ homogenize : % -> %
+ homogenize : (%,Integer) -> %        
+ lastNonNul : % -> Integer
+ lastNonNull : % -> Integer           
+ list : % -> List K                   
+ orbit : % -> List %
+ orbit : (%,NonNegativeInteger) -> List %
+ pointValue : % -> List K             
+ projectivePoint : List K -> %
+ rational? : % -> Boolean             
+ rational? : (%,NonNegativeInteger) -> Boolean
+ removeConjugate : (List %,NonNegativeInteger) -> List %
+ removeConjugate : List % -> List %
+ setelt : (%,Integer,K) -> K
+\end{verbatim}
+
+These exports come from \refto{SetCategoryWithDegree}
+\begin{verbatim}
+ ?=? : (%,%) -> Boolean               
+ ?~=? : (%,%) -> Boolean              
+ coerce : % -> OutputForm
+ degree : % -> PositiveInteger        
+ hash : % -> SingleInteger            
+ latex : % -> String
+\end{verbatim}
+
+<<category PRSPCAT ProjectiveSpaceCategory>>=
+)abbrev category PRSPCAT ProjectiveSpaceCategory
+++ Author: Gaetan Hache
+++ Date Created: 17 nov 1992
+++ Date Last Updated: May 2010 by Tim Daly
+++ Description:
+++ This is part of the PAFF package, related to projective space.
+ProjectiveSpaceCategory(K:Field):Category == Implementation where
+
+ LIST ==> List
+ INT  ==> Integer
+ NNI  ==> NonNegativeInteger
+
+ Implementation ==>
+  SetCategoryWithDegree with
+
+    lastNonNul: % -> INT
+
+    homogenize: (%,INT) -> %
+      ++ homogenize the point according to the coordinate specified 
+      ++ by the integer
+    
+    projectivePoint: LIST(K) -> %
+      ++ projectivePoint creates a projective point from a list
+   
+    definingField: % -> K
+    
+    coerce: % -> List(K)
+      ++ coerce a a projective point list of K
+
+    coerce: LIST(K) -> %
+      ++ coerce a list of K to a projective point.
+      
+    orbit: % -> LIST %
+      ++ orbit(p) returns the orbit of the point p according to the 
+      ++ characteristic of K, that is, for q= char K, 
+      ++ orbit(p) = \{ p, p**q, p**(q**2), p**(q**3), ..... \}
+
+    orbit: (%,NNI) -> LIST %
+      ++ orbit(p,n) returns the orbit of the point p according to n, that is
+      ++ orbit(p,n) = \{ p, p**n, p**(n**2), p**(n**3), ..... \}
+
+    conjugate: (%,NNI) -> %
+      ++ conjugate(p,n) returns p**n, that is all the coordinates of p 
+      ++ to the power of n
+
+    conjugate: % -> %
+      ++ conjugate(p) returns conjugate(p,n) where n is the 
+      ++ characteristic of the ground field.
+
+    removeConjugate: (LIST(%),NNI) -> LIST(%)
+      ++ removeConjugate(lp,n) returns a list of points such that no points
+      ++ in the list is the conjugate (according to n) of another point.
+
+    removeConjugate: LIST(%)  -> LIST(%)
+      ++ removeConjugate(lp) returns removeConjugate(lp,n)
+      ++ where n is the characteristic of the ground field.
+
+    rational?: (%,NNI) -> Boolean
+      ++ rational?(p,n) test if the point is rational according to n.
+
+    rational?: % -> Boolean
+      ++ rational?(p) test if the point is rational according to the
+      ++ characteristic of the ground field.
+
+    homogenize: % -> %
+      ++ homogenize(pt) the point according to the coordinate 
+      ++ which is the last non null.
+
+    lastNonNull: % -> INT
+      ++ lastNonNull returns the integer corresponding to the last 
+      ++ non null coordinates.
+
+    list  : % -> LIST(K)
+      ++ list returns the list of the coordinates
+
+    elt: (%,INT) -> K
+      ++ elt returns the value of a specified coordinates
+
+    setelt: (%,INT,K) -> K
+      ++ setelt sets the value of a specified coordinates
+
+    pointValue: % -> LIST(K)
+     ++ pointValue returns the coordinates of the point or of the point 
+     ++ of origin that represent an infinitly close point
+
+@
+<<PRSPCAT.dotabb>>=
+"PRSPCAT"
+ [color=lightblue,href="bookvol10.2.pdf#nameddest=PRSPCAT"];
+"PRSPCAT" -> "SETCATD"
+
+@
+<<PRSPCAT.dotfull>>=
+"ProjectiveSpaceCategory()"
+ [color=lightblue,href="bookvol10.2.pdf#nameddest=PRSPCAT"];
+"ProjectiveSpaceCategory()" -> "SetCategoryWithDegree()"
+
+@
+<<PRSPCAT.dotpic>>=
+digraph pic {
+ fontsize=10;
+ bgcolor="#FFFF66";
+ node [shape=box, color=white, style=filled];
+
+"ProjectiveSpaceCategory()" [color=lightblue];
+"ProjectiveSpaceCategory()" -> "SetCategoryWithDegree()"
+
+"SetCategoryWithDegree()" [color=lightblue];
+"SetCategoryWithDegree()" -> "BasicType()"
+"SetCategoryWithDegree()" -> "CoercibleTo(OutputForm)"
+"SetCategoryWithDegree()" -> "SetCategory()"
+
+"SetCategory()" [color=lightblue];
+"SetCategory()" -> "BasicType()"
+"SetCategory()" -> "CoercibleTo(OutputForm)"
+
+"BasicType()" [color=lightblue];
+"BasicType()" -> "Category"
+
+"CoercibleTo(OutputForm)" [color=seagreen];
+"CoercibleTo(OutputForm)" -> "CoercibleTo(a:Type)"
+
+"CoercibleTo(a:Type)" [color=lightblue];
+"CoercibleTo(a:Type)" -> "Category"
+
+"Package" [color="#00EE00"];
+
+"Category" [color=lightblue];
+
+}
+
+@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \pagehead{RecursiveAggregate}{RCAGG}
 \pagepic{ps/v102recursiveaggregate.ps}{RCAGG}{1.00}
 
@@ -76185,6 +76434,7 @@ Note that this code is not included in the generated catdef.spad file.
 <<category PRIMCAT PrimitiveFunctionCategory>>
 <<category PID PrincipalIdealDomain>>
 <<category PRQAGG PriorityQueueAggregate>>
+<<category PRSPCAT ProjectiveSpaceCategory>>
 <<category PACEXTC PseudoAlgebraicClosureOfAlgExtOfRationalNumberCategory>>
 <<category PACFFC PseudoAlgebraicClosureOfFiniteFieldCategory>>
 <<category PACPERC PseudoAlgebraicClosureOfPerfectFieldCategory>>
@@ -76213,6 +76463,7 @@ Note that this code is not included in the generated catdef.spad file.
 <<category SGROUP SemiGroup>>
 <<category SETAGG SetAggregate>>
 <<category SETCAT SetCategory>>
+<<category SETCATD SetCategoryWithDegree>>
 <<category SEXCAT SExpressionCategory>>
 <<category SPFCAT SpecialFunctionCategory>>
 <<category SNTSCAT SquareFreeNormalizedTriangularSetCategory>>
@@ -76257,214 +76508,216 @@ digraph dotabb {
  node [shape=box, color=white, style=filled];
 
 <<CATEGORY.dotabb>>
+<<A1AGG.dotabb>>
+<<ABELGRP.dotabb>>
+<<ABELMON.dotabb>>
+<<ABELSG.dotabb>>
+<<ACF.dotabb>>
+<<ACFS.dotabb>>
+<<AGG.dotabb>>
 <<AHYP.dotabb>>
+<<ALAGG.dotabb>>
+<<ALGEBRA.dotabb>>
+<<AMR.dotabb>>
+<<ARR2CAT.dotabb>>
 <<ATRIG.dotabb>>
 <<ATTREG.dotabb>>
 <<BASTYPE.dotabb>>
-<<KOERCE.dotabb>>
+<<BGAGG.dotabb>>
+<<BLMETCT.dotabb>>
+<<BMODULE.dotabb>>
+<<BRAGG.dotabb>>
+<<BTAGG.dotabb>>
+<<BTCAT.dotabb>>
+<<CABMON.dotabb>>
+<<CACHSET.dotabb>>
 <<CFCAT.dotabb>>
-<<KONVERT.dotabb>>
+<<CHARNZ.dotabb>>
+<<CHARZ.dotabb>>
+<<CLAGG.dotabb>>
+<<COMBOPC.dotabb>>
+<<COMPCAT.dotabb>>
+<<COMRING.dotabb>>
+<<DIAGG.dotabb>>
+<<DIFEXT.dotabb>>
+<<DIFRING.dotabb>>
+<<DIOPS.dotabb>>
+<<DIRPCAT.dotabb>>
+<<DIVRING.dotabb>>
+<<DLAGG.dotabb>>
+<<DPOLCAT.dotabb>>
+<<DQAGG.dotabb>>
+<<DVARCAT.dotabb>>
+<<ELAGG.dotabb>>
 <<ELEMFUN.dotabb>>
 <<ELTAB.dotabb>>
-<<HYPCAT.dotabb>>
-<<IEVALAB.dotabb>>
-<<OM.dotabb>>
-<<PTRANFN.dotabb>>
-<<PATAB.dotabb>>
-<<PRIMCAT.dotabb>>
-<<RADCAT.dotabb>>
-<<RETRACT.dotabb>>
-<<SPFCAT.dotabb>>
-<<TRIGCAT.dotabb>>
-<<TYPE.dotabb>>
-<<AGG.dotabb>>
-<<COMBOPC.dotabb>>
 <<ELTAGG.dotabb>>
+<<ENTIRER.dotabb>>
+<<ES.dotabb>>
+<<EUCDOM.dotabb>>
 <<EVALAB.dotabb>>
-<<FORTCAT.dotabb>>
-<<FRETRCT.dotabb>>
-<<FPATMAB.dotabb>>
-<<LOGIC.dotabb>>
-<<PPCURVE.dotabb>>
-<<PSCURVE.dotabb>>
-<<REAL.dotabb>>
-<<SEGCAT.dotabb>>
-<<SETCAT.dotabb>>
-<<TRANFUN.dotabb>>
-<<ABELSG.dotabb>>
-<<BLMETCT.dotabb>>
-<<FORTFN.dotabb>>
-<<FMC.dotabb>>
-<<FMFUN.dotabb>>
-<<FVC.dotabb>>
-<<FVFUN.dotabb>>
+<<FAMONC.dotabb>>
+<<FAMR.dotabb>>
+<<FAXF.dotabb>>
+<<FDIVCAT.dotabb>>
 <<FEVALAB.dotabb>>
+<<FFCAT.dotabb>>
+<<FFIELDC.dotabb>>
+<<FIELD.dotabb>>
 <<FILECAT.dotabb>>
+<<FINAALG.dotabb>>
 <<FINITE.dotabb>>
+<<FINRALG.dotabb>>
+<<FLAGG.dotabb>>
+<<FLALG.dotabb>>
+<<FLINEXP.dotabb>>
+<<FMC.dotabb>>
+<<FMCAT.dotabb>>
+<<FMFUN.dotabb>>
+<<FMTC.dotabb>>
 <<FNCAT.dotabb>>
+<<FORTCAT.dotabb>>
+<<FORTFN.dotabb>>
+<<FPATMAB.dotabb>>
+<<FPC.dotabb>>
+<<FPS.dotabb>>
+<<FRAMALG.dotabb>>
+<<FRETRCT.dotabb>>
+<<FRNAALG.dotabb>>
+<<FS.dotabb>>
+<<FSAGG.dotabb>>
+<<FVC.dotabb>>
+<<FVFUN.dotabb>>
+<<GCDDOM.dotabb>>
+<<GRALG.dotabb>>
 <<GRMOD.dotabb>>
+<<GROUP.dotabb>>
 <<HOAGG.dotabb>>
+<<HYPCAT.dotabb>>
 <<IDPC.dotabb>>
-<<LFCAT.dotabb>>
-<<MONAD.dotabb>>
-<<NUMINT.dotabb>>
-<<OPTCAT.dotabb>>
-<<ODECAT.dotabb>>
-<<ORDSET.dotabb>>
-<<PDECAT.dotabb>>
-<<PATMAB.dotabb>>
-<<RRCC.dotabb>>
-<<SEGXCAT.dotabb>>
-<<SGROUP.dotabb>>
-<<SEXCAT.dotabb>>
-<<STEP.dotabb>>
-<<SPACEC.dotabb>>
-<<ABELMON.dotabb>>
-<<BGAGG.dotabb>>
-<<CACHSET.dotabb>>
-<<CLAGG.dotabb>>
-<<DVARCAT.dotabb>>
-<<ES.dotabb>>
-<<GRALG.dotabb>>
+<<IEVALAB.dotabb>>
+<<INS.dotabb>>
+<<INTCAT.dotabb>>
+<<INTDOM.dotabb>>
 <<IXAGG.dotabb>>
-<<MONADWU.dotabb>>
-<<MONOID.dotabb>>
-<<ORDFIN.dotabb>>
-<<RCAGG.dotabb>>
-<<ARR2CAT.dotabb>>
-<<BRAGG.dotabb>>
-<<CABMON.dotabb>>
-<<DIOPS.dotabb>>
-<<DLAGG.dotabb>>
-<<GROUP.dotabb>>
-<<LNAGG.dotabb>>
-<<OASGP.dotabb>>
-<<ORDMON.dotabb>>
-<<PACPERC.dotabb>>
-<<PSETCAT.dotabb>>
-<<PRQAGG.dotabb>>
-<<QUAGG.dotabb>>
-<<SETAGG.dotabb>>
-<<SKAGG.dotabb>>
-<<URAGG.dotabb>>
-<<ABELGRP.dotabb>>
-<<BTCAT.dotabb>>
-<<DIAGG.dotabb>>
-<<DQAGG.dotabb>>
-<<ELAGG.dotabb>>
-<<FLAGG.dotabb>>
-<<FAMONC.dotabb>>
-<<MDAGG.dotabb>>
-<<OAMON.dotabb>>
-<<PERMCAT.dotabb>>
-<<STAGG.dotabb>>
-<<TSETCAT.dotabb>>
-<<FDIVCAT.dotabb>>
-<<FSAGG.dotabb>>
 <<KDAGG.dotabb>>
-<<LZSTAGG.dotabb>>
+<<KOERCE.dotabb>>
+<<KONVERT.dotabb>>
+<<LALG.dotabb>>
+<<LFCAT.dotabb>>
+<<LIECAT.dotabb>>
+<<LINEXP.dotabb>>
 <<LMODULE.dotabb>>
+<<LNAGG.dotabb>>
+<<LODOCAT.dotabb>>
+<<LOGIC.dotabb>>
 <<LSAGG.dotabb>>
+<<LZSTAGG.dotabb>>
+<<MATCAT.dotabb>>
+<<MDAGG.dotabb>>
+<<MLO.dotabb>>
+<<MODULE.dotabb>>
+<<MONAD.dotabb>>
+<<MONADWU.dotabb>>
+<<MONOGEN.dotabb>>
+<<MONOID.dotabb>>
 <<MSETAGG.dotabb>>
+<<MTSCAT.dotabb>>
+<<NAALG.dotabb>>
 <<NARNG.dotabb>>
-<<A1AGG.dotabb>>
-<<OCAMON.dotabb>>
-<<RSETCAT.dotabb>>
-<<RMODULE.dotabb>>
-<<RNG.dotabb>>
-<<BMODULE.dotabb>>
-<<BTAGG.dotabb>>
 <<NASRING.dotabb>>
 <<NTSCAT.dotabb>>
+<<NUMINT.dotabb>>
 <<OAGROUP.dotabb>>
+<<OAMON.dotabb>>
 <<OAMONS.dotabb>>
+<<OASGP.dotabb>>
+<<OC.dotabb>>
+<<OCAMON.dotabb>>
+<<ODECAT.dotabb>>
+<<OINTDOM.dotabb>>
+<<OM.dotabb>>
 <<OMSAGG.dotabb>>
-<<RING.dotabb>>
-<<SFRTCAT.dotabb>>
-<<SRAGG.dotabb>>
-<<TBAGG.dotabb>>
-<<VECTCAT.dotabb>>
-<<ALAGG.dotabb>>
-<<CHARNZ.dotabb>>
-<<CHARZ.dotabb>>
-<<COMRING.dotabb>>
-<<DIFRING.dotabb>>
-<<ENTIRER.dotabb>>
-<<FMCAT.dotabb>>
-<<LALG.dotabb>>
-<<LINEXP.dotabb>>
-<<MODULE.dotabb>>
+<<OPTCAT.dotabb>>
+<<ORDFIN.dotabb>>
+<<ORDMON.dotabb>>
 <<ORDRING.dotabb>>
-<<PDRING.dotabb>>
-<<PTCAT.dotabb>>
-<<RMATCAT.dotabb>>
-<<SNTSCAT.dotabb>>
-<<STRICAT.dotabb>>
+<<ORDSET.dotabb>>
 <<OREPCAT.dotabb>>
-<<XALG.dotabb>>
-<<ALGEBRA.dotabb>>
-<<DIFEXT.dotabb>>
-<<FLINEXP.dotabb>>
-<<LIECAT.dotabb>>
-<<LODOCAT.dotabb>>
-<<NAALG.dotabb>>
-<<VSPACE.dotabb>>
-<<XFALG.dotabb>>
-<<DIVRING.dotabb>>
-<<FINAALG.dotabb>>
-<<FLALG.dotabb>>
-<<INTDOM.dotabb>>
-<<MLO.dotabb>>
-<<OC.dotabb>>
-<<QUATCAT.dotabb>>
-<<SMATCAT.dotabb>>
-<<XPOLYC.dotabb>>
-<<AMR.dotabb>>
-<<FMTC.dotabb>>
-<<FRNAALG.dotabb>>
-<<GCDDOM.dotabb>>
-<<OINTDOM.dotabb>>
-<<FAMR.dotabb>>
-<<INTCAT.dotabb>>
-<<PSCAT.dotabb>>
-<<PID.dotabb>>
-<<UFD.dotabb>>
-<<EUCDOM.dotabb>>
-<<MTSCAT.dotabb>>
-<<PFECAT.dotabb>>
-<<UPSCAT.dotabb>>
-<<FIELD.dotabb>>
-<<INS.dotabb>>
+<<PACFFC.dotabb>>
+<<PACPERC.dotabb>>
+<<PACRATC.dotabb>>
 <<PADICCT.dotabb>>
+<<PATAB.dotabb>>
+<<PATMAB.dotabb>>
+<<PDECAT.dotabb>>
+<<PDRING.dotabb>>
+<<PERMCAT.dotabb>>
+<<PFECAT.dotabb>>
+<<PID.dotabb>>
 <<POLYCAT.dotabb>>
-<<UTSCAT.dotabb>>
-<<ACF.dotabb>>
-<<DPOLCAT.dotabb>>
-<<DIRPCAT.dotabb>>
-<<FPC.dotabb>>
-<<FINRALG.dotabb>>
-<<FS.dotabb>>
-<<MATCAT.dotabb>>
+<<PPCURVE.dotabb>>
+<<PRIMCAT.dotabb>>
+<<PRQAGG.dotabb>>
+<<PRSPCAT.dotabb>>
+<<PSCAT.dotabb>>
+<<PSCURVE.dotabb>>
+<<PSETCAT.dotabb>>
+<<PTCAT.dotabb>>
+<<PTRANFN.dotabb>>
 <<QFCAT.dotabb>>
+<<QUAGG.dotabb>>
+<<QUATCAT.dotabb>>
+<<RADCAT.dotabb>>
+<<RCAGG.dotabb>>
 <<RCFIELD.dotabb>>
+<<REAL.dotabb>>
+<<RETRACT.dotabb>>
+<<RING.dotabb>>
+<<RMATCAT.dotabb>>
+<<RMODULE.dotabb>>
+<<RNG.dotabb>>
 <<RNS.dotabb>>
 <<RPOLCAT.dotabb>>
+<<RRCC.dotabb>>
+<<RSETCAT.dotabb>>
+<<SEGCAT.dotabb>>
+<<SEGXCAT.dotabb>>
+<<SETAGG.dotabb>>
+<<SETCAT.dotabb>>
+<<SETCATD.dotabb>>
+<<SEXCAT.dotabb>>
+<<SFRTCAT.dotabb>>
+<<SGROUP.dotabb>>
+<<SKAGG.dotabb>>
+<<SMATCAT.dotabb>>
+<<SNTSCAT.dotabb>>
+<<SPACEC.dotabb>>
+<<SPFCAT.dotabb>>
+<<SRAGG.dotabb>>
+<<STAGG.dotabb>>
+<<STEP.dotabb>>
+<<STRICAT.dotabb>>
+<<TBAGG.dotabb>>
+<<TRANFUN.dotabb>>
+<<TRIGCAT.dotabb>>
+<<TSETCAT.dotabb>>
+<<TYPE.dotabb>>
+<<UFD.dotabb>>
 <<ULSCAT.dotabb>>
-<<UPXSCAT.dotabb>>
-<<UPOLYC.dotabb>>
-<<ACFS.dotabb>>
-<<XF.dotabb>>
-<<FFIELDC.dotabb>>
-<<FPS.dotabb>>
-<<FRAMALG.dotabb>>
 <<ULSCCAT.dotabb>>
+<<UPOLYC.dotabb>>
+<<UPSCAT.dotabb>>
+<<UPXSCAT.dotabb>>
 <<UPXSCCA.dotabb>>
-<<FAXF.dotabb>>
-<<MONOGEN.dotabb>>
-<<COMPCAT.dotabb>>
-<<FFCAT.dotabb>>
-<<PACFFC.dotabb>>
-<<PACRATC.dotabb>>
+<<URAGG.dotabb>>
+<<UTSCAT.dotabb>>
+<<VECTCAT.dotabb>>
+<<VSPACE.dotabb>>
+<<XALG.dotabb>>
+<<XF.dotabb>>
+<<XFALG.dotabb>>
+<<XPOLYC.dotabb>>
 }
 @
 <<dotfull>>=
@@ -76476,214 +76729,216 @@ digraph dotfull {
  node [shape=box, color=white, style=filled];
 
 <<CATEGORY.dotfull>>
+<<A1AGG.dotfull>>
+<<ABELGRP.dotfull>>
+<<ABELMON.dotfull>>
+<<ABELSG.dotfull>>
+<<ACF.dotfull>>
+<<ACFS.dotfull>>
+<<AGG.dotfull>>
 <<AHYP.dotfull>>
+<<ALAGG.dotfull>>
+<<ALGEBRA.dotfull>>
+<<AMR.dotfull>>
+<<ARR2CAT.dotfull>>
 <<ATRIG.dotfull>>
 <<ATTREG.dotfull>>
 <<BASTYPE.dotfull>>
-<<KOERCE.dotfull>>
+<<BGAGG.dotfull>>
+<<BLMETCT.dotfull>>
+<<BMODULE.dotfull>>
+<<BRAGG.dotfull>>
+<<BTAGG.dotfull>>
+<<BTCAT.dotfull>>
+<<CABMON.dotfull>>
+<<CACHSET.dotfull>>
 <<CFCAT.dotfull>>
-<<KONVERT.dotfull>>
+<<CHARNZ.dotfull>>
+<<CHARZ.dotfull>>
+<<CLAGG.dotfull>>
+<<COMBOPC.dotfull>>
+<<COMPCAT.dotfull>>
+<<COMRING.dotfull>>
+<<DIAGG.dotfull>>
+<<DIFEXT.dotfull>>
+<<DIFRING.dotfull>>
+<<DIOPS.dotfull>>
+<<DIRPCAT.dotfull>>
+<<DIVRING.dotfull>>
+<<DLAGG.dotfull>>
+<<DPOLCAT.dotfull>>
+<<DQAGG.dotfull>>
+<<DVARCAT.dotfull>>
+<<ELAGG.dotfull>>
 <<ELEMFUN.dotfull>>
 <<ELTAB.dotfull>>
-<<HYPCAT.dotfull>>
-<<IEVALAB.dotfull>>
-<<OM.dotfull>>
-<<PTRANFN.dotfull>>
-<<PATAB.dotfull>>
-<<PRIMCAT.dotfull>>
-<<RADCAT.dotfull>>
-<<RETRACT.dotfull>>
-<<SPFCAT.dotfull>>
-<<TRIGCAT.dotfull>>
-<<TYPE.dotfull>>
-<<AGG.dotfull>>
-<<COMBOPC.dotfull>>
 <<ELTAGG.dotfull>>
+<<ENTIRER.dotfull>>
+<<ES.dotfull>>
+<<EUCDOM.dotfull>>
 <<EVALAB.dotfull>>
-<<FORTCAT.dotfull>>
-<<FRETRCT.dotfull>>
-<<FPATMAB.dotfull>>
-<<LOGIC.dotfull>>
-<<PPCURVE.dotfull>>
-<<PSCURVE.dotfull>>
-<<REAL.dotfull>>
-<<SEGCAT.dotfull>>
-<<SETCAT.dotfull>>
-<<TRANFUN.dotfull>>
-<<ABELSG.dotfull>>
-<<BLMETCT.dotfull>>
-<<FORTFN.dotfull>>
-<<FMC.dotfull>>
-<<FMFUN.dotfull>>
-<<FVC.dotfull>>
-<<FVFUN.dotfull>>
+<<FAMONC.dotfull>>
+<<FAMR.dotfull>>
+<<FAXF.dotfull>>
+<<FDIVCAT.dotfull>>
 <<FEVALAB.dotfull>>
+<<FFCAT.dotfull>>
+<<FFIELDC.dotfull>>
+<<FIELD.dotfull>>
 <<FILECAT.dotfull>>
+<<FINAALG.dotfull>>
 <<FINITE.dotfull>>
+<<FINRALG.dotfull>>
+<<FLAGG.dotfull>>
+<<FLALG.dotfull>>
+<<FLINEXP.dotfull>>
+<<FMC.dotfull>>
+<<FMCAT.dotfull>>
+<<FMFUN.dotfull>>
+<<FMTC.dotfull>>
 <<FNCAT.dotfull>>
+<<FORTCAT.dotfull>>
+<<FORTFN.dotfull>>
+<<FPATMAB.dotfull>>
+<<FPC.dotfull>>
+<<FPS.dotfull>>
+<<FRAMALG.dotfull>>
+<<FRETRCT.dotfull>>
+<<FRNAALG.dotfull>>
+<<FS.dotfull>>
+<<FSAGG.dotfull>>
+<<FVC.dotfull>>
+<<FVFUN.dotfull>>
+<<GCDDOM.dotfull>>
+<<GRALG.dotfull>>
 <<GRMOD.dotfull>>
+<<GROUP.dotfull>>
 <<HOAGG.dotfull>>
+<<HYPCAT.dotfull>>
 <<IDPC.dotfull>>
-<<LFCAT.dotfull>>
-<<MONAD.dotfull>>
-<<NUMINT.dotfull>>
-<<OPTCAT.dotfull>>
-<<ODECAT.dotfull>>
-<<ORDSET.dotfull>>
-<<PDECAT.dotfull>>
-<<PATMAB.dotfull>>
-<<RRCC.dotfull>>
-<<SEGXCAT.dotfull>>
-<<SGROUP.dotfull>>
-<<SEXCAT.dotfull>>
-<<STEP.dotfull>>
-<<SPACEC.dotfull>>
-<<ABELMON.dotfull>>
-<<BGAGG.dotfull>>
-<<CACHSET.dotfull>>
-<<CLAGG.dotfull>>
-<<DVARCAT.dotfull>>
-<<ES.dotfull>>
-<<GRALG.dotfull>>
+<<IEVALAB.dotfull>>
+<<INS.dotfull>>
+<<INTCAT.dotfull>>
+<<INTDOM.dotfull>>
 <<IXAGG.dotfull>>
-<<MONADWU.dotfull>>
-<<MONOID.dotfull>>
-<<ORDFIN.dotfull>>
-<<RCAGG.dotfull>>
-<<ARR2CAT.dotfull>>
-<<BRAGG.dotfull>>
-<<CABMON.dotfull>>
-<<DIOPS.dotfull>>
-<<DLAGG.dotfull>>
-<<GROUP.dotfull>>
-<<LNAGG.dotfull>>
-<<OASGP.dotfull>>
-<<ORDMON.dotfull>>
-<<PSETCAT.dotfull>>
-<<PRQAGG.dotfull>>
-<<QUAGG.dotfull>>
-<<SETAGG.dotfull>>
-<<SKAGG.dotfull>>
-<<URAGG.dotfull>>
-<<ABELGRP.dotfull>>
-<<BTCAT.dotfull>>
-<<DIAGG.dotfull>>
-<<DQAGG.dotfull>>
-<<ELAGG.dotfull>>
-<<FLAGG.dotfull>>
-<<FAMONC.dotfull>>
-<<MDAGG.dotfull>>
-<<OAMON.dotfull>>
-<<PERMCAT.dotfull>>
-<<STAGG.dotfull>>
-<<TSETCAT.dotfull>>
-<<FDIVCAT.dotfull>>
-<<FSAGG.dotfull>>
 <<KDAGG.dotfull>>
-<<LZSTAGG.dotfull>>
+<<KOERCE.dotfull>>
+<<KONVERT.dotfull>>
+<<LALG.dotfull>>
+<<LFCAT.dotfull>>
+<<LIECAT.dotfull>>
+<<LINEXP.dotfull>>
 <<LMODULE.dotfull>>
+<<LNAGG.dotfull>>
+<<LODOCAT.dotfull>>
+<<LOGIC.dotfull>>
 <<LSAGG.dotfull>>
+<<LZSTAGG.dotfull>>
+<<MATCAT.dotfull>>
+<<MDAGG.dotfull>>
+<<MLO.dotfull>>
+<<MODULE.dotfull>>
+<<MONAD.dotfull>>
+<<MONADWU.dotfull>>
+<<MONOGEN.dotfull>>
+<<MONOID.dotfull>>
 <<MSETAGG.dotfull>>
+<<MTSCAT.dotfull>>
+<<NAALG.dotfull>>
 <<NARNG.dotfull>>
-<<A1AGG.dotfull>>
-<<OCAMON.dotfull>>
-<<RSETCAT.dotfull>>
-<<RMODULE.dotfull>>
-<<RNG.dotfull>>
-<<BMODULE.dotfull>>
-<<BTAGG.dotfull>>
 <<NASRING.dotfull>>
 <<NTSCAT.dotfull>>
+<<NUMINT.dotfull>>
 <<OAGROUP.dotfull>>
+<<OAMON.dotfull>>
 <<OAMONS.dotfull>>
+<<OASGP.dotfull>>
+<<OC.dotfull>>
+<<OCAMON.dotfull>>
+<<ODECAT.dotfull>>
+<<OINTDOM.dotfull>>
+<<OM.dotfull>>
 <<OMSAGG.dotfull>>
-<<RING.dotfull>>
-<<SFRTCAT.dotfull>>
-<<SRAGG.dotfull>>
-<<TBAGG.dotfull>>
-<<VECTCAT.dotfull>>
-<<ALAGG.dotfull>>
-<<CHARNZ.dotfull>>
-<<CHARZ.dotfull>>
-<<COMRING.dotfull>>
-<<DIFRING.dotfull>>
-<<ENTIRER.dotfull>>
-<<FMCAT.dotfull>>
-<<LALG.dotfull>>
-<<LINEXP.dotfull>>
-<<MODULE.dotfull>>
+<<OPTCAT.dotfull>>
+<<ORDFIN.dotfull>>
+<<ORDMON.dotfull>>
 <<ORDRING.dotfull>>
+<<ORDSET.dotfull>>
+<<OREPCAT.dotfull>>
+<<PACFFC.dotfull>>
 <<PACPERC.dotfull>>
+<<PACRATC.dotfull>>
+<<PADICCT.dotfull>>
+<<PATAB.dotfull>>
+<<PATMAB.dotfull>>
+<<PDECAT.dotfull>>
 <<PDRING.dotfull>>
-<<PTCAT.dotfull>>
-<<RMATCAT.dotfull>>
-<<SNTSCAT.dotfull>>
-<<STRICAT.dotfull>>
-<<OREPCAT.dotfull>>
-<<XALG.dotfull>>
-<<ALGEBRA.dotfull>>
-<<DIFEXT.dotfull>>
-<<FLINEXP.dotfull>>
-<<LIECAT.dotfull>>
-<<LODOCAT.dotfull>>
-<<NAALG.dotfull>>
-<<VSPACE.dotfull>>
-<<XFALG.dotfull>>
-<<DIVRING.dotfull>>
-<<FINAALG.dotfull>>
-<<FLALG.dotfull>>
-<<INTDOM.dotfull>>
-<<MLO.dotfull>>
-<<OC.dotfull>>
-<<QUATCAT.dotfull>>
-<<SMATCAT.dotfull>>
-<<XPOLYC.dotfull>>
-<<AMR.dotfull>>
-<<FMTC.dotfull>>
-<<FRNAALG.dotfull>>
-<<GCDDOM.dotfull>>
-<<OINTDOM.dotfull>>
-<<FAMR.dotfull>>
-<<INTCAT.dotfull>>
-<<PSCAT.dotfull>>
-<<PID.dotfull>>
-<<UFD.dotfull>>
-<<EUCDOM.dotfull>>
-<<MTSCAT.dotfull>>
+<<PERMCAT.dotfull>>
 <<PFECAT.dotfull>>
-<<UPSCAT.dotfull>>
-<<FIELD.dotfull>>
-<<INS.dotfull>>
-<<PADICCT.dotfull>>
+<<PID.dotfull>>
 <<POLYCAT.dotfull>>
-<<UTSCAT.dotfull>>
-<<ACF.dotfull>>
-<<DPOLCAT.dotfull>>
-<<DIRPCAT.dotfull>>
-<<FPC.dotfull>>
-<<FINRALG.dotfull>>
-<<FS.dotfull>>
-<<MATCAT.dotfull>>
+<<PPCURVE.dotfull>>
+<<PRIMCAT.dotfull>>
+<<PRQAGG.dotfull>>
+<<PRSPCAT.dotfull>>
+<<PSCAT.dotfull>>
+<<PSCURVE.dotfull>>
+<<PSETCAT.dotfull>>
+<<PTCAT.dotfull>>
+<<PTRANFN.dotfull>>
 <<QFCAT.dotfull>>
+<<QUAGG.dotfull>>
+<<QUATCAT.dotfull>>
+<<RADCAT.dotfull>>
+<<RCAGG.dotfull>>
 <<RCFIELD.dotfull>>
+<<REAL.dotfull>>
+<<RETRACT.dotfull>>
+<<RING.dotfull>>
+<<RMATCAT.dotfull>>
+<<RMODULE.dotfull>>
+<<RNG.dotfull>>
 <<RNS.dotfull>>
 <<RPOLCAT.dotfull>>
+<<RRCC.dotfull>>
+<<RSETCAT.dotfull>>
+<<SEGCAT.dotfull>>
+<<SEGXCAT.dotfull>>
+<<SETAGG.dotfull>>
+<<SETCAT.dotfull>>
+<<SETCATD.dotfull>>
+<<SEXCAT.dotfull>>
+<<SFRTCAT.dotfull>>
+<<SGROUP.dotfull>>
+<<SKAGG.dotfull>>
+<<SMATCAT.dotfull>>
+<<SNTSCAT.dotfull>>
+<<SPACEC.dotfull>>
+<<SPFCAT.dotfull>>
+<<SRAGG.dotfull>>
+<<STAGG.dotfull>>
+<<STEP.dotfull>>
+<<STRICAT.dotfull>>
+<<TBAGG.dotfull>>
+<<TRANFUN.dotfull>>
+<<TRIGCAT.dotfull>>
+<<TSETCAT.dotfull>>
+<<TYPE.dotfull>>
+<<UFD.dotfull>>
 <<ULSCAT.dotfull>>
-<<UPXSCAT.dotfull>>
-<<UPOLYC.dotfull>>
-<<ACFS.dotfull>>
-<<XF.dotfull>>
-<<FFIELDC.dotfull>>
-<<FPS.dotfull>>
-<<FRAMALG.dotfull>>
 <<ULSCCAT.dotfull>>
+<<UPOLYC.dotfull>>
+<<UPSCAT.dotfull>>
+<<UPXSCAT.dotfull>>
 <<UPXSCCA.dotfull>>
-<<FAXF.dotfull>>
-<<MONOGEN.dotfull>>
-<<COMPCAT.dotfull>>
-<<FFCAT.dotfull>>
-<<PACFFC.dotfull>>
-<<PACRATC.dotfull>>
+<<URAGG.dotfull>>
+<<UTSCAT.dotfull>>
+<<VECTCAT.dotfull>>
+<<VSPACE.dotfull>>
+<<XALG.dotfull>>
+<<XF.dotfull>>
+<<XFALG.dotfull>>
+<<XPOLYC.dotfull>>
 }
 @
 \eject
diff --git a/books/bookvol5.pamphlet b/books/bookvol5.pamphlet
index 53344ff..d9fe6ae 100644
--- a/books/bookvol5.pamphlet
+++ b/books/bookvol5.pamphlet
@@ -24479,6 +24479,7 @@ otherwise the new algebra won't be loaded by the interpreter when needed.
    (|PrimitiveFunctionCategory| . PRIMCAT)
    (|PrincipalIdealDomain| . PID)
    (|PriorityQueueAggregate| . PRQAGG)
+   (|ProjectiveSpaceCategory| . PRSPCAT)
    (|PseudoAlgebraicClosureofAlgExtOfRationalNumberCategory| . PACEXTC)
    (|PseudoAlgebraicClosureOfFiniteField| . PACOFF)
    (|PseudoAlgebraicClosureOfFiniteFieldCategory| . PACFFC)
diff --git a/books/ps/v102projectivespacecategory.ps b/books/ps/v102projectivespacecategory.ps
new file mode 100644
index 0000000..8b39f5c
--- /dev/null
+++ b/books/ps/v102projectivespacecategory.ps
@@ -0,0 +1,540 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%Creator: Graphviz version 2.20.2 (Mon Mar 30 10:09:11 UTC 2009)
+%%For: (root) root
+%%Title: pic
+%%Pages: (atend)
+%%BoundingBox: (atend)
+%%EndComments
+save
+%%BeginProlog
+/DotDict 200 dict def
+DotDict begin
+
+/setupLatin1 {
+mark
+/EncodingVector 256 array def
+ EncodingVector 0
+
+ISOLatin1Encoding 0 255 getinterval putinterval
+EncodingVector 45 /hyphen put
+
+% Set up ISO Latin 1 character encoding
+/starnetISO {
+        dup dup findfont dup length dict begin
+        { 1 index /FID ne { def }{ pop pop } ifelse
+        } forall
+        /Encoding EncodingVector def
+        currentdict end definefont
+} def
+/Times-Roman starnetISO def
+/Times-Italic starnetISO def
+/Times-Bold starnetISO def
+/Times-BoldItalic starnetISO def
+/Helvetica starnetISO def
+/Helvetica-Oblique starnetISO def
+/Helvetica-Bold starnetISO def
+/Helvetica-BoldOblique starnetISO def
+/Courier starnetISO def
+/Courier-Oblique starnetISO def
+/Courier-Bold starnetISO def
+/Courier-BoldOblique starnetISO def
+cleartomark
+} bind def
+
+%%BeginResource: procset graphviz 0 0
+/coord-font-family /Times-Roman def
+/default-font-family /Times-Roman def
+/coordfont coord-font-family findfont 8 scalefont def
+
+/InvScaleFactor 1.0 def
+/set_scale {
+       dup 1 exch div /InvScaleFactor exch def
+       scale
+} bind def
+
+% styles
+/solid { [] 0 setdash } bind def
+/dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def
+/dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def
+/invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def
+/bold { 2 setlinewidth } bind def
+/filled { } bind def
+/unfilled { } bind def
+/rounded { } bind def
+/diagonals { } bind def
+
+% hooks for setting color 
+/nodecolor { sethsbcolor } bind def
+/edgecolor { sethsbcolor } bind def
+/graphcolor { sethsbcolor } bind def
+/nopcolor {pop pop pop} bind def
+
+/beginpage {	% i j npages
+	/npages exch def
+	/j exch def
+	/i exch def
+	/str 10 string def
+	npages 1 gt {
+		gsave
+			coordfont setfont
+			0 0 moveto
+			(\() show i str cvs show (,) show j str cvs show (\)) show
+		grestore
+	} if
+} bind def
+
+/set_font {
+	findfont exch
+	scalefont setfont
+} def
+
+% draw text fitted to its expected width
+/alignedtext {			% width text
+	/text exch def
+	/width exch def
+	gsave
+		width 0 gt {
+			[] 0 setdash
+			text stringwidth pop width exch sub text length div 0 text ashow
+		} if
+	grestore
+} def
+
+/boxprim {				% xcorner ycorner xsize ysize
+		4 2 roll
+		moveto
+		2 copy
+		exch 0 rlineto
+		0 exch rlineto
+		pop neg 0 rlineto
+		closepath
+} bind def
+
+/ellipse_path {
+	/ry exch def
+	/rx exch def
+	/y exch def
+	/x exch def
+	matrix currentmatrix
+	newpath
+	x y translate
+	rx ry scale
+	0 0 1 0 360 arc
+	setmatrix
+} bind def
+
+/endpage { showpage } bind def
+/showpage { } def
+
+/layercolorseq
+	[	% layer color sequence - darkest to lightest
+		[0 0 0]
+		[.2 .8 .8]
+		[.4 .8 .8]
+		[.6 .8 .8]
+		[.8 .8 .8]
+	]
+def
+
+/layerlen layercolorseq length def
+
+/setlayer {/maxlayer exch def /curlayer exch def
+	layercolorseq curlayer 1 sub layerlen mod get
+	aload pop sethsbcolor
+	/nodecolor {nopcolor} def
+	/edgecolor {nopcolor} def
+	/graphcolor {nopcolor} def
+} bind def
+
+/onlayer { curlayer ne {invis} if } def
+
+/onlayers {
+	/myupper exch def
+	/mylower exch def
+	curlayer mylower lt
+	curlayer myupper gt
+	or
+	{invis} if
+} def
+
+/curlayer 0 def
+
+%%EndResource
+%%EndProlog
+%%BeginSetup
+14 default-font-family set_font
+1 setmiterlimit
+% /arrowlength 10 def
+% /arrowwidth 5 def
+
+% make sure pdfmark is harmless for PS-interpreters other than Distiller
+/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse
+% make '<<' and '>>' safe on PS Level 1 devices
+/languagelevel where {pop languagelevel}{1} ifelse
+2 lt {
+    userdict (<<) cvn ([) cvn load put
+    userdict (>>) cvn ([) cvn load put
+} if
+
+%%EndSetup
+setupLatin1
+%%Page: 1 1
+%%PageBoundingBox: 36 36 358 440
+%%PageOrientation: Portrait
+0 0 1 beginpage
+gsave
+36 36 322 404 boxprim clip newpath
+1 1 set_scale 0 rotate 40 40 translate
+% ProjectiveSpaceCategory()
+gsave
+0.537 0.247 0.902 nodecolor
+newpath 224 396 moveto
+26 396 lineto
+26 360 lineto
+224 360 lineto
+closepath fill
+1 setlinewidth
+filled
+0.537 0.247 0.902 nodecolor
+newpath 224 396 moveto
+26 396 lineto
+26 360 lineto
+224 360 lineto
+closepath stroke
+0.000 0.000 0.000 nodecolor
+14 /Times-Roman set_font
+34 373.9 moveto 182 (ProjectiveSpaceCategory\(\)) alignedtext
+grestore
+% SetCategoryWithDegree()
+gsave
+0.537 0.247 0.902 nodecolor
+newpath 223 324 moveto
+27 324 lineto
+27 288 lineto
+223 288 lineto
+closepath fill
+1 setlinewidth
+filled
+0.537 0.247 0.902 nodecolor
+newpath 223 324 moveto
+27 324 lineto
+27 288 lineto
+223 288 lineto
+closepath stroke
+0.000 0.000 0.000 nodecolor
+14 /Times-Roman set_font
+34.5 301.9 moveto 181 (SetCategoryWithDegree\(\)) alignedtext
+grestore
+% ProjectiveSpaceCategory()->SetCategoryWithDegree()
+gsave
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 125 360 moveto
+125 352 125 343 125 334 curveto
+stroke
+0.000 0.000 0.000 edgecolor
+newpath 128.5 334 moveto
+125 324 lineto
+121.5 334 lineto
+closepath fill
+1 setlinewidth
+solid
+0.000 0.000 0.000 edgecolor
+newpath 128.5 334 moveto
+125 324 lineto
+121.5 334 lineto
+closepath stroke
+grestore
+% BasicType()
+gsave
+0.537 0.247 0.902 nodecolor
+newpath 92 180 moveto
+0 180 lineto
+0 144 lineto
+92 144 lineto
+closepath fill
+1 setlinewidth
+filled
+0.537 0.247 0.902 nodecolor
+newpath 92 180 moveto
+0 180 lineto
+0 144 lineto
+92 144 lineto
+closepath stroke
+0.000 0.000 0.000 nodecolor
+14 /Times-Roman set_font
+7.5 157.9 moveto 77 (BasicType\(\)) alignedtext
+grestore
+% SetCategoryWithDegree()->BasicType()
+gsave
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 95 288 moveto
+82 279 68 266 60 252 curveto
+50 233 47 209 46 190 curveto
+stroke
+0.000 0.000 0.000 edgecolor
+newpath 49.48 189.6 moveto
+45 180 lineto
+42.51 190.3 lineto
+closepath fill
+1 setlinewidth
+solid
+0.000 0.000 0.000 edgecolor
+newpath 49.48 189.6 moveto
+45 180 lineto
+42.51 190.3 lineto
+closepath stroke
+grestore
+% CoercibleTo(OutputForm)
+gsave
+0.404 0.667 0.545 nodecolor
+newpath 298 180 moveto
+110 180 lineto
+110 144 lineto
+298 144 lineto
+closepath fill
+1 setlinewidth
+filled
+0.404 0.667 0.545 nodecolor
+newpath 298 180 moveto
+110 180 lineto
+110 144 lineto
+298 144 lineto
+closepath stroke
+0.000 0.000 0.000 nodecolor
+14 /Times-Roman set_font
+117.5 157.9 moveto 173 (CoercibleTo\(OutputForm\)) alignedtext
+grestore
+% SetCategoryWithDegree()->CoercibleTo(OutputForm)
+gsave
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 155 288 moveto
+167 279 181 266 190 252 curveto
+200 233 203 209 204 190 curveto
+stroke
+0.000 0.000 0.000 edgecolor
+newpath 207.49 190.3 moveto
+205 180 lineto
+200.52 189.6 lineto
+closepath fill
+1 setlinewidth
+solid
+0.000 0.000 0.000 edgecolor
+newpath 207.49 190.3 moveto
+205 180 lineto
+200.52 189.6 lineto
+closepath stroke
+grestore
+% SetCategory()
+gsave
+0.537 0.247 0.902 nodecolor
+newpath 181 252 moveto
+69 252 lineto
+69 216 lineto
+181 216 lineto
+closepath fill
+1 setlinewidth
+filled
+0.537 0.247 0.902 nodecolor
+newpath 181 252 moveto
+69 252 lineto
+69 216 lineto
+181 216 lineto
+closepath stroke
+0.000 0.000 0.000 nodecolor
+14 /Times-Roman set_font
+76.5 229.9 moveto 97 (SetCategory\(\)) alignedtext
+grestore
+% SetCategoryWithDegree()->SetCategory()
+gsave
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 125 288 moveto
+125 280 125 271 125 262 curveto
+stroke
+0.000 0.000 0.000 edgecolor
+newpath 128.5 262 moveto
+125 252 lineto
+121.5 262 lineto
+closepath fill
+1 setlinewidth
+solid
+0.000 0.000 0.000 edgecolor
+newpath 128.5 262 moveto
+125 252 lineto
+121.5 262 lineto
+closepath stroke
+grestore
+% Category
+gsave
+0.537 0.247 0.902 nodecolor
+newpath 171 36 moveto
+93 36 lineto
+93 0 lineto
+171 0 lineto
+closepath fill
+1 setlinewidth
+filled
+0.537 0.247 0.902 nodecolor
+newpath 171 36 moveto
+93 36 lineto
+93 0 lineto
+171 0 lineto
+closepath stroke
+0.000 0.000 0.000 nodecolor
+14 /Times-Roman set_font
+100.5 13.9 moveto 63 (Category) alignedtext
+grestore
+% BasicType()->Category
+gsave
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 57 144 moveto
+71 119 99 74 116 45 curveto
+stroke
+0.000 0.000 0.000 edgecolor
+newpath 119.2 46.44 moveto
+121 36 lineto
+113.08 43.04 lineto
+closepath fill
+1 setlinewidth
+solid
+0.000 0.000 0.000 edgecolor
+newpath 119.2 46.44 moveto
+121 36 lineto
+113.08 43.04 lineto
+closepath stroke
+grestore
+% CoercibleTo(a:Type)
+gsave
+0.537 0.247 0.902 nodecolor
+newpath 264 108 moveto
+116 108 lineto
+116 72 lineto
+264 72 lineto
+closepath fill
+1 setlinewidth
+filled
+0.537 0.247 0.902 nodecolor
+newpath 264 108 moveto
+116 108 lineto
+116 72 lineto
+264 72 lineto
+closepath stroke
+0.000 0.000 0.000 nodecolor
+14 /Times-Roman set_font
+123.5 85.9 moveto 133 (CoercibleTo\(a:Type\)) alignedtext
+grestore
+% CoercibleTo(OutputForm)->CoercibleTo(a:Type)
+gsave
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 200 144 moveto
+199 136 197 127 195 118 curveto
+stroke
+0.000 0.000 0.000 edgecolor
+newpath 198.39 117.12 moveto
+193 108 lineto
+191.53 118.49 lineto
+closepath fill
+1 setlinewidth
+solid
+0.000 0.000 0.000 edgecolor
+newpath 198.39 117.12 moveto
+193 108 lineto
+191.53 118.49 lineto
+closepath stroke
+grestore
+% SetCategory()->BasicType()
+gsave
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 105 216 moveto
+95 207 84 197 74 187 curveto
+stroke
+0.000 0.000 0.000 edgecolor
+newpath 75.83 183.95 moveto
+66 180 lineto
+71.22 189.22 lineto
+closepath fill
+1 setlinewidth
+solid
+0.000 0.000 0.000 edgecolor
+newpath 75.83 183.95 moveto
+66 180 lineto
+71.22 189.22 lineto
+closepath stroke
+grestore
+% SetCategory()->CoercibleTo(OutputForm)
+gsave
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 145 216 moveto
+155 207 166 197 176 187 curveto
+stroke
+0.000 0.000 0.000 edgecolor
+newpath 178.78 189.22 moveto
+184 180 lineto
+174.17 183.95 lineto
+closepath fill
+1 setlinewidth
+solid
+0.000 0.000 0.000 edgecolor
+newpath 178.78 189.22 moveto
+184 180 lineto
+174.17 183.95 lineto
+closepath stroke
+grestore
+% CoercibleTo(a:Type)->Category
+gsave
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 175 72 moveto
+168 63 160 53 152 44 curveto
+stroke
+0.000 0.000 0.000 edgecolor
+newpath 154.8 41.9 moveto
+146 36 lineto
+149.2 46.1 lineto
+closepath fill
+1 setlinewidth
+solid
+0.000 0.000 0.000 edgecolor
+newpath 154.8 41.9 moveto
+146 36 lineto
+149.2 46.1 lineto
+closepath stroke
+grestore
+% Package
+gsave
+0.333 1.000 0.933 nodecolor
+newpath 314 396 moveto
+242 396 lineto
+242 360 lineto
+314 360 lineto
+closepath fill
+1 setlinewidth
+filled
+0.333 1.000 0.933 nodecolor
+newpath 314 396 moveto
+242 396 lineto
+242 360 lineto
+314 360 lineto
+closepath stroke
+0.000 0.000 0.000 nodecolor
+14 /Times-Roman set_font
+250 373.9 moveto 56 (Package) alignedtext
+grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+%%BoundingBox: 36 36 358 440
+end
+restore
+%%EOF
diff --git a/changelog b/changelog
index 64364e0..8769e0a 100644
--- a/changelog
+++ b/changelog
@@ -1,3 +1,8 @@
+20100515 tpd src/axiom-website/patches.html 20100515.01.tpd.patch
+20100515 tpd src/algebra/Makefile help and test files for PRSPCAT
+20100515 tpd books/bookvol5 expose ProjectiveSpaceCategory
+20100515 tpd books/bookvol10.2 add ProjectiveSpaceCategory
+20100515 tpd books/ps/v102projectivespacecategory.ps added
 20100514 tpd src/axiom-website/patches.html 20100514.03.tpd.patch
 20100514 tpd books/bookvolbib Buh05 DLMF Mah05 Sei95 Seixx Sch92 SCC92 WJST90
 20100514 tpd src/axiom-website/patches.html 20100514.02.tpd.patch
diff --git a/src/algebra/Makefile.pamphlet b/src/algebra/Makefile.pamphlet
index 5f18538..590fce4 100644
--- a/src/algebra/Makefile.pamphlet
+++ b/src/algebra/Makefile.pamphlet
@@ -808,6 +808,7 @@ LAYER2=\
   ${OUT}/NARNG.o    ${OUT}/NARNG-.o   ${OUT}/NSUP2.o    ${OUT}/OASGP.o    \
   ${OUT}/ODVAR.o    ${OUT}/OPQUERY.o  ${OUT}/ORDFIN.o   ${OUT}/ORDMON.o   \
   ${OUT}/PATMATCH.o ${OUT}/PERMCAT.o  ${OUT}/PDRING.o   ${OUT}/PDRING-.o  \
+  ${OUT}/PRSPCAT.o  \
   ${OUT}/SDVAR.o    ${OUT}/SEGXCAT.o  ${OUT}/SUP2.o     ${OUT}/TRIGCAT.o  \
   ${OUT}/TRIGCAT-.o ${OUT}/ULS2.o     ${OUT}/UP2.o \
   layer2done
@@ -1191,6 +1192,11 @@ LAYER2=\
 /*"RNG" -> "KOERCE"*/
 "RNG" -> "SGROUP"
 
+"PRSPCAT" [color="#4488FF",href="bookvol10.2.pdf#nameddest=PRSPCAT",
+          shape=ellipse]
+"PRSPCAT" -> "SETCATD"
+/*"PRSPCAT" -> {"SETCAT"; "BASTYPE"; "KOERCE"}*/
+
 "SDVAR" [color="#88FF44",href="bookvol10.3.pdf#nameddest=SDVAR"]
 /*"SDVAR" -> "DVARCAT"*/
 "SDVAR" -> "ORDSET"
@@ -16248,6 +16254,21 @@ ${MID}/BLHN.nrlib/code.o: ${MID}/BLHN.spad
 	      | ${INTERPSYS} >${TMP}/trace ; \
 	   fi )
 @
+<<newcode>>=
+
+PRSPCATDEPS = SETCATD
+
+${MID}/PRSPCAT.nrlib/code.o: ${MID}/PRSPCAT.spad
+	@echo P3 making ${MID}/PRSPCAT.nrlib/code.o from ${MID}/PRSPCAT.spad
+	@ (cd ${MID} ; \
+	   if [ -z "${NOISE}" ] ; then \
+	    echo -e ")lib ${PRSPCATDEPS} \n )co PRSPCAT.spad" \
+              | ${INTERPSYS} ; \
+           else \
+	    echo -e ")lib ${PRSPCATDEPS} \n )co PRSPCAT.spad" \
+	      | ${INTERPSYS} >${TMP}/trace ; \
+	   fi )
+@
 
 \section{Broken Files}
 These files are Aldor files
@@ -17067,6 +17088,7 @@ SPADHELP=\
  ${HELP}/Permutation.help \
  ${HELP}/Polynomial.help \
  ${HELP}/Product.help \
+ ${HELP}/ProjectiveSpaceCategory.help \
  ${HELP}/PseudoAlgebraicClosureOfAlgExtOfRationalNumberCategory.help \
  ${HELP}/PseudoAlgebraicClosureOfFiniteField.help \
  ${HELP}/PseudoAlgebraicClosureOfFiniteFieldCategory.help \
@@ -17230,6 +17252,7 @@ REGRESS= \
  Plot.regress \
  Polynomial.regress \
  Product.regress \
+ ProjectiveSpaceCategory.regress \
  PseudoAlgebraicClosureOfAlgExtOfRationalNumberCategory.regress \
  PseudoAlgebraicClosureOfFiniteField.regress \
  PseudoAlgebraicClosureOfFiniteFieldCategory.regress \
@@ -18510,6 +18533,18 @@ ${HELP}/Product.help: ${BOOKS}/bookvol10.3.pamphlet
             >${INPUT}/Product.input
 	@echo "Product (PRODUCT)" >>${HELPFILE}
 
+${HELP}/ProjectiveSpaceCategory.help: ${BOOKS}/bookvol10.2.pamphlet
+	@echo 7937 create ProjectiveSpaceCategory.help from \
+           ${BOOKS}/bookvol10.2.pamphlet
+	@${TANGLE} -R"ProjectiveSpaceCategory.help" \
+           ${BOOKS}/bookvol10.2.pamphlet \
+           >${HELP}/ProjectiveSpaceCategory.help
+	@cp ${HELP}/ProjectiveSpaceCategory.help ${HELP}/PRSPCAT.help
+	@${TANGLE} -R"ProjectiveSpaceCategory.input" \
+          ${BOOKS}/bookvol10.2.pamphlet \
+          >${INPUT}/ProjectiveSpaceCategory.input
+	@echo "ProjectiveSpaceCategory (PRSPCAT)" >>${HELPFILE}
+
 ${HELP}/PseudoAlgebraicClosureOfAlgExtOfRationalNumberCategory.help: \
             ${BOOKS}/bookvol10.2.pamphlet
 	@echo 7000 create \
diff --git a/src/axiom-website/patches.html b/src/axiom-website/patches.html
index ea38458..483d56c 100644
--- a/src/axiom-website/patches.html
+++ b/src/axiom-website/patches.html
@@ -2715,5 +2715,7 @@ books/bookvol10.3 add BlowUpWithHamburgerNoether<br/>
 books/bookvol10.2 add SetCategoryWithDegree<br/>
 <a href="patches/20100514.03.tpd.patch">20100514.03.tpd.patch</a>
 books/bookvolbib Buh05 DLMF Mah05 Sei95 Seixx Sch92 SCC92 WJST90
+<a href="patches/20100515.01.tpd.patch">20100515.01.tpd.patch</a>
+books/bookvol10.2 add ProjectiveSpaceCategory<br/>
  </body>
 </html>
