% File: TeX Inputs Cell4.tex % Author: J E Pittman % Bitnet: JEPTeX@TAMVenus % Internet: JEPTeX@Venus.TAMU.EDU % Date: November 8, 1988 % % Set up to output the data. % \catcode`_=11 % Protect local control sequence names. % % The user supplied information about the column has already been % processed. % \def\column #1{\relax\ignorespaces}% % \row_number=0 \rowpenalty=0 % % This routine is used for horizontal kerning when there might be a % kern to the left of the current position. % \def\move_right_via_lastkern #1{\relax \temp_dimen=#1\relax \ifdim \lastkern>\zeropt \advance \temp_dimen \by \lastkern \unkern \else \fi \kern \temp_dimen }% % % \row begins a row by getting its specifications, terminating the % previous row (if any) and going into horizontal mode. % \def\row #1{\relax \advance \row_number \by 1 \everyrow \get_row_number_data \advance \rowheight \by \expansion \ifdim \bottomrulewidth>\zeropt \advance \bottomrulewidth \by \horizontal_rule_adjust \fi \column_number=0 \par \ifnum \rowpenalty=0 \else \penalty \rowpenalty \rowpenalty=0 \fi \noindent \ignorespaces \message{Outputting row \the\row_number.}% }% % % \blank creates a blank cell by kerning the appropriate amount. % \def\blank {\relax \advance \column_number \by 1 \everycolumn \get_column_number_data \advance \columnwidth \by \expansion \advance \merge_width \by \expansion \move_right_via_lastkern \merge_width % % Terminate merger(s). % \merge_width=\zeropt \merge_columns=0 \ifnum \merge_rows>0 \add_column_number_data {\merge_rows=0\relax\merge_height=\zeropt\relax}% \fi }% % % \cell outputs a cell. The components of the cell are (in the order % output) the entry, the top ruler, the bottom ruler, and the left and % right rulers. % \def\cell #1{\relax \advance \column_number \by 1 \everycolumn \get_column_number_data \advance \columnwidth \by \expansion \advance \merge_height \by \rowheight \advance \merge_width \by \columnwidth \ifdim \leftrulewidth>\zeropt \advance \leftrulewidth \by \vertical_rule_adjust \fi \ifdim \rightrulewidth>\zeropt \advance \rightrulewidth \by \vertical_rule_adjust \fi % % Get the correct top border skip and rule width. Note that it is % necessary to extract this informaion even if a row merger is not % present because a previous row merger might have left the wrong % values. % \begingroup \advance \row_number \by -\merge_rows \everyrow \get_row_number_data \xdef\globaltemp{\topborderskip=\the\topborderskip\relax \toprulewidth=\the\toprulewidth\relax }% \aftergroup \globaltemp \endgroup \ifdim \toprulewidth>\zeropt \advance \toprulewidth \by \horizontal_rule_adjust \fi % % Same procedure for the left border skip and rule width except that % extraction is necessary only in the presense of a column merger due % to the execution of an every column and a get at the start of \cell. % \ifnum \merge_columns>0 \begingroup \advance \column_number \by -\merge_columns \everycolumn \get_column_number_data \xdef\globaltemp{\leftrulewidth=\the\leftrulewidth\relax \leftborderskip=\the\leftborderskip\relax }% \aftergroup \globaltemp \endgroup \ifdim \leftrulewidth>\zeropt \advance \leftrulewidth \by \vertical_rule_adjust \fi \fi % % Typeset the entry into temp box horizontally first, trying kerns % before glue in case the cell does not require horizontal stretching % and taking advantage of an empty cell by doing nothing, if such is % the case. % \setbox\temp_box=\hbox{#1}% \ifdim\wd\temp_box>\zeropt \setbox\temp_box=\hbox \bgroup \kern \leftborderskip \box\temp_box \egroup \temp_dimen=\wd\temp_box \advance\temp_dimen \by \rightborderskip \wd\temp_box=\temp_dimen % \ifdim\wd\temp_box=\merge_width % % then the kerns can be used instead of skips. % \else \setbox\temp_box=\hbox \to \merge_width \bgroup \hskip \leftborderskip #1% \hskip \rightborderskip \egroup \fi % % Hide the width of temp box and put a phantom into it the hard way. % \wd\temp_box=\zeropt \setbox\scratch_box=\hbox{#1)}% \ifdim \dp\scratch_box>\dp\temp_box \dp\temp_box=\dp\scratch_box \fi \ifdim \ht\scratch_box>\ht\temp_box \ht\temp_box=\ht\scratch_box \fi % \temp_dimen=\ht\temp_box \advance \temp_dimen \by \dp\temp_box \advance \temp_dimen \by \bottomborderskip \advance \temp_dimen \by \topborderskip \ifdim \temp_dimen=\merge_height % % then the entry can be positioned vertically via a raise statement. % The total height of the material output should be equal to the row % height, thus acting as a strut. % \temp_dimen=\bottomborderskip \advance \temp_dimen \by \dp\temp_box \scratch_dimen=\rowheight \advance\scratch_dimen by -\temp_dimen \ht\temp_box=\scratch_dimen \raise \temp_dimen \box\temp_box \else % have to do it via a box \setbox\temp_box=\vbox \to \rowheight \bgroup % % Subtracting merge height - row height from top border skip allows % the cell to stick up into the next row by an appropriate amount. % \advance \topborderskip \by \rowheight \advance \topborderskip \by -\merge_height \vskip \topborderskip \box\temp_box \vskip \bottomborderskip \egroup \box\temp_box \fi \fi % % All of the rules are typeset with an overlap of at least pixel width % which insures that there will be no gaps. % % Typeset the top rule into an hbox and use a raise statement to put % it into position. % \ifdim \toprulewidth>\zeropt \setbox\temp_box=\hbox \bgroup \temp_dimen=\merge_width \ifdim \half\leftrulewidth<\pixelwidth \kern -\pixelwidth \else \kern -\half\leftrulewidth \fi \advance \temp_dimen \by -\lastkern \vrule \height \half\toprulewidth \depth \half\toprulewidth \width \temp_dimen \ifdim \half\rightrulewidth<\pixelwidth \temp_dimen=\pixelwidth \else \temp_dimen=\half\rightrulewidth \fi \kern -\temp_dimen \vrule \height \half\toprulewidth \depth \half\toprulewidth \width 2\temp_dimen \egroup \wd\temp_box=\zeropt \temp_dimen=\rowheight \advance\temp_dimen \by -\merge_height \ht\temp_box=\temp_dimen \dp\temp_box=\merge_height \raise \merge_height \box\temp_box \fi % % Output the bottom rule using the same methods. % \ifdim \bottomrulewidth>\zeropt \setbox\temp_box=\hbox \bgroup \temp_dimen=\merge_width \ifdim \half\leftrulewidth<\pixelwidth \kern -\pixelwidth \else \kern -\half\leftrulewidth \fi \advance \temp_dimen \by -\lastkern \vrule \height \half\bottomrulewidth \depth \half\bottomrulewidth \width \temp_dimen \ifdim \half\rightrulewidth<\pixelwidth \temp_dimen=\pixelwidth \else \temp_dimen=\half\rightrulewidth \fi \kern -\temp_dimen \vrule \height \half\bottomrulewidth \depth \half\bottomrulewidth \width 2\temp_dimen \egroup \wd\temp_box=\zeropt \dp\temp_box=\zeropt \ht\temp_box=\rowheight \box\temp_box \fi % % Test to see if the left inclusive-or right rule width is non-zero. % \ifdim \leftrulewidth=\zeropt \temp_dimen=\rightrulewidth \else \temp_dimen=\leftrulewidth \fi \ifdim \temp_dimen>\zeropt \setbox\temp_box=\hbox \bgroup \temp_dimen=\merge_height \advance \merge_height \by \pixelwidth \ifdim \leftrulewidth>\zeropt \kern -\half\leftrulewidth \vrule \height \temp_dimen \depth \pixelwidth \width \leftrulewidth \fi \ifdim \rightrulewidth>\zeropt \scratch_dimen=\merge_width \advance \scratch_dimen \by -\half\leftrulewidth \advance \scratch_dimen \by -\half\rightrulewidth \kern \scratch_dimen \vrule \height \temp_dimen \depth \pixelwidth \width \rightrulewidth \fi \egroup \wd\temp_box=\merge_width \ht\temp_box=\rowheight \dp\temp_box=\zeropt \box\temp_box \else \move_right_via_lastkern \merge_width \fi % % Cancel the mergers. % \merge_width=\zeropt \merge_columns=0 \ifnum \merge_rows>0 \add_column_number_data {\merge_rows=0\relax\merge_height=\zeropt\relax}% \fi \ignorespaces }% % % No surprises here. % \def\mergeright {\relax \advance \column_number \by 1 \everycolumn \get_column_number_data \advance \columnwidth \by \expansion \advance \merge_width \by \columnwidth \advance \merge_columns \by 1 \ifnum \merge_rows>0 \add_column_number_data {\merge_rows=0\relax\merge_height=\zeropt\relax}% \fi }% % % No surprises here. % \def\mergedown {\relax \advance \column_number \by 1 \everycolumn \get_column_number_data \advance \columnwidth \by \expansion \advance \merge_width \by \columnwidth \move_right_via_lastkern \merge_width \merge_width=\zeropt \merge_columns=0 \advance \merge_height \by \rowheight \let\info=\relax \edef\temp{\the\column_number>\info {\merge_height=\the\merge_height\relax \advance\merge_rows \by 1\relax}}% \let\info=\column_info \x_after \add_data \temp \rowpenalty=10000 % do not allow a break over a row merge. }% % \catcode`_=8 % Back to normal. % \def\noalign#1{\relax \vadjust{#1}% \ignorespaces }% % \endinput