123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %%%%% Typesetting REDUCE output with TeX %%%%%
 %%%%% by Werner Antweiler %%%%%
 %%%%% University of Cologne Computer Center %%%%%
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \input tridefs
 \def\9{\TeXREDUCEInterface}
 %
 % LaTeX Version
 %
 \documentstyle[twocolumn]{article}
 \begin{document}
 %
 % Titel
 %
 \title{\Huge A \9}
 \author{Werner Antweiler\thanks{All three authors are with:
 Rechenzentrum der Universit\"{a}t zu K\"{o}ln
 (University of Cologne Computer Center),
 Abt. Anwendungssoftware (Application Software
 Department), RobertKochStra\ss e 10, 5000 K\"{o}ln 41,
 West Germany.} \\
 Andreas Strotmann\\
 Volker Winkelmann\\
 University of Cologne Computer Center, West Germany}
 \date{Revised Version, \today}
 \maketitle
 %
 \section{Introduction}
 %
 REDUCE is a well known computer algebra system invented by
 Anthony C. Hearn. While every effort was made to improve
 the system's algebraic capabilities, the readability of the
 output remained poor by modern typesetting standards.
 Although a prettyprinter is already incorporated in REDUCE,
 the output is produced only in lineprinter quality.
 The simple idea to produce high quality output from REDUCE
 is to link REDUCE with Donald E. Knuth's famous \TeX\ typesetting
 language. This draft reviews our efforts in this direction.
 Our major goals we pursue with TRI are:
 \begin{itemize}
 \item We want to produce REDUCEoutput in typesetting quality.
 \item The intermediate files (\TeXinput files) should be easy to edit.
 The reason is that it is likely that the proposed
 linebreaks are suboptimal from the user's point of view.
 \item We apply a \TeXlike algorithm which ``optimizes''
 the linebreaking over the whole expression. This differs
 fundamentally from the standard lefttoright,
 oneline lookahead
 prettyprinters of REDUCE, LISP and the like.
 \end{itemize}
 We introduce a program written in RLISP\footnote{the REDUCE
 implementation language, an extended Standard LISP with an
 ALGOLlike syntax.} which typesets REDUCE
 formulas with \TeX. Our \9 incorporates three
 levels of \TeX\ output: without line breaking, with line breaking,
 and with line breaking plus indentation. While speed
 without line breaking is comparable to that achieved with
 REDUCE's prettyprinter, line breaking consumes much more CPU time.
 Nevertheless, we reckon with a cost increase due to line breaking
 which is almost linear in the length of the expression to be broken.
 Our line breaking algorithm mimics \TeX's line breaking in a
 rather rudimentary fashion.
 This paper deals with some of the ideas and algorithms we have
 programmed and it summarizes some of the experiments we have made
 with our program.
 Furthermore, at the end of this paper we provide a small user's manual
 which gives a short introduction to the use of our \9.
 For simplicity's sake the name ``\9'' will be abbreviated to ``TRI''
 in this paper.
 %
 \section{From REDUCE to \TeX: basic concepts}
 %
 The function {\tt TeXvarpri} is the interface to the algebraic
 portion of REDUCE. It first calls a function named {\tt makeprefix}.
 Its job is to change a REDUCE algebraic expression to a standard
 prefix list while retaining the tree structure of the whole expression.
 After this has been done, the
 new intermediate expression is passed to the most important module
 of TRI: the {\tt maketag/makefunc}family of functions.
 These functions recursively expand the structured list
 (or operator tree) into a flat list, translating each REDUCE symbol or
 expression into socalled \TeXitems on passing by.
 For that reason, the resulting list is called the \TeXitem list.
 If the simple \TeXmode (without line breaking) was chosen, this list
 is then printed immediately without further considerations.
 Translation and printing this way is almost as fast as with
 the standard REDUCE pretty printer.\par
 When linebreaking has been enabled things get a bit more complicated.
 The greatest effort with TRI was to implement the linebreaking
 algorithm. More than half of the entire TRI code deals with this
 task.
 The ultimate goal is to add some ``break items'', i.e. \verb\nl%
 \TeXcommands\footnote{This is not a \TeXprimitive but a TRIspecific
 \TeXmacro command which expands into a lot of stuff.},
 marking  in a certain way  optimal linebreaks.
 Additionally, these break items can be followed immediately by
 ``indentation items'', i.e. \verb\OFF{...} \TeXcommands\footnote{see
 previous footnote}, specifying the amount of indentation
 (in scaled points) applicable for the next new line.
 The problem is to choose the right points where to insert these
 special \TeXitems. Therefore, the \TeXitem list undergoes
 three further transformation steps.\par
 First, the \TeXitem list gets enlarged by socalled ``glue items''.
 Glue items are twoelement lists, where the first element is a width
 info and the second element is a penalty info.
 The width is determined according to the class of the two \TeXitems
 to the left and to the right. Each \TeXitem is associated with
 one out of eight classes. Following Knuth's \TeX book [Knu86],
 these classes are ORD (for ordinary items),
 LOP (for large operators such as square roots),
 BIN and REL (for binary and relational operators), OPN and CLO (for
 opening and closing parentheses), PCT (for punctuation) and finally
 INN (for ``inner'' items such as \TeXbrackets and macros).
 The data for the width information is stored in a matrix.
 Therefore, for each pair of classes it is easy to determine how much
 (if any) space should be inserted between two consecutive \TeXitems.
 \par
 The ``penalty'' is
 a value in the range of $10000\ldots+10000$ indicating a markup on a
 potential breakpoint, thus determining if this point is a
 fairly good (if negative) or bad (if positive) choice.
 The amount of penalty depends heuristically
 (a) on the kind of \TeXitems surrounding the glue item,
 (b) on the bracket nesting, and finally
 (c) on special characteristics.\footnote{For example, the plus and
 the difference operator have special impact on the amount of
 penalty. These operators are considered as extremely good places
 for breaking up a line.}\par
 During the second level, the \TeXitem list is transformed
 into a socalled breaklist consisting of {\em active} and
 {\em passive} nodes.
 A passive node is simply a width info giving the total width of
 \TeXitems not interspersed by glue items. On the other hand,
 active nodes are glue items enlarged by a third element, the
 offset info, indicating an indentation level which is used later
 for computing the actual amount of indentation.
 Active nodes are used as potential breakpoints.
 Moreover, while creating the breaklist, the \TeXitem list will be
 modified if necessary according to the length of fractions and square
 roots which cannot be broken if retained in their ``classical''
 form. Hence fractions look like {\tt (...)/(...)} if they don't fit
 into a single line, especially in the case of large
 polynomial fractions.\par
 The third and most important level is the linebreaking algorithm
 itself. The idea how to break lines is based
 on the article by Knuth/Plass(1981). Linebreaking can occur at
 active nodes only. So, you can loop through the breaklist considering
 all potential breakpoints. But in order to find a suitable way
 in a reasonable amount of time you have to limit the number of
 potential breakpoints considered. This is performed by associating
 a ``badness'' with each potential breakpoint, describing how
 good looking or bad looking a line turns out.
 If the badness is less than
 a given amount of ``tolerance''  as set by the user 
 then an active node is considered to be feasible and becomes
 a delta node. A delta node is simply an active node enlarged
 by four further infos: an identification number for this node,
 a pointer to the best feasible breakpoint (i.e. deltanode)
 to come from,%
 \footnote{If one were to break the formula at this deltanode, the
 best place to start this line is given by this pointer. Note that
 this pointer points backward through the list. When all delta nodes
 have been inserted, you start at the very last delta node (which
 is always at the end of breaklist) and skip backward from one
 delta node to the next delta node pointed at. Thus, you find the
 best way to break up the list.}
 the total amount of demerits (a compound value derived from
 badness and penalty) accumulated so far, and a value indicating
 the amount of indentation applied to a new line beginning at this
 node.
 When the function dealing with linebreaking has stepped through
 the list, the breakpoints will have been determined.
 Afterwards all glue items (i.e. active nodes)
 are deleted from the \TeXitem list while break and indentation%
 items for those nodes marked as breakpoints are inserted.
 \par
 Finally the \TeXitem list is printed with regular ASCIIcharacters.
 The readabiltiy of the intermediate output is low,
 but it should be quite good enough for users to do some final
 editing work.
 Nevertheless, the nesting structure of the term is kept
 visible when printed, so it will be easy to distinguish between
 parenthesis levels simply by considering the amount of indentation.
 % 
 \section{Postprocessing with the module ``tridefs.tex''}
 % 
 When a \TeXoutput file has been created with TRI it has to be
 processed by \TeX\ itself. But before you run \TeX\ you should make sure
 the file looks the way you want it. Sometimes you will
 find it necessary to add some \TeXcode of your own or delete some
 other \TeXcode. This is also the right time to
 check the line breaks marked by \verb\nlcommands.
 This job is up to you before you finally run \TeX.\par
 During the \TeXrun the sizes of brackets are determined. This task is
 not done by TRI. In order to produce proper sized brackets
 we put some \verb\left( and \verb\right) \TeXcommands
 where brackets are opened or closed. A new problem arises when
 an expression has been broken up into several lines. Since, for every
 line, the number of \verb\left( and \verb\right)
 \TeXcommands must match
 but bracketed expressions may start in one line and end in another,
 we have to insert the required number of ``dummy'' parentheses
 (i.e. \verb\right. and \verb\left. \TeXcommands)
 at the end of the current line and the beginning of the following line.
 This task is handled by the \verb\nl\TeXmacro.\par
 There is a caveat against this method.
 Since opening and closing brackets
 needn't lie in the same line, it is possible that the height of the
 brackets can differ although they should correspond in height. That will
 happen if the height of the text in the opening line has a height
 different from the text in the closing line. We haven't found a
 way of tackling this problem yet, but we think it is possible to program
 a small \TeXmacro for this task.\par
 There is at least one more line of \TeXcode you have to
 insert by hand into the \TeXinput file produced by TRI. This line runs
 \begin{verbatim}
 \input tridefs
 \end{verbatim}
 and inputs the module {\tt tridefs.tex} into the file. This is necessary
 because otherwise \TeX\ won't know how to deal with our macro calls.
 If you use the \TeXinput file as a ``standalone'' file, don't
 forget a final \verb\bye at the end of the text. If you use
 code produced by TRI as part of a larger text then simply put
 the inputline just at the beginning of your text.
 %
 \section{Experiments}
 %
 We have tested TRI on a MicroVAX operating under ULTRIX,
 with no other users working during this phase in order to minimize
 interference with other processes, e.g., caused by paging.
 The TRI code has been compiled with the PSL~3.4 compiler.
 The following table presents results obtained with a small number of
 different terms. All data were measured in CPUseconds
 as displayed by LISP's TIMEfacility.
 For expressions where special packages such as {\tt solve} and {\tt int}
 were involved we have taken only effective outputtime, i.e. the time
 consumption caused by producing the output and not by calculating
 the algebraic result.\footnote{That means we assigned the result of an
 evaluation to an itermediate variable, and then we printed this
 intermediate variable. Thus we could eliminate the time overhead
 produced by ``pure'' evaluation. Nevertheless, in terms of effective
 interactive answering time, the sum of evaluation and printing time
 might be much more interesting than the ``pure'' printing time.
 In such a context the percentage overhead caused by printing is
 the critical point. But since we talk about printing we decided
 to document the ``pure'' printing time.} First we display
 the six expressions we have tested.\par
 $$(x+y)^{12}\eqno(1)$$
 $$(x+y)^{24}\eqno(2)$$
 $$(x+y)^{36}\eqno(3)$$
 $$(x+y)^{16}/(vw)^{16}\eqno(4)$$
 $$solve((1+\xi)x^22\xi x+\xi,x)\eqno(5)$$
 $$solve(x^3+x^2\mu+\nu,x)\eqno(6)$$
 The following table shows the results:
 %
 \medskip
 \begin{center}
 {\tt
 \begin{tabular}{crrrr} \hline
 {\small\rm No.}&{\small\rm normal}&{\small\rm TeX}&
 {\small\rm Break}&{\small\rm Indent}\\
 \hline
 1& 0.65& 0.75& 3.30& 3.37\\
 2& 1.38& 1.79&11.81&12.10\\
 3& 2.31& 3.11&19.33&19.77\\
 4& 1.87& 2.26&11.78& 9.64\\
 5& 0.46& 0.75& 0.90& 0.88\\
 6& 4.52&21.52&31.34&29.78\\
 \hline
 \end{tabular}
 }
 \medskip
 \end{center}
 %
 This short table should give you an impression of the
 performance of TRI. It goes without saying that on other machines
 results may turn out which are quite different from our results. But our
 intention is to show the relative and not the absolute performance.
 Note that printing times are a function of expression complexity,
 as shown by rows three and six.
 % 
 \section{User's Guide to the TRI}
 % 
 If you intend to use TRI you are required to load the compiled code.
 This can be performed with the command
 \begin{verbatim}
 load!package 'tri;
 \end{verbatim}
 During the load, some default initializations are performed. The
 default page width is set to 15 centimeters, the tolerance for
 line breaking is set to 20 by default. Moreover, TRI is enabled
 to translate greek names, e.g. TAU or PSI, into equivalent \TeX\
 symbols, e.g. $\tau$ or $\psi$, respectively. Letters are printed
 lowercase as defined through assertion of the set LOWERCASE. The whole
 operation produces the following lines of output
 \begin{verbatim}
 % TeXREDUCEInterface 0.50
 % set GREEK asserted
 % set LOWERCASE asserted
 % \hsize=150mm
 % \tolerance 20
 \end{verbatim}
 Make sure you have at least version 0.50 installed at your site.
 Now you can switch the three TRI modes on and off as you like.
 You can use the switches alternatively and incrementally.
 That means you have to switch on TeX for receiving standard
 \TeXoutput, or TeXBreak to receive broken \TeXoutput, or
 TeXIndent to receive broken \TeXoutput plus indentation.
 More specifically, if you switch off {\tt TeXBreak} you implicitly quit
 {\tt TeXIndent}, too, or, if you switch off {\tt TeX}, you
 implicitly quit {\tt TeXBreak} and, consequently, {\tt TeXIndent}.\par
 The most crucial point in defining how TRI breaks multiple lines
 of \TeXcode is your choice of the page width and the tolerance.
 As mentioned earlier, ``tolerance'' is related to \TeX's famous
 linebreaking algorithm. The value of ``tolerance'' determines which
 potential breakpoints are considered feasible and which are not. The
 higher the tolerance, the more breakpoints become feasible as determined
 by the value of ``badness'' associated with each breakpoint. Breakpoints
 are considered feasible if the badness is less than the tolerance.
 You can easily change the tolerance using
 \begin{verbatim}
 TeXtolerance(tolerance);
 \end{verbatim}
 where the {\em tolerance} is a positive integer in the closed interval
 $[0,10000]$.
 A tolerance of 0 means that actually no breakpoint will be considered
 feasible (except those carrying a negative penalty), while a value
 of 10000 allows any breakpoint to be considered feasible.
 Obviously, the choice of a tolerance has a great impact on the time
 consumption of our linebreaking algorithm since time consumption
 increases in proportion to the number of feasible breakpoints.
 So, the question is what values to choose. For linebreaking without
 indentation, suitable values for the tolerance lie between 10 and 100.
 As a rule of thumb, you should use higher values the deeper the term
 is nested  if you can estimate. If you use indentation, you have to
 use much higher tolerance values. This is necessary because badness
 is worsened by indentation. Accordingly, TRI has to try harder to find
 suitable places where to break. Reasonable values for tolerance
 here lie between 700 and 1500. A value of 1000 should be your first
 guess. That will work for most expressions in a reasonable amount of
 time.\par
 The page width of the \TeX\ output page,
 measured in millimeters\footnote{You can
 also specify page width in scaled points (sp).
 Note: 1~pt = 65536~sp = 1/72.27~inch. The function automatically chooses
 the appropiate dimension according to the size: all values greater than
 400 are considered to be scaled points.}, can be changed by using
 \begin{verbatim}
 TeXpagewidth(pagewidth);
 \end{verbatim}
 You should choose a page width according to your purposes,
 but allow a few centimeters for errors in TRI's attempt to
 emulate \TeX's metric.
 For example, specify 140 millimeters for an effective page width of
 150 or 160 millimeters. That way you have a certain safetymargin to
 the borders of the page.\par
 Sometimes you want to add your own translations for REDUCEsymbols
 to be mapped to \TeXitems.
 For such a task, TRI provides a function named
 {\tt TeXlet} which binds any REDUCEsymbol to one of the predefined
 \TeXitems. A call to this function has the following syntax:
 \begin{verbatim}
 TeXlet(REDUCEsymbol,TeXitem)
 \end{verbatim}
 Three examples show how to do it right:
 \begin{verbatim}
 TeXlet(velocity,'!v);
 TeXlet(gamma,"\Gamma ");
 TeXlet(acceleration,"\vartheta ");
 \end{verbatim}
 Besides this method of single assertions you can choose to assert
 one of (currently) two standard sets providing substitutions
 for lowercase and greek letters. These sets are loaded by default.
 You can switch these sets on or off using the functions
 \begin{verbatim}
 TeXassertset setname;
 TeXretractset setname;
 \end{verbatim}
 where the setnames {\tt GREEK} and {\tt LOWERCASE}
 are currently defined and available.
 So far you have learned only how to connect REDUCEatoms with predefined
 \TeXitems but not how to create new \TeXitems itself. We provide a
 way for adding standard \TeXitems of any class {\tt ORD, BIN, REL,
 OPN, CLO, PCT} and {\tt LOP} except for class {\tt INN} which is
 reserved for internal use by TRI only. You can call the function
 \begin{verbatim}
 TeXitem(item,class,listofwidths)
 \end{verbatim}
 e.g. together with a binding
 \begin{verbatim}
 TeXitem("\nabla ",ORD,
 {546135,437818,377748});
 TeXlet(NABLA,"\nabla ");
 \end{verbatim}
 where {\em item} is a legal \TeXcode name\footnote{Please note that
 any \TeXname ending with a letter must be followed by a blank
 to prevent interference with letters of following \TeXitems.
 Note also that you can legalize a name by defining it as a \TeXmacro
 and declaring its width.},
 {\em class} is one of seven classes (see above) and {\em listofwidths}
 is a nonempty list of elements, each one representing the width of
 the item in successive super/subscript depth levels.
 That means that the first entry is the width in display mode,
 the second stands for scriptstyle and the third stands for
 scriptscriptstyle in \TeXterminology.
 Starting with version 0.50, all arguments can be supplied without
 quotation marks, i.e., LISP notation is no longer required
 but still possible.\par
 But how can you retrieve the width information required?
 For this purpose we provide a small interactive \TeX\ facility
 called {\tt redwidth.tex}.
 It repeatedly prompts you for the \TeXitems for which you want
 to retrieve the width information.\par
 Finally, another command is supplied which displays all
 information stored about a specific \TeXitem.
 If, for example, you call
 \begin{verbatim}
 TeXdisplay(NABLA);
 \end{verbatim}
 TRI will respond with
 \begin{verbatim}
 % TeX item \nabla is of class ORD and
 has following widths:
 % 8.333358pt 6.680572pt 5.763977pt
 \end{verbatim}
 %
 \section{Examples}
 %
 Some examples shall demonstrate the capabilities of TRI.
 For each example we state (a) the REDUCE command (i.e.
 the input), (b) the tolerance if it differs from the default, and
 (c) the output as produced in a \TeX\ run. The examples are
 displayed at the end of this article.\par
 %
 \section{Caveats}
 %
 Techniques for printing mathematical expressions are available
 everywhere. TRI adds only a highly specialized version for
 most REDUCE output. The emphasis is on the word {\em most}.
 One major caveat is that we cannot print SYMBOLICmode output
 from REDUCE. This could be done best in a WEBlike programmingplus%
 documentation style. Nevertheless, as Knuth's WEB is allready available
 for PASCAL and C, hopefully someone will write a LISPWEB or a
 REDUCEWEB as well.\par
 \LaTeX\ users will be disappointed that we have not mentioned yet if and
 how TRI cooperates with \LaTeX. Nevertheless, TRI can be used
 together with \LaTeX, as this document proves. But there are some
 important restrictions. First, read in the module ``tridefs.tex''
 at the very beginning of a \LaTeXrun, before you apply any
 \LaTeXspecific command. Furthermore, the \TeXmacros used
 in this module {\em do} interfere with \LaTeX's own macros.
 You cannot use \LaTeX's \verb\(, \verb\), \verb\[ and \verb\]
 commands while you are using ``tridefs.tex''. If you avoid to
 use them you should be able to run TRI with \LaTeX\ smoothly.
 \par
 Whenever you discover a bug in our program please let us
 know. Send us a short report accompanied by an output listing.%
 \footnote{You can reach us via electronic mail at the following
 address: reduce@rrz.unikoeln.de} We will try to fix the error.
 %
 \section{Distribution}
 %
 The whole TRI package consists of following files:
 \begin{itemize}
 \item {\tt tri.latex}: This text as a \TeXinput file.
 \item {\tt tri.tex}: A long version of this report, where we explain
 our breaking algorithm thoroughly.
 \item {\tt tri.red}: This is the REDUCELISP source code
 for TRI (approximately 58 KBytes of code).
 \item {\tt tridefs.tex}: The \TeXinput file to be used together with
 output from TRI.
 \item {\tt redwidth.tex}: This is the \TeXinput file for interactive
 determination of \TeXitem widths.
 \item {\tt tritest.red}: Run this REDUCE file to check if TRI works
 correctly.
 \item {\tt tritest.tex}: When you have run the file {\tt tritest.red},
 just make a \TeX\ run with this file to see all the nice things
 TRI is able to produce.
 \end{itemize}
 You can obtain TRI package from a network library at The
 RAND Corporation, Santa Monica, Ca./USA.
 Simply send a note {\tt send index} to the network address
 {\tt reducenetlib@rand.org} and you will receive a description
 on how to use the REDUCE netlib followed by a directory.
 Specific files may be requested with the command
 {\tt send }{\em library file}, where {\em library} is one the
 catalogues containing the different REDUCE packages, and {\em file}
 is the name of a particular file. For example, you can use
 the message {\tt send tex tri.red} to obtain the RLISPcode of
 the \9.
 % 
 \begin{thebibliography}{Knu88}
 \bibitem[Ant86]{an:be}Antweiler, W.; Strotmann, A.; Pfenning, Th.;
 Winkelmann, V.: {\em Zwischenbericht \"{u}ber den Status der
 Arbeiten am REDUCE\TeXAnschlu\ss.}
 Internal Paper, Rechenzentrum an der Universit\"{a}t
 zu K\"{o}ln, November 1986.
 \bibitem[Ant89]{an:Ab}Antweiler, W.: {\em A \TeX{}REDUCEInterface.}
 Arbeits\bericht RRZK 8901 des Regionalen Rechen\zentrums an der
 Uni\versi\t\"{a}t zu K\"{o}ln, Februar 1989.
 \bibitem[Fat87]{fa:Te}Fateman, Richard J.:
 {\em\TeX\ Output from MACSYMAlike Systems.}
 ACM SIGSAM Bulletin, Vol. 21, No. 4, Issue \#82, pp. 15,
 November 1987.
 \bibitem[Knu81]{kn:br}Knuth, Donald E.; Plass, Michael F.:
 {\em Breaking Paragraphs into Lines.}
 SoftwarePractice and Experience, Vol. 11,
 pp. 11191184, 1981.
 \bibitem[Knu86]{kn:Te}Knuth, Donald E.: {\em The \TeX\book.}
 AddisonWesley, Readings/Ma. Sixth printing, 1986.
 \bibitem[Hea87]{he:RE}Hearn, Anthony C.: {\em REDUCE User's Manual,
 Version 3.3.} The RAND Corporation, Santa Monica, Ca.,
 July 1987.
 \end{thebibliography}
 %
 %
 \onecolumn
 %
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %%%%% %%%%%
 %%%%% Examples for the TRI %%%%%
 %%%%% %%%%%
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %
 \TRIexa{Standard}{TeXindent}{250}{\verb(x+y)**16/(vw)**16}
 $$\displaylines{\qdd
 \(x^{16}
 +16\cdot x^{15}\cdot y
 +120\cdot x^{14}\cdot y^{2}
 +560\cdot x^{13}\cdot y^{3}\nl
 \OFF{327680}
 +1820\cdot x^{12}\cdot y^{4}
 +4368\cdot x^{11}\cdot y^{5}
 +8008\cdot x^{10}\cdot y^{6}\nl
 \OFF{327680}
 +11440\cdot x^{9}\cdot y^{7}
 +12870\cdot x^{8}\cdot y^{8}
 +11440\cdot x^{7}\cdot y^{9}\nl
 \OFF{327680}
 +8008\cdot x^{6}\cdot y^{10}
 +4368\cdot x^{5}\cdot y^{11}
 +1820\cdot x^{4}\cdot y^{12}\nl
 \OFF{327680}
 +560\cdot x^{3}\cdot y^{13}
 +120\cdot x^{2}\cdot y^{14}
 +16\cdot x\cdot y^{15}
 +y^{16}
 \)
 /\nl
 \(v^{16}
 16\cdot v^{15}\cdot w
 +120\cdot v^{14}\cdot w^{2}
 560\cdot v^{13}\cdot w^{3}\nl
 \OFF{327680}
 +1820\cdot v^{12}\cdot w^{4}
 4368\cdot v^{11}\cdot w^{5}
 +8008\cdot v^{10}\cdot w^{6}
 11440\cdot v^{9}\cdot w^{7}\nl
 \OFF{327680}
 +12870\cdot v^{8}\cdot w^{8}
 11440\cdot v^{7}\cdot w^{9}
 +8008\cdot v^{6}\cdot w^{10}
 4368\cdot v^{5}\cdot w^{11}\nl
 \OFF{327680}
 +1820\cdot v^{4}\cdot w^{12}
 560\cdot v^{3}\cdot w^{13}
 +120\cdot v^{2}\cdot w^{14}
 16\cdot v\cdot w^{15}
 +w^{16}
 \)
 \Nl}$$
 \TRIexa{Integration}{TeX}{}{\verbint(1/(x**3+2),x)}
 $$
 
 \(\frac{2^{\frac{1}{
 3}}\cdot
 \(2\cdot
 \sqrt{3}\cdot
 \arctan
 \(\frac{2^{\frac{1}{
 3}}
 2\cdot x}{
 2^{\frac{1}{
 3}}\cdot
 \sqrt{3}}
 \)
 +
 \ln
 \(2^{\frac{2}{
 3}}
 2^{\frac{1}{
 3}}\cdot x
 +x^{2}
 \)
 2\cdot
 \ln
 \(2^{\frac{1}{
 3}}
 +x
 \)
 \)
 }{
 12}
 \)
 $$
 \TRIexa{Integration}{TeXindent}{1000}%
 {\verbint(1/(x{*}{*}4+3*x{*}{*}21,x)}
 $$\displaylines{\qdd
 \(\sqrt{2}\cdot
 \(3\cdot
 \sqrt{
 \sqrt{13}
 3}\cdot
 \sqrt{13}\cdot
 \ln
 \(
 \(\sqrt{
 \sqrt{13}
 3}\cdot
 \sqrt{2}
 \)
 +2\cdot x
 \)
 \nl
 \OFF{2260991}
 3\cdot
 \sqrt{
 \sqrt{13}
 3}\cdot
 \sqrt{13}\cdot
 \ln
 \(\sqrt{
 \sqrt{13}
 3}\cdot
 \sqrt{2}
 +2\cdot x
 \)
 \nl
 \OFF{2260991}
 +13\cdot
 \sqrt{
 \sqrt{13}
 3}\cdot
 \ln
 \(
 \(\sqrt{
 \sqrt{13}
 3}\cdot
 \sqrt{2}
 \)
 +2\cdot x
 \)
 \nl
 \OFF{2260991}
 13\cdot
 \sqrt{
 \sqrt{13}
 3}\cdot
 \ln
 \(\sqrt{
 \sqrt{13}
 3}\cdot
 \sqrt{2}
 +2\cdot x
 \)
 \nl
 \OFF{2260991}
 +6\cdot
 \sqrt{
 \sqrt{13}
 +3}\cdot
 \sqrt{13}\cdot
 \arctan
 \(\frac{2\cdot x}{
 \sqrt{
 \sqrt{13}
 +3}\cdot
 \sqrt{2}}
 \)
 \nl
 \OFF{2260991}
 26\cdot
 \sqrt{
 \sqrt{13}
 +3}\cdot
 \arctan
 \(\frac{2\cdot x}{
 \sqrt{
 \sqrt{13}
 +3}\cdot
 \sqrt{2}}
 \)
 \)
 \)
 /104
 \Nl}$$
 \TRIexa{Solving Equations}{TeXindent}{1000}%
 {\verbsolve(x**3+x**2*mu+nu=0,x)}
 $$\displaylines{\qdd
 \{x=
 \[
 \(\(\(9\cdot
 \sqrt{4\cdot \mu ^{3}\cdot \nu
 +27\cdot \nu ^{2}}
 2\cdot
 \sqrt{3}\cdot \mu ^{3}
 27\cdot
 \sqrt{3}\cdot \nu
 \)
 ^{\frac{2}{
 3}}\cdot
 \sqrt{3}\cdot i\nl
 \OFF{3675021}
 +
 \(9\cdot
 \sqrt{4\cdot \mu ^{3}\cdot \nu
 +27\cdot \nu ^{2}}
 2\cdot
 \sqrt{3}\cdot \mu ^{3}
 27\cdot
 \sqrt{3}\cdot \nu
 \)
 ^{\frac{2}{
 3}}\nl
 \OFF{3675021}
 +2\cdot
 \(9\cdot
 \sqrt{4\cdot \mu ^{3}\cdot \nu
 +27\cdot \nu ^{2}}
 2\cdot
 \sqrt{3}\cdot \mu ^{3}
 27\cdot
 \sqrt{3}\cdot \nu
 \)
 ^{\frac{1}{
 3}}\cdot \nl
 \OFF{3675021}
 2^{\frac{1}{
 3}}\cdot 3^{\frac{1}{
 6}}\cdot
 \mu
 2^{\frac{2}{
 3}}\cdot
 \sqrt{3}\cdot 3^{\frac{1}{
 3}}\cdot
 i\cdot \mu ^{2}
 +2^{\frac{2}{
 3}}\cdot 3^{\frac{1}{
 3}}\cdot
 \mu ^{2}
 \)
 /\nl
 \OFF{3347341}
 \(6\cdot
 \(9\cdot
 \sqrt{4\cdot \mu ^{3}\cdot \nu
 +27\cdot \nu ^{2}}
 2\cdot
 \sqrt{3}\cdot \mu ^{3}
 27\cdot
 \sqrt{3}\cdot \nu
 \)
 ^{\frac{1}{
 3}}\cdot 2^{\frac{1}{
 3}}\cdot
 3^{\frac{1}{
 6}}
 \)
 \)
 \]
 \CO\nl
 \OFF{327680}
 x=
 \[\(\(9\cdot
 \sqrt{4\cdot \mu ^{3}\cdot \nu
 +27\cdot \nu ^{2}}
 2\cdot
 \sqrt{3}\cdot \mu ^{3}
 27\cdot
 \sqrt{3}\cdot \nu
 \)
 ^{\frac{2}{
 3}}\cdot
 \sqrt{3}\cdot i\nl
 \OFF{2837617}
 
 \(9\cdot
 \sqrt{4\cdot \mu ^{3}\cdot \nu
 +27\cdot \nu ^{2}}
 2\cdot
 \sqrt{3}\cdot \mu ^{3}
 27\cdot
 \sqrt{3}\cdot \nu
 \)
 ^{\frac{2}{
 3}}\nl
 \OFF{2837617}
 2\cdot
 \(9\cdot
 \sqrt{4\cdot \mu ^{3}\cdot \nu
 +27\cdot \nu ^{2}}
 2\cdot
 \sqrt{3}\cdot \mu ^{3}
 27\cdot
 \sqrt{3}\cdot \nu
 \)
 ^{\frac{1}{
 3}}\cdot \nl
 \OFF{2837617}
 2^{\frac{1}{
 3}}\cdot 3^{\frac{1}{
 6}}\cdot \mu
 2^{\frac{2}{
 3}}\cdot
 \sqrt{3}\cdot 3^{\frac{1}{
 3}}\cdot i\cdot
 \mu ^{2}
 2^{\frac{2}{
 3}}\cdot 3^{\frac{1}{
 3}}\cdot
 \mu ^{2}
 \)
 /\nl
 \OFF{2509937}
 \(6\cdot
 \(9\cdot
 \sqrt{4\cdot \mu ^{3}\cdot \nu
 +27\cdot \nu ^{2}}
 2\cdot
 \sqrt{3}\cdot \mu ^{3}
 27\cdot
 \sqrt{3}\cdot \nu
 \)
 ^{\frac{1}{
 3}}\cdot 2^{\frac{1}{
 3}}\cdot 3^{
 \frac{1}{
 6}}
 \)
 \]
 \CO\nl
 \OFF{327680}
 x=
 \[\(\(9\cdot
 \sqrt{4\cdot \mu ^{3}\cdot \nu
 +27\cdot \nu ^{2}}
 2\cdot
 \sqrt{3}\cdot \mu ^{3}
 27\cdot
 \sqrt{3}\cdot \nu
 \)
 ^{\frac{2}{
 3}}\nl
 \OFF{2837617}
 
 \(9\cdot
 \sqrt{4\cdot \mu ^{3}\cdot \nu
 +27\cdot \nu ^{2}}
 2\cdot
 \sqrt{3}\cdot \mu ^{3}
 27\cdot \nl
 \OFF{3675021}
 \sqrt{3}\cdot \nu
 \)
 ^{\frac{1}{
 3}}\cdot 2^{\frac{1}{
 3}}\cdot 3^{
 \frac{1}{
 6}}\cdot \mu
 +2^{\frac{2}{
 3}}\cdot 3^{\frac{1}{
 3}}\cdot
 \mu ^{2}
 \)
 /\nl
 \OFF{2509937}
 \(3\cdot
 \(9\cdot
 \sqrt{4\cdot \mu ^{3}\cdot \nu
 +27\cdot \nu ^{2}}
 2\cdot
 \sqrt{3}\cdot \mu ^{3}
 27\cdot
 \sqrt{3}\cdot \nu
 \)
 ^{\frac{1}{
 3}}\cdot 2^{\frac{1}{
 3}}\cdot 3^{
 \frac{1}{
 6}}
 \)
 \]
 \}
 \Nl}$$
 \TRIexa{Matrix Printing}{TeX}{}{%
 \verbmat((1,ab,1/(cd)),(a**2b**2,1,sqrt(c)),((a+b)/(cd),sqrt(d),1))
 }
 $$
 \pmatrix{1&a
 b&
 \frac{1}{
 c
 d}\cr
 a^{2}
 b^{2}&1&
 \sqrt{c}\cr
 \frac{a
 +b}{
 c
 d}&
 \sqrt{d}&1\cr
 }
 $$
 %
 %
 \end{document}
