summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/makecell/makecell.dtx
diff options
context:
space:
mode:
Diffstat (limited to 'macros/latex/contrib/makecell/makecell.dtx')
-rw-r--r--macros/latex/contrib/makecell/makecell.dtx1983
1 files changed, 1983 insertions, 0 deletions
diff --git a/macros/latex/contrib/makecell/makecell.dtx b/macros/latex/contrib/makecell/makecell.dtx
new file mode 100644
index 0000000000..c0988087b4
--- /dev/null
+++ b/macros/latex/contrib/makecell/makecell.dtx
@@ -0,0 +1,1983 @@
+% \iffalse
+%
+% makecell.dtx - Managing of tabular column heads and cells.
+% (c) 2005--2007 Olga Lapko (Lapko.O@g23.relcom.ru)
+%
+% This program is provided under the terms of the
+% LaTeX Project Public License distributed from CTAN
+% archives in directory macros/latex/base/lppl.txt.
+%
+% \fi
+%
+% \iffalse
+%<*driver>
+\ProvidesFile{makecell.dtx}
+%</driver>
+%<package>\NeedsTeXFormat{LaTeX2e}[1999/12/01]
+%<package>\ProvidesPackage{makecell}
+%<*package>
+ [2009/08/03 V0.1e Managing of Tab Column Heads and Cells]
+%</package>
+%
+%<*batchfile>
+\begingroup
+
+\input docstrip.tex
+
+\keepsilent
+\askforoverwritefalse
+
+\generate{\file{makecell.sty}{\from{makecell.dtx}{package}}}
+
+\endgroup
+%</batchfile>
+%
+%<*driver>
+\documentclass{ltxdoc}
+\IfFileExists{rotating.sty}{\usepackage{rotating}}{}
+\IfFileExists{footmisc.sty}{\usepackage[perpage,bottom]{footmisc}}{}
+\IfFileExists{multirow.sty}{\usepackage{multirow}}{}
+\IfFileExists{hyperref.sty}{\usepackage{hyperref}}{}
+\IfFileExists{hypcap.sty}{\usepackage{hypcap}}{}
+\usepackage{makecell}
+\IfFileExists{caption.sty}
+ {\usepackage[font=small,labelfont=bf,labelsep=period]{caption}[2004/11/28]
+ \IfFileExists{floatrow.sty}
+ {\usepackage[font=small,style=plaintop,captionskip=5pt]{floatrow}}
+ {}}{}
+\makeatletter
+\@ifundefined{ttabbox}{\let\ttabbox\relax}{}
+\makeatother
+\usepackage{tabularx}
+\usepackage{slashbox}
+\usepackage{hhline}
+\EnableCrossrefs
+\CodelineIndex
+\RecordChanges
+\makeatletter
+\@beginparpenalty10000
+\widowpenalty10000
+\clubpenalty10000
+\makeatother
+\providecommand*{\file}[1]{\texttt{#1}}
+\providecommand*{\package}[1]{\textsf{#1}}
+\providecommand*{\cls}[1]{\textsf{#1}}
+\providecommand*{\env}[1]{\texttt{#1}}
+
+%\OnlyDescription
+\begin{document}
+ \DocInput{makecell.dtx}
+ \PrintChanges
+\end{document}
+%</driver>
+% \fi
+%
+% \CheckSum{1407}
+%
+% \GetFileInfo{makecell.dtx}
+%
+% \DoNotIndex{\newcommand,\newenvironment}
+%
+%
+% \title{The \textsf{makecell} package\thanks{This
+% file has version number \fileversion,
+% last revised \filedate.}}
+% \author{%
+% Olga Lapko\\
+% {\tt Lapko.O@g23.relcom.ru} }
+% \date{\filedate}
+% \maketitle
+% \begin{abstract}
+% This package helps to create common layout for tabular material.
+% The |\thead| command, based on one-column tabular environment, is offered
+% for creation of tabular column heads. This macro allows to support common
+% layout for tabular column heads in whole documentation. Another command,
+% |\makecell|, is offered for creation of multilined tabular cells.
+% There are also command |\makecellbox| command and |mcellbox| environment
+% usage of tabular cells inside text.
+%
+% Package also offers: \quad 1)\nobreak\enskip macro |\makegapedcells|,
+% which changes vertical spaces around all cells in tabular, like in
+% \package{tabls} package, but uses code of \package{array} package. (Macro
+% |\makegapedcells| redefines macro |\@classz| from \package{array} package.
+% Macro |\nomakegapedcells| cancels this redefinition.);
+% \quad 2)\nobreak\enskip macros |\multirowhead| and |\multirowcell|,
+% which use |\multirow| macro from \package{multirow} package;
+% \quad 3)\nobreak\enskip numbered rows |\nline| or skipping cells |\eline|
+% in tabulars; also are the skipping rows command |\erows| and
+% repeated rows command |\Xrows|;
+% \quad 4)\nobreak\enskip diagonally divided cells (|\diaghead|)
+% plus citation of sample file of \package{slashbox} package, which does the same;
+% \quad 5)\nobreak\enskip |\hline| and |\cline| with defined thickness:
+% |\Xhline| and |\Xcline| consequently.
+% \smallskip
+%
+% \end{abstract}
+%
+% \clearpage
+% \tableofcontents
+%
+% \clearpage
+% \section{Tabular Cells and Column Heads}
+%
+% \subsection{Building Commands}
+%
+% \DescribeMacro{\makecell}
+% Macro creates one-column tabular with predefined common settings of
+% alignment, spacing and vertical spaces around (see section~\ref{sec:sets}).
+% This will be useful for creation of multilined cells. This macro allows
+% optional alignment settings.
+% \begin{quote}
+% |\makecell|\oarg{vertical or/and horizontal alignment}\marg{cell text}
+% \end{quote}
+% For vertical alignment you use \texttt{t}, \texttt{b}, or \texttt{c}---%^^A
+% this letters you usually put in optional argument of \env{tabular} or
+% \texttt{array} environments. For horizontal alignment you may use alignment
+% settings like \texttt{r}, \texttt{l}, or \texttt{c}, or more complex, like
+% |{p{3cm}}|. Since this package loads \package{array} package, you may
+% use such alignment settings like |{>{\parindent1cm}p{3cm}}|.
+%\begin{verbatim}
+%\begin{tabular}{|c|c|}
+%\hline
+%Cell text & 28--31\\
+%\hline
+%\makecell{Multilined \\ cell text} & 28--31\\
+%\hline
+%\makecell[l]{Left aligned \\ cell text} & 37--43\\
+%\hline
+%\makecell*[r]{Right aligned \\ cell text} & 37--43\\
+%\hline
+%\makecell[b]{Bottom aligned \\ cell text} & 52--58\\
+%\hline
+%\makecell*[{{p{3cm}}}]{Cell long text with predefined width} & 52--58\\
+%\hline
+%\makecell[{{>{\parindent1em}p{3cm}}}]{Cell long...} & 52--58\\
+%\hline
+%\end{tabular}
+%\end{verbatim}
+% \begin{table}[h]
+% \ttabbox
+% {\caption{Example of multilined cells}\label{tab:cells}}%
+% {\begin{tabular}{|c|c|}
+% \hline
+% Cell text & 28--31\\
+% \hline
+% \makecell{Multilined \\ cell text} & 28--31\\
+% \hline
+% \makecell[l]{Left aligned \\ cell text} & 37--43\\
+% \hline
+% \makecell*[r]{Right aligned \\ cell text} & 37--43\\
+% \hline
+% \makecell[b]{Bottom aligned\\ cell text} & 52--58\\
+% \hline
+% \makecell*[{{p{3cm}}}]{Cell long text with predefined width} & 52--58\\
+% \hline
+% \makecell[{{>{\parindent1em}p{3cm}}}]{Cell long text with predefined width} &
+% 52--58\\
+% \hline
+% \end{tabular}}
+% \end{table}
+%
+% Starred form of command, |\makecell*|, creates vertical |\jot| spaces
+% around.
+%
+% \emph{Note}. When you define column alignment like |{p{3cm}}| in optional
+% argument of |\makecell| (or |\thead|, see below), please follow these
+% rules: \quad 1)\nobreak\enskip if vertical
+% alignment defined, write column alignment in group, e.g. |[c{p{3cm}}]|;
+% \quad 2)\nobreak\enskip if vertical alignment is absent,
+% write column alignment in double
+% group---|[{{p{3cm}}}]|, or add empty group---|[{}{p{3cm}}]|. Be also
+% careful with vertical alignment when you define column alignment as
+% paragraph block: e.g., use |{{b{3cm}}}| for bottom alignment (and
+% |{{m{3cm}}}| for centered vertical alignment).
+%
+% \DescribeMacro{\thead}
+% Macro creates one-column \texttt{tabular} for column heads with predefined
+% common settings (see table~\ref{tab:thead}). This macro uses common layout
+% for column heads: font, alignment, spacing, and vertical spaces around
+% (see section~\ref{sec:tsets}).
+%\begin{verbatim}
+%\renewcommand\theadset{\def\arraystretch{.85}}%
+%\begin{tabular}{|l|c|}
+%\hline
+%\thead{First column head}&
+% \thead{Second \\multlined \\ column head}\\
+%\hline
+%Left column text & 28--31\\
+%\hline
+%\end{tabular}
+%\end{verbatim}
+% \begin{table}[h]
+% \ttabbox
+% {\caption{Example of column heads}\label{tab:thead}}
+% {\renewcommand\theadset{\def\arraystretch{.85}}
+% \begin{tabular}{|l|c|}
+% \hline
+% \thead{First column head}&
+% \thead{Second \\multlined \\ column head}\\
+% \hline
+% Long left column text & 28--31\\
+% \hline
+% \end{tabular}}
+% \end{table}
+%
+% Starred form of command, |\thead*|, creates vertical |\jot| spaces around.
+%
+% \DescribeMacro{\rothead}
+% Creates table heads rotated by 90$^\circ$ counterclockwise.
+% Macro uses the same font and spacing settings as previous
+% one, but column alignment changed to |p{\rotheadsize}| with |\raggedright|
+% justification: in this case left side of all text lines ``lies''
+% on one base line.
+%
+% \DescribeMacro{\rotheadsize}
+% This parameter defines the width of rotated tabular heads. You may define
+% that like:
+% \begin{quote}
+% |\setlength\rotheadsize{3cm}|
+% \end{quote}
+% or
+% \begin{quote}
+% |\settowidth\rotheadsize{\theadfont |\meta{Widest head text}|}|
+% \end{quote}
+% like in following example (table~\ref{tab:rotheads}):
+%\begin{verbatim}
+%\settowidth\rotheadsize{\theadfont Second multilined}
+%\begin{tabular}{|l|c|}
+%\hline
+%\thead{First column head}&
+% \rothead{Second multilined \\ column head}\\
+%\hline
+%Left column text & 28--31\\
+%\hline
+%\end{tabular}
+%\end{verbatim}
+% \begin{table}[h]
+% \ttabbox
+% {\caption{Example of rotated column heads}\label{tab:rotheads}}%^^A%
+% {\settowidth\rotheadsize{\theadfont Second multilined}%^^A
+% \begin{tabular}{l|l}
+% \hline
+% \thead{First column head}&
+% \rothead{Second multilined \\ column head}\\
+% \hline
+% Long left column text & 28--31\\
+% \hline
+% \end{tabular}}
+% \end{table}
+%
+% \subsection{Settings For Tabular Cells}\label{sec:sets}
+%
+% This section describes macros, which make layout tuning for multilined
+% cells, created by |\makecell| macro (and also |\multirowcell| and
+% |\rotcell| macros). The |\cellset| macro also is used by |\thead|
+% (|\rothead|, |\multirowtead|) macro.
+%
+% \DescribeMacro{\cellset}
+% Spacing settings for cells. Here you could use commands like:
+% \begin{quote}
+% |\renewcommand\cellset{\renewcommand\arraytretch{1}%|\\
+% | \setlength\extrarowheight{0pt}}|
+% \end{quote}
+% as was defined in current package.
+%
+% \DescribeMacro{\cellalign}
+% Default align for cells. Package offers vertical and horizontal centering
+% alignment, it defined like:
+% \begin{quote}
+% |\renewcommand\cellalign{cc}|
+% \end{quote}
+%
+% \DescribeMacro{\cellgape}
+% Define vertical spaces around |\makecell|, using |\gape| command if
+% necessary. It defined like:
+% \begin{quote}
+% |\renewcommand\cellgape{}|
+% \end{quote}
+% You may define this command like
+% \begin{quote}
+% |\renewcommand\cellgape{\Gape[1pt]}|
+% \end{quote}
+% or
+% \begin{quote}
+% |\renewcommand\cellgape{\gape[t]}|
+% \end{quote}
+% (See also section~\ref{sec:gape} about |\gape| and |\Gape| command.)
+%
+% \DescribeMacro{\cellrotangle}
+% The angle for rotated cells and column heads. The default value 90
+% (counterclockwise). This value definition is used by both |\rotcell| and
+% |\rothead| macros.
+%
+% \subsection{Settings For Column Heads}\label{sec:tsets}
+%
+% This section describes macros, which make layout tuning for tabular column
+% heads, created by |\thead| (|\rothead|, |\multirowtead|) macro.
+%
+% \DescribeMacro{\theadfont}
+% Sets a special font for column heads. It could be smaller size
+% \begin{quote}
+% |\renewcommand\theadfont{\foonotesize}|
+% \end{quote}
+% as was defined in current package (here we suppose that
+% \verb|\small| command used for tabular contents itself).
+% Next example defines italic shape
+% \begin{quote}
+% |\renewcommand\theadfont{\itshape}|
+% \end{quote}
+%
+% \DescribeMacro{\theadset}
+% Spacing settings for column heads. Here you could use commands like:
+% \begin{quote}
+% |\renewcommand\theadset{\renewcommand\arraytretch{1}%|\\
+% | \setlength\extrarowheight{0pt}}|
+% \end{quote}
+%
+% \DescribeMacro{\theadalign}
+% Default align for tabular column heads. Here also offered centering
+% alignment:
+% \begin{quote}
+% |\renewcommand\theadalign{cc}|
+% \end{quote}
+%
+% \DescribeMacro{\theadgape}
+% Define vertical spaces around column head (|\thead|),
+% using |\gape| command if necessary.
+% It defined like:
+% \begin{quote}
+% |\renewcommand\theadgape{\gape}|
+% \end{quote}
+%
+% \DescribeMacro{\rotheadgape}
+% Analogous definition for rotated column heads. Default is absent:
+% \begin{quote}
+% |\renewcommand\rotheadgape{}|
+% \end{quote}
+%
+% \clearpage
+% \section{Changing of Height and Depth of Boxes}\label{sec:gape}
+%
+% Sometimes \env{tabular} or \env{array} cells, or some elements in text need a
+% height/depth correction. The |\raisebox| command could help for it, but
+% usage of that macro in these cases, especially inside math, is rather
+% complex. Current package offers the |\gape| macro, which usage is similar
+% to |\smash| macro. The |\gape| macro allows to change height and/or depth
+% of included box with necessary dimension.
+%
+% \DescribeMacro{\gape}
+% This macro changes included box by |\jot| value (usually 3\,pt). It is
+% defined with optional and mandatory arguments, like |\smash| macro, which
+% (re)defined by \package{amsmath} package. Optional argument sets change of
+% height only (\texttt{t}) or depth only~(\texttt{b}). Mandatory argument
+% includes text.
+% \begin{quote}
+% |\gape|\oarg{\texttt{t} or \texttt{b}}\marg{text}
+% \end{quote}
+% Examples of usage:
+% \begin{quote}
+% \noindent
+% \vbox{\halign{#\cr
+% \noalign{\hrule}
+% \gape{\cmd{\gape}\texttt{\{text\}}}\cr
+% \noalign{\hrule}
+% \crcr}}\qquad
+% \vbox{\halign{#\cr
+% \noalign{\hrule}
+% \gape[t]{\cmd{\gape}\texttt{[t]\{text\}}}\cr
+% \noalign{\hrule\vskip\jot}
+% \crcr}}\qquad
+% \vbox{\halign{#\cr
+% \noalign{\hrule}
+% \gape[b]{\cmd{\gape}\texttt{[b]\{text\}}}\cr
+% \noalign{\hrule}
+% \crcr}}
+% \end{quote}
+%
+% \DescribeMacro{\Gape}
+% Another way of height/depth modification. This macro allows different
+% correction for height and depth of box:
+% \begin{quote}
+% |\Gape|\oarg{height corr}\oarg{depth corr}\marg{text}
+% \end{quote}
+%
+% If both arguments absent, |\Gape| command works like |\gape|\marg{text}, in
+% other words, command uses |\jot| as correction value for height and depth
+% of box.
+%
+% If only one optional argument exists, |\Gape| command uses value
+% from this argument for both height and depth box corrections.
+% \begin{quote}
+% \noindent
+% \vbox{\halign{#\cr
+% \noalign{\hrule}
+% \Gape{\cmd{\Gape}\texttt{\{text\}}}\cr
+% \noalign{\hrule}
+% \crcr}}\texttt{\phantom{xxxxx}}\qquad
+% \vbox{\halign{#\cr
+% \noalign{\hrule}
+% \Gape[\jot]{\cmd{\Gape}\texttt{[\cmd{\jot}]\{text\}}}\cr
+% \noalign{\hrule}
+% \crcr}}\\[2ex]
+% \vbox{\halign{#\cr
+% \noalign{\hrule}
+% \Gape[6pt]{\cmd{\Gape}\texttt{[6pt]\{text\}}}\cr
+% \noalign{\hrule}
+% \crcr}}\qquad
+% \vbox{\halign{#\cr
+% \noalign{\hrule}
+% \Gape[6pt][-2pt]{\cmd{\Gape}\texttt{[6pt][-2pt]\{text\}}}\cr
+% \noalign{\hrule\vskip8pt}
+% \crcr}}
+% \end{quote}
+%
+% You may also use |\height| and |\depth| parameters in optional arguments
+% of |\Gape| macro, parameters was borrowed from |\raisebox| command.
+%
+% \DescribeMacro{\bottopstrut}
+% \DescribeMacro{\topstrut}
+% \DescribeMacro{\botstrut}
+% These three macros modify standard |\strut| by |\jot| value:
+% |\bottopstrut| changes both height and depth;
+% \nopagebreak|\topstrut| changes only height;
+% |\botstrut| changes only depth.
+% These commands could be useful, for example, in first and last table rows.
+%
+% \emph{Note}. If you use
+% \package{bigstrut} package note that these macros duplicate \cmd{\bigstrut},
+% \cmd{\bigstrut[t]}, and \cmd{\bigstrut[b]} commands consequently. Please
+% note that value, which increases strut in \cmd{\topstrut} etc. equals to
+% \cmd{\jot}, but \cmd{\bigstrut} and others use a special dimension
+% \cmd{\bigstrutjot}.
+%
+% \clearpage
+% \section{How to Change Vertical Spaces Around Cells
+% in Whole Table}\label{sec:beta}
+%
+% This section describes macros which try to emulate one of possibilities of
+% \package{tabls} package: to get necessary vertical spacing around cells.
+%
+% \DescribeMacro{\setcellgapes}
+% Sets the parameters for vertical spaces:
+% \begin{quote}
+% |\setcellgapes|\oarg{\texttt{t} or \texttt{b}}\marg{value}
+% \end{quote}
+% The next examples with array and tabular use following settings:
+% \begin{quote}
+% |\setcellgapes{5pt}|
+% \end{quote}
+% You may also try to load negative values if you wish. This macro you may
+% put in the preamble as common settings.
+%
+% \DescribeMacro{\makegapedcells}
+% \DescribeMacro{\nomakegapedcells}
+% The first macro switches on vertical spacing settings. The second cancels
+% first~one.
+%
+% The \cmd{\makegapedcells} macro temporarily redefines macro
+% |\@classz| of \package{array} package, so use this mechanism carefully.
+% Load |\makegapedcells| inside group or inside environment
+% (see table~\ref{tab:gaped}):
+%\begin{verbatim}
+%\begin{table}[h]
+%\makegapedcells
+%...
+%\end{table}
+%\end{verbatim}
+% \setcellgapes{5pt}
+% \begin{table}
+% \makegapedcells
+% \ttabbox
+% {\caption{Example of multilined cells with additional vertical spaces}%^^A
+% \label{tab:gaped}}%
+% {\begin{tabular}{|c|c|}
+% \hline
+% Cell text & 28--31\\
+% \hline
+% \makecell{Multilined \\ cell text} & 28--31\\
+% \hline
+% \makecell[l]{Left aligned \\ cell text} & 37--43\\
+% \hline
+% \makecell*[r]{Right aligned \\ cell text} & 37--43\\
+% \hline
+% \makecell[b]{Bottom aligned \\ cell text} & 52--58\\
+% \hline
+% \makecell*[{{p{3cm}}}]{Cell long text with predefined width} & 52--58\\
+% \hline
+% \makecell[{{>{\parindent1em}p{3cm}}}]{Cell long text with
+% predefined width} & 52--58\\
+% \hline
+% \end{tabular}}
+% \end{table}
+%
+% Please note that space defined in |\setcellgapes| and space which creates
+% |\gape| mechanism in commands
+% for tabular cells (usually |\thead| or |\makecell*|) are summarized.
+%
+% \clearpage
+% \section{Multirow Table Heads and Cells}
+%
+% The next examples show usage of macros which use |\multirow| command from
+% \package{multirow} package.\nopagebreak
+%
+% At first goes short repetition of arguments of |\multirow| macro itself:
+% \begin{quote}
+% |\multirow|\marg{nrow}\oarg{njot}\marg{width}\oarg{vmove}\marg{contents}
+% \end{quote}
+% \marg{nrow} sets number of rows (i.e. text lines);
+% \oarg{njot} is mainly used if you've used \package{bigstrut} package: it makes
+% additional tuning of vertical position (see comments in
+% \package{multirow} package);
+% \marg{width} defines width of contents, the |*| sign used to indicate that
+% the text argument's natural width is to be used;
+% \oarg{vmove} is a length used for fine tuning: the text will be raised (or
+% lowered, if \meta{vmove} is negative) by that length;
+% \marg{contents} includes ``|\multirow|'ed'' text.\smallskip
+%
+% \DescribeMacro{\multirowcell}
+% \DescribeMacro{\multirowthead}
+% These two macros use following arguments (example uses |\multirowcell|
+% command):
+% \begin{quote}
+% |\multirowcell|\marg{nrow}\oarg{vmove}\oarg{hor alignment}\marg{contents}
+% \end{quote}
+% in these macros were skipped \oarg{njot} and \marg{width}. Instead of
+% tuning optional argument \oarg{njot} for vertical
+% correction used \oarg{vmove} optional argument.
+% For the \marg{width} argument both |\multirowcell| and |\multirowthead|
+% macros use natural width of contents (i.e. the |*| argument used).
+%
+% First example (table~\ref{tab:mrowI}) with ``|\multirow|'ed'' column heads
+% and cells:
+%\begin{verbatim}
+%\renewcommand\theadset{\def\arraystretch{.85}}%
+%\begin{tabular}{|l|c|c|}
+% \multirowthead{4}{First ...}&
+% \multicolumn{2}{c|}{\thead{Multicolumn head}}\\ \cline{2-3}
+% & \thead{Second ...} & \thead{Third ...}\\ \hline
+% Cell text & A &\multirowcell{3}{28--31}\\ \cline{1-2}
+% \makecell{Multilined\\Cell text} & B& \\ \hline
+% \makecell[l]{Left ...} & C & \multirowcell{4}[1ex][l]{37--43}\\ \cline{1-2}
+% \makecell[r]{Right ...} & D & \\ \hline
+% \makecell[b]{Bottom ...} & E & \multirowcell{5}[1ex][r]{37--43\\52--58}\\
+% \cline{1-2}
+% \makecell[{{p{5cm}}}]{Cell ...} & F & \\ \cline{1-2}
+% \makecell[{{>{\parindent1em}p{5cm}}}]{Cell ...} & G & \\ \hline
+% \end{tabular}
+%\end{verbatim}
+%
+% \begin{table}[p]
+%\renewcommand\theadset{\def\arraystretch{.85}}%
+% \ttabbox
+% {\caption{Example of ``\cmd{\multirow}'ed'' cells}\label{tab:mrowI}}%
+% {\begin{tabular}{|l|c|c|}
+% \hline
+% \multirowthead{4}{First Column head}&
+% \multicolumn{2}{c|}{\thead{Multicolumn head}}\\
+% \cline{2-3}
+% & \thead{Second \\multlined \\ column head} &
+% \thead{Third \\ column head}\\
+% \hline
+% Cell text & A &\multirowcell{3}{28--31}\\
+% \cline{1-2}
+% \makecell{Multilined\\Cell text} & B& \\
+% \hline
+% \makecell[l]{Left aligned\\ cell text} & C
+% & \multirowcell{4}[1ex][l]{37--43}\\
+% \cline{1-2}
+% \makecell[r]{Right aligned\\ cell text} & D & \\
+% \hline
+% \makecell[b]{Bottom aligned\\ cell text} & E &
+% \multirowcell{5}[1ex][r]{37--43\\52--58}\\
+% \cline{1-2}
+% \makecell[{{p{5cm}}}]{Cell long long long long text with predefined width}
+% & F & \\
+% \cline{1-2}
+% \makecell[{{>{\parindent1em}p{5cm}}}]{Cell long long long long text with
+% predefined width} & G & \\
+% \hline
+% \end{tabular}}
+% \end{table}
+%
+% Second example (table~\ref{tab:mrowII}) with ``multirow'ed'' column heads
+% and cells uses |\makegapedcells| command. The |\theadgape| command does
+% nothing:
+%\begin{verbatim}
+%\makegapedcells
+%\renewcommand\theadset{\def\arraystretch{.85}}%
+%\renewcommand\theadgape{}
+%...
+%\end{verbatim}
+% \begin{table}[p]\makegapedcells
+%\renewcommand\theadset{\def\arraystretch{.85}}%
+%\renewcommand\theadgape{}
+% \ttabbox
+% {\caption{Example of ``\cmd{\multirow}'ed'' cells and additional vertical
+% spaces}\label{tab:mrowII}}%
+% {\begin{tabular}{|l|c|c|}
+% \hline
+% \multirowthead{4}{First Column head}&
+% \multicolumn{2}{c|}{\thead{Multicolumn head}}\\
+% \cline{2-3}
+% & \thead{Second \\multlined \\ column head} &
+% \thead{Third \\ column head}\\
+% \hline
+% Cell text & A &\multirowcell{4}{28--31}\\
+% \cline{1-2}
+% \makecell{Multilined \\Cell text} & B& \\
+% \hline
+% \makecell[l]{Left aligned \\ cell text} & C
+% & \multirowcell{4}[0ex][l]{37--43}\\
+% \cline{1-2}
+% \makecell[r]{Right aligned \\ cell text} & D & \\
+% \hline
+% \makecell[b]{Bottom aligned \\ cell text} & E &
+% \multirowcell{6}[0ex][r]{37--43\\52--58}\\
+% \cline{1-2}
+% \makecell[{{p{5cm}}}]{Cell long long long long text with predefined width}
+% & F & \\
+% \cline{1-2}
+% \makecell[{{>{\parindent1em}p{5cm}}}]{Cell long long long long text with
+% predefined width} & G & \\
+% \hline
+% \end{tabular}}
+% \end{table}
+% \bigskip
+%
+% The last example (table~\ref{tab:mrowIII}) uses \env{tabularx} environment
+% with |\hsize| in the width argument.
+%\begin{verbatim}
+%\makegapedcells
+%\renewcommand\theadset{\def\arraystretch{.85}}%
+%\renewcommand\theadgape{}
+%\begin{tabularx}\hsize{|X|c|c|}
+%...
+%\cline{1-2}
+%\makecell[{{p{\hsize}}}]{Cell ...} & F & \\
+%\cline{1-2}
+%\makecell[{{>{\parindent1em}p{\hsize}}}]{Cell ...} & G & \\
+%\hline
+%\end{tabularx}
+%\end{verbatim}
+% As you may see the |\makecell|'s in last two rows defined as
+% \begin{quote}
+% |\makecell[{{p{\hsize}}}]{...}|
+% \end{quote}
+% and
+% \begin{quote}
+% |\makecell[{{>{\parindent1em}p{\hsize}}}]{...}|
+% \end{quote}
+% consequently.
+% \begin{table}\makegapedcells
+%\renewcommand\theadset{\def\arraystretch{.85}}%
+%\renewcommand\theadgape{}
+% \ttabbox
+% {\caption{Example of \env{tabularx} environment}\label{tab:mrowIII}}%
+% {\begin{tabularx}\hsize{|X|c|c|}
+% \hline
+% \multirowthead{4}{First Column head}&
+% \multicolumn{2}{c|}{\thead{Multicolumn head}}\\
+% \cline{2-3}
+% & \thead{Second \\multlined \\ column head} &
+% \thead{Third \\ column head}\\
+% \hline
+% Cell text & A &\multirowcell{4}{28--31}\\
+% \cline{1-2}
+% \makecell{Multilined \\Cell text} & B& \\
+% \hline
+% \makecell[l]{Left aligned \\ cell text} & C
+% & \multirowcell{4}[0ex][l]{37--43}\\
+% \cline{1-2}
+% \makecell[r]{Right aligned \\ cell text} & D & \\
+% \hline
+% \makecell[b]{Bottom aligned \\ cell text} & E &
+% \multirowcell{6}[0ex][r]{37--43\\52--58}\\
+% \cline{1-2}
+% \makecell[{{p{\hsize}}}]{Cell long long long long long long text with
+% predefined width} & F & \\
+% \cline{1-2}
+% \makecell[{{>{\parindent1em}p{\hsize}}}]{Cell long long long long long
+% long text with predefined width} & G & \\
+% \hline
+% \end{tabularx}}
+% \end{table}
+%
+% \subsection{Multirow Table Heads and Cells: Second Variant}
+%
+% Another, simplified, variant of multirow cell: use
+% |\makecell| and |\thead| commands, and set |\\| with
+% negative space at the end, for example
+%\begin{quote}
+% |\thead{First Column head\\[-5ex]}|
+%\end{quote}
+% cells, which stay in one ``multi row'' will have the same value of this
+% negative space, in spite of different number of lines in their contents.
+%
+% \clearpage\suppressfloats[t]
+% \section{Numbered Lines in Tabulars}
+%
+% The three commands |\eline|, |\nline|, |\rnline| allow to skip:
+% \begin{quote}
+% |\eline|\marg{number of cells}
+% \end{quote}
+% and numbering (|\nline|) a few/all sells in the row:
+% \begin{quote}
+% |\nline|\oarg{numbering type}\oarg{start number}\marg{number of cells}
+% \end{quote}
+% Command |\rnline| does the same as |\nline|, but allows numbering by
+% Russian letters (it redefines
+% \LaTeX's |\Alph| and |\alph| with |\Asbuk| and |\asbuk| consequently).
+% (see table~\ref{tab:elines})
+%\begin{verbatim}
+% \begin{tabular}{|*{12}{c|}}
+% \hline
+% \eline{6} \\ \hline
+% \nline{6} \\ \hline
+% \eline{3} & \nline[1][4]{3} \\ \hline
+% \nline[(a)]{6} \\ \hline
+% \nline[column I]{6} \\ \hline
+% \end{tabular}
+%\end{verbatim}
+%
+% \begin{table}[H]
+% \ttabbox
+% {\caption{Examples of filling of cells}\label{tab:elines}}%
+% {\begin{tabular}{|*{6}{c|}}
+% \hline
+% \eline{6} \\ \hline
+% \nline{6} \\ \hline
+% \eline{3} & \nline[1][4]{3} \\ \hline
+% \nline[(a)]{6} \\ \hline
+% \nline[column I]{6} \\ \hline
+% \end{tabular}}
+%\end{table}
+%
+% Two ``lazy'' commands: for empty table rows
+% (|\erows|) and for rows with repeated text (|\Xrows|) were added in the version V0.1e.
+%
+%\DeleteShortVerb{\|}
+%\begin{verbatim}
+% \begin{tabular}{|*{4}{c|}}
+% \hline
+% \thead{No}&\thead{First Data}&\thead{Second Data}&\thead{Third Data} \\
+% \hline
+% \erows{4}{8}
+% \end{tabular}\quad
+% \begin{tabular}{||c||c||c||c||}
+% \hhline{|t:=:t:=:t:=:t:=:t|}
+% \thead{No}&\thead{First Data}&\thead{Second Data}&\thead{Third Data} \\
+% \hhline{|:=::=::=::=:|}
+% \erows[\\ \hhline{|:=::=::=::=:|}]{4}{8}
+% \eline{4}\\ \hhline{|b:=:b:=:b:=:b:=:b|}
+% \end{tabular}\quad
+% \begin{tabular}{|*{4}{c|}}
+% \hline
+% \thead{No}&\thead{First Data}&\thead{Second Data}&\thead{Third Data} \\
+% \hline
+% \Xrows{\refstepcounter{enumi}\arabic{enumi}.\eline{3}\\ \hline}{8}
+% \end{tabular}
+%\end{verbatim}
+%
+% \begin{table}[hbt]\extrarowheight1pt
+% \ttabbox[\hsize]
+% {\caption{Examples of filling of cells}\label{tab:elines}}%
+% {\begin{tabular}{|*{4}{c|}}
+% \hline
+% \thead{No}&\thead{First Data}&\thead{Second Data}&\thead{Third Data} \\
+% \hline
+% \erows{4}{8}
+% \end{tabular}\par\bigskip
+% \begin{tabular}{||c||c||c||c||}
+% \hhline{|t:*3{=:t:}=:t|}
+% \thead{No}&\thead{First Data}&\thead{Second Data}&\thead{Third Data} \\
+% \hhline{|:*3{=::}=:|}
+% \erows[\\ \hhline{|:*3{=::}=:|}]{4}{7}
+% \eline{4}\\
+% \hhline{|b:*3{=:b:}=:b|}
+% \end{tabular}\par\bigskip
+% \begin{tabular}{|*{4}{c|}}
+% \hline
+% \thead{No}&\thead{First Data}&\thead{Second Data}&\thead{Third Data} \\
+% \hline
+% \Xrows{\refstepcounter{enumi}\arabic{enumi}.\eline{4}\\ \hline}{8}
+% \end{tabular}}
+%\end{table}
+%\MakeShortVerb{\|}
+%
+% \section{Cells (One-Column Tabulars) in the Text}
+%
+% If the |\makecell| command appears in the text (outside outer tabular environment)
+% it could create wrong layout. The |\makecellbox| command
+% and |mcellbox| environment are created for one-column tabulars in the text.
+%
+% \section{Diagonally Divided Cell}
+%
+% This variant of head's positioning is not too popular nowadays, but in
+% the some cases it could be used. Instead of creating of
+% multicolumn head above a wide couple of all column heads except the
+% very left column, the most left column head (upper left cell)
+% divided by diagonal line. The lower head is usually head of very left
+% column and upper head---``multicolumn'' to all other column heads of
+% table to the right.
+%
+% This package offers macro based on possibilities of \env{picture}
+% environment.
+% \begin{quote}
+% |\diaghead|\texttt{(}\meta{\texttt{\textup{H}} ratio,%^^A
+% \textup{\texttt{V}} ratio}\texttt{)}%^^A
+% \marg{Text set for column width}|%|\\
+% \phantom{/diaghead }\marg{First head}\marg{Second head}
+% \end{quote}
+% where \texttt{(}\meta{\textup{\texttt{H ratio}},%^^A
+% \textup{\texttt{V ratio}}}\texttt{)} sets the ratios like in |\line|
+% command (digits from~|1| up to~|6|). This argument is optional,
+% the default ratio (|\line|
+% direction) defined as~|(5,-2)|.
+%
+% The \marg{Text set for column width}
+% defined by hand, for example:
+% \quad 1)\nobreak\enskip sets the width, using longest text lines from
+% both heads---in this case you must put |\theadfont| macro, if you use
+% |\thead|'s; \quad 2)\nobreak\enskip the longest text from the rest of
+% column; \quad 3)\nobreak\enskip |\hskip|\meta{value}, even |\hskip\hsize|
+% the case of |p| column (or |X| column in \env{tabularx} environment).
+% The \marg{First head}
+% is head in lower corner (usually for first or very left column),
+% \marg{Second head}---in the upper corner (head for the all right columns).
+%
+% Here is code of table~\ref{tab:diaghead}.
+%\begin{verbatim}\makegapedcells
+%\begin{tabular}{|l|c|c|}\hline
+%\diaghead{\theadfont Diag ColumnmnHead II}%
+% {Diag Column \\Head I}{Diag\\Column Head II}&
+%\thead{Second\\column}&\thead{Third\\column}\\
+%\hline...
+%\end{tabular}\medskip
+%
+%\begin{tabularx}{.62\hsize}{|X|c|c|}\hline
+%\diaghead(-4,1){\hskip\hsize}%
+% {Diag \\Column Head I}{Diag Column \\Head II}&
+%\thead{Second\\column}&\thead{Third\\column}\\
+%\hline...
+%\end{tabularx}\medskip
+%
+% \nomakegapedcells
+% \begin{tabular}{|l|c|c|}\hline
+% \diaghead(4,1){\hskip4.2cm}%
+% {Diag \\Column Head I}{Diag Column \\Head II}&
+% \thead{Second\\column}&\thead{Third\\column}\\
+%...
+%\end{verbatim}%
+%
+% \begin{table}[!bp]\makegapedcells
+% \begin{tabular}{|c|c|c|}%
+% \hline
+% \diaghead{\theadfont Diag ColumnmnHead II}%^^A
+% {Diag \\Column Head I}{Diag Column\\ Head II}&
+% \thead{Second\\column}&\thead{Third\\column}\\
+% \hline
+% \makecell[l]{Left aligned \\ cell text} & A & 37--43\\
+% \hline
+% \makecell*[r]{Right aligned \\ cell text} & B & 37--43\\
+% \hline
+% \makecell[b]{Bottom aligned\\ cell text} & C & 52--58\\
+% \hline
+% \end{tabular}%
+% \medskip
+%
+% \begin{tabularx}{.62\hsize}{|X|c|c|}%
+% \hline
+% \diaghead(4,1){\hskip\hsize}%
+% %^^A{\theadfont Diag ColuDiag Column}%^^A
+% {Diag \\Column Head I}{Diag Column \\Head II}&
+% \thead{Second\\column}&\thead{Third\\column}\\
+% \hline
+% \makecell[l]{Left aligned \\ cell text} & A & 37--43\\
+% \hline
+% \makecell*[r]{Right aligned \\ cell text} & B & 37--43\\
+% \hline
+% \makecell[b]{Bottom aligned\\ cell text} & C & 52--58\\
+% \hline
+% \end{tabularx}%
+% \medskip
+%
+% \nomakegapedcells
+% \begin{tabular}{|l|c|c|}%
+% \hline
+% \diaghead(-4,1){\hskip4.2cm}%^^A
+% {Diag \\Column Head I}{Diag Column \\Head II}&
+% \thead{Second\\column}&\thead{Third\\column}\\
+% \hline
+% \makecell[l]{Left aligned \\ cell text} & A & 37--43\\
+% \hline
+% \makecell*[r]{Right aligned \\ cell text} & B & 37--43\\
+% \hline
+% \makecell[b]{Bottom aligned\\ cell text} & C & 52--58\\
+% \hline
+% \end{tabular}%
+%
+% \caption{Examples of tabulars with diagonally divided
+% cells}\label{tab:diaghead}
+%
+% \end{table}%
+% The correct position of diagonal ends depends of width of column. If cell width
+% is narrower then necessary
+% column ends of diagonal don't touch corners of cell.
+%
+% \section{Comparison: Diagonally Divided Cell with the slashbox package}
+%
+% I didn't know about the \texttt{slashbox} package in time
+% when the code for the diagonal cells was created. This package uses also picture
+% |\line| mechanism, but calculates slopes automatically. It creates the
+% |\backslash| direction of diagonal lines only. (The |\slash| direction seems to be
+% not correct. Or direction depends to traditions of current publishing house?)
+%
+% Here is used citation of the sample file distributed with the \texttt{slashbox} package%^^A
+% \footnote{by Koichi Yasuoka, May 27, 1993; minor modification by Toru Sato, May 31, 1993}.
+% The verbatim of the table examples are added only in citation.\smallskip
+%
+% \begingroup\slshape
+% The usage is pretty straightforward, such as
+%
+%\begin{table}[H]%
+%\begin{verbatim}
+%\begin{tabular}{|l||*{5}{c|}}\hline
+%\backslashbox{Room}{Date}
+%&\makebox[3em]{5/31}&\makebox[3em]{6/1}&\makebox[3em]{6/2}
+%&\makebox[3em]{6/3}&\makebox[3em]{6/4}\\\hline\hline
+%Meeting Room &&&&&\\\hline
+%Auditorium &&&&&\\\hline
+%Seminar Room &&&&&\\\hline
+%\end{tabular}
+%\end{verbatim}%
+%
+% \noindent
+% \begin{tabular}{|l||*{5}{c|}}\hline
+% \backslashbox{Room}{Date}
+% &\makebox[3em]{5/31}&\makebox[3em]{6/1}&\makebox[3em]{6/2}
+% &\makebox[3em]{6/3}&\makebox[3em]{6/4}\\\hline\hline
+% Meeting Room &&&&&\\\hline
+% Auditorium &&&&&\\\hline
+% Seminar Room &&&&&\\\hline
+% \end{tabular}
+%\end{table}%
+%
+% You may include a newline (\verb+\\+) in `Room' and/or `Date'.
+% Note that you will get spaces aside the slash line if there is a
+% wider column in the same column of a different line.
+% In such a case, you need to specify the width of the slashed column
+% by saying
+%
+%\begin{table}[H]%
+%\begin{verbatim}
+%\begin{tabular}{|l||*{4}{c|}}\hline
+%\backslashbox[48mm]{Room}{Date}
+%&\makebox[3em]{5/31}&\makebox[3em]{6/1}&\makebox[3em]{6/2}
+%&\makebox[3em]{6/3}\\\hline\hline
+%Room With a Long Name &&&&\\\hline
+%Auditorium &&&&\\\hline
+%Seminar Room &&&&\\\hline
+%\end{tabular}
+%\end{verbatim}%
+%
+% \noindent
+% \begin{tabular}{|l||*{4}{c|}}\hline
+% \backslashbox[48mm]{Room}{Date}
+% &\makebox[3em]{5/31}&\makebox[3em]{6/1}&\makebox[3em]{6/2}
+% &\makebox[3em]{6/3}\\\hline\hline
+% Room With a Long Name &&&&\\\hline
+% Auditorium &&&&\\\hline
+% Seminar Room &&&&\\\hline
+% \end{tabular}
+%\end{table}%
+%
+% \bigskip
+% The specified width is neglected if it is narrower than the natural
+% width of the column.
+%
+% \verb+\(back)slashbox+ assumes by default that there is a blank space
+% of width \verb+\tabcolsep+ on both sides of the column.
+% Thus the slash line might exceeds the boundary when you use \verb+@{}+
+% etc.
+%
+% You can avoid it by specifying
+%
+%\begin{table}[H]%
+%\begin{verbatim}
+%\begin{tabular}{|@{\ $\bullet$\hspace*{3mm}}l||*{5}{c|}}\hline
+%\multicolumn{1}{|@{}l||}{\backslashbox[0pt][l]{Room}{Date}}
+%&\makebox[3em]{5/31}&\makebox[4em]{6/1}&\makebox[3em]{6/2}
+%&\makebox[3em]{6/3}&\makebox[3em]{6/4}\\\hline\hline
+%Meeting Room &&&&&\\\hline
+%Auditorium &&&&&\\\hline
+%Seminar Room &&&&&\\\hline
+%\end{tabular}
+%\end{verbatim}%
+%
+% \bigskip
+%
+% \noindent
+% \begin{tabular}{|@{\ $\bullet$\hspace*{3mm}}l||*{5}{c|}}\hline
+% \multicolumn{1}{|@{}l||}{\backslashbox[0pt][l]{Room}{Date}}
+% &\makebox[3em]{5/31}&\makebox[4em]{6/1}&\makebox[3em]{6/2}
+% &\makebox[3em]{6/3}&\makebox[3em]{6/4}\\\hline\hline
+% Meeting Room &&&&&\\\hline
+% Auditorium &&&&&\\\hline
+% Seminar Room &&&&&\\\hline
+% \end{tabular}
+%\end{table}%
+%
+% Here \verb+[l]+ tells the command that there is no extra space on the
+% left of this column. You can use \verb+[r]+ and \verb+[lr]+ likewise.
+% You have to also specify the width of the column in this case, but it
+% can be~0pt.
+% \endgroup
+%
+% The addition for the sample with |\slashbox| command. This example demonstrates that you may combine
+% the \texttt{makecell} commands and |\backslashbox|.
+%
+%\begin{table}[H]%
+%\begin{verbatim}
+%\begin{tabular}{|l||*{5}{c|}}\hline
+%\theadset\theadfont\backslashbox{Room}{Date}
+%&\makebox[3em]{\thead{5/31}}&\makebox[3em]{\thead{6/1}}&\makebox[3em]{\thead{6/2}}
+%&\makebox[3em]{6/3}&\makebox[3em]{\thead{6/4}}\\\hline\hline
+%Meeting Room &&&&&\\\hline
+%Auditorium &&&&&\\\hline
+%Seminar Room &&&&&\\\hline
+%\end{tabular}
+%\end{verbatim}%
+%
+% \noindent
+% \begin{tabular}{|l||*{5}{c|}}\hline
+%\theadset\theadfont\backslashbox{Room}{Date}
+%&\makebox[3em]{\thead{5/31}}&\makebox[3em]{\thead{6/1}}&\makebox[3em]{\thead{6/2}}
+%&\makebox[3em]{6/3}&\makebox[3em]{\thead{6/4}}\\\hline\hline
+% Meeting Room &&&&&\\\hline
+% Auditorium &&&&&\\\hline
+% Seminar Room &&&&&\\\hline
+% \end{tabular}
+%\end{table}%
+%
+%\begin{table}[H]%
+%\begin{verbatim}
+%\begin{tabular}{|l||*{4}{c|}}\hline
+%\theadset\backslashbox[48mm]{Room}{Date}
+%&\makebox[3em]{\thead{5/31}}&\makebox[3em]{\thead{6/1}}&\makebox[3em]{\thead{6/2}}
+%&\makebox[3em]{\thead{6/3}}\\\hline\hline
+%Room With a Long Name &&&&\\\hline
+%Auditorium &&&&\\\hline
+%Seminar Room &&&&\\\hline
+%\end{tabular}
+%\end{verbatim}%
+%
+% \noindent
+% \begin{tabular}{|l||*{4}{c|}}\hline
+% \theadset\backslashbox[48mm]{Room}{Date}
+% &\makebox[3em]{\thead{5/31}}&\makebox[3em]{\thead{6/1}}&\makebox[3em]{\thead{6/2}}
+% &\makebox[3em]{\thead{6/3}}\\\hline\hline
+% Room With a Long Name &&&&\\\hline
+% Auditorium &&&&\\\hline
+% Seminar Room &&&&\\\hline
+% \end{tabular}
+%\end{table}%
+%
+% \clearpage
+% \section{Thick Rules for the hline and cline Commands}
+%
+% For horizontal rules in tabular there were added two commands
+% \cmd{\Xhline} and \cmd{\Xcline}
+% They use additional mandatory argument with defined rule width.
+%
+% The example, with result in table~\ref{tab:XmrowIII}.
+%\begin{verbatim}%
+%\begin{table}
+%\renewcommand\theadset{\def\arraystretch{.85}}%
+%\renewcommand\theadgape{}
+%\ttabbox
+%{\caption{...}\label{...}}%
+%{\begin{tabular}{!{\vrule width1.2pt}c
+% !{\vrule width1.2pt}c|c
+% !{\vrule width1.2pt}}
+%\Xhline{1.2pt}
+%\multirowthead{4}{First Column head}&
+%\multicolumn{2}{c!{\vrule width1.2pt}}{\thead{Multicolumn head}}\\
+%\Xcline{2-3}{1.2pt}
+% & \thead{Second \\multlined \\ column head} &
+% \thead{Third \\ column head}\\
+%\Xhline{1.2pt}
+%Cell text & A &\multirowcell{4}{28--31}\\
+%...
+%\Xhline{1.2pt}
+%\end{tabular}}
+%\end{table}
+%\end{verbatim}%
+%
+% \begin{table}\makegapedcells\relax
+%\renewcommand\theadset{\def\arraystretch{.85}}%
+%\renewcommand\theadgape{}
+% \ttabbox
+% {\caption{Example of \env{tabular} environment with
+% thick lines}\label{tab:XmrowIII}}%
+% {\begin{tabular}{!{\vrule width1.2pt}c
+% !{\vrule width1.2pt}c|c!{\vrule width1.2pt}}
+% \Xhline{1.2pt}
+% \multirowthead{4}{First Column head}&
+% \multicolumn{2}{c!{\vrule width1.2pt}}{\thead{Multicolumn head}}\\
+% \Xcline{2-3}{1.2pt}
+% & \thead{Second \\multlined \\ column head} &
+% \thead{Third \\ column head}\\
+% \Xhline{1.2pt}
+% Cell text & A &\multirowcell{4}{28--31}\\
+% \cline{1-2}
+% \makecell{Multilined \\Cell text} & B& \\
+% \hline
+% \makecell[l]{Left aligned \\ cell text} & C
+% & \multirowcell{4}[0ex][l]{37--43}\\
+% \cline{1-2}
+% \makecell[r]{Right aligned \\ cell text} & D & \\
+% \hline
+% \makecell[b]{Bottom aligned \\ cell text} & E &
+% \multirowcell{6}[0ex][r]{37--43\\52--58}\\
+% \cline{1-2}
+% \makecell[{{p{5cm}}}]{Cell long long long long long long text with
+% predefined width} & F & \\
+% \cline{1-2}
+% \makecell[{{>{\parindent1em}p{5cm}}}]{Cell long long long long long
+% long text with predefined width} & G & \\
+% \Xhline{1.2pt}
+% \end{tabular}}
+% \end{table}
+%
+% \StopEventually{}\clearpage
+%
+% \section{Code of package}
+%
+% \subsection{Multilined cells}
+%
+% First goes request of \package{array} package.
+% \begin{macrocode}
+\RequirePackage{array}
+% \end{macrocode}
+%
+% \begin{macro}{\makecell}
+% The definition of command for multilined cells. At first defined |\gape|
+% stuff. Non-star form loads special setting for vertical space around (if it
+% used). Star form always creates additional vertical |\jot|-spaces.
+% \begin{macrocode}
+\newcommand\makecell{\@ifstar{\let\tabg@pe\gape\makecell@}%
+ {\let\tabg@pe\cellgape\makecell@}}
+% \end{macrocode}
+% Next macro loads vertical and horizontal common alignment for cells and
+% loads redefined spacing parameters |\arraystretch| and |\extrarowheight|
+% if these parameters were redefined.
+% \begin{macrocode}
+\newcommand\makecell@{\def\t@bset{\cellset}%
+ \let\mcell@align\cellalign
+ \@ifnextchar[\mcell@tabular
+ {\expandafter\mcell@@tabular\cellalign\@nil}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\thead}
+% The macro for tabular column heads. At first defined |\gape| stuff.
+% Non-star from loads special setting for vertical space around (if it used).
+% Star form always creates additional vertical |\jot|-spaces.
+% \begin{macrocode}
+\newcommand\thead{\@ifstar{\let\tabg@pe\gape\thead@}%
+ {\let\tabg@pe\theadgape\thead@}}
+% \end{macrocode}
+% Next macro loads vertical and horizontal common alignment for column heads
+% and loads redefined spacing parameters |\arraystretch| and |\extrarowheight|
+% if these parameters were redefined. (First go settings
+% for cells, as for |\makecell|, then special settings for column heads.)
+%
+% For column heads also loaded font settings.
+% \begin{macrocode}
+\newcommand\thead@{\def\t@bset{\cellset\theadfont\theadset}%
+ \let\mcell@align\theadalign
+ \@ifnextchar[\mcell@tabular
+ {\expandafter\mcell@@tabular\theadalign\@nil}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\rotheadsize}
+% The width dimension for rotated cells.
+% \begin{macrocode}
+\@ifdefinable\rotheadsize{\newdimen\rotheadsize}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\rotcell}
+% The macro for rotated cell. If no \package{rotating} package loaded
+% this macro works like |\makecell|.
+% \begin{macrocode}
+\newcommand\rotcell{\@ifundefined{turn}%
+ {\PackageWarning{makecell}%
+ {\string\rotcell\space needs rotating package}%
+ \let\tabg@pe\empty\let\t@bset\cellset\makecell@}
+ {\@ifnextchar[{\@rotcell}{\@@rotcell}}}
+% \end{macrocode}
+% For rotated cell default column setting is similar to |p{\rotheadsize}| (plus
+% some additional justification settings)
+% \begin{macrocode}
+\@ifdefinable\@rotcell{}
+\def\@rotcell[#1]#2{\makecell*{\\[-.65\normalbaselineskip]
+ \turn{\cellrotangle}\makecell[#1]{#2}\endturn}}
+\newcommand\@@rotcell[1]{\makecell*{\\[-.65\normalbaselineskip]
+ \turn{\cellrotangle}\makecell[c{>{\rightskip0explus
+ \rotheadsize\hyphenpenalty0\pretolerance-1%
+ \noindent\hskip\z@}p{\rotheadsize}
+ }]{#1}\endturn}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\rothead}
+% The macro for rotated tabular column heads. If no \package{rotating} package
+% loaded this macro works like |\thead|.
+% \begin{macrocode}
+\newcommand\rothead{\@ifundefined{turn}%
+ {\PackageWarning{makecell}{\string\rothead\space
+ needs rotating package}%
+ \let\tabg@pe\theadgape
+ \def\t@bset{\cellset\theadfont\theadset}\thead@}%
+ {\let\theadgape\rotheadgape
+ \@ifnextchar[{\@rothead}{\@@rothead}}}
+% \end{macrocode}
+% For rotated column head default column setting is similar to
+% |p{\rotheadsize}| (plus some additional justification settings)
+% \begin{macrocode}
+\@ifdefinable\@rothead{}
+\def\@rothead[#1]#2{\thead{\\[-.65\normalbaselineskip]
+ \turn{\cellrotangle}\thead[#1]{#2@{}}\endturn}}
+\newcommand\@@rothead[1]{\thead{\\[-.65\normalbaselineskip]
+ \turn{\cellrotangle}\thead[c{>{\rightskip0explus
+ \rotheadsize\hyphenpenalty0\pretolerance-1%
+ \noindent\hskip\z@}p{\rotheadsize}
+ @{}}]{#1}\endturn}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\multirowcell}
+% The macro for multirow cells. If no \package{multirow} package loaded
+% this macro works like |\makecell|.
+% \begin{macrocode}
+\newcommand\multirowcell{\@ifundefined{multirow}%
+ {\PackageWarning{makecell}{\string\multirowcell\space
+ needs multirow package}}%
+ {\let\mcell@multirow\multirow}\mcell@mrowcell@}
+% \end{macrocode}
+% These macros define settings for |\multirow| arguments.
+% \begin{macrocode}
+\newcommand\mcell@mrowcell@[1]{\@ifnextchar
+ [{\mcell@mrowcell@@{#1}}{\mcell@mrowcell@@{#1}[0pt]}}
+\@ifdefinable\mcell@mrowcell@@{}
+\def\mcell@mrowcell@@#1[#2]{\edef\mcell@nrows{#1}\edef\mcell@fixup{#2}%
+ \let\tabg@pe\cellgape\makecell@}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\multirowthead}
+% The macro for multirow column heads. If no \package{multirow} package loaded
+% this macro works like |\thead|.
+% \begin{macrocode}
+\newcommand\multirowthead{\@ifundefined{multirow}%
+ {\PackageWarning{makecell}{\string\multirowthead\space
+ needs multirow package}}%
+ {\let\mcell@multirow\multirow}\mcell@mrowhead@}
+% \end{macrocode}
+% These macros define settings for |\multirow| arguments.
+% \begin{macrocode}
+\newcommand\mcell@mrowhead@[1]{\@ifnextchar
+ [{\mcell@mrowhead@@{#1}}{\mcell@mrowhead@@{#1}[0pt]}}
+\@ifdefinable\mcell@mrowhead@@{}
+\def\mcell@mrowhead@@#1[#2]{\edef\mcell@nrows{#1}\edef\mcell@fixup{#2}%
+ \let\tabg@pe\theadgape\thead@}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\mcell@multirow}
+% By default |\mcell@multirow| macro gobbles |\multirow|'s arguments.
+% \begin{macrocode}
+\@ifdefinable\mcell@multirow{}
+\def\mcell@multirow#1#2[#3]{}%
+% \end{macrocode}
+% \end{macro}
+%
+% Definitions for horizontal and vertical alignments, which use by \env{tabular}
+% and \env{array} environments.
+%
+% For \texttt{l}, \texttt{r}, \texttt{t}, and \texttt{b} alignments commands
+% set |c|-argument as vertical or horizontal centering alignment if necessary.
+% For \texttt{l} and \texttt{r} alignments also redefined alignment
+% settings for |\makecell| (|\thead|) blocks.
+% \begin{macrocode}
+\newcommand\mcell@l{\def\mcell@ii{l}\let\mcell@c\mcell@ic
+ \global\let\mcell@left\relax}
+\newcommand\mcell@r{\def\mcell@ii{r}\let\mcell@c\mcell@ic
+ \global\let\mcell@right\relax}
+\newcommand\mcell@t{\def\mcell@i{t}\let\mcell@c\mcell@iic}
+\newcommand\mcell@b{\def\mcell@i{b}\let\mcell@c\mcell@iic}
+\newcommand\mcell@{}
+% \end{macrocode}
+% If alone |c|-argument loaded it is used for horizontal alignment.
+% \begin{macrocode}
+\newcommand\mcell@c{\def\mcell@ii{c}}
+\newcommand\mcell@ic{\def\mcell@i{c}}
+\newcommand\mcell@iic{\def\mcell@ii{c}}
+% \end{macrocode}
+% Default vertical and horizontal alignment is centered.
+% \begin{macrocode}
+\newcommand\mcell@i{c}
+\newcommand\mcell@ii{c}
+% \end{macrocode}
+%
+% Default horizontal alignment of |\makecell| (|\thead|) blocks is centered.
+% \begin{macrocode}
+\@ifdefinable\mcell@left{\let\mcell@left\hfill}
+\@ifdefinable\mcell@right{\let\mcell@right\hfill}
+% \end{macrocode}
+%
+% \begin{macro}{\mcell@tabular}
+% \begin{macro}{\mcell@@tabular}
+% \begin{macro}{\mcell@@@tabular}
+% The core macros for tabular building.
+%
+% Next few macros for sorting of |\makecell| (|\thead|) arguments.
+% \begin{macrocode}
+\@ifdefinable\mcell@tabular{}\@ifdefinable\mcell@@tabular{}
+\@ifdefinable\mcell@@@tabular{}
+\def\mcell@tabular[#1]#2{\mcell@@tabular#1\@nil{#2}}
+% \end{macrocode}
+% The code for this macro borrowed from \package{caption} 3.x package (AS).
+% \begin{macrocode}
+\newcommand\mcell@ifinlist[2]{%
+ \let\next\@secondoftwo
+ \edef\mcell@tmp{#1}%
+ \@for\mcell@Tmp:={#2}\do{%
+ \ifx\mcell@tmp\mcell@Tmp
+ \let\next\@firstoftwo
+ \fi}\next}
+% \end{macrocode}
+%
+% The |\mcell@@tabular| macro at first calls |\mcell@setalign| macro for
+% sorting of alignment arguments, then calls |\mcell@@@tabular|
+% macro, which created tabular cell or column head.
+% \begin{macrocode}
+\def\mcell@@tabular#1#2\@nil#3{%
+ \expandafter\mcell@setalign\mcell@align\@nil
+ \mcell@setalign{#1}{#2}\@nil
+ \expandafter\mcell@@@tabular\expandafter\mcell@i\mcell@ii\@nil{#3}}
+% \end{macrocode}
+%
+% \begin{macro}{\mcell@setalign}
+% This macro sorts arguments for vertical and horizontal alignment.
+%
+% First argument has second check at the end of macro for the case if
+% it is |c|-argument.
+% \begin{macrocode}
+\@ifdefinable\mcell@setalign{}
+\def\mcell@setalign#1#2\@nil{\def\@tempa{#1}\def\@tempc{c}%
+% \end{macrocode}
+% Restore default alignment for |\makecell| and |\thead| blocks.
+% \begin{macrocode}
+ \global\let\mcell@left\hfill\global\let\mcell@right\hfill
+% \end{macrocode}
+% If in optional argument appears alone |c|-argument it defines
+% horizontal centering only.
+% \begin{macrocode}
+ \def\mcell@c{\def\mcell@ii{c}}%
+ \mcell@ifinlist{#1}{l,r,t,b,c,}{\@nameuse{mcell@#1}}%
+% \end{macrocode}
+% If argument is not \texttt{l}, \texttt{r}, \texttt{c}, \texttt{t},
+% or \texttt{b} it could define horizontal alignment only.
+% \begin{macrocode}
+ {\def\mcell@ii{#1}\let\mcell@c\mcell@ic
+ \let\mcell@left\relax\let\mcell@right\relax}%
+ \mcell@ifinlist{#2}{l,r,t,b,c,}{\@nameuse{mcell@#2}}%
+% \end{macrocode}
+% If argument is not \texttt{l}, \texttt{r}, \texttt{c}, \texttt{t},
+% or \texttt{b} it could define horizontal alignment only.
+% \begin{macrocode}
+ {\def\mcell@ii{#2}\let\mcell@c\mcell@ic
+ \let\mcell@left\relax\let\mcell@right\relax}%
+% \end{macrocode}
+% Here goes repeated check for first argument, if it is |c|-argument
+% we call |\mcell@c| command, which can be now redefined.
+% \begin{macrocode}
+ \ifx\@tempa\@tempc\mcell@c\fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% This macro builds tabular itself.
+% First (and last) go commands which align |\makecell| and |\thead|
+% blocks like \texttt{l}, \texttt{r}, or \texttt{c} (if they loaded).
+% Then goes check whether math mode exists.
+% The |\mcell@multirow| emulation macro transforms to |\multirow|
+% when necessary.
+% \begin{macrocode}
+\def\mcell@@@tabular#1#2\@nil#3{%\mcell@mstyle
+ \ifdim\parindent<\z@\leavevmode\else\noindent\fi
+ \null\mcell@left
+ \ifmmode
+ \mcell@multirow\mcell@nrows*[\mcell@fixup]{\tabg@pe
+ {\hbox{\t@bset$\array[#1]{@{}#2@{}}#3\endarray$}}}%
+ \else
+ \mcell@multirow\mcell@nrows*[\mcell@fixup]{\tabg@pe
+ {\hbox{\t@bset\tabular[#1]{@{}#2@{}}#3\endtabular}}}%
+ \fi\mcell@right\null}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{environment}{\mcellbox}
+% \begin{macro}{\makecellbox}
+% \begin{macrocode}
+\@ifdefinable\mcell@start{}\@ifdefinable\mcell@stop{}
+\newcommand\mcellbox[1][c]{%
+ \expandafter\mcell@setalign\cellalign\@nil
+ \expandafter\mcell@setalign#1\@nil
+ \expandafter\mcell@box\expandafter\mcell@i\mcell@ii\@nil}
+\@ifdefinable\mcell@box{}
+\def\mcell@box#1#2\@nil{%
+ \ifdim\parindent<\z@\leavevmode\else\noindent\fi
+ \ifmmode\def\mcell@start{$\array}\def\mcell@stop{\endarray$}\else
+ \def\mcell@start{\tabular}\def\mcell@stop{\endtabular}\fi
+ \hbox\bgroup\cellset\mcell@start[#1]{@{}#2@{}}}%
+\def\endmcellbox {\mcell@stop\egroup}
+\newcommand\makecellbox[2][c]{\begin{mcellbox}[#1]#2\end{mcellbox}}
+% \end{macrocode}
+% \end{macro}
+% \end{environment}
+%
+% \begin{macro}{\cellset}
+% \begin{macro}{\cellgape}
+% \begin{macro}{\cellalign}
+% \begin{macro}{\cellrotangle}
+% \begin{macro}{\theadfont}
+% \begin{macro}{\theadset}
+% \begin{macro}{\theadgape}
+% \begin{macro}{\rotheadgape}
+% \begin{macro}{\theadalign}
+% The layout macros for tabular building settings.\nopagebreak
+%
+% Spacing settings for tabular spacing inside cells (like |\arraystretch|
+% or |\extrarowheight|).\nopagebreak
+% \begin{macrocode}
+\newcommand\cellset{\def\arraystretch{1}\extrarowheight\z@
+ \nomakegapedcells}
+% \end{macrocode}
+% Vertical space around cells (created by |\gape| stuff).
+% \begin{macrocode}
+\newcommand\cellgape{}
+% \end{macrocode}
+% Vertical and horizontal alignment of cell text.
+% \begin{macrocode}
+\newcommand\cellalign{cc}
+% \end{macrocode}
+% Angle for rotated column heads and cells.
+% \begin{macrocode}
+\newcommand\cellrotangle{90}
+% \end{macrocode}
+%
+% Font for column heads
+% \begin{macrocode}
+\newcommand\theadfont{\footnotesize}
+% \end{macrocode}
+% Special spacing settings for tabular spacing in column heads (like
+% |\arraystretch| or/and |\extrarowheight|).
+% \begin{macrocode}
+\newcommand\theadset{}
+% \end{macrocode}
+% Vertical space around column heads (created by |\gape| stuff).
+% \begin{macrocode}
+\newcommand\theadgape{\gape}
+% \end{macrocode}
+% Vertical space around rotated column heads.
+% \begin{macrocode}
+\newcommand\rotheadgape{}
+% \end{macrocode}
+% Vertical and horizontal alignment of column head text.
+% \begin{macrocode}
+\newcommand\theadalign{cc}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{Gape commands}
+%
+% \begin{macro}{\gape}
+% \begin{macro}{\setcellgapes}
+% The macro itself. It uses analogous to |\smash| macro from \package{amsmath}
+% package.
+% \begin{macrocode}
+\@ifdefinable\gape{}
+\DeclareRobustCommand\gape{\@ifnextchar[\@gape{\@gape[tb]}}
+% \end{macrocode}
+%
+% The |\setcellgapes| defines settings used by |\makegapedcells| command.
+%
+% First goes check for optional argument.
+% \begin{macrocode}
+\newcommand\setcellgapes{\@ifnextchar[%]
+ {\mcell@setgapes{MB}}{\mcell@setgapes{MB}[tb]}}
+% \end{macrocode}
+% Then body of settings.
+% \begin{macrocode}
+\@ifdefinable\@setcellgapes{}
+\def\mcell@setgapes#1[#2]#3{\expandafter\let\csname
+ mcell@#1@\expandafter\endcsname\csname mcell@mb@#2\endcsname
+ \@namedef{mcell@#1jot}{#3}%
+% \end{macrocode}
+% Negative compensate inside |\makegapedsells| area.
+% \begin{macrocode}
+ \@namedef{mcell@#1negjot}{-#3}\@namedef{mcell@#1negtb}{#2}}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\newcommand\negjot[1]{{\jot\mcell@MBnegjot\gape[mcell@MBnegtb]{#1}}}
+% \end{macrocode}
+%
+% The macros which count advanced height and depth of boxes.
+% \begin{macrocode}
+\newcommand\mcell@mb@t[2]{%
+ \@tempdima\ht#1\advance\@tempdima#2\ht#1\@tempdima}
+\newcommand\mcell@mb@b[2]{%
+ \@tempdimb\dp#1\advance\@tempdimb#2\dp#1\@tempdimb}
+\newcommand\mcell@mb@tb[2]{\mcell@mb@t{#1}{#2}\mcell@mb@b{#1}{#2}}
+% \end{macrocode}
+%
+% The body of |\gape| macros.
+% \begin{macrocode}
+\@ifdefinable\@gape{}\@ifdefinable\@@gape{}
+\def\@gape[#1]{\mcell@setgapes{mb}[#1]{\jot}\@@gape}
+\def\@@gape{%
+ \ifmmode \expandafter\mathpalette\expandafter\mathg@pe
+ \else \expandafter\makeg@pe
+ \fi}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\makeg@pe}
+% The macros which put box with necessary parameters in text and math mode.
+% \begin{macrocode}
+\newcommand\makeg@pe[1]{\setbox\z@
+ \hbox{\color@begingroup#1\color@endgroup}\mcell@mb@\z@\mcell@mbjot\box\z@}
+\newcommand\mathg@pe[2]{\setbox\z@
+ \hbox{$\m@th#1{#2}$}\mcell@mb@\z@\mcell@mbjot\box\z@}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\Gape}
+% The macros which put box with necessary parameters in text and math mode.
+% \begin{macrocode}
+\@ifdefinable\Gape{}
+\DeclareRobustCommand\Gape{\@ifnextchar[\@Gape{\@Gape[\jot]}}
+\@ifdefinable\@Gape{}\@ifdefinable\@@Gape{}
+\def\@Gape[#1]{\@ifnextchar[{\@@Gape[#1]}{\@@Gape[#1][#1]}}
+\def\@@Gape[#1][#2]{\def\depth{\dp\z@}\def\height{\ht\z@}%
+ \edef\mcell@mb@##1##2{%
+ \@tempdima\ht\z@\advance\@tempdima#1\ht\z@\@tempdima
+ \@tempdimb\dp\z@\advance\@tempdimb#2\dp\z@\@tempdimb}%
+ \@@gape}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\topstrut}
+% \begin{macro}{\botstrut}
+% \begin{macro}{\bottopstrut}
+% The macros abbreviations for |\strut| which changed by value of |\jot|.
+% First enlarges both depth and height.
+% \begin{macrocode}
+\newcommand\bottopstrut{\gape{\strut}}
+% \end{macrocode}
+% Second enlarges only height.
+% \begin{macrocode}
+\newcommand\topstrut{\gape[t]{\strut}}
+% \end{macrocode}
+% Third enlarges only depth.
+% \begin{macrocode}
+\newcommand\botstrut{\gape[b]{\strut}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{Modification of command from \package{array} package}
+%
+% \begin{macro}{\makegapedcells}
+% \begin{macro}{\nomakegapedcells}
+% At first is saved |\@classz| macro.
+% \begin{macrocode}
+\@ifdefinable\mcell@oriclassz{\let\mcell@oriclassz\@classz}
+% \end{macrocode}
+% This macros redefine and restore the |\@classz| macro from \package{array}
+% package.
+% \begin{macrocode}
+\newcommand\makegapedcells{\let\@classz\mcell@classz}
+\newcommand\nomakegapedcells{\let\@classz\mcell@oriclassz}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\mcell@agape}
+% Following macro creates tabular/array cells with changed vertical spaces.
+% \begin{macrocode}
+\newcommand\mcell@agape[1]{\setbox\z@\hbox{#1}\mcell@MB@\z@\mcell@MBjot
+ \null\mcell@left\box\z@\mcell@right\null}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\mcell@classz}
+% Redefined |\@classz| macro from \package{array} package.
+% \begin{macrocode}
+\newcommand\mcell@classz{\@classx
+ \@tempcnta \count@
+ \prepnext@tok
+ \@addtopreamble{%\mcell@mstyle
+ \ifcase\@chnum
+ \hfil
+ \mcell@agape{\d@llarbegin\insert@column\d@llarend}\hfil \or
+ \hskip1sp
+ \mcell@agape{\d@llarbegin\insert@column\d@llarend}\hfil \or
+ \hfil\hskip1sp
+ \mcell@agape{\d@llarbegin \insert@column\d@llarend}\or
+ $\mcell@agape{\vcenter
+ \@startpbox{\@nextchar}\insert@column\@endpbox}$\or
+ \mcell@agape{\vtop
+ \@startpbox{\@nextchar}\insert@column\@endpbox}\or
+ \mcell@agape{\vbox
+ \@startpbox{\@nextchar}\insert@column\@endpbox}%
+ \fi
+ \global\let\mcell@left\relax\global\let\mcell@right\relax
+ }\prepnext@tok}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Rows of skipped and numbered cells}
+%
+% \begin{macro}{\eline}
+% The row of empty cells.
+% \begin{macrocode}
+\@ifdefinable\eline{}
+\DeclareRobustCommand\eline[1]{\@temptokena{}\count@ #1%
+ \advance\count@\m@ne
+ \loop \@temptokena\expandafter{\the\@temptokena&}%
+ \advance\count@\m@ne \ifnum\count@>\z@\repeat
+ \the\@temptokena\ignorespaces}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\erows}
+% \begin{macro}{\Xrows}
+% Lazy macros for filling few rows.
+% \begin{macrocode}
+%\newtoks\@temptokenb\newtoks\@temptokenc
+%\newcommand\erows[3][\\ \hline]{\relax\@temptokenb{}\@temptokenc{}\@tempcnta#3\relax
+% \count@#2\advance\count@\m@ne\loop\showthe\@temptokenc
+% \@temptokenc\expandafter{\the\@temptokenc&}%
+% \advance\count@\m@ne \ifnum\count@>\z@\repeat
+% \loop
+% \global\@temptokenb\expandafter{\the\expandafter\@temptokenb\expandafter\the\@temptokenc#1}%
+% \advance\@tempcnta\m@ne \ifnum\@tempcnta>\z@\repeat
+% \the\@temptokenb\showthe\@temptokenb}
+\newcommand\erows[3][\\ \hline]{\@temptokena{}\count@ #3%
+ \loop \@temptokena\expandafter{\the\@temptokena\eline{#2}#1}%
+ \advance\count@\m@ne \ifnum\count@>\z@\repeat
+ \the\@temptokena}
+\newcommand\Xrows[2]{\@temptokena{}\count@ #2%
+ \loop \@temptokena\expandafter{\the\@temptokena#1}%
+ \advance\count@\m@ne \ifnum\count@>\z@\repeat
+ \the\@temptokena}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\rnline}
+% \begin{macro}{\nline}
+% The rows of numbered cells. The |\rnline| command replaces |\Alph| and
+% |\alph| counter by |\Asbuk| and |\asbuk| consequently.
+% \begin{macrocode}
+\newcounter{nlinenum}
+\@ifdefinable\rnline{}
+\DeclareRobustCommand\rnline{\gdef
+ \TeXr@rus{\let\@Alph\@Asbuk\let\@alph\@asbuk}\@nline}
+\@ifdefinable\nline{}
+\DeclareRobustCommand\nline{\gdef\TeXr@rus{}\@nline}
+\newcommand\@nline{\@ifnextchar[%]
+ {\@@nline}{\@@nline[1]}}
+\@ifdefinable\@@nline{}
+\def\@@nline[#1]{\@ifnextchar[%]
+ {\@@@nline[#1]}{\@@@nline[#1][1]}}
+\@ifdefinable\@@@nline{}
+\def\@@@nline[#1][#2]#3{\count@ #3
+ \def\TeXr@label{\TeXr@label@{nlinenum}}%
+ \expandafter\TeXr@loop\@gobble{}#1\@@@
+ \xdef\Num{\the\TeXr@lab}%
+ \c@nlinenum#2\relax%
+ \expandafter\@temptokena\expandafter{\Num
+ \global\advance\c@nlinenum\@ne}%
+ \advance\count@\m@ne
+ \loop\@temptokena\expandafter{\the\@temptokena&
+ \Num \global\advance\c@nlinenum\@ne}%
+ \advance\count@\m@ne \ifnum\count@>\z@ \repeat
+ \the\@temptokena\ignorespaces}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% [Borrowed code stuff and explanation from \package{enumerate}/\package{paralist}
+% packages just with changes of command names.]
+%
+% Internal token register used to build up the label command from the
+% optional argument.
+% \begin{macrocode}
+\newtoks\TeXr@lab
+% \end{macrocode}
+% This just expands to a `?'. |\ref| will produce this, if no counter
+% is printed.
+% \begin{macrocode}
+\def\TeXr@qmark{?}
+% \end{macrocode}
+% The next four macros build up the command that will print the item
+% label. They each gobble one token or group from the optional argument,
+% and add corresponding tokens to the register |\@enLab|. They each end
+% with a call to |\@enloop|, which starts the processing of the next
+% token.
+% \begin{macro}{\TeXr@label}
+% Add the counter to the label. |#2| will be one of the `special'
+% tokens |A a I i 1|, and is thrown away. |#1| will be a command
+% like |\Roman|.
+% \begin{macrocode}
+\def\TeXr@label@#1#2#3{%
+ \edef\TeXr@the{\noexpand#2{#1}}%
+ \TeXr@lab\expandafter
+ {\the\TeXr@lab\TeXr@rus\csname the#1\endcsname}%
+ \advance\@tempcnta1
+ \TeXr@loop}
+% \end{macrocode}
+% The only foreign command in this stuff. It indicates whether
+% the list has numeration by Russian letters.
+% \begin{macrocode}
+\def\TeXr@rus{}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\TeXr@space}
+% \begin{macro}{\TeXr@sp@ce}
+% Add a space to the label. The tricky bit is to gobble the space token,
+% as you can not do this with a macro argument.
+% \begin{macrocode}
+\def\TeXr@space{\afterassignment\TeXr@sp@ce\let\@tempa= }
+\def\TeXr@sp@ce{\TeXr@lab\expandafter{\the\TeXr@lab\space}\TeXr@loop}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\TeXr@group}
+% Add a |{ }| group to the label.
+% \begin{macrocode}
+\def\TeXr@group#1{\TeXr@lab\expandafter{\the\TeXr@lab{#1}}\TeXr@loop}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\TeXr@other}
+% Add anything else to the label
+% \begin{macrocode}
+\def\TeXr@other#1{\TeXr@lab\expandafter{\the\TeXr@lab#1}\TeXr@loop}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\TeXr@loop}
+% \begin{macro}{\TeXr@loop@}
+% The body of the main loop.
+% Eating tokens this way instead of using |\@tfor| lets you see
+% spaces and {\bf all} braces. |\@tfor| would treat {\tt a} and
+% |{a}| as special, but not |{{a}}|.
+% \begin{macrocode}
+\def\TeXr@loop{\futurelet\TeXr@temp\TeXr@loop@}
+% \end{macrocode}
+% \begin{macrocode}
+\def\TeXr@loop@{%
+ \ifx A\TeXr@temp \def\@tempa{\TeXr@label\Alph }\else
+ \ifx a\TeXr@temp \def\@tempa{\TeXr@label\alph }\else
+ \ifx i\TeXr@temp \def\@tempa{\TeXr@label\roman }\else
+ \ifx I\TeXr@temp \def\@tempa{\TeXr@label\Roman }\else
+ \ifx 1\TeXr@temp \def\@tempa{\TeXr@label\arabic}\else
+ \ifx \@sptoken\TeXr@temp \let\@tempa\TeXr@space \else
+ \ifx \bgroup\TeXr@temp \let\@tempa\TeXr@group \else
+ \ifx \@@@\TeXr@temp \let\@tempa\@gobble \else
+ \let\@tempa\TeXr@other
+% \end{macrocode}
+% Hook for possible extensions
+% \begin{macrocode}
+ \TeXr@hook
+ \fi\fi\fi\fi\fi\fi\fi\fi
+ \@tempa}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\TeXr@hook}
+% \begin{macrocode}
+\providecommand\TeXr@hook{}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Diagonally separated column heads}
+%
+% \begin{macro}{\diaghead}
+% Macro for diagonally separated column heads.
+% \begin{macrocode}
+\newcommand\diaghead{\@ifnextchar({\mcell@diaghead}{\mcell@diagheads}}
+\@ifdefinable\mcell@diaghead{}
+\def\mcell@diaghead(#1){\def\celldiagratio{(#1)}\mcell@diagheads}
+% \end{macrocode}
+% The default value of diagonal ratio.
+% \begin{macrocode}
+\newcommand\celldiagratio{(5,-2)}
+% \end{macrocode}
+% The building itself
+% \begin{macrocode}
+\newcommand\mcell@diagheads[3]{\hbox\bgroup\expandafter
+ \mcell@getcelldiagratios\celldiagratio\relax
+ \@tempswafalse
+% \end{macrocode}
+% depends of sign of ratios.
+% \begin{macrocode}
+ \ifnum\mcell@Hratio<\z@\count@-\mcell@Hratio\relax
+ \edef\mcell@Hratio{\the\count@}\relax
+ \ifnum\mcell@Vratio<\z@\count@-\mcell@Vratio\relax
+ \edef\mcell@Vratio{\the\count@}\else\@tempswatrue
+ \fi
+ \else
+ \ifnum\mcell@Vratio<\z@\count@-\mcell@Vratio\relax
+ \edef\mcell@Vratio{\the\count@}\@tempswatrue\else
+ \fi
+ \fi
+ \settowidth\@tempdima{#1}\advance\@tempdima2\tabcolsep
+ \edef\mcell@diagH{\the\@tempdima}\divide\@tempdima\mcell@Hratio
+ \@tempdima\mcell@Vratio\@tempdima\edef\mcell@diagV{\the\@tempdima}%
+% \end{macrocode}
+% The |\unitlength| here is |\relaxed|, we use just real dimensions.
+% \begin{macrocode}
+ \let\mcell@oriunitlength\unitlength\let\unitlength\relax
+ \kern-\tabcolsep\kern-\@wholewidth
+ \setbox\z@\hbox{\theadfont{\strut}}\@tempdima\dp\z@
+% \end{macrocode}
+% The value of compensate vertical spacing defined here experimentally
+% and equals to 2~default line thickness.
+% \begin{macrocode}
+ \advance\@tempdima.8\p@%2\@wholewidth
+% \end{macrocode}
+% If |\makedgapedcells| switched on for the table there is
+% compensate spacing.
+% \begin{macrocode}
+ {\ifx\@classz\mcell@classz
+ \setbox\z@\hbox{#1}\ht\z@\z@\dp\z@\z@
+ \mcell@MB@\z@\mcell@MBjot
+ \global\dimen@\@tempdima\global\@tempdimb\@tempdimb
+ \else\global\dimen@\z@\global\@tempdimb\z@\fi
+ }%
+ \advance\@tempdima\dimen@
+ \edef\mcell@diagVoffset{\the\@tempdima}%
+ \@tempdima\mcell@diagV\advance\@tempdima-\mcell@diagVoffset
+ \advance\@tempdima-\@tempdimb
+ \edef\mcell@diagVcorr{\the\@tempdima}%
+ \noindent\nomakegapedcells\hbox{\begin{tabular}{@{}c@{}}%
+% \end{macrocode}
+% At least a~|\normallineskip| vertical space from top and bottom of cell.
+% \begin{macrocode}
+ \ifdim\jot<2\p@\jot2\p@\fi
+ \if@tempswa
+% \end{macrocode}
+% For South-East or North-West directions.
+% \begin{macrocode}
+ \begin{picture}(\mcell@diagH,\mcell@diagVcorr)(\z@,\mcell@diagVoffset)%
+ \put(\z@,\mcell@diagV){\makebox(\z@,\z@)[tl]%
+ {\edef\tempa{(\mcell@Hratio,-\mcell@Vratio)}\expandafter
+ \line\tempa{\mcell@diagH}}}
+ \put(\tabcolsep,\jot)%
+ {\makebox(\z@,\z@)[bl]{\theadfont
+ \let\cellset\theadset\makecell[bl]{\strut#2}}}
+ \@tempdima\mcell@diagH\advance\@tempdima-\tabcolsep
+ \@tempdimb\mcell@diagV\advance\@tempdimb-\jot
+ \put(\@tempdima,\@tempdimb)%
+ {\makebox(\z@,\z@)[tr]{\theadfont
+ \let\cellset\theadset\makecell[tr]{#3\strut}}}
+ \end{picture}%
+ \else
+% \end{macrocode}
+% For South-West or North-East directions.
+% \begin{macrocode}
+ \begin{picture}(\mcell@diagH,\mcell@diagVcorr)(\z@,\mcell@diagVoffset)%
+ \put(\z@,\mcell@diagV){\makebox(\z@,\z@)[tl]%
+ {\edef\tempa{(\mcell@Hratio,\mcell@Vratio)}\expandafter
+ \line\tempa{\mcell@diagH}}}
+ \@tempdima\mcell@diagV\advance\@tempdima-\jot
+ \put(\tabcolsep,\@tempdima)%
+ {\makebox(\z@,\z@)[tl]{\theadfont
+ \let\cellset\theadset\makecell[tl]{\strut#3}}}
+ \@tempdima\mcell@diagH\advance\@tempdima-\tabcolsep
+ \put(\@tempdima,\jot)%
+ {\makebox(\z@,\z@)[br]%
+ {\theadfont
+ \let\cellset\theadset{\makecell[br]{#2\strut}}}}
+ \end{picture}%
+ \fi
+ \end{tabular}%
+ \kern-\tabcolsep\kern-\@wholewidth
+ }\let\unitlength\mcell@oriunitlength\egroup\par
+ \ifvmode\strut
+ \vspace*{-\normalbaselineskip}\vspace*{-\normallineskip}
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+% Macro used by previous one. Extracts ratios for defining of height of cell.
+% \begin{macrocode}
+\@ifdefinable\mcell@getcelldiagratios{}
+\def\mcell@getcelldiagratios(#1,#2){\def\mcell@Hratio{#1}\def\mcell@Vratio{#2}}
+% \end{macrocode}
+%
+% \subsection{The \cmd{\hline} and \cmd{\cline} with necessary thickness}
+%
+% \begin{macro}{\Xhline}
+% The commands for |\hline| and |\cline| with necessary thickness.
+% Added code for the |longtable| environment.
+% \begin{macrocode}
+\newcommand\Xhline[1]{\noalign{\ifnum0=`}\fi\arrayrulewidth#1%
+ \ifx\hline\LT@hline\let\@xhline\LT@@hline\fi
+ \hrule\@height\arrayrulewidth\futurelet\reserved@a\@xhline}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\Xcline}
+% \begin{macrocode}
+\def\Xcline#1#2{\@Xcline#1;#2\@nil}
+\def\@Xcline#1-#2;#3\@nil{%
+ \omit
+ \@multicnt#1%
+ \advance\@multispan\m@ne
+ \ifnum\@multicnt=\@ne\@firstofone{&\omit}\fi
+ \@multicnt#2%
+ \advance\@multicnt-#1%
+ \advance\@multispan\@ne
+ \leaders\hrule\@height#3\hfill
+ \cr
+ \noalign{\vskip-#3}}
+% \end{macrocode}
+% \end{macro}
+%
+% \Finale
+\endinput