%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Maple Table Support
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\ProvidesPackage{mapletab}[1998/09/19 -- Maple Spreadsheets]
\typeout{Defining Maple Spreadsheet Environemnts}
\typeout{Maple Spreadsheet and Table Support}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% Copyright (c) 1994--1998 by Waterloo Maple Inc., all rights reserved.
%
% Permission is granted to use this package without charge. It may
% be redistributed providing that it is distributed as is
% and without charge.  You may modify these macros for your own use,
% and redistribute them, subject to the following conditions.
%
% 1. The package name used for any modified version of this file is 
%    different from mapletab and a file name other than mapletab.sty
%    is used.
%
% 2. You acknowledge this copyright notice and this file as the source.
%
% 3. The new file is redistributed under the same terms and conditions 
%    as indicated here, including a version of this notice modified to
%    refer to the new file and/or package name.
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% Maple Spreadsheets and Tables Package
%%%
%%%  Maple displays its spreadsheets as a tabular arrays of cells.
%%%
%%% This is essentially a tabular environment
%%% with some pre and post processing. 
%%% The format is:
%%% \begin{maplespreadsheet}[spreadsheet01.tab]{|c|c|}
%%% \hline
%%% entry 1 &
%%% entry 2 &
%%% \mapleinline{inert}{2d}{1;}{xx} \\
%%% \hline
%%% entry 2,21 &
%%% entry 2,3  &
%%% \mapleinline{{1;} \\
%%% \hline
%%%\end{maplespreadsheet}
%%%
%%%  The cells are in typeset in text mode. The mathematics is
%%%  usually provided in \mapleinline in order to provide both the
%%%  Maple and the LaTeX encoding of the expression.
%%%
%%%  Maple's \multiline macro is used in the latex portion
%%%  of the \mapleinline macro in order to effect line wrapping.
%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\newif\ifMapleTableCell%  % used to change vertical offset of a
			  % mapleinline inside table
\newdimen\multilinesep%
\multilinesep=1ex%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%
%%% maplespreadsheet - tabular environment whose entries are encoded
%%%	using mapleinline.
%%%
%%%	\begin{maplespreadsheet}[filename]{format}
%%%	...
%%%	\end{maplespreadsheet}
%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\def\maplespreadsheet{%
\@ifnextchar [{\@maplespreadsheet}{\@maplespreadsheet[]}
}
\def\@maplespreadsheet[#1]#2{%
\par\MapleTableCelltrue\begin{center}\begin{tabular}{#2}}%
\def\endmaplespreadsheet{%
\end{tabular}%
\end{center}%
\MapleTableCellfalse%
}
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%
%%% maplemultiline - Used for stacking lines of maple input and output
%%%
%%% An implementation of mapleinline based on vbox and hbox.
%%% The tokens are parsed and dropped into hboxes which are in turn
%%% collected into a vbox.
%%%
%%% Each line of the multiline is followed by some extra space
%%% No extra space is required at the top as the multiline is
%%% used inside of \mapleinline, which provide's its own space
%%%
%%% \maplemultiline{x^2 + y^2\\(x - y)^{100}\\}
%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Tokens and utilities used by \maplemultiinline
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\newbox\@linebuffer\setbox\@linebuffer=\vbox{\relax}
\newbox\@currentline\setbox\@currentline=\hbox{\relax}
\newdimen\@linebufferwidth  %%% DEBUG %%%
\newtoks\EndMultiLine%
\@ifundefined{@skiponetoken}{\gdef\@skiponetoken#1{\relax}}{\relax}%
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% \maplemultiline -
%%% for use primarily inside of table cells.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\def\maplemultiline#1{%
{\def\\{\relax}%
\processcell#1\noexpand\\\EndMultiLine%
}%
%%% \@linebufferwidth=\wd\@linebuffer%%% DEBUG %%%
%\fbox{\@dumplinebuffer}%         %%% DEBUG %%%
\@dumplinebuffer%
}%
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% \processcell -
%%% start processing the contents of the cell
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\def\processcell{\futurelet\@nexttoken\processline}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% \processline
%%% - invokes \processfullline unless at the
%%% end of the cell. (skips over \cr's to
%%% avoid spacing problems)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\def\processline{%
\ifx\@nexttoken\EndMultiLine%
\let\next\@skiponetoken%  % at end of cell.
\else%
\let\next\processfullline%% grab next line 
\fi%
% \cr's cause spacing problems.
\ifx\@nexttoken\cr\@skiponetoken\let\next\processline\fi%
\next%
}%
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% \processfullline -
%%% - Adds currentline (as identified by \\)
%%% to the vbox \@linebuffer
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\def\processfullline #1\\{%
\global\setbox\@currentline=\hbox{$#1$}
\@extendlinebuffer{\@currentline}%
\processcell}
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% \@extendlinebuffer - a stack of lines
%%% add currentline to end of \@linebuffer
%%%
%%% #1 is assumed to be a box. (hbox) and
%%% is reset at the end.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\def\@extendlinebuffer#1{%
\ifvoid#1\else% 	% skip over blank lines
\ifvoid\@linebuffer%	% first line ?
\global\setbox\@linebuffer=\vtop{\copy#1}%
\else%			% add new lines
\global\setbox\@linebuffer=\vtop{%
\unvcopy\@linebuffer%
\copy#1%
\vskip\multilinesep%
}%
\fi%
\fi%
\global\setbox#1=\hbox{}% reset currentline
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% \@dumplinebuffer -
%%% place @linebuffer on the output stream as
%%% a vbox.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\def\@dumplinebuffer{%
\setbox\@linebuffer=\vtop{%
\hbox{\vrule height3pt depth0pt width 0pt}%
\unvbox\@linebuffer%
\unskip}%  
\box\@linebuffer%  A verticle box ...
\global\setbox\@linebuffer=\vbox{}%
\relax}
\endinput %%% mapletab.def
%%%