%%TABU-FIXED %% %% tabu : 2019-01-11 - tabu : Flexible LaTeX tabulars %% %% ********************************************************************************************** %% \begin{tabu} { preamble } => default target: \linewidth or \linegoal %% \begin{tabu} to { preamble } => target specified %% \begin{tabu} spread { preamble } => target relative to the ``natural width'' %% %% tabu works in text and in math modes. %% %% X columns: automatic width ajustment + horizontal and vertical alignment %% \begin{tabu} { X[4c] X[1c] X[-2ml] } %% %% Horizontal lines and / or leaders: %% \hline\hline => double horizontal line %% \firsthline\hline => for nested tabulars %% \lasthline\hline => for nested tabulars %% \tabucline[line spec]{column-column} => ``funny'' lines (dash/leader) %% Automatic lines / leaders : %% \everyrow{\hline\hline} %% %% Vertical lines and / or leaders: %% \begin{tabu} { |[3pt red] X[4c] X[1c] X[-2ml] |[3pt blue] } %% \begin{tabu} { |[3pt red] X[4c] X[1c] X[-2ml] |[3pt on 2pt off 4pt blue] } %% %% Fixed vertical spacing adjustment: %% \extrarowheight= \extrarowdepth= %% or: \extrarowsep= => may be prefixed by \global %% %% Dynamic vertical spacing adjustment: %% \abovetabulinesep= \belowtabulinesep= %% or: \tabulinesep= => may be prefixed by \global %% %% delarray.sty shortcuts: in math and text modes %% \begin{tabu} .... \({ preamble }\) %% %% Algorithms reports: %% \tracingtabu=1 \tracingtabu=2 %% %% ********************************************************************************************** %% %% This work may be distributed and/or modified under the %% conditions of the LaTeX Project Public License, either %% version 1.3 of this license or (at your option) any later %% version. The latest version of this license is in %% http://www.latex-project.org/lppl.txt %% %% %%TABU-FIXED %% tabu : Flexible LaTeX tabulars %% lppl copyright 2010-2011 by FC %% %% Updated 2019-01-11 %% Copyright 2019 tabu-fixed github group (LaTeX3 Project members) %% Please report any issues at https://github.com/tabu-fixed/tabu %% \NeedsTeXFormat{LaTeX2e} \ProvidesPackage{tabu}[2019/01/11 v2.9 - flexible LaTeX tabulars (FC+tabu-fixed)] \RequirePackage{array}[2008/09/09] \RequirePackage{varwidth}[2009/03/30] \AtEndOfPackage{\tabu@AtEnd \let\tabu@AtEnd \@undefined} \let\tabu@AtEnd\@empty \def\TMP@EnsureCode#1={% \edef\tabu@AtEnd{\tabu@AtEnd \catcode#1 \the\catcode#1}% \catcode#1=% }% \TMP@EnsureCode \TMP@EnsureCode 33 = 12 % ! \TMP@EnsureCode 58 = 12 % : (for siunitx) \TMP@EnsureCode124 = 12 % | \TMP@EnsureCode 36 = 3 % $ = math shift \TMP@EnsureCode 38 = 4 % & = tab alignmment character \TMP@EnsureCode 32 = 10 % space \TMP@EnsureCode 94 = 7 % ^ \TMP@EnsureCode 95 = 8 % _ %% Constants -------------------------------------------------------- \newcount \c@taburow \def\thetaburow {\number\c@taburow} \newcount \tabu@nbcols \newcount \tabu@cnt \newcount \tabu@Xcol \let\tabu@start \@tempcnta \let\tabu@stop \@tempcntb \newcount \tabu@alloc \tabu@alloc=\m@ne \newcount \tabu@nested \def\tabu@alloc@{\global\advance\tabu@alloc \@ne \tabu@nested\tabu@alloc} \newdimen \tabu@target \newdimen \tabu@spreadtarget \newdimen \tabu@naturalX \newdimen \tabucolX \let\tabu@DELTA \@tempdimc \let\tabu@thick \@tempdima \let\tabu@on \@tempdimb \let\tabu@off \@tempdimc \newdimen \tabu@Xsum \newdimen \extrarowdepth \newdimen \abovetabulinesep \newdimen \belowtabulinesep \newdimen \tabustrutrule \tabustrutrule \z@ \newtoks \tabu@thebody \newtoks \tabu@footnotes \newsavebox \tabu@box \newsavebox \tabu@arstrutbox \newsavebox \tabu@hleads \newsavebox \tabu@vleads \newif \iftabu@colortbl \newif \iftabu@siunitx \newif \iftabu@measuring \newif \iftabu@spread \newif \iftabu@negcoef \newif \iftabu@everyrow \def\tabu@everyrowtrue {\global\let\iftabu@everyrow \iftrue} \def\tabu@everyrowfalse{\global\let\iftabu@everyrow \iffalse} \newif \iftabu@long \newif \iftabuscantokens \def\tabu@rescan {\tabu@verbatim \scantokens } %% Utilities (for internal usage) ----------------------------------- \def\tabu@gobblespace #1 {#1} \def\tabu@gobbletoken #1#2{#1} \def\tabu@gobbleX{\futurelet\@let@token \tabu@gobblex} \def\tabu@gobblex{\if ^^J\noexpand\@let@token \expandafter\@gobble \else\ifx \@sptoken\@let@token \expandafter\tabu@gobblespace\expandafter\tabu@gobbleX \fi\fi }% \tabu@gobblex \def\tabu@X{^^J} {\obeyspaces \global\let\tabu@spxiii= % saves an active space (for \ifx) \gdef\tabu@@spxiii{ }} \def\tabu@ifenvir {% only for \multicolumn \expandafter\tabu@if@nvir\csname\@currenvir\endcsname }% \tabu@ifenvir \def\tabu@if@nvir #1{\csname @\ifx\tabu#1first\else \ifx\longtabu#1first\else second\fi\fi oftwo\endcsname }% \tabu@ifenvir \def\tabu@modulo #1#2{\numexpr\ifnum\numexpr#1=\z@ 0\else #1-(#1-(#2-1)/2)/(#2)*(#2)\fi} {\catcode`\&=3 \gdef\tabu@strtrim #1{% #1 = control sequence to trim \ifodd 1\ifx #1\@empty \else \ifx #1\space \else 0\fi \fi \let\tabu@c@l@r \@empty \let#1\@empty \else \expandafter \tabu@trimspaces #1\@nnil \fi }% \tabu@strtrim \gdef\tabu@trimspaces #1\@nnil{\let\tabu@c@l@r=#2\tabu@firstspace .#1& }% \gdef\tabu@firstspace #1#2#3 &{\tabu@lastspace #2#3&} \gdef\tabu@lastspace #1{\def #3{#1}% \ifx #3\tabu@c@l@r \def\tabu@c@l@r{\protect\color{#1}}\expandafter\remove@to@nnil \fi \tabu@trimspaces #1\@nnil} }% \catcode \def\tabu@sanitizearg #1#2{{% \csname \ifcsname if@safe@actives\endcsname % @safe@activestrue\else relax\fi \endcsname \edef#2{#1}\tabu@strtrim#2\@onelevel@sanitize#2% \expandafter}\expandafter\def\expandafter#2\expandafter{#2}% }% \tabu@sanitizearg %%TABU-FIXED \def\tabu@textbar#1{% \begingroup \newlinechar \m@ne% \endlinechar \m@ne \everyeof{\noexpand}% \edef\:{\expandafter\noexpand\scantokens{|}}% \expandafter \endgroup \expandafter #1% \:% }% \tabu@textbar \def\tabu@everyrow@bgroup{\iftabu@everyrow \begingroup \else \noalign{\ifnum0=`}\fi \fi} \def\tabu@everyrow@egroup{% \iftabu@everyrow \expandafter \endgroup \the\toks@ \else \ifnum0=`{\fi}% \fi }% \tabu@everyrow@egroup \def\tabu@arstrut {\global\setbox\@arstrutbox \hbox{\vrule height \arraystretch \dimexpr\ht\strutbox+\extrarowheight depth \arraystretch \dimexpr\dp\strutbox+\extrarowdepth width \z@}% }% \tabu@arstrut \def\tabu@rearstrut {% \@tempdima \arraystretch\dimexpr\ht\strutbox+\extrarowheight \relax \@tempdimb \arraystretch\dimexpr\dp\strutbox+\extrarowdepth \relax \ifodd 1\ifdim \ht\@arstrutbox=\@tempdima \ifdim \dp\@arstrutbox=\@tempdimb 0 \fi\fi \tabu@mkarstrut \fi }% \tabu@rearstrut \def\tabu@@DBG #1{\ifdim\tabustrutrule>\z@ \color{#1}\fi} \def\tabu@DBG@arstrut {\global\setbox\@arstrutbox \hbox to\z@{\hbox to\z@{\hss {\tabu@DBG{cyan}\vrule height \arraystretch \dimexpr\ht\strutbox+\extrarowheight depth \z@ width \tabustrutrule}\kern-\tabustrutrule {\tabu@DBG{pink}\vrule height \z@ depth \arraystretch \dimexpr\dp\strutbox+\extrarowdepth width \tabustrutrule}}}% }% \tabu@DBG@arstrut \def\tabu@save@decl{\toks\count@ \expandafter{\the\toks\expandafter\count@ \@nextchar}}% \def\tabu@savedecl{\ifcat$\d@llarend\else \let\save@decl \tabu@save@decl \fi % no inversion of tokens in text mode }% \tabu@savedecl \def\tabu@finalstrut #1{\unskip\ifhmode\nobreak\fi\vrule height\z@ depth\z@ width\z@} \newcommand*\tabuDisableCommands {\g@addto@macro\tabu@trialh@@k } \let\tabu@trialh@@k \@empty \def\tabu@nowrite #1#{{\afterassignment}\toks@} \let\tabu@write\write \let\tabu@immediate\immediate \def\tabu@WRITE{\begingroup \def\immediate\write{\aftergroup\endgroup \tabu@immediate\tabu@write}% }% \tabu@WRITE \expandafter\def\expandafter\tabu@GenericError\expandafter{% \expandafter\tabu@WRITE\GenericError} \def\tabu@warn{\tabu@WRITE\PackageWarning{tabu}} \def\tabu@noxfootnote [#1]{\@gobble} \def\tabu@nocolor #1#{\@gobble} \newcommand*\tabu@norowcolor[2][]{} \def\tabu@maybesiunitx #1{\def\tabu@temp{#1}% \futurelet\@let@token \tabu@m@ybesiunitx} \def\tabu@m@ybesiunitx #1{\def\tabu@m@ybesiunitx {% \ifx #1\@let@token \let\tabu@cellleft \@empty \let\tabu@cellright \@empty \fi \tabu@temp}% \tabu@m@ybesiunitx }\expandafter\tabu@m@ybesiunitx \csname siunitx_table_collect_begin:Nn\endcsname \def\tabu@celllalign@def #1{\def\tabu@celllalign{\tabu@maybesiunitx{#1}}}% %% Fixed vertical spacing adjustment: \extrarowsep ------------------ \newcommand*\extrarowsep{\edef\tabu@C@extra{\the\numexpr\tabu@C@extra+1}% \iftabu@everyrow \aftergroup\tabu@Gextra \else \aftergroup\tabu@n@Gextra \fi \@ifnextchar={\tabu@gobbletoken\tabu@extra} \tabu@extra }% \extrarowsep \def\tabu@extra {\@ifnextchar_% {\tabu@gobbletoken{\tabu@setextra\extrarowheight \extrarowdepth}} {\ifx ^\@let@token \def\tabu@temp{% \tabu@gobbletoken{\tabu@setextra\extrarowdepth \extrarowheight}}% \else \let\tabu@temp \@empty \afterassignment \tabu@setextrasep \extrarowdepth \fi \tabu@temp}% }% \tabu@extra \def\tabu@setextra #1#2{\def\tabu@temp{\tabu@extr@#1#2}\afterassignment\tabu@temp#2} \def\tabu@extr@ #1#2{\@ifnextchar^% {\tabu@gobbletoken{\tabu@setextra\extrarowdepth \extrarowheight}} {\ifx _\@let@token \def\tabu@temp{% \tabu@gobbletoken{\tabu@setextra\extrarowheight \extrarowdepth}}% \else \let\tabu@temp \@empty \tabu@Gsave \tabu@G@extra \tabu@C@extra \extrarowheight \extrarowdepth \fi \tabu@temp}% }% \tabu@extr@ \def\tabu@setextrasep {\extrarowheight=\extrarowdepth \tabu@Gsave \tabu@G@extra \tabu@C@extra \extrarowheight \extrarowdepth }% \tabu@setextrasep \def\tabu@Gextra{\ifx \tabu@G@extra\@empty \else {\tabu@Rextra}\fi} \def\tabu@n@Gextra{\ifx \tabu@G@extra\@empty \else \noalign{\tabu@Rextra}\fi} \def\tabu@Rextra{\tabu@Grestore \tabu@G@extra \tabu@C@extra} \let\tabu@C@extra \z@ \let\tabu@G@extra \@empty %% Dynamic vertical spacing adjustment: \tabulinesep ---------------- \newcommand*\tabulinesep{\edef\tabu@C@linesep{\the\numexpr\tabu@C@linesep+1}% \iftabu@everyrow \aftergroup\tabu@Glinesep \else \aftergroup\tabu@n@Glinesep \fi \@ifnextchar={\tabu@gobbletoken\tabu@linesep} \tabu@linesep }% \tabulinesep \def\tabu@linesep {\@ifnextchar_% {\tabu@gobbletoken{\tabu@setsep\abovetabulinesep \belowtabulinesep}} {\ifx ^\@let@token \def\tabu@temp{% \tabu@gobbletoken{\tabu@setsep\belowtabulinesep \abovetabulinesep}}% \else \let\tabu@temp \@empty \afterassignment \tabu@setlinesep \abovetabulinesep \fi \tabu@temp}% }% \tabu@linesep \def\tabu@setsep #1#2{\def\tabu@temp{\tabu@sets@p#1#2}\afterassignment\tabu@temp#2} \def\tabu@sets@p #1#2{\@ifnextchar^% {\tabu@gobbletoken{\tabu@setsep\belowtabulinesep \abovetabulinesep}} {\ifx _\@let@token \def\tabu@temp{% \tabu@gobbletoken{\tabu@setsep\abovetabulinesep \belowtabulinesep}}% \else \let\tabu@temp \@empty \tabu@Gsave \tabu@G@linesep \tabu@C@linesep \abovetabulinesep \belowtabulinesep \fi \tabu@temp}% }% \tabu@sets@p \def\tabu@setlinesep {\belowtabulinesep=\abovetabulinesep \tabu@Gsave \tabu@G@linesep \tabu@C@linesep \abovetabulinesep \belowtabulinesep }% \tabu@setlinesep \def\tabu@Glinesep{\ifx \tabu@G@linesep\@empty \else {\tabu@Rlinesep}\fi} \def\tabu@n@Glinesep{\ifx \tabu@G@linesep\@empty \else \noalign{\tabu@Rlinesep}\fi} \def\tabu@Rlinesep{\tabu@Grestore \tabu@G@linesep \tabu@C@linesep} \let\tabu@C@linesep \z@ \let\tabu@G@linesep \@empty %% \global\extrarowsep and \global\tabulinesep ------------------- \def\tabu@Gsave #1#2#3#4{\xdef#1{#1% \toks#2{\toks\the\currentgrouplevel{\global#3\the#3\global#4\the#4}}}% }% \tabu@Gsave \def\tabu@Grestore#1#2{% \toks#2{}#1\toks\currentgrouplevel\expandafter{\expandafter}\the\toks#2\relax \ifcat$\the\toks\currentgrouplevel$\else \global\let#1\@empty \global\let#2\z@ \the\toks\currentgrouplevel \fi }% \tabu@Grestore %% Setting code for every row --------------------------------------- \newcommand*\everyrow{\tabu@everyrow@bgroup \tabu@start \z@ \tabu@stop \z@ \tabu@evrstartstop }% \everyrow \def\tabu@evrstartstop {\@ifnextchar^% {\afterassignment \tabu@evrstartstop \tabu@stop=}% {\ifx ^\@let@token \afterassignment\tabu@evrstartstop \tabu@start=% \else \afterassignment\tabu@everyr@w \toks@ \fi}% }% \tabu@evrstartstop \def\tabu@everyr@w {% \xdef\tabu@everyrow{% \noexpand\tabu@everyrowfalse \let\noalign \relax \noexpand\tabu@rowfontreset \iftabu@colortbl \noexpand\tabu@rc@ \fi % \taburowcolors \let\noexpand\tabu@docline \noexpand\tabu@docline@evr \the\toks@ \noexpand\tabu@evrh@@k \noexpand\tabu@rearstrut \global\advance\c@taburow \@ne}% \iftabu@everyrow \toks@\expandafter {\expandafter\def\expandafter\tabu@evr@L\expandafter{\the\toks@}\ignorespaces}% \else \xdef\tabu@evr@G{\the\toks@}% \fi \tabu@everyrow@egroup }% \tabu@everyr@w \def\tabu@evr {\def\tabu@evrh@@k} % for internal use only \tabu@evr{} %% line style and leaders ------------------------------------------- \newcommand*\newtabulinestyle [1]{% {\@for \@tempa :=#1\do{\expandafter\tabu@newlinestyle \@tempa==\@nil}}% }% \newtabulinestyle \def\tabu@newlinestyle #1=#2=#3\@nil{\tabu@getline {#2}% \tabu@sanitizearg {#1}\@tempa \ifodd 1\ifx \@tempa\@empty \ifdefined\tabu@linestyle@ 0 \fi\fi \global\expandafter\let \csname tabu@linestyle@\@tempa \endcsname =\tabu@thestyle \fi }% \tabu@newlinestyle \newcommand*\tabulinestyle [1]{\tabu@everyrow@bgroup \tabu@getline{#1}% \iftabu@everyrow \toks@\expandafter{\expandafter \def \expandafter \tabu@ls@L\expandafter{\tabu@thestyle}\ignorespaces}% \gdef\tabu@ls@{\tabu@ls@L}% \else \global\let\tabu@ls@G \tabu@thestyle \gdef\tabu@ls@{\tabu@ls@G}% \fi \tabu@everyrow@egroup }% \tabulinestyle \newcommand*\taburulecolor{\tabu@everyrow@bgroup \tabu@textbar \tabu@rulecolor} \def\tabu@rulecolor #1{\toks@{}% \def\tabu@temp #1##1#1{\tabu@ruledrsc{##1}}\@ifnextchar #1% \tabu@temp \tabu@rulearc }% \tabu@rulecolor \def\tabu@ruledrsc #1{\edef\tabu@temp{#1}\tabu@strtrim\tabu@temp \ifx \tabu@temp\@empty \def\tabu@temp{\tabu@rule@drsc@ {}{}}% \else \edef\tabu@temp{\noexpand\tabu@rule@drsc@ {}{\tabu@temp}}% \fi \tabu@temp }% \tabu@ruledrsc@ \def\tabu@ruledrsc@ #1#{\tabu@rule@drsc@ {#1}} \def\tabu@rule@drsc@ #1#2{% \iftabu@everyrow \ifx \\#1#2\\\toks@{\let\CT@drsc@ \relax}% \else \toks@{\def\CT@drsc@{\color #1{#2}}}% \fi \else \ifx \\#1#2\\\global\let\CT@drsc@ \relax \else \gdef\CT@drsc@{\color #1{#2}}% \fi \fi \tabu@rulearc }% \tabu@rule@drsc@ \def\tabu@rulearc #1#{\tabu@rule@arc@ {#1}} \def\tabu@rule@arc@ #1#2{% \iftabu@everyrow \ifx \\#1#2\\\toks@\expandafter{\the\toks@ \def\CT@arc@{}}% \else \toks@\expandafter{\the\toks@ \def\CT@arc@{\color #1{#2}}}% \fi \toks@\expandafter{\the\toks@ \let\tabu@arc@L \CT@arc@ \let\tabu@drsc@L \CT@drsc@ \ignorespaces}% \else \ifx \\#1#2\\\gdef\CT@arc@{}% \else \gdef\CT@arc@{\color #1{#2}}% \fi \global\let\tabu@arc@G \CT@arc@ \global\let\tabu@drsc@G \CT@drsc@ \fi \tabu@everyrow@egroup }% \tabu@rule@arc@ \def\taburowcolors {\tabu@everyrow@bgroup \@testopt \tabu@rowcolors 1} \def\tabu@rowcolors [#1]#2#{\tabu@rowc@lors{#1}{#2}} \def\tabu@rowc@lors #1#2#3{% \toks@{}\@defaultunits \count@ =\number0#2\relax \@nnil \@defaultunits \tabu@start =\number0#1\relax \@nnil \ifnum \count@<\tw@ \count@=\tw@ \fi \advance\tabu@start \m@ne \ifnum \tabu@start<\z@ \tabu@start \z@ \fi \tabu@rowcolorseries #3\in@..\in@ \@nnil }% \tabu@rowcolors \def\tabu@rowcolorseries #1..#2\in@ #3\@nnil {% \ifx \in@#1\relax \iftabu@everyrow \toks@{\def\tabu@rc@{}\let\tabu@rc@L \tabu@rc@}% \else \gdef\tabu@rc@{}\global\let\tabu@rc@G \tabu@rc@ \fi \else \ifx \\#2\\\tabu@rowcolorserieserror \fi \tabu@sanitizearg{#1}\tabu@temp \tabu@sanitizearg{#2}\@tempa \advance\count@ \m@ne \iftabu@everyrow \def\tabu@rc@ ##1##2##3##4{\def\tabu@rc@{% \ifnum ##2=\c@taburow \definecolorseries{tabu@rcseries@\the\tabu@nested}{rgb}{last}{##3}{##4}\fi \ifnum \c@taburow<##2 \else \ifnum \tabu@modulo {\c@taburow-##2}{##1+1}=\z@ \resetcolorseries[{##1}]{tabu@rcseries@\the\tabu@nested}\fi \xglobal\colorlet{tabu@rc@\the\tabu@nested}{tabu@rcseries@\the\tabu@nested!!+}% \rowcolor{tabu@rc@\the\tabu@nested}\fi}% }\edef\x{\noexpand\tabu@rc@ {\the\count@} {\the\tabu@start} {\tabu@temp} {\@tempa}% }\x \toks@\expandafter{\expandafter\def\expandafter\tabu@rc@\expandafter{\tabu@rc@}}% \toks@\expandafter{\the\toks@ \let\tabu@rc@L \tabu@rc@ \ignorespaces}% \else % inside \noalign \definecolorseries{tabu@rcseries@\the\tabu@nested}{rgb}{last}{\tabu@temp}{\@tempa}% \expandafter\resetcolorseries\expandafter[\the\count@]{tabu@rcseries@\the\tabu@nested}% \xglobal\colorlet{tabu@rc@\the\tabu@nested}{tabu@rcseries@\the\tabu@nested!!+}% \let\noalign \relax \rowcolor{tabu@rc@\the\tabu@nested}% \def\tabu@rc@ ##1##2{\gdef\tabu@rc@{% \ifnum \tabu@modulo {\c@taburow-##2}{##1+1}=\@ne \resetcolorseries[{##1}]{tabu@rcseries@\the\tabu@nested}\fi \xglobal\colorlet{tabu@rc@\the\tabu@nested}{tabu@rcseries@\the\tabu@nested!!+}% \rowcolor{tabu@rc@\the\tabu@nested}}% }\edef\x{\noexpand\tabu@rc@{\the\count@}{\the\c@taburow}}\x \global\let\tabu@rc@G \tabu@rc@ \fi \fi \tabu@everyrow@egroup }% \tabu@rowcolorseries \tabuDisableCommands {\let\tabu@rc@ \@empty } \def\tabu@rowcolorserieserror {\PackageError{tabu} {Invalid syntax for \string\taburowcolors \MessageBreak Please look at the documentation!}\@ehd }% \tabu@rowcolorserieserror \newcommand*\tabureset {% \tabulinesep=\z@ \extrarowsep=\z@ \extratabsurround=\z@ \tabulinestyle{}\everyrow{}\taburulecolor||{}\taburowcolors{}% }% \tabureset %% Parsing the line styles ------------------------------------------ \def\tabu@getline #1{\begingroup \csname \ifcsname if@safe@actives\endcsname % @safe@activestrue\else relax\fi \endcsname \edef\tabu@temp{#1}\tabu@sanitizearg{#1}\@tempa \let\tabu@thestyle \relax \ifcsname tabu@linestyle@\@tempa \endcsname \edef\tabu@thestyle{\endgroup \def\tabu@thestyle{\expandafter\noexpand \csname tabu@linestyle@\@tempa\endcsname}% }\tabu@thestyle \else \expandafter\tabu@definestyle \tabu@temp \@nil \fi }% \tabu@getline \def\tabu@definestyle #1#2\@nil {\endlinechar \m@ne \makeatletter \tabu@thick \maxdimen \tabu@on \maxdimen \tabu@off \maxdimen \let\tabu@c@lon \@undefined \let\tabu@c@loff \@undefined \ifodd 1\ifcat .#1\else\ifcat\relax #1\else 0\fi\fi % catcode 12 or non expandable cs \def\tabu@temp{\tabu@getparam{thick}}% \else \def\tabu@temp{\tabu@getparam{thick}\maxdimen}% \fi {% \let\tabu@ \relax \def\:{\obeyspaces \tabu@oXIII \tabu@commaXIII \edef\:}% (space active \: happy ;-)) \scantokens{\:{\tabu@temp #1#2 \tabu@\tabu@}}% \expandafter}\expandafter \def\expandafter\:\expandafter{\:}% line spec rewritten now ;-) \def\;{\def\:}% \scantokens\expandafter{\expandafter\;\expandafter{\:}}% space is now inactive (catcode 10) \let\tabu@ \tabu@getcolor \:% all arguments are ready now ;-) \ifdefined\tabu@c@lon \else \let\tabu@c@lon\@empty \fi \ifx \tabu@c@lon\@empty \def\tabu@c@lon{\CT@arc@}\fi \ifdefined\tabu@c@loff \else \let\tabu@c@loff \@empty \fi \ifdim \tabu@on=\maxdimen \ifdim \tabu@off<\maxdimen \tabu@on \tabulineon \fi\fi \ifdim \tabu@off=\maxdimen \ifdim \tabu@on<\maxdimen \tabu@off \tabulineoff \fi\fi \ifodd 1\ifdim \tabu@off=\maxdimen \ifdim \tabu@on=\maxdimen 0 \fi\fi \in@true % \else \in@false % \fi \ifdim\tabu@thick=\maxdimen \def\tabu@thick{\arrayrulewidth}% \else \edef\tabu@thick{\the\tabu@thick}% \fi \edef \tabu@thestyle ##1##2{\endgroup \def\tabu@thestyle{% \ifin@ \noexpand\tabu@leadersstyle {\tabu@thick} {\the\tabu@on}{##1} {\the\tabu@off}{##2}% \else \noexpand\tabu@rulesstyle {##1\vrule width \tabu@thick}% {##1\leaders \hrule height \tabu@thick \hfil}% \fi}% }\expandafter \expandafter \expandafter \tabu@thestyle \expandafter \expandafter \expandafter {\expandafter\tabu@c@lon\expandafter}\expandafter{\tabu@c@loff}% }% \tabu@definestyle {\catcode`\O=\active \lccode`\O=`\o \catcode`\,=\active \lowercase{\gdef\tabu@oXIII {\catcode`\o=\active \let O=\tabu@oxiii}} \gdef\tabu@commaXIII {\catcode`\,=\active \let ,=\space} }% \catcode \def\tabu@oxiii #1{% \ifcase \ifx n#1\z@ \else \ifx f#1\@ne\else \tw@ \fi\fi \expandafter\tabu@onxiii \or \expandafter\tabu@ofxiii \else o% \fi#1}% \def\tabu@onxiii #1#2{% \ifcase \ifx !#2\tw@ \else \ifcat.\noexpand#2\z@ \else \ifx \tabu@spxiii#2\@ne\else \tw@ \fi\fi\fi \tabu@getparam{on}#2\expandafter\@gobble \or \expandafter\tabu@onxiii % (space is active) \else o\expandafter\@firstofone \fi{#1#2}}% \def\tabu@ofxiii #1#2{% \ifx #2f\expandafter\tabu@offxiii \else o\expandafter\@firstofone \fi{#1#2}} \def\tabu@offxiii #1#2{% \ifcase \ifx !#2\tw@ \else \ifcat.\noexpand#2\z@ \else \ifx\tabu@spxiii#2\@ne \else \tw@ \fi\fi\fi \tabu@getparam{off}#2\expandafter\@gobble \or \expandafter\tabu@offxiii % (space is active) \else o\expandafter\@firstofone \fi{#1#2}} \def\tabu@getparam #1{\tabu@ \csname tabu@#1\endcsname=} \def\tabu@getcolor #1{% \tabu@ <- \tabu@getcolor after \edef \ifx \tabu@#1\else % no more spec \let\tabu@theparam=#1\afterassignment \tabu@getc@l@r #1\fi }% \tabu@getcolor \def\tabu@getc@l@r #1\tabu@ {% \def\tabu@temp{#1}\tabu@strtrim \tabu@temp \ifx \tabu@temp\@empty \else%\ifcsname \string\color@\tabu@temp \endcsname % if the color exists \ifx \tabu@theparam \tabu@off \let\tabu@c@loff \tabu@c@l@r \else \let\tabu@c@lon \tabu@c@l@r \fi %\else \tabu@warncolour{\tabu@temp}% \fi%\fi \tabu@ % next spec }% \tabu@getc@l@r \def\tabu@warncolour #1{\PackageWarning{tabu} {Color #1 is not defined. Default color used}% }% \tabu@warncolour \def\tabu@leadersstyle #1#2#3#4#5{\def\tabu@leaders{{#1}{#2}{#3}{#4}{#5}}% \ifx \tabu@leaders\tabu@leaders@G \else \tabu@LEADERS{#1}{#2}{#3}{#4}{#5}\fi }% \tabu@leadersstyle \def\tabu@rulesstyle #1#2{\let\tabu@leaders \@undefined \gdef\tabu@thevrule{#1}\gdef\tabu@thehrule{#2}% }% \tabu@rulesstyle %% The leaders boxes ------------------------------------------------ \def\tabu@LEADERS #1#2#3#4#5{%% width, dash, dash color, gap, gap color {\let\color \tabu@color % => during trials -> \color = \tabu@nocolor {% % but the leaders boxes should have colors ! \def\@therule{\vrule}\def\@thick{height}\def\@length{width}% \def\@box{\hbox}\def\@unbox{\unhbox}\def\@elt{\wd}% \def\@skip{\hskip}\def\@ss{\hss}\def\tabu@leads{\tabu@hleads}% \tabu@l@@d@rs {#1}{#2}{#3}{#4}{#5}% \global\let\tabu@thehleaders \tabu@theleaders }% {% \def\@therule{\hrule}\def\@thick{width}\def\@length{height}% \def\@box{\vbox}\def\@unbox{\unvbox}\def\@elt{\ht}% \def\@skip{\vskip}\def\@ss{\vss}\def\tabu@leads{\tabu@vleads}% \tabu@l@@d@rs {#1}{#2}{#3}{#4}{#5}% \global\let\tabu@thevleaders \tabu@theleaders }% \gdef\tabu@leaders@G{{#1}{#2}{#3}{#4}{#5}}% }% }% \tabu@LEADERS \def\tabu@therule #1#2{\@therule \@thick#1\@length\dimexpr#2/2 \@depth\z@} \def\tabu@l@@d@rs #1#2#3#4#5{%% width, dash, dash color, gap, gap color \global\setbox \tabu@leads=\@box{% {#3\tabu@therule{#1}{#2}}% \ifx\\#5\\\@skip#4\else{#5\tabu@therule{#1}{#4*2}}\fi {#3\tabu@therule{#1}{#2}}}% \global\setbox\tabu@leads=\@box to\@elt\tabu@leads{\@ss {#3\tabu@therule{#1}{#2}}\@unbox\tabu@leads}% \edef\tabu@theleaders ##1{\def\noexpand\tabu@theleaders {% {##1\tabu@therule{#1}{#2}}% \xleaders \copy\tabu@leads \@ss \tabu@therule{0pt}{-#2}{##1\tabu@therule{#1}{#2}}}% }\tabu@theleaders{#3}% }% \tabu@l@@d@rs %% \tabu \endtabu \tabu* \longtabu \endlongtabu \longtabu* ---------- \newcommand*\tabu {\tabu@longfalse \ifmmode \def\tabu@ {\array}\def\endtabu {\endarray}% \else \def\tabu@ {\tabu@tabular}\def\endtabu {\endtabular}\fi \expandafter\let\csname tabu*\endcsname \tabu \expandafter\def\csname endtabu*\endcsname{\endtabu}% \tabu@spreadfalse \tabu@negcoeffalse \tabu@settarget }% {tabu} \let\tabu@tabular \tabular % \expandafter\def\csname tabu*\endcsname{\tabuscantokenstrue \tabu} \newcommand*\longtabu {\tabu@longtrue \ifmmode\PackageError{tabu}{longtabu not allowed in math mode}\fi \def\tabu@{\longtable}\def\endlongtabu{\endlongtable}% \LTchunksize=\@M \expandafter\let\csname tabu*\endcsname \tabu \expandafter\def\csname endlongtabu*\endcsname{\endlongtabu}% \let\LT@startpbox \tabu@LT@startpbox % \everypar{ array struts } \tabu@spreadfalse \tabu@negcoeffalse \tabu@settarget }% {longtabu} \expandafter\def\csname longtabu*\endcsname{\tabuscantokenstrue \longtabu} \def\tabu@nolongtabu{\PackageError{tabu} {longtabu requires the longtable package}\@ehd} %% Read the target and then : \tabular or \@array ------------------ \def\tabu@settarget {\futurelet\@let@token \tabu@sett@rget } \def\tabu@sett@rget {\tabu@target \z@ \ifcase \ifx \bgroup\@let@token \z@ \else \ifx \@sptoken\@let@token \@ne \else \if t\@let@token \tw@ \else \if s\@let@token \thr@@\else \z@\fi\fi\fi\fi \expandafter\tabu@begin \or \expandafter\tabu@gobblespace\expandafter\tabu@settarget \or \expandafter\tabu@to \or \expandafter\tabu@spread \fi }% \tabu@sett@rget \def\tabu@to to{\def\tabu@halignto{to}\tabu@gettarget} \def\tabu@spread spread{\tabu@spreadtrue\def\tabu@halignto{spread}\tabu@gettarget} \def\tabu@gettarget {\afterassignment\tabu@linegoaltarget \tabu@target } \def\tabu@linegoaltarget {\futurelet\tabu@temp \tabu@linegoalt@rget } \def\tabu@linegoalt@rget {% \ifx \tabu@temp\LNGL@setlinegoal \LNGL@setlinegoal \expandafter \@firstoftwo \fi % @gobbles \LNGL@setlinegoal \tabu@begin }% \tabu@linegoalt@rget \def\tabu@begin #1#{% \iftabu@measuring \expandafter\tabu@nestedmeasure \fi \ifdim \tabu@target=\z@ \let\tabu@halignto \@empty \else \edef\tabu@halignto{\tabu@halignto\the\tabu@target}% \fi \@testopt \tabu@tabu@ \tabu@aligndefault #1\@nil }% \tabu@begin \long\def\tabu@tabu@ [#1]#2\@nil #3{\tabu@setup \def\tabu@align {#1}\def\tabu@savedpream{\NC@find #3}% \tabu@ [\tabu@align ]#2{#3\tabu@rewritefirst }% }% \tabu@tabu@ \def\tabu@nestedmeasure {% \ifodd 1\iftabu@spread \else \ifdim\tabu@target=\z@ \else 0 \fi\fi\relax \tabu@spreadtrue \else \begingroup \iffalse{\fi \ifnum0=`}\fi \toks@{}\def\tabu@stack{b}% \expandafter\tabu@collectbody\expandafter\tabu@quickrule \expandafter\endgroup \fi }% \tabu@nestedmeasure \def\tabu@quickrule {\indent\vrule height\z@ depth\z@ width\tabu@target} %% \tabu@setup \tabu@init \tabu@indent \def\tabu@setup{\tabu@alloc@ \ifcase \tabu@nested \ifmmode \else \iftabu@spread\else \ifdim\tabu@target=\z@ \let\tabu@afterendpar \par \fi\fi\fi \def\tabu@aligndefault{c}\tabu@init \tabu@indent \else % \def\tabu@aligndefault{t}\let\tabudefaulttarget \linewidth \fi \let\tabu@thetarget \tabudefaulttarget \let\tabu@restored \@undefined \edef\tabu@NC@list{\the\NC@list}\NC@list{\NC@do \tabu@rewritefirst}% \everycr{}\let\@startpbox \tabu@startpbox % for nested tabu inside longtabu... \let\@endpbox \tabu@endpbox % idem " " " " " " \let\@tabarray \tabu@tabarray % idem " " " " " " \tabu@setcleanup \tabu@setreset }% \tabu@setup \def\tabu@init{\tabu@starttimer \tabu@measuringfalse \edef\tabu@hfuzz {\the\dimexpr\hfuzz+1sp}\global\tabu@footnotes{}% \let\firsthline \tabu@firsthline \let\lasthline \tabu@lasthline \let\firstline \tabu@firstline \let\lastline \tabu@lastline \let\hline \tabu@hline \let\@xhline \tabu@xhline \let\color \tabu@color \let\@arstrutbox \tabu@arstrutbox \iftabu@colortbl\else\let\LT@@hline \tabu@LT@@hline \fi \tabu@trivlist % \let\@footnotetext \tabu@footnotetext \let\@xfootnotetext \tabu@xfootnotetext \let\@xfootnote \tabu@xfootnote \let\centering \tabu@centering \let\raggedright \tabu@raggedright \let\raggedleft \tabu@raggedleft \let\tabudecimal \tabu@tabudecimal \let\Centering \tabu@Centering \let\RaggedRight \tabu@RaggedRight \let\RaggedLeft \tabu@RaggedLeft \let\justifying \tabu@justifying \let\rowfont \tabu@rowfont \let\fbox \tabu@fbox \let\color@b@x \tabu@color@b@x \let\tabu@@everycr \everycr \let\tabu@@everypar \everypar \let\tabu@prepnext@tokORI \prepnext@tok\let\prepnext@tok \tabu@prepnext@tok \let\tabu@multicolumnORI\multicolumn \let\multicolumn \tabu@multicolumn \let\tabu@startpbox \@startpbox % for nested tabu inside longtabu pfff !!! \let\tabu@endpbox \@endpbox % idem " " " " " " " \let\tabu@tabarray \@tabarray % idem " " " " " " " \tabu@adl@fix \let\endarray \tabu@endarray % colortbl & arydshln (delarray) \iftabu@colortbl\CT@everycr\expandafter{\expandafter\iftabu@everyrow \the\CT@everycr \fi}\fi %%TABU-FIXED set up old version of array package \@classz to avoid recoding m (and X) here. (Partial fix only: may not cover all cases) \let\tabu@classzORI\@classz \let\@classz \tabu@classz %%TABU-FIXED set up \tabu@currentgrouptype \def\tabu@currentgrouptype{\currentgrouptype}% \ifx\color@begingroup\begingroup \def\color@begingroup{\expandafter\begingroup\expandafter\def\expandafter \tabu@currentgrouptype\expandafter{\the\currentgrouptype}}% \fi }% \tabu@init \def\tabu@indent{% correction for indentation \ifdim \parindent>\z@\ifx \linewidth\tabudefaulttarget \everypar\expandafter{% \the\everypar\everypar\expandafter{\the\everypar}% \setbox\z@=\lastbox \ifdim\wd\z@>\z@ \edef\tabu@thetarget {\the\dimexpr -\wd\z@+\tabudefaulttarget}\fi \box\z@}% \fi\fi }% \tabu@indent \def\tabu@setcleanup {% saves last global assignments \ifodd 1\ifmmode \else \iftabu@long \else 0\fi\fi\relax \def\tabu@aftergroupcleanup{% \def\tabu@aftergroupcleanup{\aftergroup\tabu@cleanup}}% \else \def\tabu@aftergroupcleanup{% \aftergroup\aftergroup\aftergroup\tabu@cleanup \let\tabu@aftergroupcleanup \relax}% \fi \let\tabu@arc@Gsave \tabu@arc@G \let\tabu@arc@G \tabu@arc@L % \let\tabu@drsc@Gsave \tabu@drsc@G \let\tabu@drsc@G \tabu@drsc@L % \let\tabu@ls@Gsave \tabu@ls@G \let\tabu@ls@G \tabu@ls@L % \let\tabu@rc@Gsave \tabu@rc@G \let\tabu@rc@G \tabu@rc@L % \let\tabu@evr@Gsave \tabu@evr@G \let\tabu@evr@G \tabu@evr@L % \let\tabu@celllalign@save \tabu@celllalign \let\tabu@cellralign@save \tabu@cellralign \let\tabu@cellleft@save \tabu@cellleft \let\tabu@cellright@save \tabu@cellright \let\tabu@@celllalign@save \tabu@@celllalign \let\tabu@@cellralign@save \tabu@@cellralign \let\tabu@@cellleft@save \tabu@@cellleft \let\tabu@@cellright@save \tabu@@cellright \let\tabu@rowfontreset@save \tabu@rowfontreset \let\tabu@@rowfontreset@save\tabu@@rowfontreset \let\tabu@rowfontreset \@empty \edef\tabu@alloc@save {\the\tabu@alloc}% restore at \tabu@reset \edef\c@taburow@save {\the\c@taburow}% \edef\tabu@naturalX@save {\the\tabu@naturalX}% \let\tabu@naturalXmin@save \tabu@naturalXmin \let\tabu@naturalXmax@save \tabu@naturalXmax \let\tabu@mkarstrut@save \tabu@mkarstrut \edef\tabu@clarstrut{% \extrarowheight \the\dimexpr \ht\@arstrutbox-\ht\strutbox \relax \extrarowdepth \the\dimexpr \dp\@arstrutbox-\dp\strutbox \relax \let\noexpand\@arraystretch \@ne \noexpand\tabu@rearstrut}% }% \tabu@setcleanup \def\tabu@cleanup {\begingroup \globaldefs\@ne \tabu@everyrowtrue \let\tabu@arc@G \tabu@arc@Gsave \let\CT@arc@ \tabu@arc@G \let\tabu@drsc@G \tabu@drsc@Gsave \let\CT@drsc@ \tabu@drsc@G \let\tabu@ls@G \tabu@ls@Gsave \let\tabu@ls@ \tabu@ls@G \let\tabu@rc@G \tabu@rc@Gsave \let\tabu@rc@ \tabu@rc@G \let\CT@do@color \relax \let\tabu@evr@G \tabu@evr@Gsave \let\tabu@celllalign \tabu@celllalign@save \let\tabu@cellralign \tabu@cellralign@save \let\tabu@cellleft \tabu@cellleft@save \let\tabu@cellright \tabu@cellright@save \let\tabu@@celllalign \tabu@@celllalign@save \let\tabu@@cellralign \tabu@@cellralign@save \let\tabu@@cellleft \tabu@@cellleft@save \let\tabu@@cellright \tabu@@cellright@save \let\tabu@rowfontreset \tabu@rowfontreset@save \let\tabu@@rowfontreset \tabu@@rowfontreset@save \tabu@naturalX =\tabu@naturalX@save \let\tabu@naturalXmax \tabu@naturalXmax@save \let\tabu@naturalXmin \tabu@naturalXmin@save \let\tabu@mkarstrut \tabu@mkarstrut@save \c@taburow =\c@taburow@save \ifcase \tabu@nested \tabu@alloc \m@ne\fi \endgroup % \ifcase \tabu@nested \the\tabu@footnotes \global\tabu@footnotes{}% \tabu@afterendpar \tabu@elapsedtime \fi \tabu@clarstrut \everyrow\expandafter {\tabu@evr@G}% }% \tabu@cleanup \let\tabu@afterendpar \relax \def\tabu@setreset {% \edef\tabu@savedparams {% \relax for \tabu@message@save \ifmmode \col@sep \the\arraycolsep \else \col@sep \the\tabcolsep \fi \relax \arrayrulewidth \the\arrayrulewidth \relax \doublerulesep \the\doublerulesep \relax \extratabsurround \the\extratabsurround \relax \extrarowheight \the\extrarowheight \relax \extrarowdepth \the\extrarowdepth \relax \abovetabulinesep \the\abovetabulinesep \relax \belowtabulinesep \the\belowtabulinesep \relax \def\noexpand\arraystretch{\arraystretch}% \ifdefined\minrowclearance \minrowclearance\the\minrowclearance\relax\fi}% \begingroup \@temptokena\expandafter{\tabu@savedparams}% => only for \savetabu / \usetabu \ifx \tabu@arc@L\relax \else \tabu@setsave \tabu@arc@L \fi \ifx \tabu@drsc@L\relax \else \tabu@setsave \tabu@drsc@L \fi \tabu@setsave \tabu@ls@L \tabu@setsave \tabu@evr@L \expandafter \endgroup \expandafter \def\expandafter\tabu@saved@ \expandafter{\the\@temptokena \let\tabu@arc@G \tabu@arc@L \let\tabu@drsc@G \tabu@drsc@L \let\tabu@ls@G \tabu@ls@L \let\tabu@rc@G \tabu@rc@L \let\tabu@evr@G \tabu@evr@L}% \def\tabu@reset{\tabu@savedparams \tabu@everyrowtrue \c@taburow \z@ \let\CT@arc@ \tabu@arc@L \let\CT@drsc@ \tabu@drsc@L \let\tabu@ls@ \tabu@ls@L \let\tabu@rc@ \tabu@rc@L \global\tabu@alloc \tabu@alloc@save \everyrow\expandafter{\tabu@evr@L}}% }% \tabu@reset \def\tabu@setsave #1{\expandafter\tabu@sets@ve #1\@nil{#1}} \long\def\tabu@sets@ve #1\@nil #2{\@temptokena\expandafter{\the\@temptokena \def#2{#1}}} %%TABU-FIXED define classz to use vcenter, reverting a change in array package \let\tabu@classzORI\@classz \def\tabu@classz{% \ifx\tabu@prepnext@tok\prepnext@tok% in tabu \expandafter\tabu@classz@oldarray \else \tabu@classzORI \fi}% \def\tabu@classz@oldarray{% \@classx \@tempcnta \count@ \prepnext@tok \@addtopreamble{\ifcase \@chnum \hfil \d@llarbegin \insert@column \d@llarend \hfil \or \hskip1sp\d@llarbegin \insert@column \d@llarend \hfil \or \hfil\hskip1sp\d@llarbegin \insert@column \d@llarend \or $\vcenter \@startpbox{\@nextchar}\insert@column \@endpbox $\or \vtop \@startpbox{\@nextchar}\insert@column \@endpbox \or \vbox \@startpbox{\@nextchar}\insert@column \@endpbox \fi}\prepnext@tok}% %% The Rewritting Process ------------------------------------------- \def\tabu@newcolumntype #1{% \expandafter\tabu@new@columntype \csname NC@find@\string#1\expandafter\endcsname \csname NC@rewrite@\string#1\endcsname {#1}% }% \tabu@newcolumntype \def\tabu@new@columntype #1#2#3{% \def#1##1#3{\NC@{##1}}% \let#2\relax \newcommand*#2% }% \tabu@new@columntype \def\tabu@privatecolumntype #1{% \expandafter\tabu@private@columntype \csname NC@find@\string#1\expandafter\endcsname \csname NC@rewrite@\string#1\expandafter\endcsname \csname tabu@NC@find@\string#1\expandafter\endcsname \csname tabu@NC@rewrite@\string#1\endcsname {#1}% }% \tabu@privatecolumntype \def\tabu@private@columntype#1#2#3#4{% \g@addto@macro\tabu@privatecolumns{\let#1#3\let#2#4}% \tabu@new@columntype#3#4% }% \tabu@private@columntype \let\tabu@privatecolumns \@empty \newcommand*\tabucolumn [1]{\expandafter \def \expandafter \tabu@highprioritycolumns\expandafter{\tabu@highprioritycolumns \NC@do #1}}% \let\tabu@highprioritycolumns \@empty %% The | ``column'' : rewriting process -------------------------- \tabu@privatecolumntype |{\tabu@rewritevline} \newcommand*\tabu@rewritevline[1][]{\tabu@vlinearg{#1}% \expandafter \NC@find \tabu@rewritten} \def\tabu@lines #1{% \ifx|#1\else \tabu@privatecolumntype #1{\tabu@rewritevline}\fi \NC@list\expandafter{\the\NC@list \NC@do #1}% }% \tabu@lines@ \def\tabu@vlinearg #1{% \ifx\\#1\\\def\tabu@thestyle {\tabu@ls@}% \else\tabu@getline {#1}% \fi \def\tabu@rewritten ##1{\def\tabu@rewritten{!{##1\tabu@thevline}}% }\expandafter\tabu@rewritten\expandafter{\tabu@thestyle}% \expandafter \tabu@keepls \tabu@thestyle \@nil }% \tabu@vlinearg \def\tabu@keepls #1\@nil{% \ifcat $\@cdr #1\@nil $% \ifx \relax#1\else \ifx \tabu@ls@#1\else \let#1\relax \xdef\tabu@mkpreambuffer{\tabu@mkpreambuffer \tabu@savels\noexpand#1}\fi\fi\fi }% \tabu@keepls \def\tabu@thevline {\begingroup \ifdefined\tabu@leaders \setbox\@tempboxa=\vtop to\dimexpr \ht\@arstrutbox+\dp\@arstrutbox{{\tabu@thevleaders}}% \ht\@tempboxa=\ht\@arstrutbox \dp\@tempboxa=\dp\@arstrutbox \box\@tempboxa \else \tabu@thevrule \fi \endgroup }% \tabu@thevline \def\tabu@savels #1{% \expandafter\let\csname\string#1\endcsname #1% \expandafter\def\expandafter\tabu@reset\expandafter{\tabu@reset \tabu@resetls#1}}% \def\tabu@resetls #1{\expandafter\let\expandafter#1\csname\string#1\endcsname}% %% \multicolumn inside tabu environment ----------------------------- \tabu@newcolumntype \tabu@rewritemulticolumn{% \aftergroup \tabu@endrewritemulticolumn % after \@mkpream group \NC@list{\NC@do *}\tabu@textbar \tabu@lines \tabu@savedecl \tabu@privatecolumns \NC@list\expandafter{\the\expandafter\NC@list \tabu@NC@list}% \let\tabu@savels \relax \NC@find }% \tabu@rewritemulticolumn \def\tabu@endrewritemulticolumn{\gdef\tabu@mkpreambuffer{}\endgroup} \def\tabu@multicolumn{\tabu@ifenvir \tabu@multic@lumn \tabu@multicolumnORI} \long\def\tabu@multic@lumn #1#2#3{\multispan{#1}\begingroup \tabu@everyrowtrue \NC@list{\NC@do \tabu@rewritemulticolumn}% \expandafter\@gobbletwo % gobbles \multispan{#1} \tabu@multicolumnORI{#1}{\tabu@rewritemulticolumn #2}% {\iftabuscantokens \tabu@rescan \else \expandafter\@firstofone \fi {#3}}% }% \tabu@multic@lumn %% The X column(s): rewriting process ----------------------------- \tabu@privatecolumntype X[1][]{\begingroup \tabu@siunitx{\endgroup \tabu@rewriteX {#1}}} \def\tabu@nosiunitx #1{#1{}{}\expandafter \NC@find \tabu@rewritten } \def\tabu@siunitx #1{\@ifnextchar \bgroup {\tabu@rewriteX@Ss{#1}} {\tabu@nosiunitx{#1}}} \def\tabu@rewriteX@Ss #1#2{\@temptokena{}% \@defaultunits \let\tabu@temp =#2\relax\@nnil \ifodd 1\ifx S\tabu@temp \else \ifx s\tabu@temp \else 0 \fi\fi \def\NC@find{\def\NC@find >####1####2<####3\relax{#1 {####1}{####3}% }\expandafter\NC@find \the\@temptokena \relax }\expandafter\NC@rewrite@S \@gobble #2\relax \else \tabu@siunitxerror \fi \expandafter \NC@find \tabu@rewritten }% \tabu@rewriteX@Ss \def\tabu@siunitxerror {\PackageError{tabu}{Not a S nor s column ! \MessageBreak X column can only embed siunitx S or s columns}\@ehd }% \tabu@siunitxerror \def\tabu@rewriteX #1#2#3{\tabu@Xarg {#1}{#2}{#3}% \iftabu@measuring \else \tabu@measuringtrue % first X column found in the preamble \let\@halignto \relax \let\tabu@halignto \relax \iftabu@spread \tabu@spreadtarget \tabu@target \tabu@target \z@ \else \tabu@spreadtarget \z@ \fi \ifdim \tabu@target=\z@ \setlength\tabu@target \tabu@thetarget \tabu@message{\tabu@message@defaulttarget}% \else \tabu@message{\tabu@message@target}\fi \fi }% \tabu@rewriteX \def\tabu@rewriteXrestore #1#2#3{\let\@halignto \relax \def\tabu@rewritten{l}} \def\tabu@Xarg #1#2#3{% \advance\tabu@Xcol \@ne \let\tabu@Xlcr \@empty \let\tabu@Xdisp \@empty \let\tabu@Xmath \@empty \ifx\\#1\\% \def\tabu@rewritten{p}\tabucolX \p@ % \else \let\tabu@rewritten \@empty \let\tabu@temp \@empty \tabucolX \z@ \tabu@Xparse {}#1\relax \fi \tabu@Xrewritten{#2}{#3}% }% \tabu@Xarg \def\tabu@Xparse #1{\futurelet\@let@token \tabu@Xtest} \expandafter\def\expandafter\tabu@Xparsespace\space{\tabu@Xparse{}} \def\tabu@Xtest{% \ifcase \ifx \relax\@let@token \z@ \else \if ,\@let@token \m@ne\else \if p\@let@token 1\else \if m\@let@token 2\else \if b\@let@token 3\else \if l\@let@token 4\else \if c\@let@token 5\else \if r\@let@token 6\else \if j\@let@token 7\else \if L\@let@token 8\else \if C\@let@token 9\else \if R\@let@token 10\else \if J\@let@token 11\else \ifx \@sptoken\@let@token 12\else \if .\@let@token 13\else \if -\@let@token 13\else \ifcat $\@let@token 14\else 15\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\relax \or \tabu@Xtype {p}% \or \tabu@Xtype {m}% \or \tabu@Xtype {b}% \or \tabu@Xalign \raggedright\relax \or \tabu@Xalign \centering\relax \or \tabu@Xalign \raggedleft\relax \or \tabu@Xalign \tabu@justify\relax \or \tabu@Xalign \RaggedRight\raggedright \or \tabu@Xalign \Centering\centering \or \tabu@Xalign \RaggedLeft\raggedleft \or \tabu@Xalign \justifying\tabu@justify \or \expandafter \tabu@Xparsespace \or \expandafter \tabu@Xcoef \or \expandafter \tabu@Xm@th \or \tabu@Xcoef{}% \else\expandafter \tabu@Xparse \fi }% \tabu@Xtest \def\tabu@Xalign #1#2{% \ifx \tabu@Xlcr\@empty \else \PackageWarning{tabu} {Duplicate horizontal alignment specification}\fi \ifdefined#1\def\tabu@Xlcr{#1}\let#1\relax \else \def\tabu@Xlcr{#2}\let#2\relax\fi \expandafter\tabu@Xparse }% \tabu@Xalign \def\tabu@Xtype #1{% \ifx \tabu@rewritten\@empty \else \PackageWarning{tabu} {Duplicate vertical alignment specification}\fi \def\tabu@rewritten{#1}\expandafter\tabu@Xparse }% \tabu@Xtype \def\tabu@Xcoef#1{\edef\tabu@temp{\tabu@temp#1}% \afterassignment\tabu@Xc@ef \tabu@cnt\number\if-#10\fi }% \tabu@Xcoef \def\tabu@Xc@ef{\advance\tabucolX \tabu@temp\the\tabu@cnt\p@ \tabu@Xparse{}% }% \tabu@Xc@ef \def\tabu@Xm@th #1{\futurelet \@let@token \tabu@Xd@sp} \def\tabu@Xd@sp{\let\tabu@Xmath=$% \ifx $\@let@token \def\tabu@Xdisp{\displaystyle}% \expandafter\tabu@Xparse \else \expandafter\tabu@Xparse\expandafter{\expandafter}% \fi }% \tabu@Xd@sp \def\tabu@Xrewritten {% \ifx \tabu@rewritten\@empty \def\tabu@rewritten{p}\fi \ifdim \tabucolX<\z@ \tabu@negcoeftrue \else\ifdim \tabucolX=\z@ \tabucolX \p@ \fi\fi \edef\tabu@temp{{\the\tabu@Xcol}{\tabu@strippt\tabucolX}}% \edef\tabu@Xcoefs{\tabu@Xcoefs \tabu@ \tabu@temp}% \edef\tabu@rewritten ##1##2{\def\noexpand\tabu@rewritten{% >{\tabu@Xlcr \ifx$\tabu@Xmath$\tabu@Xdisp\fi ##1}% \tabu@rewritten {\tabu@hsize \tabu@temp}% <{##2\ifx$\tabu@Xmath$\fi}}% }\tabu@rewritten }% \tabu@Xrewritten \def\tabu@hsize #1#2{% \ifdim #2\p@<\z@ \ifdim \tabucolX=\maxdimen \tabu@wd{#1}\else \ifdim \tabu@wd{#1}<-#2\tabucolX \tabu@wd{#1}\else -#2\tabucolX\fi \fi \else #2\tabucolX \fi }% \tabu@hsize %% \usetabu and \preamble: rewritting process --------------------- \tabu@privatecolumntype \usetabu [1]{% \ifx\\#1\\\tabu@saveerr{}\else \@ifundefined{tabu@saved@\string#1} {\tabu@saveerr{#1}} {\let\tabu@rewriteX \tabu@rewriteXrestore \csname tabu@saved@\string#1\expandafter\endcsname\expandafter\@ne}% \fi }% \NC@rewrite@\usetabu \tabu@privatecolumntype \preamble [1]{% \ifx\\#1\\\tabu@saveerr{}\else \@ifundefined{tabu@saved@\string#1} {\tabu@saveerr{#1}} {\csname tabu@saved@\string#1\expandafter\endcsname\expandafter\z@}% \fi }% \NC@rewrite@\preamble %% Controlling the rewritting process ------------------------------- \tabu@newcolumntype \tabu@rewritefirst{% \iftabu@long \aftergroup \tabu@longpream % \else \aftergroup \tabu@pream \fi \let\tabu@ \relax \let\tabu@hsize \relax \let\tabu@Xcoefs \@empty \let\tabu@savels \relax \tabu@Xcol \z@ \tabu@cnt \tw@ \gdef\tabu@mkpreambuffer{\tabu@{}}\tabu@measuringfalse \global\setbox\@arstrutbox \box\@arstrutbox \NC@list{\NC@do *}\tabu@textbar \tabu@lines \NC@list\expandafter{\the\NC@list \NC@do X}% \iftabu@siunitx % \NC@list\expandafter{\the\NC@list \NC@do S\NC@do s}\fi \NC@list\expandafter{\the\expandafter\NC@list \tabu@highprioritycolumns}% \expandafter\def\expandafter\tabu@NC@list\expandafter{% \the\expandafter\NC@list \tabu@NC@list}% % * | X S \NC@list\expandafter{\expandafter \NC@do \expandafter\usetabu \expandafter \NC@do \expandafter\preamble \the\NC@list \NC@do \tabu@rewritemiddle \NC@do \tabu@rewritelast}% \tabu@savedecl \tabu@privatecolumns \edef\tabu@prev{\the\@temptokena}\NC@find \tabu@rewritemiddle }% NC@rewrite@\tabu@rewritefirst \tabu@newcolumntype \tabu@rewritemiddle{% \edef\tabu@temp{\the\@temptokena}\NC@find \tabu@rewritelast }% \NC@rewrite@\tabu@rewritemiddle \tabu@newcolumntype \tabu@rewritelast{% \ifx \tabu@temp\tabu@prev \advance\tabu@cnt \m@ne \NC@list\expandafter{\tabu@NC@list \NC@do \tabu@rewritemiddle \NC@do \tabu@rewritelast}% \else \let\tabu@prev\tabu@temp \fi \ifcase \tabu@cnt \expandafter\tabu@endrewrite \else \expandafter\NC@find \expandafter\tabu@rewritemiddle \fi }% \NC@rewrite@\tabu@rewritelast %% Choosing the strategy -------------------------------------------- \def\tabu@endrewrite {% \let\tabu@temp \NC@find \ifx \@arrayright\relax \let\@arrayright \@empty \fi \count@=% \ifx \@finalstrut\tabu@finalstrut \z@ % outer in mode 0 print \iftabu@measuring \xdef\tabu@mkpreambuffer{\tabu@mkpreambuffer \tabu@target \csname tabu@\the\tabu@nested.T\endcsname \tabucolX \csname tabu@\the\tabu@nested.X\endcsname \edef\@halignto {\ifx\@arrayright\@empty to\tabu@target\fi}}% \fi \else\iftabu@measuring 4 % X columns \xdef\tabu@mkpreambuffer{\tabu@{\tabu@mkpreambuffer \tabu@target \the\tabu@target \tabu@spreadtarget \the\tabu@spreadtarget}% \def\noexpand\tabu@Xcoefs{\tabu@Xcoefs}% \edef\tabu@halignto{\ifx \@arrayright\@empty to\tabu@target\fi}}% \let\tabu@Xcoefs \relax \else\ifcase\tabu@nested \thr@@ % outer, no X \global\let\tabu@afterendpar \relax \else \@ne % inner, no X, outer in mode 1 or 2 \fi \ifdefined\tabu@usetabu \else \ifdim\tabu@target=\z@ \else \let\tabu@temp \tabu@extracolsep \fi\fi \fi \fi \xdef\tabu@mkpreambuffer{\count@ \the\count@ \tabu@mkpreambuffer}% \tabu@temp }% \tabu@endrewrite \def\tabu@extracolsep{\@defaultunits \expandafter\let \expandafter\tabu@temp \expandafter=\the\@temptokena \relax\@nnil \ifx \tabu@temp\@sptoken \expandafter\tabu@gobblespace \expandafter\tabu@extracolsep \else \edef\tabu@temp{\noexpand\NC@find \if |\noexpand\tabu@temp @% \else\if !\noexpand\tabu@temp @% \else !% \fi\fi {\noexpand\extracolsep\noexpand\@flushglue}}% \fi \tabu@temp }% \tabu@extrac@lsep %% Implementing the strategy ---------------------------------------- \long\def\tabu@pream #1\@preamble {% \let\tabu@ \tabu@@ \tabu@mkpreambuffer \tabu@aftergroupcleanup \NC@list\expandafter {\tabu@NC@list}% in case of nesting... \ifdefined\tabu@usetabu \tabu@usetabu \tabu@target \z@ \fi \let\tabu@savedpreamble \@preamble \global\let\tabu@elapsedtime \relax \tabu@thebody ={#1\tabu@aftergroupcleanup}% \tabu@thebody =\expandafter{\the\expandafter\tabu@thebody \@preamble}% \edef\tabuthepreamble {\the\tabu@thebody}% ( no @ allowed for \scantokens ) \tabu@select }% \tabu@pream \long\def\tabu@longpream #1\LT@bchunk #2\LT@bchunk{% \let\tabu@ \tabu@@ \tabu@mkpreambuffer \tabu@aftergroupcleanup \NC@list\expandafter {\tabu@NC@list}% in case of nesting... \let\tabu@savedpreamble \@preamble \global\let\tabu@elapsedtime \relax \tabu@thebody ={#1\LT@bchunk #2\tabu@aftergroupcleanup \LT@bchunk}% \edef\tabuthepreamble {\the\tabu@thebody}% ( no @ allowed for \scantokens ) \tabu@select }% \tabu@longpream \def\tabu@select {% \ifnum\tabu@nested>\z@ \tabuscantokensfalse \fi \ifnum \count@=\@ne \iftabu@measuring \count@=\tw@ \fi\fi \ifcase \count@ \global\let\tabu@elapsedtime \relax \tabu@seteverycr \expandafter \tabuthepreamble % vertical adjustment (inheritated from outer) \or % exit in vertical measure + struts per cell because no X and outer in mode 3 \tabu@evr{\tabu@verticalinit}\tabu@celllalign@def{\tabu@verticalmeasure}% \def\tabu@cellralign{\tabu@verticalspacing}% \tabu@seteverycr \expandafter \tabuthepreamble \or % exit without measure because no X and outer in mode 4 \tabu@evr{}\tabu@celllalign@def{}\let\tabu@cellralign \@empty \tabu@seteverycr \expandafter \tabuthepreamble \else % needs trials \tabu@evr{}\tabu@celllalign@def{}\let\tabu@cellralign \@empty \tabu@savecounters \expandafter \tabu@setstrategy \fi }% \tabu@select \def\tabu@@ {\gdef\tabu@mkpreambuffer} %% Protections to set up before trials ------------------------------ \def\tabu@setstrategy {\begingroup % \tabu@trialh@@k \tabu@cnt \z@ % number of trials \hbadness \@M \let\hbadness \@tempcnta \hfuzz \maxdimen \let\hfuzz \@tempdima \let\write \tabu@nowrite\let\GenericError \tabu@GenericError \let\savetabu \@gobble \let\tabudefaulttarget \linewidth \let\@footnotetext \@gobble \let\@xfootnote \tabu@xfootnote \let\color \tabu@nocolor\let\rowcolor \tabu@norowcolor \let\tabu@aftergroupcleanup \relax % only after the last trial \tabu@mkpreambuffer \ifnum \count@>\thr@@ \let\@halignto \@empty \tabucolX@init \def\tabu@lasttry{\m@ne\p@}\fi \begingroup \iffalse{\fi \ifnum0=`}\fi \toks@{}\def\tabu@stack{b}\iftabuscantokens \endlinechar=10 \obeyspaces \fi % \tabu@collectbody \tabu@strategy % }% \tabu@setstrategy \def\tabu@savecounters{% \def\@elt ##1{\csname c@##1\endcsname\the\csname c@##1\endcsname}% \edef\tabu@clckpt {\begingroup \globaldefs=\@ne \cl@@ckpt \endgroup}\let\@elt \relax }% \tabu@savecounters \def\tabucolX@init {% \tabucolX <= \tabu@target / (sum coefs > 0) \dimen@ \z@ \tabu@Xsum \z@ \tabucolX \z@ \let\tabu@ \tabu@Xinit \tabu@Xcoefs \ifdim \dimen@>\z@ \@tempdima \dimexpr \tabu@target *\p@/\dimen@ + \tabu@hfuzz\relax \ifdim \tabucolX<\@tempdima \tabucolX \@tempdima \fi \fi }% \tabucolX@init \def\tabu@Xinit #1#2{\tabu@Xcol #1 \advance \tabu@Xsum \ifdim #2\p@>\z@ #2\p@ \advance\dimen@ #2\p@ \else -#2\p@ \tabu@negcoeftrue \@tempdima \dimexpr \tabu@target*\p@/\dimexpr-#2\p@\relax \relax \ifdim \tabucolX<\@tempdima \tabucolX \@tempdima \fi \tabu@wddef{#1}{0pt}% \fi }% \tabu@Xinit %% Collecting the environment body ---------------------------------- \long\def\tabu@collectbody #1#2\end #3{% \edef\tabu@stack{\tabu@pushbegins #2\begin\end\expandafter\@gobble\tabu@stack}% \ifx \tabu@stack\@empty \toks@\expandafter{\expandafter\tabu@thebody\expandafter{\the\toks@ #2}% \def\tabu@end@envir{\end{#3}}% \iftabuscantokens \iftabu@long \def\tabu@endenvir {\end{#3}\tabu@gobbleX}% \else \def\tabu@endenvir {\let\endarray \@empty \end{#3}\tabu@gobbleX}% \fi \else \def\tabu@endenvir {\end{#3}}\fi}% \let\tabu@collectbody \tabu@endofcollect \else\def\tabu@temp{#3}% \ifx \tabu@temp\@empty \toks@\expandafter{\the\toks@ #2\end }% \else \ifx\tabu@temp\tabu@@spxiii \toks@\expandafter{\the\toks@ #2\end #3}% \else \ifx\tabu@temp\tabu@X \toks@\expandafter{\the\toks@ #2\end #3}% \else \toks@\expandafter{\the\toks@ #2\end{#3}}% \fi\fi\fi \fi \tabu@collectbody{#1}% }% \tabu@collectbody \long\def\tabu@pushbegins#1\begin#2{\ifx\end#2\else b\expandafter\tabu@pushbegins\fi}% \def\tabu@endofcollect #1{\ifnum0=`{}\fi \expandafter\endgroup \the\toks@ #1% }% \tabu@endofcollect %% The trials: switching between strategies ------------------------- \def\tabu@strategy {\relax % stops \count@ assignment ! \ifcase\count@ % case 0 = print with vertical adjustment (outer is finished) \expandafter \tabu@endoftrials \or % case 1 = exit in vertical measure (outer in mode 3) \expandafter\xdef\csname tabu@\the\tabu@nested.T\endcsname{\the\tabu@target}% \expandafter\xdef\csname tabu@\the\tabu@nested.X\endcsname{\the\tabucolX}% \expandafter \tabu@endoftrials \or % case 2 = exit with a rule replacing the table (outer in mode 4) \expandafter \tabu@quickend \or % case 3 = outer is in mode 3 because of no X \begingroup \tabu@evr{\tabu@verticalinit}\tabu@celllalign@def{\tabu@verticalmeasure}% \def\tabu@cellralign{\tabu@verticalspacing}% \expandafter \tabu@measuring \else % case 4 = horizontal measure \begingroup \global\let\tabu@elapsedtime \tabu@message@etime \long\def\multicolumn##1##2##3{\multispan{##1}}% \let\tabu@startpboxORI \@startpbox \iftabu@spread \def\tabu@naturalXmax {\z@}% \let\tabu@naturalXmin \tabu@naturalXmax \tabu@evr{\global\tabu@naturalX \z@}% \let\@startpbox \tabu@startpboxmeasure \else\iftabu@negcoef \let\@startpbox \tabu@startpboxmeasure \else \let\@startpbox \tabu@startpboxquick \fi\fi \expandafter \tabu@measuring \fi }% \tabu@strategy \def\tabu@measuring{\expandafter \tabu@trial \expandafter \count@ \the\count@ \tabu@endtrial }% \tabu@measuring \def\tabu@trial{\iftabu@long \tabu@longtrial \else \tabu@shorttrial \fi} \def\tabu@shorttrial {\setbox\tabu@box \hbox\bgroup \tabu@seteverycr \ifx \tabu@savecounters\relax \else \let\tabu@savecounters \relax \tabu@clckpt \fi $\iftabuscantokens \tabu@rescan \else \expandafter\@secondoftwo \fi \expandafter{\expandafter \tabuthepreamble \the\tabu@thebody \csname tabu@adl@endtrial\endcsname \endarray}$\egroup % got \tabu@box }% \tabu@shorttrial \def\tabu@longtrial {\setbox\tabu@box \hbox\bgroup \tabu@seteverycr \ifx \tabu@savecounters\relax \else \let\tabu@savecounters \relax \tabu@clckpt \fi \iftabuscantokens \tabu@rescan \else \expandafter\@secondoftwo \fi \expandafter{\expandafter \tabuthepreamble \the\tabu@thebody \tabuendlongtrial}\egroup % got \tabu@box }% \tabu@longtrial \def\tabuendlongtrial{% no @ allowed for \scantokens \LT@echunk \global\setbox\@ne \hbox{\unhbox\@ne}\kern\wd\@ne \LT@get@widths }% \tabuendlongtrial \def\tabu@adl@endtrial{% \crcr \noalign{\global\adl@ncol \tabu@nbcols}}% anything global is crap, junky and fails ! \def\tabu@seteverycr {\tabu@reset \everycr \expandafter{\the\everycr \tabu@everycr}% \let\everycr \tabu@noeverycr % }% \tabu@seteverycr \def\tabu@noeverycr{{\aftergroup\tabu@restoreeverycr \afterassignment}\toks@} \def\tabu@restoreeverycr {\let\everycr \tabu@@everycr} \def\tabu@everycr {\iftabu@everyrow \noalign{\tabu@everyrow}\fi} \def\tabu@endoftrials {% \iftabuscantokens \expandafter\@firstoftwo \else \expandafter\@secondoftwo \fi {\expandafter \tabu@closetrialsgroup \expandafter \tabu@rescan \expandafter{% \expandafter\tabuthepreamble \the\expandafter\tabu@thebody \iftabu@long \else \endarray \fi}} {\expandafter\tabu@closetrialsgroup \expandafter \tabuthepreamble \the\tabu@thebody}% \tabu@endenvir % Finish ! }% \tabu@endoftrials \def\tabu@closetrialsgroup {% \toks@\expandafter{\tabu@endenvir}% \edef\tabu@bufferX{\endgroup \tabucolX \the\tabucolX \tabu@target \the\tabu@target \tabu@cnt \the\tabu@cnt \def\noexpand\tabu@endenvir{\the\toks@}% %Quid de \@halignto = \tabu@halignto ?? }% \tabu@bufferX \tabu@bufferX \ifcase\tabu@nested % print out (outer in mode 0) \global\tabu@cnt \tabu@cnt \tabu@evr{\tabu@verticaldynamicadjustment}% \tabu@celllalign@def{\everypar{}}\let\tabu@cellralign \@empty \let\@finalstrut \tabu@finalstrut \else % vertical measure of nested tabu \tabu@evr{\tabu@verticalinit}% \tabu@celllalign@def{\tabu@verticalmeasure}% \def\tabu@cellralign{\tabu@verticalspacing}% \fi \tabu@clckpt \let\@halignto \tabu@halignto \let\@halignto \@empty \tabu@seteverycr \ifdim \tabustrutrule>\z@ \ifnum\tabu@nested=\z@ \setbox\@arstrutbox \box\voidb@x % force \@arstrutbox to be rebuilt (visible struts) \fi\fi }% \tabu@closetrialsgroup \def\tabu@quickend {\expandafter \endgroup \expandafter \tabu@target \the\tabu@target \tabu@quickrule \let\endarray \relax \tabu@endenvir }% \tabu@quickend \def\tabu@endtrial {\relax % stops \count@ assignment ! \ifcase \count@ \tabu@err % case 0 = impossible here \or \tabu@err % case 1 = impossible here \or \tabu@err % case 2 = impossible here \or % case 3 = outer goes into mode 0 \def\tabu@bufferX{\endgroup}\count@ \z@ \else % case 4 = outer goes into mode 3 \iftabu@spread \tabu@spreadarith % inner into mode 1 (outer in mode 3) \else \tabu@arith % or 2 (outer in mode 4) \fi \count@=% \ifcase\tabu@nested \thr@@ % outer goes into mode 3 \else\iftabu@measuring \tw@ % outer is in mode 4 \else \@ne % outer is in mode 3 \fi\fi \edef\tabu@bufferX{\endgroup \tabucolX \the\tabucolX \tabu@target \the\tabu@target}% \fi \expandafter \tabu@bufferX \expandafter \count@ \the\count@ \tabu@strategy }% \tabu@endtrial \def\tabu@err{\errmessage{(tabu) Internal impossible error! (\count@=\the\count@)}} %% The algorithms: compute the widths / stop or go on --------------- \def\tabu@arithnegcoef {% \@tempdima \z@ \dimen@ \z@ \let\tabu@ \tabu@arith@negcoef \tabu@Xcoefs }% \tabu@arithnegcoef \def\tabu@arith@negcoef #1#2{% \ifdim #2\p@>\z@ \advance\dimen@ #2\p@ % saturated by definition \advance\@tempdima #2\tabucolX \else \ifdim -#2\tabucolX <\tabu@wd{#1}% c_i X < natural width <= \tabu@target-> saturated \advance\dimen@ -#2\p@ \advance\@tempdima -#2\tabucolX \else \advance\@tempdima \tabu@wd{#1}% natural width <= c_i X => neutralised \ifdim \tabu@wd{#1}<\tabu@target \else % neutralised \advance\dimen@ -#2\p@ % saturated (natural width = tabu@target) \fi \fi \fi }% \tabu@arith@negcoef \def\tabu@givespace #1#2{% here \tabu@DELTA < \z@ \ifdim \@tempdima=\z@ \tabu@wddef{#1}{\the\dimexpr -\tabu@DELTA*\p@/\tabu@Xsum}% \else \tabu@wddef{#1}{\the\dimexpr \tabu@hsize{#1}{#2} *(\p@ -\tabu@DELTA*\p@/\@tempdima)/\p@\relax}% \fi }% \tabu@givespace \def\tabu@arith {\advance\tabu@cnt \@ne \ifnum \tabu@cnt=\@ne \tabu@message{\tabu@titles}\fi \tabu@arithnegcoef \@tempdimb \dimexpr \wd\tabu@box -\@tempdima \relax % \tabu@DELTA = \dimexpr \wd\tabu@box - \tabu@target \relax \tabu@message{\tabu@message@arith}% \ifdim \tabu@DELTA <\tabu@hfuzz \ifdim \tabu@DELTA<\z@ % wd (tabu)<\tabu@target ? \let\tabu@ \tabu@givespace \tabu@Xcoefs \advance\@tempdima \@tempdimb \advance\@tempdima -\tabu@DELTA % for message \else % already converged: nothing to do but nearly impossible... \fi \tabucolX \maxdimen \tabu@measuringfalse \else % need for narrower X columns \tabucolX =\dimexpr (\@tempdima -\tabu@DELTA) *\p@/\tabu@Xsum \relax \tabu@measuringtrue \@whilesw \iftabu@measuring\fi {% \advance\tabu@cnt \@ne \tabu@arithnegcoef \tabu@DELTA =\dimexpr \@tempdima+\@tempdimb -\tabu@target \relax % always < 0 here \tabu@message{\tabu@header \tabu@msgalign \tabucolX { }{ }{ }{ }{ }\@@ \tabu@msgalign \@tempdima+\@tempdimb { }{ }{ }{ }{ }\@@ \tabu@msgalign \tabu@target { }{ }{ }{ }{ }\@@ \tabu@msgalign@PT \dimen@ { }{}{}{}{}{}{}\@@ \ifdim -\tabu@DELTA<\tabu@hfuzz \tabu@spaces target ok\else \tabu@msgalign \dimexpr -\tabu@DELTA *\p@/\dimen@ {}{}{}{}{}\@@ \fi}% \ifdim -\tabu@DELTA<\tabu@hfuzz \advance\@tempdima \@tempdimb % for message \tabu@measuringfalse \else \advance\tabucolX \dimexpr -\tabu@DELTA *\p@/\dimen@ \relax \fi }% \fi \tabu@message{\tabu@message@reached}% \edef\tabu@bufferX{\endgroup \tabu@cnt \the\tabu@cnt \tabucolX \the\tabucolX \tabu@target \the\tabu@target}% }% \tabu@arith \def\tabu@spreadarith {% \dimen@ \z@ \@tempdima \tabu@naturalXmax \let\tabu@ \tabu@spread@arith \tabu@Xcoefs \edef\tabu@naturalXmin {\the\dimexpr\tabu@naturalXmin*\dimen@/\p@}% \@tempdimc =\dimexpr \wd\tabu@box -\tabu@naturalXmax+\tabu@naturalXmin \relax \iftabu@measuring \tabu@target =\dimexpr \@tempdimc+\tabu@spreadtarget \relax \edef\tabu@bufferX{\endgroup \tabucolX \the\tabucolX \tabu@target\the\tabu@target}% \else \tabu@message{\tabu@message@spreadarith}% \ifdim \dimexpr \@tempdimc+\tabu@spreadtarget >\tabu@target \tabu@message{(tabu) spread \ifdim \@tempdimc>\tabu@target useless here: default target used% \else too large: reduced to fit default target\fi.}% \else \tabu@target =\dimexpr \@tempdimc+\tabu@spreadtarget \relax \tabu@message{(tabu) spread: New target set to \the\tabu@target^^J}% \fi \begingroup \let\tabu@wddef \@gobbletwo \@tempdimb \@tempdima \tabucolX@init \tabu@arithnegcoef \wd\tabu@box =\dimexpr \wd\tabu@box +\@tempdima-\@tempdimb \relax \expandafter\endgroup \expandafter\tabucolX \the\tabucolX \tabu@arith \fi }% \tabu@spreadarith \def\tabu@spread@arith #1#2{% \ifdim #2\p@>\z@ \advance\dimen@ #2\p@ \else \advance\@tempdima \tabu@wd{#1}\relax \fi }% \tabu@spread@arith %% Reporting in the .log file --------------------------------------- \def\tabu@message@defaulttarget{% \ifnum\tabu@nested=\z@^^J(tabu) Default target: \ifx\tabudefaulttarget\linewidth \string\linewidth \ifdim \tabu@thetarget=\linewidth \else -\the\dimexpr\linewidth-\tabu@thetarget\fi = \else\ifx\tabudefaulttarget\linegoal\string\linegoal= \fi\fi \else (tabu) Default target (nested): \fi \the\tabu@target \on@line \ifnum\tabu@nested=\z@ , page \the\c@page\fi} \def\tabu@message@target {^^J(tabu) Target specified: \the\tabu@target \on@line, page \the\c@page} \def\tabu@message@arith {\tabu@header \tabu@msgalign \tabucolX { }{ }{ }{ }{ }\@@ \tabu@msgalign \wd\tabu@box { }{ }{ }{ }{ }\@@ \tabu@msgalign \tabu@target { }{ }{ }{ }{ }\@@ \tabu@msgalign@PT \dimen@ { }{}{}{}{}{}{}\@@ \ifdim \tabu@DELTA<\tabu@hfuzz giving space\else \tabu@msgalign \dimexpr (\@tempdima-\tabu@DELTA) *\p@/\tabu@Xsum -\tabucolX {}{}{}{}{}\@@ \fi }% \tabu@message@arith \def\tabu@message@spreadarith {\tabu@spreadheader \tabu@msgalign \tabu@spreadtarget { }{ }{ }{ }{}\@@ \tabu@msgalign \wd\tabu@box { }{ }{ }{ }{}\@@ \tabu@msgalign -\tabu@naturalXmax { }{}{}{}{}\@@ \tabu@msgalign \tabu@naturalXmin { }{ }{ }{ }{}\@@ \tabu@msgalign \ifdim \dimexpr\@tempdimc>\tabu@target \tabu@target \else \@tempdimc+\tabu@spreadtarget \fi {}{}{}{}{}\@@} \def\tabu@message@negcoef #1#2{ \tabu@spaces\tabu@spaces\space * #1. X[\rem@pt#2]: \space width = \tabu@wd {#1} \expandafter\string\csname tabu@\the\tabu@nested.W\number#1\endcsname \ifdim -\tabu@pt#2\tabucolX<\tabu@target < \number-\rem@pt#2 X = \the\dimexpr -\tabu@pt#2\tabucolX \relax \else <= \the\tabu@target\space < \number-\rem@pt#2 X\fi} \def\tabu@message@reached{\tabu@header ******* Reached Target: hfuzz = \tabu@hfuzz\on@line\space *******} \def\tabu@message@etime{\edef\tabu@stoptime{\the\pdfelapsedtime}% \tabu@message{(tabu)\tabu@spaces Time elapsed during measure: \the\numexpr(\tabu@stoptime-\tabu@starttime-32767)/65536\relax sec \the\numexpr\numexpr(\tabu@stoptime-\tabu@starttime) -\numexpr(\tabu@stoptime-\tabu@starttime-32767)/65536\relax*65536\relax *1000/65536\relax ms \tabu@spaces(\the\tabu@cnt\space cycle\ifnum\tabu@cnt>\@ne s\fi)^^J^^J}} \def\tabu@message@verticalsp {% \ifdim \@tempdima>\tabu@ht \ifdim \@tempdimb>\tabu@dp \expandafter\expandafter\expandafter\string\tabu@ht = \tabu@msgalign \@tempdima { }{ }{ }{ }{ }\@@ \expandafter\expandafter\expandafter\string\tabu@dp = \tabu@msgalign \@tempdimb { }{ }{ }{ }{ }\@@^^J% \else \expandafter\expandafter\expandafter\string\tabu@ht = \tabu@msgalign \@tempdima { }{ }{ }{ }{ }\@@^^J% \fi \else\ifdim \@tempdimb>\tabu@dp \tabu@spaces\tabu@spaces\tabu@spaces \expandafter\expandafter\expandafter\string\tabu@dp = \tabu@msgalign \@tempdimb { }{ }{ }{ }{ }\@@^^J\fi \fi }% \tabu@message@verticalsp \edef\tabu@spaces{\@spaces} \def\tabu@strippt{\expandafter\tabu@pt\the} {\@makeother\P \@makeother\T\lowercase{\gdef\tabu@pt #1PT{#1}}} \def\tabu@msgalign{\expandafter\tabu@msg@align\the\dimexpr} \def\tabu@msgalign@PT{\expandafter\tabu@msg@align\romannumeral-`\0\tabu@strippt} \def\do #1{% \def\tabu@msg@align##1.##2##3##4##5##6##7##8##9\@@{% \ifnum##1<10 #1 #1\else \ifnum##1<100 #1 \else \ifnum##1<\@m #1\fi\fi\fi ##1.##2##3##4##5##6##7##8#1}% \def\tabu@header{(tabu) \ifnum\tabu@cnt<10 #1\fi\the\tabu@cnt) }% \def\tabu@titles{\ifnum \tabu@nested=\z@ (tabu) Try#1 #1 tabu X #1 #1 #1tabu Width #1 #1 Target #1 #1 #1 Coefs #1 #1 #1 Update^^J\fi}% \def\tabu@spreadheader{% (tabu) Try#1 #1 Spread #1 #1 tabu Width #1 #1 #1 Nat. X #1 #1 #1 #1Nat. Min. #1 New Target^^J% (tabu) sprd} \def\tabu@message@save {\begingroup \def\x ####1{\tabu@msg@align ####1{ }{ }{ }{ }{}\@@} \def\z ####1{\expandafter\x\expandafter{\romannumeral-`\0\tabu@strippt \dimexpr####1\p@{ }{ }}}% \let\color \relax \def\tabu@rulesstyle ####1####2{\detokenize{####1}}% \let\CT@arc@ \relax \let\@preamble \@gobble \let\tabu@savedpream \@firstofone \let\tabu@savedparams \@firstofone \def\tabu@target ####1\relax {(tabu) target #1 #1 #1 #1 #1 = \x{####1}^^J}% \def\tabucolX ####1\relax {(tabu) X columns width#1 = \x{####1}^^J}% \def\tabu@nbcols ####1\relax {(tabu) Number of columns: \z{####1}^^J}% \def\tabu@aligndefault ####1{(tabu) Default alignment: #1 #1 ####1^^J}% \def\col@sep ####1\relax {(tabu) column sep #1 #1 #1 = \x{####1}^^J}% \def\arrayrulewidth ####1\relax{(tabu) arrayrulewidth #1 = \x{####1}}% \def\doublerulesep ####1\relax { doublerulesep = \x{####1}^^J}% \def\extratabsurround####1\relax{(tabu) extratabsurround = \x{####1}^^J}% \def\extrarowheight ####1\relax{(tabu) extrarowheight #1 = \x{####1}}% \def\extrarowdepth ####1\relax {extrarowdepth = \x{####1}^^J}% \def\abovetabulinesep####1\relax{(tabu) abovetabulinesep=\x{####1} }% \def\belowtabulinesep####1\relax{ belowtabulinesep=\x{####1}^^J}% \def\arraystretch ####1{(tabu) arraystretch #1 #1 = \z{####1}^^J}% \def\minrowclearance####1\relax{(tabu) minrowclearance #1 = \x{####1}^^J}% \def\tabu@arc@L ####1{(tabu) taburulecolor #1 #1 = ####1^^J}% \def\tabu@drsc@L ####1{(tabu) tabudoublerulecolor= ####1^^J}% \def\tabu@evr@L ####1{(tabu) everyrow #1 #1 #1 #1 = \detokenize{####1}^^J}% \def\tabu@ls@L ####1{(tabu) line style = \detokenize{####1}^^J}% \def\NC@find ####1\@nil{(tabu) tabu preamble#1 #1 = \detokenize{####1}^^J}% \def\tabu@wddef####1####2{(tabu) Natural width ####1 = \x{####2}^^J}% \let\edef \@gobbletwo \let\def \@empty \let\let \@gobbletwo \tabu@message{% (tabu) \string\savetabu{\tabu@temp}: \on@line^^J% \tabu@usetabu \@nil^^J}% \endgroup} }\do{ } %% Measuring the natural width (varwidth) - store the results ------- \def\tabu@startpboxmeasure #1{\bgroup % entering \vtop \edef\tabu@temp{\expandafter\@secondoftwo \ifx\tabu@hsize #1\else\relax\fi}% \ifodd 1\ifx \tabu@temp\@empty 0 \else % starts with \tabu@hsize ? \iftabu@spread \else % if spread -> measure \ifdim \tabu@temp\p@>\z@ 0 \fi\fi\fi% if coef>0 -> do not measure \let\@startpbox \tabu@startpboxORI % restore immediately (nesting) \tabu@measuringtrue % for the quick option... \tabu@Xcol =\expandafter\@firstoftwo\ifx\tabu@hsize #1\fi \ifdim \tabu@temp\p@>\z@ \ifdim \tabu@temp\tabucolX<\tabu@target \tabu@target=\tabu@temp\tabucolX \fi\fi \setbox\tabu@box \hbox \bgroup \begin{varwidth}\tabu@target \let\FV@ListProcessLine \tabu@FV@ListProcessLine % \hbox to natural width... \narrowragged \arraybackslash \parfillskip \@flushglue \ifdefined\pdfadjustspacing \pdfadjustspacing\z@ \fi \bgroup \aftergroup\tabu@endpboxmeasure %%TABU-FIXED add \color@begingroup \color@begingroup \ifdefined \cellspacetoplimit \tabu@cellspacepatch \fi \else \expandafter\@gobble \tabu@startpboxquick{#1}% \@gobble \bgroup \fi }% \tabu@startpboxmeasure \def\tabu@cellspacepatch{\def\bcolumn##1\@nil{}\let\ecolumn\@empty \bgroup\color@begingroup} \def\tabu@endpboxmeasure {% \@finalstrut \@arstrutbox \end{varwidth}% %TABU-FIXED add \color@begingroup \color@endgroup \egroup % \ifdim \tabu@temp\p@ <\z@ % neg coef \ifdim \tabu@wd\tabu@Xcol <\wd\tabu@box \tabu@wddef\tabu@Xcol {\the\wd\tabu@box}% \tabu@debug{\tabu@message@endpboxmeasure}% \fi \else % spread coef>0 \global\advance \tabu@naturalX \wd\tabu@box \@tempdima =\dimexpr \wd\tabu@box *\p@/\dimexpr \tabu@temp\p@\relax \relax \ifdim \tabu@naturalXmax <\tabu@naturalX \xdef\tabu@naturalXmax {\the\tabu@naturalX}\fi \ifdim \tabu@naturalXmin <\@tempdima \xdef\tabu@naturalXmin {\the\@tempdima}\fi \fi \box\tabu@box \egroup % end of \vtop (measure) restore \tabu@target }% \tabu@endpboxmeasure \def\tabu@wddef #1{\expandafter\xdef \csname tabu@\the\tabu@nested.W\number#1\endcsname} \def\tabu@wd #1{\csname tabu@\the\tabu@nested.W\number#1\endcsname} \def\tabu@message@endpboxmeasure{\tabu@spaces\tabu@spaces<-> % <-> save natural wd \the\tabu@Xcol. X[\tabu@temp]: target = \the\tabucolX \space \expandafter\expandafter\expandafter\string\tabu@wd\tabu@Xcol =\tabu@wd\tabu@Xcol }% \tabu@message@endpboxmeasure \def\tabu@startpboxquick {\bgroup \let\@startpbox \tabu@startpboxORI % restore immediately \let\tabu \tabu@quick % \begin is expanded before... \expandafter\@gobble \@startpbox % gobbles \bgroup }% \tabu@startpboxquick \def\tabu@quick {\begingroup \iffalse{\fi \ifnum0=`}\fi \toks@{}\def\tabu@stack{b}\tabu@collectbody \tabu@endquick }% \tabu@quick \def\tabu@endquick {% \ifodd 1\ifx\tabu@end@envir\tabu@endtabu \else \ifx\tabu@end@envir\tabu@endtabus \else 0\fi\fi\relax \endgroup \else \let\endtabu \relax \tabu@end@envir \fi }% \tabu@quick \def\tabu@endtabu {\end{tabu}} \def\tabu@endtabus {\end{tabu*}} %% Measuring the heights and depths - store the results ------------- %%TABU-FIXED use \tabu@currentgrouptype \def\tabu@verticalmeasure{\everypar{}% \ifnum \tabu@currentgrouptype>12 % 14=semi-simple, 15=math shift group \setbox\tabu@box =\hbox\bgroup \let\tabu@verticalspacing \tabu@verticalsp@lcr \d@llarbegin % after \hbox ... \else \edef\tabu@temp{\ifnum\tabu@currentgrouptype=5\vtop \else\ifnum\tabu@currentgrouptype=12\vcenter \else\vbox\fi\fi}% \setbox\tabu@box \hbox\bgroup$\tabu@temp \bgroup \let\tabu@verticalspacing \tabu@verticalsp@pmb \fi }% \tabu@verticalmeasure \def\tabu@verticalsp@lcr{% \d@llarend \egroup % \@tempdima \dimexpr \ht\tabu@box+\abovetabulinesep \@tempdimb \dimexpr \dp\tabu@box+\belowtabulinesep \relax \ifdim\tabustrutrule>\z@ \tabu@debug{\tabu@message@verticalsp}\fi \ifdim \tabu@ht<\@tempdima \tabu@htdef{\the\@tempdima}\fi \ifdim \tabu@dp<\@tempdimb \tabu@dpdef{\the\@tempdimb}\fi \noindent\vrule height\@tempdima depth\@tempdimb }% \tabu@verticalsp@lcr \def\tabu@verticalsp@pmb{% inserts struts as needed \par \expandafter\egroup \expandafter$\expandafter \egroup \expandafter \@tempdimc \the\prevdepth \@tempdima \dimexpr \ht\tabu@box+\abovetabulinesep \@tempdimb \dimexpr \dp\tabu@box+\belowtabulinesep \relax \ifdim\tabustrutrule>\z@ \tabu@debug{\tabu@message@verticalsp}\fi \ifdim \tabu@ht<\@tempdima \tabu@htdef{\the\@tempdima}\fi \ifdim \tabu@dp<\@tempdimb \tabu@dpdef{\the\@tempdimb}\fi \let\@finalstrut \@gobble \hrule height\@tempdima depth\@tempdimb width\hsize %% \box\tabu@box }% \tabu@verticalsp@pmb \def\tabu@verticalinit{% \ifnum \c@taburow=\z@ \tabu@rearstrut \fi % after \tabu@reset ! \advance\c@taburow \@ne \tabu@htdef{\the\ht\@arstrutbox}\tabu@dpdef{\the\dp\@arstrutbox}% \advance\c@taburow \m@ne }% \tabu@verticalinit \def\tabu@htdef {\expandafter\xdef \csname tabu@\the\tabu@nested.H\the\c@taburow\endcsname} \def\tabu@ht {\csname tabu@\the\tabu@nested.H\the\c@taburow\endcsname} \def\tabu@dpdef {\expandafter\xdef \csname tabu@\the\tabu@nested.D\the\c@taburow\endcsname} \def\tabu@dp {\csname tabu@\the\tabu@nested.D\the\c@taburow\endcsname} \def\tabu@verticaldynamicadjustment {% \advance\c@taburow \@ne \extrarowheight \dimexpr\tabu@ht - \ht\strutbox \extrarowdepth \dimexpr\tabu@dp - \dp\strutbox \let\arraystretch \@empty \advance\c@taburow \m@ne }% \tabu@verticaldynamicadjustment \def\tabuphantomline{\crcr \noalign{% {\globaldefs \@ne \setbox\@arstrutbox \box\voidb@x \let\tabu@@celllalign \tabu@celllalign \let\tabu@@cellralign \tabu@cellralign \let\tabu@@cellleft \tabu@cellleft \let\tabu@@cellright \tabu@cellright \let\tabu@@thevline \tabu@thevline \let\tabu@celllalign \@empty \let\tabu@cellralign \@empty \let\tabu@cellright \@empty \let\tabu@cellleft \@empty \let\tabu@thevline \relax}% \edef\tabu@temp{\tabu@multispan \tabu@nbcols{\noindent &}}% \toks@\expandafter{\tabu@temp \noindent\tabu@everyrowfalse \cr \noalign{\tabu@rearstrut {\globaldefs\@ne \let\tabu@celllalign \tabu@@celllalign \let\tabu@cellralign \tabu@@cellralign \let\tabu@cellleft \tabu@@cellleft \let\tabu@cellright \tabu@@cellright \let\tabu@thevline \tabu@@thevline}}}% \expandafter}\the\toks@ }% \tabuphantomline %% \firsthline and \lasthline corrections --------------------------- \def\tabu@firstline {\tabu@hlineAZ \tabu@firsthlinecorrection {}} \def\tabu@firsthline{\tabu@hlineAZ \tabu@firsthlinecorrection \hline} \def\tabu@lastline {\tabu@hlineAZ \tabu@lasthlinecorrection {}} \def\tabu@lasthline {\tabu@hlineAZ \tabu@lasthlinecorrection \hline} \def\tabu@hline {% replaces \hline if no colortbl (see \AtBeginDocument) \noalign{\ifnum0=`}\fi {\CT@arc@\hrule height\arrayrulewidth}% \futurelet \tabu@temp \tabu@xhline }% \tabu@hline \def\tabu@xhline{% \ifx \tabu@temp \hline {\ifx \CT@drsc@\relax \vskip \else\ifx \CT@drsc@\@empty \vskip \else \CT@drsc@\hrule height \fi\fi \doublerulesep}% \fi \ifnum0=`{\fi}% }% \tabu@xhline \def\tabu@hlineAZ #1#2{\noalign{\ifnum0=`}\fi \dimen@ \z@ \count@ \z@ \toks@{}\def\tabu@hlinecorrection{#1}\def\tabu@temp{#2}% \tabu@hlineAZsurround }% \tabu@hlineAZ \newcommand*\tabu@hlineAZsurround[1][\extratabsurround]{% \extratabsurround #1\let\tabucline \tabucline@scan \let\hline \tabu@hlinescan \let\firsthline \hline \let\cline \tabu@clinescan \let\lasthline \hline \expandafter \futurelet \expandafter \tabu@temp \expandafter \tabu@nexthlineAZ \tabu@temp }% \tabu@hlineAZsurround \def\tabu@hlinescan {\tabu@thick \arrayrulewidth \tabu@xhlineAZ \hline} \def\tabu@clinescan #1{\tabu@thick \arrayrulewidth \tabu@xhlineAZ {\cline{#1}}} \def\tabucline@scan{\@testopt \tabucline@sc@n {}} \def\tabucline@sc@n #1[#2]{\tabu@xhlineAZ {\tabucline[{#1}]{#2}}} \def\tabu@nexthlineAZ{% \ifx \tabu@temp\hline \else \ifx \tabu@temp\cline \else \ifx \tabu@temp\tabucline \else \tabu@hlinecorrection \fi\fi\fi }% \tabu@nexthlineAZ \def\tabu@xhlineAZ #1{% \toks@\expandafter{\the\toks@ #1}% \@tempdimc \tabu@thick % The last line width \ifcase\count@ \@tempdimb \tabu@thick % The first line width \else \advance\dimen@ \dimexpr \tabu@thick+\doublerulesep \relax \fi \advance\count@ \@ne \futurelet \tabu@temp \tabu@nexthlineAZ }% \tabu@xhlineAZ \def\tabu@firsthlinecorrection{% \count@ = number of \hline -1 \@tempdima \dimexpr \ht\@arstrutbox+\dimen@ \edef\firsthline{% \omit \hbox to\z@{\hss{\noexpand\tabu@DBG{yellow}\vrule height \the\dimexpr\@tempdima+\extratabsurround depth \dp\@arstrutbox width \tabustrutrule}\hss}\cr \noalign{\vskip -\the\dimexpr \@tempdima+\@tempdimb +\dp\@arstrutbox \relax}% \the\toks@ }\ifnum0=`{\fi \expandafter}\firsthline % we are then ! }% \tabu@firsthlinecorrection \def\tabu@lasthlinecorrection{% \@tempdima \dimexpr \dp\@arstrutbox+\dimen@+\@tempdimb+\@tempdimc \edef\lasthline{% \the\toks@ \noalign{\vskip -\the\dimexpr\dimen@+\@tempdimb+\dp\@arstrutbox}% \omit \hbox to\z@{\hss{\noexpand\tabu@DBG{yellow}\vrule depth \the\dimexpr \dp\@arstrutbox+\@tempdimb+\dimen@ +\extratabsurround-\@tempdimc height \z@ width \tabustrutrule}\hss}\cr }\ifnum0=`{\fi \expandafter}\lasthline % we are then ! }% \tabu@lasthlinecorrection \def\tabu@LT@@hline{% \ifx\LT@next\hline \global\let\LT@next \@gobble \ifx \CT@drsc@\relax \gdef\CT@LT@sep{% \noalign{\penalty-\@medpenalty\vskip\doublerulesep}}% \else \gdef\CT@LT@sep{% \multispan\LT@cols{% \CT@drsc@\leaders\hrule\@height\doublerulesep\hfill}\cr}% \fi \else \global\let\LT@next\empty \gdef\CT@LT@sep{% \noalign{\penalty-\@lowpenalty\vskip-\arrayrulewidth}}% \fi \ifnum0=`{\fi}% \multispan\LT@cols {\CT@arc@\leaders\hrule\@height\arrayrulewidth\hfill}\cr \CT@LT@sep \multispan\LT@cols {\CT@arc@\leaders\hrule\@height\arrayrulewidth\hfill}\cr \noalign{\penalty\@M}% \LT@next }% \tabu@LT@@hline %% Horizontal lines : \tabucline ------------------------------------ \let\tabu@start \@tempcnta \let\tabu@stop \@tempcntb \newcommand*\tabucline{\noalign{\ifnum0=`}\fi \tabu@cline} \newcommand*\tabu@cline[2][]{\tabu@startstop{#2}% \ifnum \tabu@stop<\z@ \toks@{}% \else \tabu@clinearg{#1}\tabu@thestyle \edef\tabucline{\toks@{% \ifnum \tabu@start>\z@ \omit \tabu@multispan\tabu@start {\span\omit}&\fi \omit \tabu@multispan\tabu@stop {\span\omit}% \tabu@thehline\cr }}\tabucline \tabu@tracinglines{(tabu:tabucline) Style: #1^^J\the\toks@^^J^^J}% \fi \futurelet \tabu@temp \tabu@xcline }% \tabu@cline \def\tabu@clinearg #1{% \ifx\\#1\\\let\tabu@thestyle \tabu@ls@ \else \@defaultunits \expandafter\let\expandafter\@tempa \romannumeral-`\0#1\relax \@nnil \ifx \hbox\@tempa \tabu@clinebox{#1}% \else\ifx \box\@tempa \tabu@clinebox{#1}% \else\ifx \vbox\@tempa \tabu@clinebox{#1}% \else\ifx \vtop\@tempa \tabu@clinebox{#1}% \else\ifx \copy\@tempa \tabu@clinebox{#1}% \else\ifx \leaders\@tempa \tabu@clineleads{#1}% \else\ifx \cleaders\@tempa \tabu@clineleads{#1}% \else\ifx \xleaders\@tempa \tabu@clineleads{#1}% \else\tabu@getline {#1}% \fi\fi\fi\fi\fi\fi\fi\fi \fi }% \tabu@clinearg \def\tabu@clinebox #1{\tabu@clineleads{\xleaders#1\hss}} \def\tabu@clineleads #1{% \let\tabu@thestyle \relax \let\tabu@leaders \@undefined \gdef\tabu@thehrule{#1}} \def\tabu@thehline{\begingroup \ifdefined\tabu@leaders \noexpand\tabu@thehleaders \else \noexpand\tabu@thehrule \fi \endgroup }% \tabu@thehline \def\tabu@xcline{% \ifx \tabu@temp\tabucline \toks@\expandafter{\the\toks@ \noalign {\ifx\CT@drsc@\relax \vskip \else \CT@drsc@\hrule height \fi \doublerulesep}}% \fi \tabu@docline }% \tabu@xcline \def\tabu@docline {\ifnum0=`{\fi \expandafter}\the\toks@} \def\tabu@docline@evr {\xdef\tabu@doclineafter{\the\toks@}% \ifnum0=`{\fi}\aftergroup\tabu@doclineafter} \def\tabu@multispan #1#2{% \ifnum\numexpr#1>\@ne #2\expandafter\tabu@multispan \else \expandafter\@gobbletwo \fi {#1-1}{#2}% }% \tabu@multispan \def\tabu@startstop #1{\tabu@start@stop #1\relax 1-\tabu@nbcols \@nnil} \def\tabu@start@stop #1-#2\@nnil{% \@defaultunits \tabu@start\number 0#1\relax \@nnil \@defaultunits \tabu@stop \number 0#2\relax \@nnil \tabu@stop \ifnum \tabu@start>\tabu@nbcols \m@ne \else\ifnum \tabu@stop=\z@ \tabu@nbcols \else\ifnum \tabu@stop>\tabu@nbcols \tabu@nbcols \else \tabu@stop \fi\fi\fi \advance\tabu@start \m@ne \ifnum \tabu@start>\z@ \advance\tabu@stop -\tabu@start \fi }% \tabu@start@stop %% Numbers: siunitx S columns (and \tabudecimal) ------------------- \def\tabu@tabudecimal #1{% \def\tabu@decimal{#1}\@temptokena{}% \let\tabu@getdecimal@ \tabu@getdecimal@ignorespaces \tabu@scandecimal }% \tabu@tabudecimal \def\tabu@scandecimal{\futurelet \tabu@temp \tabu@getdecimal@} \def\tabu@skipdecimal#1{#1\tabu@scandecimal} \def\tabu@getdecimal@ignorespaces{% \ifcase 0\ifx\tabu@temp\ignorespaces\else \ifx\tabu@temp\@sptoken1\else 2\fi\fi\relax \let\tabu@getdecimal@ \tabu@getdecimal \expandafter\tabu@skipdecimal \or \expandafter\tabu@gobblespace\expandafter\tabu@scandecimal \else \expandafter\tabu@skipdecimal \fi }% \tabu@getdecimal@ignorespaces \def\tabu@get@decimal#1{\@temptokena\expandafter{\the\@temptokena #1}% \tabu@scandecimal} \def\do#1{% \def\tabu@get@decimalspace#1{% \@temptokena\expandafter{\the\@temptokena #1}\tabu@scandecimal}% }\do{ } \let\tabu@@tabudecimal \tabu@tabudecimal \def\tabu@getdecimal{% \ifcase 0\ifx 0\tabu@temp\else \ifx 1\tabu@temp\else \ifx 2\tabu@temp\else \ifx 3\tabu@temp\else \ifx 4\tabu@temp\else \ifx 5\tabu@temp\else \ifx 6\tabu@temp\else \ifx 7\tabu@temp\else \ifx 8\tabu@temp\else \ifx 9\tabu@temp\else \ifx .\tabu@temp\else \ifx ,\tabu@temp\else \ifx -\tabu@temp\else \ifx +\tabu@temp\else \ifx e\tabu@temp\else \ifx E\tabu@temp\else \ifx\tabu@cellleft\tabu@temp1\else \ifx\ignorespaces\tabu@temp1\else \ifx\@sptoken\tabu@temp2\else 3\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\relax \expandafter\tabu@get@decimal \or \expandafter\tabu@skipdecimal \or \expandafter\tabu@get@decimalspace \else\expandafter\tabu@printdecimal \fi }% \tabu@getdecimal \def\tabu@printdecimal{% \edef\tabu@temp{\the\@temptokena}% \ifx\tabu@temp\@empty\else \ifx\tabu@temp\space\else \expandafter\tabu@decimal\expandafter{\the\@temptokena}% \fi\fi }% \tabu@printdecimal %% Verbatim inside X columns ---------------------------------------- \def\tabu@verbatim{% \let\verb \tabu@verb \let\FV@DefineCheckEnd \tabu@FV@DefineCheckEnd }% \tabu@verbatim \let\tabu@ltx@verb \verb \def\tabu@verb{\@ifstar {\tabu@ltx@verb*} \tabu@ltx@verb} \def\tabu@fancyvrb {% \def\tabu@FV@DefineCheckEnd ##1{% \def\tabu@FV@DefineCheckEnd{% ##1% \let\FV@CheckEnd \tabu@FV@CheckEnd \let\FV@@CheckEnd \tabu@FV@@CheckEnd \let\FV@@@CheckEnd \tabu@FV@@@CheckEnd \edef\FV@EndScanning{% \def\noexpand\next{\noexpand\end{\FV@EnvironName}}% \global\let\noexpand\FV@EnvironName\relax \noexpand\next}% \xdef\FV@EnvironName{\detokenize\expandafter{\FV@EnvironName}}}% }\expandafter\tabu@FV@DefineCheckEnd\expandafter{\FV@DefineCheckEnd} }% \tabu@fancyvrb \def\tabu@FV@CheckEnd #1{\expandafter\FV@@CheckEnd \detokenize{#1\end{}}\@nil} \edef\tabu@FV@@@CheckEnd {\detokenize{\end{}}} \begingroup \catcode`\[1 \catcode`\]2 \@makeother\{ \@makeother\} \edef\x[\endgroup \def\noexpand\tabu@FV@@CheckEnd ##1\detokenize[\end{]##2\detokenize[}]##3% ]\x \@nil{\def\@tempa{#2}\def\@tempb{#3}} \def\tabu@FV@ListProcessLine #1{% \hbox {%to \hsize{% \kern\leftmargin \hbox {%to \linewidth{% \FV@LeftListNumber \FV@LeftListFrame \FancyVerbFormatLine{#1}\hss %% DG/SR modification begin - Jan. 28, 1998 (for numbers=right add-on) %% \FV@RightListFrame}% \FV@RightListFrame \FV@RightListNumber}% %% DG/SR modification end \hss}} %% \savetabu -------------------------------------------------------- \newcommand*\savetabu[1]{\noalign{% \tabu@sanitizearg{#1}\tabu@temp \ifx \tabu@temp\@empty \tabu@savewarn{}{The tabu will not be saved}\else \@ifundefined{tabu@saved@\tabu@temp}{}{\tabu@savewarn{#1}{Overwritting}}% \ifdefined\tabu@restored \expandafter\let \csname tabu@saved@\tabu@temp \endcsname \tabu@restored \else {\tabu@save}% \fi \fi}% }% \savetabu \def\tabu@save {% \toks0\expandafter{\tabu@saved@}% \iftabu@negcoef \let\tabu@wddef \relax \let\tabu@ \tabu@savewd \edef\tabu@savewd{\tabu@Xcoefs}% \toks0\expandafter{\the\toks\expandafter0\tabu@savewd}\fi \toks1\expandafter{\tabu@savedpream}% \toks2\expandafter{\tabu@savedpreamble}% \let\@preamble \relax \let\tabu@savedpream \relax \let\tabu@savedparams \relax \edef\tabu@preamble{% \def\noexpand\tabu@aligndefault{\tabu@align}% \def\tabu@savedparams {\noexpand\the\toks0}% \def\tabu@savedpream {\noexpand\the\toks1}}% \edef\tabu@usetabu{% \def\@preamble {\noexpand\the\toks2}% \tabu@target \the\tabu@target \relax \tabucolX \the\tabucolX \relax \tabu@nbcols \the\tabu@nbcols \relax \def\noexpand\tabu@aligndefault{\tabu@align}% \def\tabu@savedparams {\noexpand\the\toks0}% \def\tabu@savedpream {\noexpand\the\toks1}}% \let\tabu@aligndefault \relax \let\@sharp \relax \edef\@tempa{\noexpand\tabu@s@ved {\tabu@usetabu} {\tabu@preamble} {\the\toks1}}\@tempa \tabu@message@save }% \tabu@save \long\def\tabu@s@ved #1#2#3{% \def\tabu@usetabu{#1}% \expandafter\gdef\csname tabu@saved@\tabu@temp\endcsname ##1{% \ifodd ##1% \usetabu \tabu@measuringfalse \tabu@spreadfalse % Just in case... \gdef\tabu@usetabu {% \ifdim \tabu@target>\z@ \tabu@warn@usetabu \fi \global\let\tabu@usetabu \@undefined \def\@halignto {to\tabu@target}% #1% \ifx \tabu@align\tabu@aligndefault@text \ifnum \tabu@nested=\z@ \let\tabu@align \tabu@aligndefault \fi\fi}% \else % \preamble \gdef\tabu@preamble {% \global\let\tabu@preamble \@undefined #2% \ifx \tabu@align\tabu@aligndefault@text \ifnum \tabu@nested=\z@ \let\tabu@align \tabu@aligndefault \fi\fi}% \fi #3}% }% \tabu@s@ved \def\tabu@aligndefault@text {\tabu@aligndefault}% \def\tabu@warn@usetabu {\PackageWarning{tabu} {Specifying a target with \string\usetabu\space is useless \MessageBreak The target cannot be changed!}} \def\tabu@savewd #1#2{\ifdim #2\p@<\z@ \tabu@wddef{#1}{\tabu@wd{#1}}\fi} \def\tabu@savewarn#1#2{\PackageInfo{tabu} {User-name `#1' already used for \string\savetabu \MessageBreak #2}}% \def\tabu@saveerr#1{\PackageError{tabu} {User-name `#1' is unknown for \string\usetabu \MessageBreak I cannot restore an unknown preamble!}\@ehd} %% \rowfont --------------------------------------------------------- \newskip \tabu@cellskip \def\tabu@rowfont{\ifdim \baselineskip=\z@\noalign\fi {\ifnum0=`}\fi \tabu@row@font} \newcommand*\tabu@row@font[2][]{% \ifnum7=\currentgrouptype \global\let\tabu@@cellleft \tabu@cellleft \global\let\tabu@@cellright \tabu@cellright \global\let\tabu@@celllalign \tabu@celllalign \global\let\tabu@@cellralign \tabu@cellralign \global\let\tabu@@rowfontreset\tabu@rowfontreset \fi \global\let\tabu@rowfontreset \tabu@rowfont@reset \expandafter\gdef\expandafter\tabu@cellleft\expandafter{\tabu@cellleft #2}% \ifcsname tabu@cell@#1\endcsname % row alignment \csname tabu@cell@#1\endcsname \fi \ifnum0=`{\fi}% end of group / noalign group }% \rowfont \def\tabu@ifcolorleavevmode #1{\let\color \tabu@leavevmodecolor #1\let\color\tabu@color}% \def\tabu@rowfont@reset{% \global\let\tabu@rowfontreset \tabu@@rowfontreset \global\let\tabu@cellleft \tabu@@cellleft \global\let\tabu@cellright \tabu@@cellright \global\let\tabu@cellfont \@empty \global\let\tabu@celllalign \tabu@@celllalign \global\let\tabu@cellralign \tabu@@cellralign }% \tabu@@rowfontreset \let\tabu@rowfontreset \@empty % overwritten \AtBeginDocument if colortbl %% \tabu@prepnext@tok ----------------------------------------------- \newif \iftabu@cellright \def\tabu@prepnext@tok{% \ifnum \count@<\z@ % \@tempcnta \@M % \tabu@nbcols\z@ \let\tabu@fornoopORI \@fornoop \tabu@cellrightfalse \else \ifcase \numexpr \count@-\@tempcnta \relax % (case 0): prev. token is left \advance \tabu@nbcols \@ne \iftabu@cellright % before-previous token is right and is finished \tabu@cellrightfalse % \tabu@righttok \fi \tabu@lefttok \or % (case 1) previous token is right \tabu@cellrighttrue \let\@fornoop \tabu@lastnoop \else % special column: do not change the token \iftabu@cellright % before-previous token is right \tabu@cellrightfalse \tabu@righttok \fi \fi % \ifcase \fi \tabu@prepnext@tokORI }% \tabu@prepnext@tok \long\def\tabu@lastnoop#1\@@#2#3{\tabu@lastn@@p #2\@nextchar \in@\in@@} \def\tabu@lastn@@p #1\@nextchar #2#3\in@@{% \ifx \in@#2\else \let\@fornoop \tabu@fornoopORI \xdef\tabu@mkpreambuffer{\tabu@nbcols\the\tabu@nbcols \tabu@mkpreambuffer}% \toks0\expandafter{\expandafter\tabu@everyrowtrue \the\toks0}% \expandafter\prepnext@tok \fi }% \tabu@lastnoop \def\tabu@righttok{% \advance \count@ \m@ne \toks\count@\expandafter {\the\toks\count@ \tabu@cellright \tabu@cellralign}% \advance \count@ \@ne }% \tabu@righttok \def\tabu@lefttok{\toks\count@\expandafter{\expandafter\tabu@celllalign \the\toks\count@ \tabu@cellleft}% after because of $ }% \tabu@lefttok %% Neutralisation of glues ------------------------------------------ \let\tabu@cellleft \@empty \let\tabu@cellright \@empty \tabu@celllalign@def{\tabu@cellleft}% \let\tabu@cellralign \@empty \def\tabu@cell@align #1#2#3{% \let\tabu@maybesiunitx \toks@ \tabu@celllalign \global \expandafter \tabu@celllalign@def \expandafter {\the\toks@ #1}% \toks@\expandafter{\tabu@cellralign #2}% \xdef\tabu@cellralign{\the\toks@}% \toks@\expandafter{\tabu@cellleft #3}% \xdef\tabu@cellleft{\the\toks@}% }% \tabu@cell@align \def\tabu@cell@l{% force alignment to left \tabu@cell@align {\tabu@removehfil \raggedright \tabu@cellleft}% left {\tabu@flush1\tabu@ignorehfil}% right \raggedright }% \tabu@cell@l \def\tabu@cell@c{% force alignment to center \tabu@cell@align {\tabu@removehfil \centering \tabu@flush{.5}\tabu@cellleft} {\tabu@flush{.5}\tabu@ignorehfil} \centering }% \tabu@cell@c \def\tabu@cell@r{% force alignment to right \tabu@cell@align {\tabu@removehfil \raggedleft \tabu@flush1\tabu@cellleft} \tabu@ignorehfil \raggedleft }% \tabu@cell@r \def\tabu@cell@j{% force justification (for p, m, b columns) \tabu@cell@align {\tabu@justify\tabu@cellleft} {} \tabu@justify }% \tabu@cell@j \def\tabu@justify{% \leftskip\z@skip \@rightskip\leftskip \rightskip\@rightskip \parfillskip\@flushglue }% \tabu@justify %% ragged2e settings \def\tabu@cell@L{% force alignment to left (ragged2e) \tabu@cell@align {\tabu@removehfil \RaggedRight \tabu@cellleft} {\tabu@flush 1\tabu@ignorehfil} \RaggedRight }% \tabu@cell@L \def\tabu@cell@C{% force alignment to center (ragged2e) \tabu@cell@align {\tabu@removehfil \Centering \tabu@flush{.5}\tabu@cellleft} {\tabu@flush{.5}\tabu@ignorehfil} \Centering }% \tabu@cell@C \def\tabu@cell@R{% force alignment to right (ragged2e) \tabu@cell@align {\tabu@removehfil \RaggedLeft \tabu@flush 1\tabu@cellleft} \tabu@ignorehfil \RaggedLeft }% \tabu@cell@R \def\tabu@cell@J{% force justification (ragged2e) \tabu@cell@align {\justifying \tabu@cellleft} {} \justifying }% \tabu@cell@J \def\tabu@flush#1{% \iftabu@colortbl % colortbl uses \hfill rather than \hfil \hskip \ifnum13<\currentgrouptype \stretch{#1}% \else \ifdim#1pt<\p@ \tabu@cellskip \else \stretch{#1} \fi\fi \relax \else % array.sty \ifnum 13<\currentgrouptype \hfil \hskip1sp \relax \fi \fi }% \tabu@flush \let\tabu@hfil \hfil \let\tabu@hfill \hfill \let\tabu@hskip \hskip \def\tabu@removehfil{% \iftabu@colortbl \unkern \tabu@cellskip =\lastskip \ifnum\gluestretchorder\tabu@cellskip =\tw@ \hskip-\tabu@cellskip \else \tabu@cellskip \z@skip \fi \else \ifdim\lastskip=1sp\unskip\fi \ifnum\gluestretchorder\lastskip =\@ne \hfilneg % \hfilneg for array.sty but not for colortbl... \fi \fi }% \tabu@removehfil \def\tabu@ignorehfil{\aftergroup \tabu@nohfil} \def\tabu@nohfil{% \hfil -> do nothing + restore original \hfil \def\hfil{\let\hfil \tabu@hfil}% local to (alignment template) group }% \tabu@nohfil \def\tabu@colortblalignments {% if colortbl \def\tabu@nohfil{% \def\hfil {\let\hfil \tabu@hfil}% local to (alignment template) group \def\hfill {\let\hfill \tabu@hfill}% (colortbl uses \hfill) pfff... \def\hskip ####1\relax{\let\hskip \tabu@hskip}}% local }% \tabu@colortblalignments %% Taking care of footnotes and hyperfootnotes ---------------------- \long\def\tabu@footnotetext #1{% \edef\@tempa{\the\tabu@footnotes \noexpand\footnotetext [\the\csname c@\@mpfn\endcsname]}% \global\tabu@footnotes\expandafter{\@tempa {#1}}}% \long\def\tabu@xfootnotetext [#1]#2{% \global\tabu@footnotes\expandafter{\the\tabu@footnotes \footnotetext [{#1}]{#2}}} \let\tabu@xfootnote \@xfootnote \long\def\tabu@Hy@ftntext{\tabu@Hy@ftntxt {\the \c@footnote }} \long\def\tabu@Hy@xfootnote [#1]{% \begingroup \value\@mpfn #1\relax \protected@xdef \@thefnmark {\thempfn}% \endgroup \@footnotemark \tabu@Hy@ftntxt {#1}% }% \tabu@Hy@xfootnote \long\def\tabu@Hy@ftntxt #1#2{% \edef\@tempa{% \the\tabu@footnotes \begingroup \value\@mpfn #1\relax \noexpand\protected@xdef\noexpand\@thefnmark {\noexpand\thempfn}% \expandafter \noexpand \expandafter \tabu@Hy@footnotetext \expandafter{\Hy@footnote@currentHref}% }% \global\tabu@footnotes\expandafter{\@tempa {#2}% \endgroup}% }% \tabu@Hy@ftntxt \long\def\tabu@Hy@footnotetext #1#2{% \H@@footnotetext{% \ifHy@nesting \hyper@@anchor {#1}{#2}% \else \Hy@raisedlink{% \hyper@@anchor {#1}{\relax}% }% \def\@currentHref {#1}% \let\@currentlabelname \@empty #2% \fi }% }% \tabu@Hy@footnotetext %% No need for \arraybackslash ! ------------------------------------ \def\tabu@latextwoe {% \def\tabu@temp##1##2##3{{\toks@\expandafter{##2##3}\xdef##1{\the\toks@}}} \tabu@temp \tabu@centering \centering \arraybackslash \tabu@temp \tabu@raggedleft \raggedleft \arraybackslash \tabu@temp \tabu@raggedright \raggedright \arraybackslash }% \tabu@latextwoe \def\tabu@raggedtwoe {% \def\tabu@temp ##1##2##3{{\toks@\expandafter{##2##3}\xdef##1{\the\toks@}}} \tabu@temp \tabu@Centering \Centering \arraybackslash \tabu@temp \tabu@RaggedLeft \RaggedLeft \arraybackslash \tabu@temp \tabu@RaggedRight \RaggedRight \arraybackslash \tabu@temp \tabu@justifying \justifying \arraybackslash }% \tabu@raggedtwoe \def\tabu@normalcrbackslash{\let\\\@normalcr} \def\tabu@trivlist{\expandafter\def\expandafter\@trivlist\expandafter{% \expandafter\tabu@normalcrbackslash \@trivlist}} %% Utilities: \fbox \fcolorbox and \tabudecimal ------------------- \def\tabu@fbox {\leavevmode\afterassignment\tabu@beginfbox \setbox\@tempboxa\hbox} \def\tabu@beginfbox {\bgroup \kern\fboxsep \bgroup\aftergroup\tabu@endfbox} \def\tabu@endfbox {\kern\fboxsep\egroup\egroup \@frameb@x\relax} \def\tabu@color@b@x #1#2{\leavevmode \bgroup \def\tabu@docolor@b@x{#1{#2\color@block{\wd\z@}{\ht\z@}{\dp\z@}\box\z@}}% \afterassignment\tabu@begincolor@b@x \setbox\z@ \hbox }% \tabu@color@b@x \def\tabu@begincolor@b@x {\kern\fboxsep \bgroup \aftergroup\tabu@endcolor@b@x \set@color} \def\tabu@endcolor@b@x {\kern\fboxsep \egroup \dimen@\ht\z@ \advance\dimen@ \fboxsep \ht\z@ \dimen@ \dimen@\dp\z@ \advance\dimen@ \fboxsep \dp\z@ \dimen@ \tabu@docolor@b@x \egroup }% \tabu@endcolor@b@x %% Corrections (arydshln, delarray, colortbl) ----------------------- \def\tabu@fix@arrayright {%% \@arrayright is missing from \endarray \iftabu@colortbl \ifdefined\adl@array % \def\tabu@endarray{% \adl@endarray \egroup \adl@arrayrestore \CT@end \egroup % \@arrayright % \gdef\@preamble{}}% \else % \def\tabu@endarray{% \crcr \egroup \egroup % \@arrayright % \gdef\@preamble{}\CT@end}% \fi \else \ifdefined\adl@array % \def\tabu@endarray{% \adl@endarray \egroup \adl@arrayrestore \egroup % \@arrayright % \gdef\@preamble{}}% \else % \PackageWarning{tabu} {\string\@arrayright\space is missing from the \MessageBreak definition of \string\endarray. \MessageBreak Comptability with delarray.sty is broken.}% \fi\fi }% \tabu@fix@arrayright \def\tabu@adl@xarraydashrule #1#2#3{% \ifnum\@lastchclass=\adl@class@start\else \ifnum\@lastchclass=\@ne\else \ifnum\@lastchclass=5 \else % @-arg (class 5) and !-arg (class 1) \adl@leftrulefalse \fi\fi % must be treated the same \fi \ifadl@zwvrule\else \ifadl@inactive\else \@addtopreamble{\vrule\@width\arrayrulewidth \@height\z@ \@depth\z@}\fi \fi \ifadl@leftrule \@addtopreamble{\adl@vlineL{\CT@arc@}{\adl@dashgapcolor}% {\number#1}#3}% \else \@addtopreamble{\adl@vlineR{\CT@arc@}{\adl@dashgapcolor}% {\number#2}#3} \fi }% \tabu@adl@xarraydashrule \def\tabu@adl@act@endpbox {% \unskip \ifhmode \nobreak \fi \@finalstrut \@arstrutbox %%TABU-FIXED \color@endgroup \egroup \egroup \adl@colhtdp \box\adl@box \hfil }% \tabu@adl@act@endpbox \def\tabu@adl@fix {% \let\adl@xarraydashrule \tabu@adl@xarraydashrule % arydshln \let\adl@act@endpbox \tabu@adl@act@endpbox % arydshln \let\adl@act@@endpbox \tabu@adl@act@endpbox % arydshln \let\@preamerror \@preamerr % arydshln }% \tabu@adl@fix %% Correction for longtable' \@startbox definition ------------------ %% => \everypar is ``missing'' : TeX should be in vertical mode \def\tabu@LT@startpbox #1{% %%TABU-FIXED add \color@begingroup \bgroup\color@begingroup \let\@footnotetext\LT@p@ftntext \setlength\hsize{#1}% \@arrayparboxrestore \everypar{% \vrule \@height \ht\@arstrutbox \@width \z@ \everypar{}}% }% \tabu@LT@startpbox %% \tracingtabu and the package options ------------------ \DeclareOption{delarray}{\AtEndOfPackage{\RequirePackage{delarray}}} \DeclareOption{linegoal}{% \AtEndOfPackage{% \RequirePackage{linegoal}[2010/12/07]% \let\tabudefaulttarget \linegoal% \linegoal is \linewidth if not pdfTeX }} \DeclareOption{scantokens}{\tabuscantokenstrue} \DeclareOption{debugshow}{\AtEndOfPackage{\tracingtabu=\tw@}} \def\tracingtabu {\begingroup\@ifnextchar=% {\afterassignment\tabu@tracing\count@} {\afterassignment\tabu@tracing\count@1\relax}} \def\tabu@tracing{\expandafter\endgroup \expandafter\tabu@tr@cing \the\count@ \relax }% \tabu@tracing \def\tabu@tr@cing #1\relax {% \ifnum#1>\thr@@ \let\tabu@tracinglines\message \else \let\tabu@tracinglines\@gobble \fi \ifnum#1>\tw@ \let\tabu@DBG \tabu@@DBG \def\tabu@mkarstrut {\tabu@DBG@arstrut}% \tabustrutrule 1.5\p@ \else \let\tabu@DBG \@gobble \def\tabu@mkarstrut {\tabu@arstrut}% \tabustrutrule \z@ \fi \ifnum#1>\@ne \let\tabu@debug \message \else \let\tabu@debug \@gobble \fi \ifnum#1>\z@ \let\tabu@message \message \let\tabu@tracing@save \tabu@message@save \let\tabu@starttimer \tabu@pdftimer \else \let\tabu@message \@gobble \let\tabu@tracing@save \@gobble \let\tabu@starttimer \relax \fi }% \tabu@tr@cing %% Setup \AtBeginDocument \AtBeginDocument{\tabu@AtBeginDocument} \def\tabu@AtBeginDocument{\let\tabu@AtBeginDocument \@undefined \ifdefined\arrayrulecolor \tabu@colortbltrue % \tabu@colortblalignments % different glues are used \else \tabu@colortblfalse \fi \ifdefined\CT@arc@ \else \let\CT@arc@ \relax \fi \ifdefined\CT@drsc@\else \let\CT@drsc@ \relax \fi \let\tabu@arc@L \CT@arc@ \let\tabu@drsc@L \CT@drsc@ \ifodd 1\ifcsname siunitx_table_collect_begin:Nn\endcsname % \expandafter\ifx \csname siunitx_table_collect_begin:Nn\endcsname\relax 0\fi\fi\relax \tabu@siunitxtrue \else \let\tabu@maybesiunitx \@firstofone % \let\tabu@siunitx \tabu@nosiunitx \tabu@siunitxfalse \fi \ifdefined\adl@array % \else \let\tabu@adl@fix \relax \let\tabu@adl@endtrial \@empty \fi \ifdefined\longtable % \else \let\longtabu \tabu@nolongtabu \fi \ifdefined\cellspacetoplimit \tabu@warn@cellspace\fi \csname\ifcsname ifHy@hyperfootnotes\endcsname % ifHy@hyperfootnotes\else iffalse\fi\endcsname \let\tabu@footnotetext \tabu@Hy@ftntext \let\tabu@xfootnote \tabu@Hy@xfootnote \fi \ifdefined\FV@DefineCheckEnd% \tabu@fancyvrb \fi \ifdefined\color % \let\tabu@color \color \def\tabu@leavevmodecolor ##1{% \def\tabu@leavevmodecolor {\leavevmode ##1}% }\expandafter\tabu@leavevmodecolor\expandafter{\color}% \else \let\tabu@color \tabu@nocolor \let\tabu@leavevmodecolor \@firstofone \fi \tabu@latextwoe \ifdefined\@raggedtwoe@everyselectfont % \tabu@raggedtwoe \else \let\tabu@cell@L \tabu@cell@l \let\tabu@cell@R \tabu@cell@r \let\tabu@cell@C \tabu@cell@c \let\tabu@cell@J \tabu@cell@j \fi \expandafter\in@ \expandafter\@arrayright \expandafter{\endarray}% \ifin@ \let\tabu@endarray \endarray \else \tabu@fix@arrayright \fi% \everyrow{}% }% \tabu@AtBeginDocument \def\tabu@warn@cellspace{% \PackageWarning{tabu}{% Package cellspace has some limitations \MessageBreak And redefines some macros of array.sty. \MessageBreak Please use \string\tabulinesep\space to control \MessageBreak vertical spacing of lines inside tabu environnement}% }% \tabu@warn@cellspace %% tabu Package initialisation \tabuscantokensfalse \let\tabu@arc@G \relax \let\tabu@drsc@G \relax \let\tabu@evr@G \@empty \let\tabu@rc@G \@empty \def\tabu@ls@G {\tabu@linestyle@}% \let\tabu@@rowfontreset \@empty % \let\tabu@@celllalign \@empty \let\tabu@@cellralign \@empty \let\tabu@@cellleft \@empty \let\tabu@@cellright \@empty \def\tabu@naturalXmin {\z@} \def\tabu@naturalXmax {\z@} \let\tabu@rowfontreset \@empty \def\tabulineon {4pt}\let\tabulineoff \tabulineon \tabu@everyrowtrue \ifdefined\pdfelapsedtime % \def\tabu@pdftimer {\xdef\tabu@starttime{\the\pdfelapsedtime}}% \else \let\tabu@pdftimer \relax \let\tabu@message@etime \relax \fi \tracingtabu=\z@ \newtabulinestyle {=\maxdimen}% creates the 'factory' settings \tabu@linestyle@ \tabulinestyle{} \taburowcolors{} \let\tabudefaulttarget \linewidth \ProcessOptions* % \ProcessOptions* is quicker ! \endinput %% %% End of file `tabu.sty'.