diff --git a/books/bookvol10.4.pamphlet b/books/bookvol10.4.pamphlet
index 62d73be..a89816d 100644
--- a/books/bookvol10.4.pamphlet
+++ b/books/bookvol10.4.pamphlet
@@ -152427,6 +152427,211 @@ TranscendentalManipulations(R, F): Exports == Implementation where
     smplog p      == map(logexpand, (r1:R):F +-> r1::F, p)
     smp2htrigs p  == map((k1:K):F +-> htrigs(k1::F), (r1:R):F +-> r1::F, p)
 
+\end{chunk}
+\subsection{The htrigs function}
+The htrigs function can be used to replace and reduce hyperbolic
+trigonometric identities.
+
+The identity for $sinh(x)$ is $(exp(x) - exp(-x))/2$
+
+If we difference these we should get zero
+\begin{verbatim}
+    f := sinh(x) - (exp(x) - exp(-x))/2
+\end{verbatim}
+instead, by default, we get
+\begin{verbatim}
+                x     -x
+   2sinh(x) - %e  + %e
+   ---------------------
+              2
+\end{verbatim}
+The function htrigs(f) gives 0
+
+This works as follows:
+\begin{verbatim}   
+     m:=mainKernel f => sinh(x)
+                   Type: Union(Kernel(Expression(Integer)),...)
+\end{verbatim}   
+which is coerced to the first part of the union:
+\begin{verbatim}   
+     k:=m::Kernel(Expression(Integer))
+\end{verbatim}   
+and the operator is extracted:
+\begin{verbatim}   
+     op:=operator(k) => sinh
+                              Type: BasicOperator
+\end{verbatim}   
+The argument function extracts the variable used as arguments:
+\begin{verbatim}   
+     argument k ==> [x]
+                              Type Kernel(Expression(Integer))
+\end{verbatim}   
+At this point we have picked apart the main Kernel into its
+operator and its arguments. We now process the list of arguments.
+
+The function htrigs is called on every element of the argument list, 
+which in this case, returns a list:
+\begin{verbatim}   
+     arg:=[htrigs x for x in argument k]$List(Expression(Integer))
+           => [x]
+                       Type: List(Expression(Integer))
+\end{verbatim}   
+We form a polynomial by replacing the kernel in the numerator with ?
+\begin{verbatim}   
+     num := univariate(numer f, k)
+  
+                x      -x
+         2? - %e   + %e
+                        Type: SparseUnivariatePolynomial(
+                                SparseMultivariatePolynomial(
+                                  Integer, Kernel(Expression(Integer))))
+\end{verbatim}   
+and a polynomial of the denominator, replacing the kernel
+\begin{verbatim}   
+     den := univariate(denom f, k)
+  
+        2
+                        Type: SparseUnivariatePolynomial(
+                                SparseMultivariatePolynomial(
+                                  Integer, Kernel(Expression(Integer))))
+\end{verbatim}   
+In this case the op is not the exponential so we are doing straight
+trig substitution. We reconstruct the function call using the op
+and arg values, that is:
+\begin{verbatim}   
+     g1 := op arg ==> sinh(x)
+                                Type: Expression(Integer)
+\end{verbatim}   
+So sup2htrigs, which is a local function, is used to simplify the
+parts of the fraction. In this case, 
+\begin{verbatim}   
+    sup2htrigs(num, g1:= op arg) ==> 0
+                                Type: Expression(Integer)
+
+    sup2htrigs(den, g1) ==> 2
+                                Type: Expression(Integer)
+\end{verbatim}   
+Thus, the result is 0
+
+The identity for $cosh(x)$ is $(exp(x) + exp(-x))/2$
+
+If we difference these we should get zero
+\begin{verbatim}   
+     f := cosh(x) - (%e^x + %e^-x)/2
+\end{verbatim}   
+instead, by default, we get
+\begin{verbatim}   
+         x      - x
+     - %e   + %e    + 2cosh(x)
+     -------------------------
+                  2
+\end{verbatim}   
+and the function call $htrigs(f)$ gives 0
+
+This works as follows:
+\begin{verbatim}   
+                          x
+     m:=mainKernel f => %e
+                         Type: Union(Kernel(Expression(Integer)),...)
+\end{verbatim}   
+which is coerced to the first part of the union:
+\begin{verbatim}   
+                                            x
+     k:=m::Kernel(Expression(Integer)) => %e
+                         Type: Kernel(Expression(Integer))
+\end{verbatim}   
+and the operator is extracted:
+\begin{verbatim}   
+     op:=operator(k) => exp
+                              Type: BasicOperator
+\end{verbatim}   
+The argument function extracts the variable used as arguments:
+\begin{verbatim}   
+     argument k ==> [x]
+                              Type Kernel(Expression(Integer))
+\end{verbatim}   
+At this point we have picked apart the main Kernel into its
+operator and its arguments. We now process the list of arguments.
+
+The htrigs function 
+is called on every element of the argument list, which in this
+case, returns a list:
+\begin{verbatim}   
+     arg:=[htrigs x for x in argument k]$List(Expression(Integer))
+           => [x]
+                       Type: List(Expression(Integer))
+\end{verbatim}   
+We form polynomial by replacing the kernel in the numerator with ?
+\begin{verbatim}   
+     num := univariate(numer f, k)
+  
+               - x
+       - ? - %e    + 2cosh(x)
+                        Type: SparseUnivariatePolynomial(
+                                SparseMultivariatePolynomial(
+                                  Integer, Kernel(Expression(Integer))))
+\end{verbatim}   
+and a polynomial of the denominator, replacing the kernel
+\begin{verbatim}   
+     den := univariate(denom f, k)
+  
+        2
+                        Type: SparseUnivariatePolynomial(
+                                SparseMultivariatePolynomial(
+                                  Integer, Kernel(Expression(Integer))))
+\end{verbatim}   
+In this case, the expression
+\begin{verbatim}   
+     is?(op, "exp"::Symbol) => true
+\end{verbatim}   
+so we form 
+\begin{verbatim}   
+     a  := first arg => x
+                         Type: Expression(Integer)
+\end{verbatim}   
+since we know that 
+\begin{verbatim}   
+                          x
+     cosh(x)+sinh(x) => %e
+\end{verbatim}   
+we can form this use this expression in substitutions
+\begin{verbatim}   
+     g1 := cosh(a)+sinh(a) => sinh(x)+cosh(x)
+                        Type: Expression(Integer)
+\end{verbatim}   
+since we know that 
+\begin{verbatim}   
+                            - x
+     cosh(x)-sinh(x) => - %e
+\end{verbatim}   
+we can form this use this expression in substitutions
+\begin{verbatim}   
+     g2 := cosh(a)-sinh(a) => -sinh(x)+cosh(x)
+                         Type: Expression(Integer)
+   
+     b  := (degree num)::Integer quo 2 => 0
+                         Type: NonNegativeInteger
+\end{verbatim}   
+The supexp function is using the g1 and g2 identities to replace exp(x)
+\begin{verbatim}   
+     supexp(num,g1,g2,b) => sinh(x)-cosh(x)-sinh(x)+2cosh(x)-cosh(x)
+                         Type: Expression(Integer)
+   
+     supexp(den,g1,g2,b) => 2
+                         Type: Expression(Integer)
+\end{verbatim}   
+which is effectively
+\begin{verbatim}   
+     t1/t2 => (sinh(x)-cosh(x)-sinh(x)+2cosh(x)-cosh(x))/2
+                         Type: Expression(Integer)
+\end{verbatim}     
+the last form of which can be rearranged as:
+\begin{verbatim}   
+     (sinh(x)-sinh(x) + 2cosh(x)-cosh(x)-cosh(x) )/2 => 0
+\end{verbatim}   
+so the result is 0
+
+\begin{chunk}{package TRMANIP TranscendentalManipulations}
     htrigs f ==
       (m := mainKernel f) case "failed" => f
       op  := operator(k := m::K)
diff --git a/changelog b/changelog
index cb8dd8d..9b0d43c 100644
--- a/changelog
+++ b/changelog
@@ -1,3 +1,5 @@
+20130124 tpd src/axiom-website/patches.html 20130124.01.tpd.patch
+20120124 tpd books/bookvol10.4 document htrigs function in TRMANIP
 20130123 tpd src/axiom-website/patches.html 20130123.03.tpd.patch
 20130123 tpd src/Makefile clean up src/algebra properly
 20130123 tpd src/axiom-website/patches.html 20130123.02.tpd.patch
diff --git a/src/axiom-website/patches.html b/src/axiom-website/patches.html
index 152948e..b6faeb7 100644
--- a/src/axiom-website/patches.html
+++ b/src/axiom-website/patches.html
@@ -3955,5 +3955,7 @@ src/input/tree.regress added
 src/doc/endpaper fixed format
 <a href="patches/20130123.03.tpd.patch">20130123.03.tpd.patch</a>
 src/Makefile clean up src/algebra properly
+<a href="patches/20130124.01.tpd.patch">20130124.01.tpd.patch</a>
+books/bookvol10.4 document htrigs function in TRMANIP
  </body>
 </html>
