%% %% This is file `tabularht.sty', %% generated with the docstrip utility. %% %% The original source files were: %% %% tabularht.dtx (with options: `package') %% %% This is a generated file. %% %% Project: tabularht %% Version: 2019/12/29 v2.7 %% %% Copyright (C) %% 2005-2007 Heiko Oberdiek %% 2016-2019 Oberdiek Package Support Group %% %% This work may be distributed and/or modified under the %% conditions of the LaTeX Project Public License, either %% version 1.3c of this license or (at your option) any later %% version. This version of this license is in %% https://www.latex-project.org/lppl/lppl-1-3c.txt %% and the latest version of this license is in %% https://www.latex-project.org/lppl.txt %% and version 1.3 or later is part of all distributions of %% LaTeX version 2005/12/01 or later. %% %% This work has the LPPL maintenance status "maintained". %% %% The Current Maintainers of this work are %% Heiko Oberdiek and the Oberdiek Package Support Group %% https://github.com/ho-tex/oberdiek/issues %% %% %% This work consists of the main source file tabularht.dtx %% and the derived files %% tabularht.sty, tabularht.pdf, tabularht.ins, tabularht.drv, %% tabularht-example1.tex, tabularht-example2.tex. %% \NeedsTeXFormat{LaTeX2e} \ProvidesPackage{tabularht}% [2019/12/29 v2.7 Tabular with height specified (HO)] \let\@toarrayheight\@empty \let\tabH@array@init\@empty \toks@={% \begingroup \long\def\x#1\vcenter\fi\fi\bgroup#2\@sharp#3#4\@nil{% \endgroup \gdef\@array[##1]##2{% \tabH@array@init #1% \vcenter\fi\fi \@toarrayheight \bgroup \let\@toarrayheight\@empty #2\@sharp###3#4% }% }% \expandafter\x\@array[#1]{#2}\@nil % hash-ok } \edef\tabH@patch@array{\the\toks@} \def\tabH@patch@@array{% \ifx\@array\@@array \def\reserved@a{\let\@@array\@array}% \else \let\reserved@a\relax \fi \tabH@patch@array \reserved@a } \tabH@patch@@array \@ifpackageloaded{array}{}{% \AtBeginDocument{% \@ifpackageloaded{array}{% \tabH@patch@@array }{}% }% } \def\tabH@setheight#1{% \tabH@@setheight#1==\@nil } \def\tabH@@setheight#1=#2=#3\@nil{% \ifx\\#2#3\\% \setlength{\dimen@}{#1}% \edef\@toarrayheight{to\the\dimen@}% \else \edef\tabH@temp{\zap@space#1 \@empty}% \ifx\tabH@temp\tabH@to \else \ifx\tabH@temp\tabH@spread \else \PackageError{tabularht}{% Unknown height specifier % `\expandafter\strip@prefix\meaning\tabH@temp'% }{% The height dimension for tabular height can be prefixed% \MessageBreak with `to=' or `spread=', default is `to='.% }% \let\tabH@temp\tabH@to \fi \fi \setlength{\dimen@}{#2}% \edef\@toarrayheight{\tabH@temp\the\dimen@}% \fi } \def\tabH@to{to} \def\tabH@spread{spread} \newenvironment{tabularht}[1]{% \tabH@setheight{#1}% \tabular }{% \endtabular } \newenvironment{tabularht*}[1]{% \tabH@setheight{#1}% \@nameuse{tabular*}% }{% \@nameuse{endtabular*}% } \newenvironment{tabularhtx}[1]{% \tabH@setheight{#1}% \tabularx }{% \endtabularx } \newenvironment{arrayht}[1]{% \tabH@setheight{#1}% \array }{% \endarray } \def\interrowspace{% \noalign\bgroup \tabH@interrowspace } \newcommand*{\tabH@interrowspace}[2][]{% \tabH@vspace{#1}{#2}% \egroup } \def\interrowfill{% \noalign\bgroup \tabH@interrowfill } \newcommand*{\tabH@interrowfill}[1][]{% \tabH@vspace{#1}{\fill}% \egroup } \def\tabH@vspace#1#2{% \tabH@vspace@start{#1}% \vspace{#2}% \tabH@vspace@stop } \let\tabH@vspace@start\@gobble \let\tabH@vspace@stop\@empty \newcommand*{\interrowstart}{% \noalign\bgroup \tabH@interrowstart } \newcommand*{\tabH@interrowstart}[1][]{% \tabH@vspace@start{#1}% \egroup } \newcommand*{\interrowstop}{% \noalign{\tabH@vspace@stop}% } \providecommand*{\tabH@driver}{} \DeclareOption{vlines}{% \let\tabH@temp\relax } \DeclareOption{pdftex}{} \DeclareOption{dvips}{% \def\tabH@driver{dvips}% } \ProcessOptions*\relax \ifx\tabH@temp\relax \else \expandafter\endinput \fi \begingroup \@ifundefined{eTeXversion}{% \PackageError{tabularht}{% Option `vlines' requires eTeX% }{% Use of eTeX is recommended for LaTeX, see ltnews16.% }% \endgroup \endinput }{}% \endgroup \begingroup \let\@addtoreset\@gobbletwo \newcounter{tabH@unique}% \endgroup \let\tabH@currenttab\@empty \def\tabH@array@init{% \ifx\@toarrayheight\@empty % ignore vertical lines of nested tabular environments \let\tabH@currenttab\@empty \else \stepcounter{tabH@unique}% \edef\tabH@currenttab{\the\c@tabH@unique}% \fi } \renewcommand*{\@arrayrule}{% \@addtopreamble{% \hskip -.5\arrayrulewidth \ifx\tabH@currenttab\@empty \else \tabH@vrule{\tabH@currenttab}% \fi \begingroup \expandafter\ifx\csname CT@arc@\endcsname\relax \else \expandafter\CT@arc@ \fi \vline \endgroup \hskip -.5\arrayrulewidth }% } \let\tabH@arrayrule\@arrayrule \AtBeginDocument{% \@ifpackageloaded{colortbl}{% \let\@arrayrule\tabH@arrayrule }{}% } \let\tabH@vrule\@gobble \RequirePackage{iftex}[2019/11/07] \ifpdf \begingroup \@ifundefined{pdfsavepos}{% \PackageError{tabularht}{% Your pdfTeX is too old% }{% \string\pdfsavepos\space is missing.% }% \endgroup \csname fi\endcsname \endinput }{}% \let\on@line\@empty \PackageInfo{tabularht}{% Using driver `pdftex' because of pdfTeX in PDF mode% }% \endgroup \protected\def\tabH@vrule#1{% \if@filesw \pdfsavepos \protected@write\@auxout{% \let\tabH@lastxpos\relax }{% \tabH@aux@vrule{#1}{\tabH@lastxpos}% }% \fi }% \def\tabH@lastxpos{\the\pdflastxpos}% \def\tabH@lastypos{\the\pdflastypos}% % The .aux file contains three commands: % \tabH@aux@vrule{tabular id}{x position} % \tabH@aux@vstart{tabular id}{row id}{x position}{y position} % \tabH@aux@vstop{y position} % \AtBeginDocument{% % The .aux files are read the first time before % \AtBeginDocument and later at \end{document}. % \tabH@aux@done is a marker to distinguish % between these two readings. Only in the first % case we need the \tabH@aux@... commands. \let\tabH@aux@done\@empty \if@filesw \immediate\write\@mainaux{% \@percentchar\@percentchar BeginProlog: tabularht% }% % items in the aux file are executed, % if tabularht is loaded % and during the aux file read at \begin{document} only \immediate\write\@mainaux{% \detokenize{% % the \tabH@aux@... commands are needed only if % tabularht is loaded with driver pdftex. \@ifundefined{tabH@aux@vrule}\@secondoftwo\@firstofone {% % disable commands except for the first .aux files reading \@ifundefined{tabH@aux@done}\@gobble\@firstofone }% {% \let\tabH@aux@vrule\@gobbletwo \let\tabH@aux@vstart\@gobblefour \let\tabH@aux@vstop\@gobble }% }% }% \immediate\write\@mainaux{% \@percentchar\@percentchar EndProlog: tabularht% }% \fi }% % the x positions of vrules are stored in % \tabH@list with distinct values \protected\def\tabH@aux@vrule#1#2{% \@ifundefined{tabH@#1list}{% \expandafter\xdef\csname tabH@#1list\endcsname{% \noexpand\do{#2}% }% }{% \begingroup \def\x{#2}% \let\y\@undefined \let\do\tabH@do@add \expandafter\xdef\csname tabH@#1list\endcsname{% \csname tabH@#1list\endcsname\@empty \ifx\y\@undefined \noexpand\do{\x}% \fi }% \endgroup }% }% \def\tabH@do@add#1{% \ifx\y\@undefined \ifnum#1<\x\space \else \expandafter\ifx\csname y\endcsname\relax\fi \ifnum#1>\x\space \noexpand\do{\x}% \fi \fi \fi \noexpand\do{#1}% }% \def\tabH@vspace@start#1{% \if@filesw \stepcounter{tabH@unique}% \edef\tabH@currentrow{\the\c@tabH@unique}% \pdfsavepos \protected@write\@auxout{% \let\tabH@lastxpos\relax \let\tabH@lastypos\relax }{% \tabH@aux@vstart{\tabH@currenttab}{\tabH@currentrow}% {\tabH@lastxpos}{\tabH@lastypos}% }% \fi \begingroup \edef\a{tabH@\tabH@currenttab row\tabH@currentrow}% \expandafter\let\expandafter\x\csname\a x\endcsname \ifx\x\relax \else \expandafter\let\expandafter\y\csname\a y\endcsname \expandafter\let\expandafter\l \csname tabH@\tabH@currenttab list\endcsname \ifx\l\relax \else \def\f{#1}% \ifx\f\@empty \let\do\tabH@do@set \else \count@=\z@ \let\do\tabH@do@filter \fi \setbox\z@=\hbox{\l}% \wd\z@=\z@ \dp\z@=\z@ \copy\z@ \fi \fi \endgroup }% \def\tabH@vspace@stop{% \if@filesw \pdfsavepos \protected@write\@auxout{% \let\tabH@lastypos\relax }{% \tabH@aux@vstop{\tabH@lastypos}% }% \fi }% \def\tabH@do@set#1{% \hbox to \z@{% \hskip \dimexpr #1sp - \x sp\relax \vrule \@width\arrayrulewidth \@depth\dimexpr \y sp\relax \hss }% }% \def\tabH@do@filter{% \@tempswafalse \advance\count@\@ne \@for\e:=\f\do{% \ifnum\e=\count@ \@tempswatrue \fi }% \if@tempswa \expandafter\tabH@do@set \else \expandafter\@gobble \fi }% \protected\def\tabH@aux@vstart#1#2#3#4{% \def\tabH@current@vstart{{#1}{#2}{#3}{#4}}% }% \protected\def\tabH@aux@vstop{% \expandafter\tabH@aux@v\tabH@current@vstart }% \def\tabH@aux@v#1#2#3#4#5{% \expandafter\gdef\csname tabH@#1row#2x\endcsname{#3}% \expandafter\xdef\csname tabH@#1row#2y\endcsname{% \the\numexpr #4 - #5\relax }% }% \csname fi\endcsname \endinput \fi \ifx\tabH@driver\@empty \PackageError{tabularht}{% Missing DVI driver, option `vlines' disabled% }{% Supported DVI drivers: dvips.% }% \expandafter\endinput \fi \def\tabH@driver@dvips{% \def\tabH@literalps##1{\special{ps:SDict begin ##1 end}}% \def\tabH@headerps##1{\special{! ##1}}% } \@onelevel@sanitize\tabH@driver \@ifundefined{tabH@driver@\tabH@driver}{% \PackageError{tabularht}{% Unsupported driver `\tabH@driver'% }{% Supported DVI drivers: dvips.% }% \endinput }{} \begingroup \let\on@line\@empty \PackageInfo{tabularht}{% Using driver `\tabH@driver'% }% \endgroup \csname tabH@driver@\tabH@driver\endcsname \protected\def\tabH@vrule#1#2\vrule#3\arrayrulewidth{% #2% \fi or empty % hack to get rid of maxdrift rounding of dvips, % thus simulate a large motion \kern1in\relax \tabH@literalps{% #1 tabH.vrule % Resolution neg 0 translate% }% \vrule#3\arrayrulewidth \tabH@literalps{Resolution 0 translate}% \kern-1in\relax } \def\tabH@vspace@start#1{% \begingroup \let\y\@empty \@for\x:=#1\do{% \ifx\y\@empty \edef\y{\x}% \else \edef\y{\y\space\x}% \fi }% \tabH@literalps{\tabH@currenttab[\y]currentpoint exch pop}% \endgroup } \def\tabH@vspace@stop{% \tabH@literalps{% currentpoint exch pop % \number\dimexpr\arrayrulewidth\relax\space tabH.vspace% }% } \tabH@headerps{% userdict begin% /tabH.list 10 dict def% /tabH.job [] def % end% /tabH.vrule{% 10 string cvs cvn dup tabH.list exch known{% tabH.list exch dup [ exch tabH.list exch get % currentpoint pop round exch true exch{% % tabH.list key [ ... x true i % tabH.list key [ ... false i exch{% % ... [ ... x i 2 copy lt{false}{% 2 copy eq{pop false}{exch true}ifelse% }ifelse% }{false}ifelse% }forall % pop% ]put% }{% tabH.list exch[currentpoint pop round]put% }ifelse% }bind def% % /tabH.vspace{% userdict begin % 10 dict dup begin % exch 65536 div Resolution mul 72.27 div % % dvips uses a poor man's ceil function % see dopage.c before "drawrule": (int)(... + 0.9999999) 0.9999999 add truncate% /rulewidth exch def % exch/ybottom exch def % exch/ytop exch def % exch/cols exch def % exch/tabkey exch 10 string cvs cvn def % end% /tabH.job exch[exch userdict/tabH.job get aload pop]def % end% }bind def % % Now we do the work at the end of the page. % Unhappily "eop-hook" cannot be used, because "eop" % executes "restore" before, so that all data are lost. TeXDict begin% /eop% [% {% tabH.job{% begin% /colarray % tabH.list tabkey known{tabH.list tabkey get}{[]}ifelse % def % cols length 0 eq not{% /colarray[% cols{1 sub % dup 0 lt{pop}{% dup colarray length ge{pop}{% colarray exch get% }ifelse% }ifelse% }forall% ]def% }if % colarray{% % (rulewidth) == rulewidth == % debug Resolution sub % ytop rulewidth ytop ybottom sub v% }forall % end% }forall% % tabH.list{== ==}forall % debug }bind aload pop % TeXDict /eop get aload pop% ]cvx def % end% } \endinput %% %% End of file `tabularht.sty'.