%
% plextarray.sty
% written by Hironobu Yamashita (@aminophen)
%
% This package is part of the platex-tools bundle.
% https://github.com/aminophen/platex-tools
%
% This package is expected to be compatible with
% * array.sty in latex-tools
% (2016/10/06 v2.4d -- 2018/09/13 v2.4i)
% * plext.sty in platex
% (2001/09/26 v1.2 -- 2018/09/20 v1.2j)
% Largely based on lltjext.sty from LuaTeX-ja project.
%
\NeedsTeXFormat{pLaTeX2e}
\ProvidesPackage{plextarray}
[2018/10/27 v1.1d Tabular extension package for plext and array]
\RequirePackage{plext}
\RequirePackage{plarray}
%% save definitions from array.sty
% the
option will be handled later in \@tabarray
\def\array{\col@sep\arraycolsep
\def\d@llarbegin{$}\let\d@llarend\d@llarbegin\def\@halignto{}%
\@tabarray}
\def\tabular{\def\@halignto{}\@tabular}
%% merged definitions from array.sty and plext.sty
% take option first as in plext.sty,
% which will be passed to \@tabarray
\@namedef{tabular*}{\@ifnextchar<%>
{\p@stabular}{\p@stabular}}
\def\p@stabular<#1>#2{%
\setlength\dimen@{#2}%
\edef\@halignto{to\the\dimen@}\@tabular<#1>}
%% patching internal code for array.sty and plext.sty
%
\@ifpackagelater{array}{2018/09/13}{\@firstoftwo}{\@secondoftwo}
{% = for 2018/09/13 v2.4i or newer
\def\@startpbox#1{\bgroup
\color@begingroup
\box@dir\adjustbaseline %% added
\setlength\hsize{#1}\@arrayparboxrestore
\everypar{%
\vrule \@height \ht\@arstrutbox \@width \z@
\everypar{}}%
}%
}% =
{% = for 2018/04/30 v2.4h or older
\def\@startpbox#1{\bgroup
\box@dir\adjustbaseline %% added
\setlength\hsize{#1}\@arrayparboxrestore
\everypar{%
\vrule \@height \ht\@arstrutbox \@width \z@
\everypar{}}%
}%
}% =
%
\def\@tabarray{\@ifnextchar<\p@tabarray{\p@tabarray}}
%
%% merged \@array (from array.sty) and \p@array (from plext.sty)
\def\p@array<#1>[#2]#3{%
%%%%% new code for box direction
\let\box@dir\relax
\iftdir
\if #1y\relax
\let\box@dir\yoko
\@tempcnta=\z@ % \(y)strutbox
\else\if #1z\relax
\@rotswtrue
\let\box@dir\tate
\@tempcnta=\tw@ % \zstrutbox
\else
\let\box@dir\tate
\@tempcnta=\@ne % \tstrutbox
\fi\fi
\else
\if #1t\relax
\let\box@dir\tate
\@tempcnta=\@ne % \tstrutbox
\else
\let\box@dir\yoko
\@tempcnta=\z@ % \(y)strutbox
\fi
\fi
%%%%% new code end
\setbox \@arstrutbox \hbox{\box@dir %% add \box@dir
% the behavior of \strutbox has been changed
% (box resister -> conditional macro) in pLaTeX2e 2017/04/08;
% so, \strutbox should appear after \box@dir is applied.
\@tempcntb=\ifcase\@tempcnta\strutbox
\or\tstrutbox\or\zstrutbox\or\@ctrerr\fi
\@tempdima \ht \@tempcntb
\advance \@tempdima by\extrarowheight
\vrule \@height \arraystretch \@tempdima
\@depth \arraystretch \dp \@tempcntb
\@width \z@}%
\fork@array@option<#1>[#2]% %% merged from plext
\begingroup
\@mkpream{#3}%
% following definition of \@preamble is from plext (\edef -> \xdef),
% but it's not the same as the one in array; why?
\xdef\@preamble{\ialign \noexpand \@halignto
\bgroup \tabskip \z@skip \@arstrut \@preamble
\tabskip \z@skip \cr}%
\endgroup
\@arrayleft
\@begin@alignbox %% defined inside \fork@array@option
\bgroup
\box@dir\adjustbaseline
\let\par\@empty
\let\@sharp##\let\protect\relax
\let\\\@arraycr\let\tabularnewline\\
\lineskip\z@skip\baselineskip\z@skip\@preamble}
%
\def\endarray{\crcr \egroup \egroup \@end@alignbox \@arrayright \gdef\@preamble{}}
%
%% done
\endinput