aboutsummaryrefslogtreecommitdiff
path: root/src/algebra/tex.spad.pamphlet
diff options
context:
space:
mode:
authordos-reis <gdr@axiomatics.org>2007-08-14 05:14:52 +0000
committerdos-reis <gdr@axiomatics.org>2007-08-14 05:14:52 +0000
commitab8cc85adde879fb963c94d15675783f2cf4b183 (patch)
treec202482327f474583b750b2c45dedfc4e4312b1d /src/algebra/tex.spad.pamphlet
downloadopen-axiom-ab8cc85adde879fb963c94d15675783f2cf4b183.tar.gz
Initial population.
Diffstat (limited to 'src/algebra/tex.spad.pamphlet')
-rw-r--r--src/algebra/tex.spad.pamphlet709
1 files changed, 709 insertions, 0 deletions
diff --git a/src/algebra/tex.spad.pamphlet b/src/algebra/tex.spad.pamphlet
new file mode 100644
index 00000000..7577e3f4
--- /dev/null
+++ b/src/algebra/tex.spad.pamphlet
@@ -0,0 +1,709 @@
+\documentclass{article}
+\usepackage{axiom}
+\begin{document}
+\title{\$SPAD/src/algebra tex.spad}
+\author{Robert S. Sutor}
+\maketitle
+\begin{abstract}
+\end{abstract}
+\eject
+\tableofcontents
+\eject
+\section{domain TEX TexFormat}
+\subsection{product(product(i*j,i=a..b),j=c..d) fix}
+The expression prints properly in ascii text but the tex output
+is incorrect. Originally the input
+\begin{verbatim}
+product(product(i*j,i=a..b),j=c..d)
+\end{verbatim}
+prints as
+$$
+PI2
+\left(
+{{j=c}, \: d, \: {PI2
+\left(
+{{i=a}, \: b, \: {i \ j}}
+\right)}}
+\right)
+\leqno(1)
+$$
+but now says:
+The problem is in [[src/algebra/tex.spad.pamphlet]] in the list of
+constants.
+The code used to read
+\begin{verbatim}
+ plexOps : L S := ["SIGMA","SIGMA2","PI","INTSIGN","INDEFINTEGRAL"]$(L S)
+ plexPrecs : L I := [ 700, 800, 700, 700]$(L I)
+\end{verbatim}
+it now reads:
+<<product(product(i*j,i=a..b),j=c..d) fix>>=
+ plexOps : L S := ["SIGMA","SIGMA2","PI","PI2","INTSIGN","INDEFINTEGRAL"]$(L S)
+ plexPrecs : L I := [ 700, 800, 700, 800 , 700, 700]$(L I)
+@
+in addition we need to add a line defining [[PI2]] in [[formatPlex]]:
+<<define PI2>>=
+ op = "PI2" => "\prod"
+@
+\subsection{domain TEX TexFormat}
+<<domain TEX TexFormat>>=
+)abbrev domain TEX TexFormat
+++ Author: Robert S. Sutor
+++ Date Created: 1987 through 1992
+++ Change History:
+++ 05/15/91 RSS Changed matrix formatting to use array environment.
+++ 06/27/91 RSS Fixed segments
+++ 08/12/91 RSS Removed some grouping for things, added newWithNum and
+++ ungroup, improved line splitting
+++ 08/15/91 RSS Added mbox support for strings
+++ 10/15/91 RSS Handle \%\% at beginning of string
+++ 01/22/92 RSS Use \[ and \] instead of $$ and $$. Use
+++ %AXIOM STEP NUMBER: instead of \leqno
+++ 02/27/92 RSS Escape dollar signs appearing in the input.
+++ 03/09/92 RSS Handle explicit blank appearing in the input.
+++ 11/28/93 JHD Added code for the VCONCAT and TAG operations.
+++ 06/27/95 RSS Change back to $$ and \leqno for Saturn
+++ Basic Operations: coerce, convert, display, epilogue,
+++ tex, new, prologue, setEpilogue!, setTex!, setPrologue!
+++ Related Constructors: TexFormat1
+++ Also See: ScriptFormulaFormat
+++ AMS Classifications:
+++ Keywords: TeX, LaTeX, output, format
+++ References: \TeX{} is a trademark of the American Mathematical Society.
+++ Description:
+++ \spadtype{TexFormat} provides a coercion from \spadtype{OutputForm} to
+++ \TeX{} format. The particular dialect of \TeX{} used is \LaTeX{}.
+++ The basic object consists of three parts: a prologue, a
+++ tex part and an epilogue. The functions \spadfun{prologue},
+++ \spadfun{tex} and \spadfun{epilogue} extract these parts,
+++ respectively. The main guts of the expression go into the tex part.
+++ The other parts can be set (\spadfun{setPrologue!},
+++ \spadfun{setEpilogue!}) so that contain the appropriate tags for
+++ printing. For example, the prologue and epilogue might simply
+++ contain ``\verb+\[+'' and ``\verb+\]+'', respectively, so that
+++ the TeX section will be printed in LaTeX display math mode.
+
+TexFormat(): public == private where
+ E ==> OutputForm
+ I ==> Integer
+ L ==> List
+ S ==> String
+ US ==> UniversalSegment(Integer)
+
+ public == SetCategory with
+ coerce: E -> $
+ ++ coerce(o) changes o in the standard output format to TeX
+ ++ format.
+ convert: (E,I) -> $
+ ++ convert(o,step) changes o in standard output format to
+ ++ TeX format and also adds the given step number. This is useful
+ ++ if you want to create equations with given numbers or have the
+ ++ equation numbers correspond to the interpreter step numbers.
+ convert: (E,I,E) -> $
+ ++ convert(o,step,type) changes o in standard output format to
+ ++ TeX format and also adds the given step number and type. This
+ ++ is useful if you want to create equations with given numbers
+ ++ or have the equation numbers correspond to the interpreter step
+ ++ numbers.
+ display: ($, I) -> Void
+ ++ display(t,width) outputs the TeX formatted code t so that each
+ ++ line has length less than or equal to \spadvar{width}.
+ display: $ -> Void
+ ++ display(t) outputs the TeX formatted code t so that each
+ ++ line has length less than or equal to the value set by
+ ++ the system command \spadsyscom{set output length}.
+ epilogue: $ -> L S
+ ++ epilogue(t) extracts the epilogue section of a TeX form t.
+ tex: $ -> L S
+ ++ tex(t) extracts the TeX section of a TeX form t.
+ new: () -> $
+ ++ new() create a new, empty object. Use \spadfun{setPrologue!},
+ ++ \spadfun{setTex!} and \spadfun{setEpilogue!} to set the various
+ ++ components of this object.
+ prologue: $ -> L S
+ ++ prologue(t) extracts the prologue section of a TeX form t.
+ setEpilogue!: ($, L S) -> L S
+ ++ setEpilogue!(t,strings) sets the epilogue section of a TeX form t to strings.
+ setTex!: ($, L S) -> L S
+ ++ setTex!(t,strings) sets the TeX section of a TeX form t to strings.
+ setPrologue!: ($, L S) -> L S
+ ++ setPrologue!(t,strings) sets the prologue section of a TeX form t to strings.
+
+ private == add
+ import OutputForm
+ import Character
+ import Integer
+ import List OutputForm
+ import List String
+
+ Rep := Record(prolog : L S, TeX : L S, epilog : L S)
+
+ -- local variables declarations and definitions
+
+ expr: E
+ prec,opPrec: I
+ str: S
+ blank : S := " \ "
+
+ maxPrec : I := 1000000
+ minPrec : I := 0
+
+ unaryOps : L S := ["-","^"]$(L S)
+ unaryPrecs : L I := [700,260]$(L I)
+
+ -- the precedence of / in the following is relatively low because
+ -- the bar obviates the need for parentheses.
+ binaryOps : L S := ["+->","|","**","/","<",">","=","OVER"]$(L S)
+ binaryPrecs : L I := [0,0,900, 700,400,400,400, 700]$(L I)
+
+ naryOps : L S := ["-","+","*",blank,",",";"," ","ROW","",
+ " \cr ","&"," \\ "]$(L S)
+ naryPrecs : L I := [700,700,800, 800,110,110, 0, 0, 0,
+ 0, 0, 0]$(L I)
+ naryNGOps : L S := ["ROW","&"]$(L S)
+
+<<product(product(i*j,i=a..b),j=c..d) fix>>
+
+ specialOps : L S := ["MATRIX","BRACKET","BRACE","CONCATB","VCONCAT", _
+ "AGGLST","CONCAT","OVERBAR","ROOT","SUB","TAG", _
+ "SUPERSUB","ZAG","AGGSET","SC","PAREN", _
+ "SEGMENT","QUOTE","theMap" ]
+
+ -- the next two lists provide translations for some strings for
+ -- which TeX provides special macros.
+
+ specialStrings : L S :=
+ ["cos", "cot", "csc", "log", "sec", "sin", "tan",
+ "cosh", "coth", "csch", "sech", "sinh", "tanh",
+ "acos","asin","atan","erf","...","$","infinity"]
+ specialStringsInTeX : L S :=
+ ["\cos","\cot","\csc","\log","\sec","\sin","\tan",
+ "\cosh","\coth","\csch","\sech","\sinh","\tanh",
+ "\arccos","\arcsin","\arctan","\erf","\ldots","\$","\infty"]
+
+ -- local function signatures
+
+ addBraces: S -> S
+ addBrackets: S -> S
+ group: S -> S
+ formatBinary: (S,L E, I) -> S
+ formatFunction: (S,L E, I) -> S
+ formatMatrix: L E -> S
+ formatNary: (S,L E, I) -> S
+ formatNaryNoGroup: (S,L E, I) -> S
+ formatNullary: S -> S
+ formatPlex: (S,L E, I) -> S
+ formatSpecial: (S,L E, I) -> S
+ formatUnary: (S, E, I) -> S
+ formatTex: (E,I) -> S
+ newWithNum: I -> $
+ parenthesize: S -> S
+ precondition: E -> E
+ postcondition: S -> S
+ splitLong: (S,I) -> L S
+ splitLong1: (S,I) -> L S
+ stringify: E -> S
+ ungroup: S -> S
+
+ -- public function definitions
+
+ new() : $ ==
+-- [["\["]$(L S), [""]$(L S), ["\]"]$(L S)]$Rep
+ [["$$"]$(L S), [""]$(L S), ["$$"]$(L S)]$Rep
+
+ newWithNum(stepNum: I) : $ ==
+-- num : S := concat("%AXIOM STEP NUMBER: ",string(stepNum)$S)
+-- [["\["]$(L S), [""]$(L S), ["\]",num]$(L S)]$Rep
+ num : S := concat(concat("\leqno(",string(stepNum)$S),")")$S
+ [["$$"]$(L S), [""]$(L S), [num,"$$"]$(L S)]$Rep
+
+ coerce(expr : E): $ ==
+ f : $ := new()$$
+ f.TeX := [postcondition
+ formatTex(precondition expr, minPrec)]$(L S)
+ f
+
+ convert(expr : E, stepNum : I): $ ==
+ f : $ := newWithNum(stepNum)
+ f.TeX := [postcondition
+ formatTex(precondition expr, minPrec)]$(L S)
+ f
+
+ display(f : $, len : I) ==
+ s,t : S
+ for s in f.prolog repeat sayTeX$Lisp s
+ for s in f.TeX repeat
+ for t in splitLong(s, len) repeat sayTeX$Lisp t
+ for s in f.epilog repeat sayTeX$Lisp s
+ void()$Void
+
+ display(f : $) ==
+ display(f, _$LINELENGTH$Lisp pretend I)
+
+ prologue(f : $) == f.prolog
+ tex(f : $) == f.TeX
+ epilogue(f : $) == f.epilog
+
+ setPrologue!(f : $, l : L S) == f.prolog := l
+ setTex!(f : $, l : L S) == f.TeX := l
+ setEpilogue!(f : $, l : L S) == f.epilog := l
+
+ coerce(f : $): E ==
+ s,t : S
+ l : L S := nil
+ for s in f.prolog repeat l := concat(s,l)
+ for s in f.TeX repeat
+ for t in splitLong(s, (_$LINELENGTH$Lisp pretend Integer) - 4) repeat
+ l := concat(t,l)
+ for s in f.epilog repeat l := concat(s,l)
+ (reverse l) :: E
+
+ -- local function definitions
+
+ ungroup(str: S): S ==
+ len : I := #str
+ len < 2 => str
+ lbrace : Character := char "{"
+ rbrace : Character := char "}"
+ -- drop leading and trailing braces
+ if (str.1 =$Character lbrace) and (str.len =$Character rbrace) then
+ u : US := segment(2,len-1)$US
+ str := str.u
+ str
+
+ postcondition(str: S): S ==
+ str := ungroup str
+ len : I := #str
+ plus : Character := char "+"
+ minus: Character := char "-"
+ len < 4 => str
+ for i in 1..(len-1) repeat
+ if (str.i =$Character plus) and (str.(i+1) =$Character minus)
+ then setelt(str,i,char " ")$S
+ str
+
+ stringify expr == (object2String$Lisp expr) pretend S
+
+ lineConcat( line : S, lines: L S ) : L S ==
+ length := #line
+
+ if ( length > 0 ) then
+ -- If the last character is a backslash then split at "\ ".
+ -- Reinstate the blank.
+
+ if (line.length = char "\" ) then line := concat(line, " ")
+
+ -- Remark: for some reason, "\%" at the beginning
+ -- of a line has the "\" erased when printed
+
+ if ( line.1 = char "%" ) then line := concat(" \", line)
+ else if ( line.1 = char "\" ) and length > 1 and ( line.2 = char "%" ) then
+ line := concat(" ", line)
+
+ lines := concat(line,lines)$List(S)
+ lines
+
+ splitLong(str : S, len : I): L S ==
+ -- this blocks into lines
+ if len < 20 then len := _$LINELENGTH$Lisp
+ splitLong1(str, len)
+
+ splitLong1(str : S, len : I) ==
+ -- We first build the list of lines backwards and then we
+ -- reverse it.
+
+ l : List S := nil
+ s : S := ""
+ ls : I := 0
+ ss : S
+ lss : I
+ for ss in split(str,char " ") repeat
+ -- have the newline macro end a line (even if it means the line
+ -- is slightly too long)
+
+ ss = "\\" =>
+ l := lineConcat( concat(s,ss), l )
+ s := ""
+ ls := 0
+
+ lss := #ss
+
+ -- place certain tokens on their own lines for clarity
+
+ ownLine : Boolean :=
+ u : US := segment(1,4)$US
+ (lss > 3) and ("\end" = ss.u) => true
+ u := segment(1,5)$US
+ (lss > 4) and ("\left" = ss.u) => true
+ u := segment(1,6)$US
+ (lss > 5) and (("\right" = ss.u) or ("\begin" = ss.u)) => true
+ false
+
+ if ownLine or (ls + lss > len) then
+ if not empty? s then l := lineConcat( s, l )
+ s := ""
+ ls := 0
+
+ ownLine or lss > len => l := lineConcat( ss, l )
+
+ (lss = 1) and (ss.1 = char "\") =>
+ ls := ls + lss + 2
+ s := concat(s,concat(ss," ")$S)$S
+
+ ls := ls + lss + 1
+ s := concat(s,concat(ss," ")$S)$S
+
+ if ls > 0 then l := lineConcat( s, l )
+
+ reverse l
+
+ group str ==
+ concat ["{",str,"}"]
+
+ addBraces str ==
+ concat ["\left\{ ",str," \right\}"]
+
+ addBrackets str ==
+ concat ["\left[ ",str," \right]"]
+
+ parenthesize str ==
+ concat ["\left( ",str," \right)"]
+
+ precondition expr ==
+ outputTran$Lisp expr
+
+ formatSpecial(op : S, args : L E, prec : I) : S ==
+ arg : E
+ prescript : Boolean := false
+ op = "theMap" => "\mbox{theMap(...)}"
+ op = "AGGLST" =>
+ formatNary(",",args,prec)
+ op = "AGGSET" =>
+ formatNary(";",args,prec)
+ op = "TAG" =>
+ group concat [formatTex(first args,prec),
+ "\rightarrow",
+ formatTex(second args,prec)]
+ op = "VCONCAT" =>
+ group concat("\begin{array}{c}",
+ concat(concat([concat(formatTex(u, minPrec),"\\")
+ for u in args]::L S),
+ "\end{array}"))
+ op = "CONCATB" =>
+ formatNary(" ",args,prec)
+ op = "CONCAT" =>
+ formatNary("",args,minPrec)
+ op = "QUOTE" =>
+ group concat("{\tt '}",formatTex(first args, minPrec))
+ op = "BRACKET" =>
+ group addBrackets ungroup formatTex(first args, minPrec)
+ op = "BRACE" =>
+ group addBraces ungroup formatTex(first args, minPrec)
+ op = "PAREN" =>
+ group parenthesize ungroup formatTex(first args, minPrec)
+ op = "OVERBAR" =>
+ null args => ""
+ group concat ["\overline ",formatTex(first args, minPrec)]
+ op = "ROOT" =>
+ null args => ""
+ tmp : S := group formatTex(first args, minPrec)
+ null rest args => group concat ["\sqrt ",tmp]
+ group concat
+ ["\root ",group formatTex(first rest args, minPrec)," \of ",tmp]
+ op = "SEGMENT" =>
+ tmp : S := concat [formatTex(first args, minPrec),".."]
+ group
+ null rest args => tmp
+ concat [tmp,formatTex(first rest args, minPrec)]
+ op = "SUB" =>
+ group concat [formatTex(first args, minPrec)," \sb ",
+ formatSpecial("AGGLST",rest args,minPrec)]
+ op = "SUPERSUB" =>
+ -- variable name
+ form : List S := [formatTex(first args, minPrec)]
+ -- subscripts
+ args := rest args
+ null args => concat(form)$S
+ tmp : S := formatTex(first args, minPrec)
+ if (tmp ^= "") and (tmp ^= "{}") and (tmp ^= " ") then
+ form := append(form,[" \sb ",group tmp])$(List S)
+ -- superscripts
+ args := rest args
+ null args => group concat(form)$S
+ tmp : S := formatTex(first args, minPrec)
+ if (tmp ^= "") and (tmp ^= "{}") and (tmp ^= " ") then
+ form := append(form,[" \sp ",group tmp])$(List S)
+ -- presuperscripts
+ args := rest args
+ null args => group concat(form)$S
+ tmp : S := formatTex(first args, minPrec)
+ if (tmp ^= "") and (tmp ^= "{}") and (tmp ^= " ") then
+ form := append([" \sp ",group tmp],form)$(List S)
+ prescript := true
+ -- presubscripts
+ args := rest args
+ null args =>
+ group concat
+ prescript => cons("{}",form)
+ form
+ tmp : S := formatTex(first args, minPrec)
+ if (tmp ^= "") and (tmp ^= "{}") and (tmp ^= " ") then
+ form := append([" \sb ",group tmp],form)$(List S)
+ prescript := true
+ group concat
+ prescript => cons("{}",form)
+ form
+ op = "SC" =>
+ -- need to handle indentation someday
+ null args => ""
+ tmp := formatNaryNoGroup(" \\ ", args, minPrec)
+ group concat ["\begin{array}{l} ",tmp," \end{array} "]
+ op = "MATRIX" => formatMatrix rest args
+ op = "ZAG" =>
+ concat [" \zag{",formatTex(first args, minPrec),"}{",
+ formatTex(first rest args,minPrec),"}"]
+ concat ["not done yet for ",op]
+
+ formatPlex(op : S, args : L E, prec : I) : S ==
+ hold : S
+ p : I := position(op,plexOps)
+ p < 1 => error "unknown Tex unary op"
+ opPrec := plexPrecs.p
+ n : I := #args
+ (n ^= 2) and (n ^= 3) => error "wrong number of arguments for plex"
+ s : S :=
+ op = "SIGMA" => "\sum"
+ op = "SIGMA2" => "\sum"
+ op = "PI" => "\prod"
+<<define PI2>>
+ op = "INTSIGN" => "\int"
+ op = "INDEFINTEGRAL" => "\int"
+ "????"
+ hold := formatTex(first args,minPrec)
+ args := rest args
+ if op ^= "INDEFINTEGRAL" then
+ if hold ^= "" then
+ s := concat [s," \sb",group concat ["\displaystyle ",hold]]
+ if not null rest args then
+ hold := formatTex(first args,minPrec)
+ if hold ^= "" then
+ s := concat [s," \sp",group concat ["\displaystyle ",hold]]
+ args := rest args
+ s := concat [s," ",formatTex(first args,minPrec)]
+ else
+ hold := group concat [hold," ",formatTex(first args,minPrec)]
+ s := concat [s," ",hold]
+ if opPrec < prec then s := parenthesize s
+ group s
+
+ formatMatrix(args : L E) : S ==
+ -- format for args is [[ROW ...],[ROW ...],[ROW ...]]
+ -- generate string for formatting columns (centered)
+ cols : S := "{"
+ for i in 2..#(first(args) pretend L E) repeat
+ cols := concat(cols,"c")
+ cols := concat(cols,"} ")
+ group addBrackets concat
+ ["\begin{array}",cols,formatNaryNoGroup(" \\ ",args,minPrec),
+ " \end{array} "]
+
+ formatFunction(op : S, args : L E, prec : I) : S ==
+ group concat [op, " ", parenthesize formatNary(",",args,minPrec)]
+
+ formatNullary(op : S) ==
+ op = "NOTHING" => ""
+ group concat [op,"()"]
+
+ formatUnary(op : S, arg : E, prec : I) ==
+ p : I := position(op,unaryOps)
+ p < 1 => error "unknown Tex unary op"
+ opPrec := unaryPrecs.p
+ s : S := concat [op,formatTex(arg,opPrec)]
+ opPrec < prec => group parenthesize s
+ op = "-" => s
+ group s
+
+ formatBinary(op : S, args : L E, prec : I) : S ==
+ p : I := position(op,binaryOps)
+ p < 1 => error "unknown Tex binary op"
+ op :=
+ op = "|" => " \mid "
+ op = "**" => " \sp "
+ op = "/" => " \over "
+ op = "OVER" => " \over "
+ op = "+->" => " \mapsto "
+ op
+ opPrec := binaryPrecs.p
+ s : S := formatTex(first args, opPrec)
+ s := concat [s,op,formatTex(first rest args, opPrec)]
+ group
+ op = " \over " => s
+ opPrec < prec => parenthesize s
+ s
+
+ formatNary(op : S, args : L E, prec : I) : S ==
+ group formatNaryNoGroup(op, args, prec)
+
+ formatNaryNoGroup(op : S, args : L E, prec : I) : S ==
+ null args => ""
+ p : I := position(op,naryOps)
+ p < 1 => error "unknown Tex nary op"
+ op :=
+ op = "," => ", \: "
+ op = ";" => "; \: "
+ op = "*" => blank
+ op = " " => " \ "
+ op = "ROW" => " & "
+ op
+ l : L S := nil
+ opPrec := naryPrecs.p
+ for a in args repeat
+ l := concat(op,concat(formatTex(a,opPrec),l)$L(S))$L(S)
+ s : S := concat reverse rest l
+ opPrec < prec => parenthesize s
+ s
+
+ formatTex(expr,prec) ==
+ i,len : Integer
+ intSplitLen : Integer := 20
+ ATOM(expr)$Lisp pretend Boolean =>
+ str := stringify expr
+ len := #str
+ FIXP$Lisp expr =>
+ i := expr pretend Integer
+ if (i < 0) or (i > 9)
+ then
+ group
+ nstr : String := ""
+ -- insert some blanks into the string, if too long
+ while ((len := #str) > intSplitLen) repeat
+ nstr := concat [nstr," ",
+ elt(str,segment(1,intSplitLen)$US)]
+ str := elt(str,segment(intSplitLen+1)$US)
+ empty? nstr => str
+ nstr :=
+ empty? str => nstr
+ concat [nstr," ",str]
+ elt(nstr,segment(2)$US)
+ else str
+ str = "%pi" => "\pi"
+ str = "%e" => "e"
+ str = "%i" => "i"
+ len > 1 and str.1 = char "%" and str.2 = char "%" =>
+ u : US := segment(3,len)$US
+ concat(" \%\%",str.u)
+ len > 0 and str.1 = char "%" => concat(" \",str)
+ len > 1 and digit? str.1 => group str -- should handle floats
+ len > 0 and str.1 = char "_"" =>
+ concat(concat(" \mbox{\tt ",str),"} ")
+ len = 1 and str.1 = char " " => "{\ }"
+ (i := position(str,specialStrings)) > 0 =>
+ specialStringsInTeX.i
+ (i := position(char " ",str)) > 0 =>
+ -- We want to preserve spacing, so use a roman font.
+ concat(concat(" \mbox{\rm ",str),"} ")
+ str
+ l : L E := (expr pretend L E)
+ null l => blank
+ op : S := stringify first l
+ args : L E := rest l
+ nargs : I := #args
+
+ -- special cases
+ member?(op, specialOps) => formatSpecial(op,args,prec)
+ member?(op, plexOps) => formatPlex(op,args,prec)
+
+ -- nullary case
+ 0 = nargs => formatNullary op
+
+ -- unary case
+ (1 = nargs) and member?(op, unaryOps) =>
+ formatUnary(op, first args, prec)
+
+ -- binary case
+ (2 = nargs) and member?(op, binaryOps) =>
+ formatBinary(op, args, prec)
+
+ -- nary case
+ member?(op,naryNGOps) => formatNaryNoGroup(op,args, prec)
+ member?(op,naryOps) => formatNary(op,args, prec)
+ op := formatTex(first l,minPrec)
+ formatFunction(op,args,prec)
+
+@
+\section{package TEX1 TexFormat1}
+<<package TEX1 TexFormat1>>=
+)abbrev package TEX1 TexFormat1
+++ Author: Robert S. Sutor
+++ Date Created: 1987 through 1990
+++ Change History:
+++ Basic Operations: coerce
+++ Related Constructors: TexFormat
+++ Also See: ScriptFormulaFormat, ScriptFormulaFormat1
+++ AMS Classifications:
+++ Keywords: TeX, output, format
+++ References: \TeX{} is a trademark of the American Mathematical
+++ Society.
+++ Description:
+++ \spadtype{TexFormat1} provides a utility coercion for changing
+++ to TeX format anything that has a coercion to the standard output
+++ format.
+
+TexFormat1(S : SetCategory): public == private where
+ public == with
+ coerce: S -> TexFormat()
+ ++ coerce(s) provides a direct coercion from a domain S to
+ ++ TeX format. This allows the user to skip the step of first
+ ++ manually coercing the object to standard output format before
+ ++ it is coerced to TeX format.
+
+ private == add
+ import TexFormat()
+
+ coerce(s : S): TexFormat ==
+ coerce(s :: OutputForm)$TexFormat
+
+@
+\section{License}
+<<license>>=
+--Copyright (c) 1991-2002, The Numerical ALgorithms Group Ltd.
+--All rights reserved.
+--
+--Redistribution and use in source and binary forms, with or without
+--modification, are permitted provided that the following conditions are
+--met:
+--
+-- - Redistributions of source code must retain the above copyright
+-- notice, this list of conditions and the following disclaimer.
+--
+-- - Redistributions in binary form must reproduce the above copyright
+-- notice, this list of conditions and the following disclaimer in
+-- the documentation and/or other materials provided with the
+-- distribution.
+--
+-- - Neither the name of The Numerical ALgorithms Group Ltd. nor the
+-- names of its contributors may be used to endorse or promote products
+-- derived from this software without specific prior written permission.
+--
+--THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+--IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+--TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+--PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
+--OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+--EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+--PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+--PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+--LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+--NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+--SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+@
+<<*>>=
+<<license>>
+
+<<domain TEX TexFormat>>
+<<package TEX1 TexFormat1>>
+@
+\eject
+\begin{thebibliography}{99}
+\bibitem{1} nothing
+\end{thebibliography}
+\end{document}