summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/plain/cellular
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2006-01-12 23:46:46 +0000
committerKarl Berry <karl@freefriends.org>2006-01-12 23:46:46 +0000
commitb1c871653d37d9c6fd0f97b048dca051b5b1db27 (patch)
tree3f925e95aa3461b9ecb75df861259a7f71bc3f23 /Master/texmf-dist/tex/plain/cellular
parent82770e7491344072d5dd54ce9a78546eebe99c3f (diff)
trunk/Master/texmf-dist/tex/plain
git-svn-id: svn://tug.org/texlive/trunk@621 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/plain/cellular')
-rw-r--r--Master/texmf-dist/tex/plain/cellular/cell1.tex148
-rw-r--r--Master/texmf-dist/tex/plain/cellular/cell2.tex216
-rw-r--r--Master/texmf-dist/tex/plain/cellular/cell3.tex132
-rw-r--r--Master/texmf-dist/tex/plain/cellular/cell4.tex355
-rw-r--r--Master/texmf-dist/tex/plain/cellular/cellular.tex29
5 files changed, 880 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/plain/cellular/cell1.tex b/Master/texmf-dist/tex/plain/cellular/cell1.tex
new file mode 100644
index 00000000000..89b98a354ea
--- /dev/null
+++ b/Master/texmf-dist/tex/plain/cellular/cell1.tex
@@ -0,0 +1,148 @@
+% File: TeX Inputs Cell1.tex
+% Author: J E Pittman
+% Bitnet: JEPTeX@TAMVenus
+% Internet: JEPTeX@Venus.TAMU.EDU
+% Date: October 11, 1988
+%
+% Set up the cellular environment
+%
+\catcode`_=11 % Protect local macros.
+%
+\ifx\forcount\undefined \input loopy \fi
+\ifx\declarecount\undefined \input declare \fi
+%
+% Handy abbreviations
+%
+\def\half{0.5}%
+\def\by{by}%
+\def\height{height}%
+\def\depth{depth}%
+\def\width{width}%
+\def\to{to}%
+\def\zeropt{0pt}%
+\let\x_after=\expandafter
+%
+% When using the Xerox 9700s or 4050, use \setverticaladjustment for
+% portrait output and \sethorizontaladjustment for landscape output
+% due to the differences in the way that vertical and horizontal lines
+% of the same weight are printed.
+%
+\declaredimen\pixelwidth
+\pixelwidth=1in
+\divide\pixelwidth by 300 % assume 300dpi
+%
+\declaredimen\horizontal_rule_adjust
+\horizontal_rule_adjust=\zeropt
+\def\sethorizontaladjustment{\horizontal_rule_adjust=\pixelwidth}%
+%
+\declaredimen\vertical_rule_adjust
+\vertical_rule_adjust=\zeropt
+\def\setverticaladjustment{\vertical_rule_adjust=\pixelwidth}%
+%
+% The left, right, bottom, and top rule widths are used to determine
+% the widths of the box around each cell.
+%
+\declaredimen\leftrulewidth
+\declaredimen\rightrulewidth
+\declaredimen\bottomrulewidth
+\declaredimen\toprulewidth
+%
+% The left, right, bottom, and top border skips are used to position
+% the text of a cell within it, relative to the centers of the rulers.
+%
+\declareskip\leftborderskip
+\declareskip\rightborderskip
+\declareskip\bottomborderskip
+\declareskip\topborderskip
+%
+\declarecount\last_column
+\declaredimen\columnwidth
+\declarecount\merge_columns
+\declaredimen\merge_width
+%
+\declarecount\last_row
+\declaredimen\rowheight
+\declarecount\merge_rows
+\declaredimen\merge_height
+\declarecount\rowpenalty
+%
+% The row info and column info token registers contain a list of
+% tokens of the form /number/info, where number is the number of a
+% row or column of interest and info is information, usually register
+% assignments, that pertains to the row or column.
+%
+\declaretoks\column_info
+\column_info={/}%
+%
+\declaretoks\row_info
+\row_info={/}%
+%
+\def\everycolumn{\leftrulewidth=0.4pt\relax
+ \rightrulewidth=\leftrulewidth
+ \leftborderskip=6pt plus 1fil\relax
+ \rightborderskip=\leftborderskip
+ \columnwidth=\zeropt\relax
+ \merge_rows=0\relax
+ \merge_height=\zeropt\relax
+ \columnwidth=\zeropt\relax
+ }%
+%
+\def\everyrow{\toprulewidth=0.4pt\relax
+ \bottomrulewidth=\toprulewidth
+ \topborderskip=3pt plus 1fil\relax
+ \bottomborderskip=\topborderskip
+ \rowheight=\zeropt\relax
+ \merge_columns=0\relax
+ \merge_width=\zeropt\relax
+ }%
+%
+\def\get_data#1<#2{\relax
+ \def\temp##1/#1/##2/##3***{\relax
+ \def\temp{##2}%
+ \ifnum1=0\temp
+ #2={##1/#1//}%
+ \else
+% \message{extracted ##2}% debug
+ ##2%
+ \fi
+ }%
+ \x_after\temp\the#2#1/1/***%
+ }%
+%
+\def\add_data#1>#2#3{\relax
+ \def\temp##1/#1/##2/##3***{\relax
+ #2={##1/#1/##2#3/##3}%
+% \message{\string#2=\the#2}% debug
+ }%
+ \x_after\temp\the#2***%
+ }%
+%
+\def\add_column_number_data{\relax
+ \x_after \add_data \the\column_number>\column_info
+ }%
+%
+\def\get_column_number_data{\relax
+ \x_after \get_data \the\column_number<\column_info
+ }%
+%
+\def\add_row_number_data{\relax
+ \x_after \add_data \the\row_number>\row_info
+ }%
+%
+\def\get_row_number_data{\relax
+ \x_after \get_data \the\row_number<\row_info
+ }%
+%
+\declarebox\temp_box
+\declarebox\scratch_box
+\declaredimen\temp_dimen
+\declaredimen\scratch_dimen
+\declareskip\temp_skip
+\declarecount\temp_count
+%
+\declarecount\tracingexpansions
+\tracingexpansions=0
+%
+\catcode`_=8 % Return to normal.
+%
+\endinput
diff --git a/Master/texmf-dist/tex/plain/cellular/cell2.tex b/Master/texmf-dist/tex/plain/cellular/cell2.tex
new file mode 100644
index 00000000000..4b025aabb8e
--- /dev/null
+++ b/Master/texmf-dist/tex/plain/cellular/cell2.tex
@@ -0,0 +1,216 @@
+% File: TeX Inputs Cell2.tex
+% Author: J E Pittman
+% Bitnet: JEPTeX@TAMVenus
+% Internet: JEPTeX@Venus.TAMU.EDU
+% Date: November 8, 1988
+%
+% Prepare to scan the data, taking notes as to span sizes, row and
+% column dimensions, et cetera.
+%
+\catcode`_=11 % Used to protect local control sequence names.
+%
+% The span info tokens contain sets of entries of the form \process
+% {position}{number}{dimension}, where position is the terminal column
+% or row, number is the number of columns or rows leading into the
+% column or row, and dimension is the size of the information.
+%
+\declaretoks\column_span_info
+\column_span_info={}%
+\declaretoks\row_span_info
+\row_span_info={}%
+%
+\let\process=\relax
+%
+\declarecount\column_number
+\column_number=0
+%
+% Create a column information entry and put the user's specifications
+% into it.
+%
+\def\column#1{\relax
+ \advance\column_number \by 1
+ \last_column=\column_number
+ \get_column_number_data
+ \add_column_number_data {#1}%
+ \ignorespaces
+ }%
+%
+\declarecount\row_number
+\row_number=0
+%
+% Same as \column.
+%
+\def\row#1{\relax
+ \advance\row_number \by 1
+ \message{Scanning row \the\row_number.}%
+ \last_row=\row_number
+ \everyrow
+ \get_row_number_data
+ \add_row_number_data {#1}%
+ \column_number=0
+ \ignorespaces
+ }%
+%
+% \blank is used to generate a cell without a border or data. In this
+% context, all it does is absorb merges.
+%
+\def\blank{\relax
+ \advance\column_number \by 1
+ \if\column_number>\last_column
+ \advance\column_number \by -1
+ \column{}%
+ \fi
+ \everycolumn
+ \get_column_number_data
+ \ifnum\merge_rows>1
+ \add_column_number_data {\merge_rows=0\relax}%
+ \fi
+ \merge_columns=0
+ }%
+%
+% \cell is used to generate a normal, ruled cell. In this context, it
+% merely measures the cell and makes the appropriate notes.
+%
+\def\cell#1{\relax
+ \advance\column_number \by 1
+ \if\column_number>\last_column
+ \advance\column_number \by -1
+ \column{}%
+ \fi
+ \everycolumn
+ \get_column_number_data
+%
+% Typeset the information into temp box.
+%
+ \setbox\temp_box=\vbox \bgroup
+ \begingroup
+ \ifnum\merge_rows>0
+ \advance\row_number \by -\merge_rows
+ \get_row_number_data
+ \fi
+ \vskip \topborderskip
+ \endgroup
+ \hbox \bgroup
+ \begingroup
+ \ifnum\merge_columns>0
+ \advance\column_number \by -\merge_columns
+ \get_column_number_data
+ \fi
+ \hskip \leftborderskip
+ \endgroup
+ #1\vphantom{)}%
+ \hskip \rightborderskip
+ \egroup
+ \vskip \bottomborderskip
+ \egroup
+%
+% If it is a row merger, record it for later processing.
+%
+ \ifnum \merge_rows>0
+ \edef\temp{\process
+ {\the\merge_rows}{\the\ht\temp_box}{\the\row_number}%
+ \the\row_span_info
+ }%
+ \x_after\row_span_info\x_after=\x_after{\temp}%
+% \message{\string\row_span_info=\the\row_span_info}% debug
+ \add_column_number_data {\merge_rows=0\relax}%
+ \else
+%
+% Not a merger, record the height if max.
+%
+ \ifdim\ht\temp_box>\rowheight
+ \let\info=\relax
+ \edef\temp{\the\row_number>\info
+ {\rowheight=\the\ht\temp_box\relax}}%
+ \let\info=\row_info
+ \x_after \add_data \temp
+% \message{\string\row_info=\the\row_info}% debug
+ \rowheight=\ht\temp_box
+ \fi
+ \fi
+%
+% Same as above for column merger and width.
+%
+ \ifnum \merge_columns>0
+ \edef\temp{\process
+ {\the\merge_columns}{\the\wd\temp_box}{\the\column_number}%
+ \the\column_span_info
+ }%
+ \x_after\column_span_info\x_after=\x_after{\temp}%
+% \message{\string\column_span_info=\the\column_span_info}% debug
+ \merge_columns=0
+ \else
+ \ifdim\wd\temp_box>\columnwidth
+ \let\info=\relax
+ \edef\temp{\the\column_number>\info
+ {\columnwidth=\the\wd\temp_box\relax}}%
+ \let\info=\column_info
+ \x_after \add_data \temp
+% \message{\string\column_info=\the\column_info}% debug
+ \fi
+ \fi
+ }%
+%
+% \mergeright specifies that the corresponding position is to be
+% merged with the cell to its right.
+%
+\def\mergeright{\relax
+ \advance\column_number \by 1
+ \if\column_number>\last_column
+ \advance\column_number \by -1
+ \column{}%
+ \fi
+ \everycolumn
+ \get_column_number_data
+ \advance\merge_columns \by 1
+%
+% Cancel a row merge, if present.
+%
+ \ifnum\merge_rows>1
+ \add_column_number_data {\merge_rows=0\relax}%
+ \fi
+ }%
+%
+% Same as \mergeright, except down.
+%
+\def\mergedown{\relax
+ \advance\column_number \by 1
+ \if\column_number>\last_column
+ \advance\column_number \by -1
+ \column{}%
+ \fi
+ \everycolumn
+ \get_column_number_data
+ \add_column_number_data {\advance\merge_rows \by 1\relax}%
+ \merge_columns=0
+ }%
+%
+% The horizontal and vertical stretch macros allow the user to specify
+% an explicit stretch that will subsequently be processed like a span.
+% User-specified stretches are processed after span caused ones. The
+% parameters are the starting column/row, the ending column/row, and
+% the size of the stretch.
+%
+\def\horizontalstretch#1#2#3{\relax
+ \temp_count=#2\relax
+ \advance\temp_count \by -#1\relax
+ \edef\temp{\the\column_span_info\process{\the\temp_count}{#3}{#2}}%
+ \x_after \column_span_info\x_after=\x_after{\temp}%
+% \message{\string\column_span_info=\the\column_span_info}% debug
+ \ignorespaces
+ }%
+%
+\def\verticalstretch#1#2#3{\relax
+ \temp_count=#2\relax
+ \advance\temp_count \by -#1\relax
+ \edef\temp{\the\row_span_info\process{\the\temp_count}{#3}{#2}}%
+ \x_after \row_span_info\x_after=\x_after{\temp}%
+% \message{\string\row_span_info=\the\row_span_info}% debug
+ \ignorespaces
+ }%
+%
+\def\noalign#1{\ignorespaces}% don't do anything for the first pass
+%
+\catcode`_=8 % Return to normal.
+%
+\endinput
diff --git a/Master/texmf-dist/tex/plain/cellular/cell3.tex b/Master/texmf-dist/tex/plain/cellular/cell3.tex
new file mode 100644
index 00000000000..1daa3b1746d
--- /dev/null
+++ b/Master/texmf-dist/tex/plain/cellular/cell3.tex
@@ -0,0 +1,132 @@
+% File: TeX Inputs Cell3.tex
+% Author: J E Pittman
+% Bitnet: JEPTeX@TAMVenus
+% Internet: JEPTeX@Venus.TAMU.EDU
+% Date: October 11, 1988
+%
+% Process the column and row span info.
+%
+\declaredimen\expansion
+%
+\edef\everycolumn{\everycolumn\expansion=\zeropt\relax}%
+\edef\everyrow{\everyrow\expansion=\zeropt\relax}%
+%
+\catcode`_=11 % used to protect local control sequence names.
+%
+%\message{\string\row_span_info=\the\row_span_info}% debug
+%\message{\string\column_span_info=\the\column_span_info}% debug
+%
+\def\process#1#2#3{\relax
+ \last_cell=#3\relax
+ \first_cell=\last_cell
+ \advance \first_cell \by -#1\relax
+ \span_size=#2\relax
+%
+% Compute the gap between the size of the span and the total size of
+% the cells spanned.
+%
+ \gap=\span_size
+ \forcount \cell_number=\first_cell to \last_cell by 1 do
+ \everycell
+ \get_cell_number_data
+ \advance \gap \by -\cell_size
+ \advance \gap \by -\expansion
+ \endfor \cell_number
+% \message{\string\first_cell=\the\first_cell}% debug
+% \message{\string\last_cell=\the\last_cell}% debug
+% \message{\string\span_size=\the\span_size}% debug
+% \message{\string\gap=\the\gap}% debug
+%
+% If the gap is 0pt or less, nothing needs to be done, else search for
+% the minimum expansion that can be applied to every cell with a
+% current expansion less than the expansion found such that the span
+% is properly accomadated.
+%
+ \ifdim \gap>\zeropt
+ \expandable_cells=#1\relax
+ \advance \expandable_cells \by 1
+ \trial_expansion=\zeropt
+ \whilenot\search \ifdim\gap=\zeropt do
+% \message{\string\gap=\the\gap}% debug
+ \ifnum \expandable_cells=0
+ \advance \trial_expansion \by \expansion
+ \else
+ \multiply \trial_expansion \by \expandable_cells
+ \advance \trial_expansion \by \gap
+ \divide \trial_expansion \by \expandable_cells
+ \expandable_cells=0
+ \fi
+ \gap=\span_size
+% \message{\string\trial_expansion=\the\trial_expansion}% debug
+ \forcount \cell_number=\first_cell to \last_cell by 1 do
+ \everycell
+ \get_cell_number_data
+ \advance \gap \by -\cell_size
+ \ifdim \expansion>\trial_expansion
+ \advance \gap \by -\expansion
+ \else
+ \advance \gap \by -\trial_expansion
+ \advance \expandable_cells \by 1
+ \fi
+ \endfor \cell_number
+ \temp_dimen=1sp
+ \multiply \temp_dimen \by \expandable_cells
+ \ifdim \gap>-\temp_dimen
+ \ifdim \gap<\temp_dimen
+ \gap=\zeropt
+ \fi
+ \fi
+ \endwhilenot \search
+ \forcount \cell_number=\first_cell to \last_cell by 1 do
+ \everycell
+ \get_cell_number_data
+ \ifdim \expansion<\trial_expansion
+ \let\info=\relax
+ \edef\temp{\the\cell_number>\info
+ {\expansion=\the\trial_expansion\relax}}%
+ \let\info=\cell_info
+ \x_after \add_data \temp
+ \ifnum\tracingexpansions>0
+ \message{Expanded \the\cell_number}%
+ \message{by \the\trial_expansion}%
+ \message{from \the\cell_size}%
+ \advance \cell_size \by \trial_expansion
+ \message{to \the\cell_size.}%
+ \fi
+ \fi
+ \endfor \cell_number
+ \fi
+ }%
+%
+\declarecount\first_cell
+\declarecount\last_cell
+\declaredimen\span_size
+\let\expandable_cells=\temp_count
+\declaredimen\trial_expansion
+\let\gap=\scratch_dimen
+%
+\let\cell_number=\row_number
+\let\everycell=\everyrow
+\let\get_cell_number_data=\get_row_number_data
+\let\cell_info=\row_info
+\let\cell_size=\rowheight
+\ifnum\tracingexpansions>0
+ \message{Checking row expansions.}%
+\fi
+\the\row_span_info
+%
+\let\cell_number=\column_number
+\let\everycell=\everycolumn
+\let\get_cell_number_data=\get_column_number_data
+\let\cell_info=\column_info
+\let\cell_size=\columnwidth
+\ifnum\tracingexpansions>0
+ \message{Checking column expansions.}%
+\fi
+\the\column_span_info
+%
+\let\process=\relax
+%
+\catcode`_=8 % back to normal
+%
+\endinput
diff --git a/Master/texmf-dist/tex/plain/cellular/cell4.tex b/Master/texmf-dist/tex/plain/cellular/cell4.tex
new file mode 100644
index 00000000000..498fd6f0044
--- /dev/null
+++ b/Master/texmf-dist/tex/plain/cellular/cell4.tex
@@ -0,0 +1,355 @@
+% 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
diff --git a/Master/texmf-dist/tex/plain/cellular/cellular.tex b/Master/texmf-dist/tex/plain/cellular/cellular.tex
new file mode 100644
index 00000000000..62f2c7c02f5
--- /dev/null
+++ b/Master/texmf-dist/tex/plain/cellular/cellular.tex
@@ -0,0 +1,29 @@
+% File: TeX Inputs cellular.tex
+% Author: J E Pittman
+% Bitnet: JEPTeX@TAMVenus
+% Internet: JEPTeX@Venus.TAMU.EDU
+% Date: November 8, 1988
+%
+% This file defines the main macro for cellular table construction.
+% For commentary, please see the file cellular.doc.
+%
+\message{Cellular.TeX version 0.}%
+%
+\def\begincellular#1#2\endcellular{\relax
+ \begingroup
+ \input Cell1 % set up enviroment
+ #1\relax
+ \input Cell2 % set up for scan
+ \ignorespaces
+ #2\relax % scan the cells
+ \input Cell3 % compute spans
+ \input Cell4 % set up for output
+ \offinterlineskip
+ \parskip=\zeropt
+ \ignorespaces
+ #2\relax % output cells
+ \par
+ \endgroup
+ }%
+%
+\endinput