root/doc_inner/doxygen/latex/tabu_doxygen.sty

/* [<][>][^][v][top][bottom][index][help] */
%%
%% This is file `tabu.sty',
%% generated with the docstrip utility.
%%
%% The original source files were:
%%
%% tabu.dtx  (with options: `package')
%% 
%% This is a generated file.
%% Copyright (FC) 2010-2011 - lppl
%% 
%% tabu : 2011/02/26 v2.8 - tabu : Flexible LaTeX tabulars
%% 
%% **********************************************************************************************
%% \begin{tabu}               { preamble } => default target: \linewidth or \linegoal
%% \begin{tabu} to     <dimen>{ preamble } => target specified
%% \begin{tabu} spread <dimen>{ preamble } => target relative to the ``natural width''
%% 
%%  tabu works in text and in math modes.
%% 
%%  X columns: automatic width adjustment + 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=<dimen>     \extrarowdepth=<dimen>
%%    or:     \extrarowsep=<dimen>               => may be prefixed by \global
%% 
%%  Dynamic vertical spacing adjustment:
%%       \abovetabulinesep=<dimen>  \belowtabulinesep=<dimen>
%%   or:      \tabulinesep=<dimen>               => 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
%% 
%% This work consists of the main source file tabu.dtx
%% and the derived files
%%    tabu.sty, tabu.pdf, tabu.ins
%% 
%% tabu : Flexible LaTeX tabulars
%% lppl copyright 2010-2011 by FC <florent.chervet@free.fr>
%% 

\NeedsTeXFormat{LaTeX2e}[2005/12/01]
\ProvidesPackage{tabu_doxygen}[2011/02/26 v2.8 - flexible LaTeX tabulars (FC), frozen version for doxygen]
\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 alignment 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&#1\@nnil
    \fi
}% \tabu@strtrim
\gdef\tabu@trimspaces #1&#2\@nnil{\let\tabu@c@l@r=#2\tabu@firstspace .#1& &#2}%
\gdef\tabu@firstspace #1#2#3 &{\tabu@lastspace #2#3&}
\gdef\tabu@lastspace #1&#2&#3{\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&#3\@nnil}
}% \catcode
\def\tabu@sanitizearg #1#2{{%
    \csname \ifcsname if@safe@actives\endcsname         % <babel>
                      @safe@activestrue\else
                      relax\fi       \endcsname
    \edef#2{#1}\tabu@strtrim#2\@onelevel@sanitize#2%
    \expandafter}\expandafter\def\expandafter#2\expandafter{#2}%
}% \tabu@sanitizearg
\def\tabu@textbar #1{\begingroup \endlinechar\m@ne \scantokens{\def\:{|}}%
    \expandafter\endgroup \expandafter#1\:% !!! semi simple group !!!
}% \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         % <babel>
                      @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    % <leaders>
    \else   \in@false   % <rule>
    \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 % <For LyX: some users redefine \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       % <nested tabu>
        \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     %<restore \\=\@normalcr inside lists>
    \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 % <fix> colortbl & arydshln (delarray)
    \iftabu@colortbl\CT@everycr\expandafter{\expandafter\iftabu@everyrow \the\CT@everycr \fi}\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   % <init>
    \let\tabu@drsc@Gsave        \tabu@drsc@G
    \let\tabu@drsc@G            \tabu@drsc@L  % <init>
    \let\tabu@ls@Gsave          \tabu@ls@G
    \let\tabu@ls@G              \tabu@ls@L    % <init>
    \let\tabu@rc@Gsave          \tabu@rc@G
    \let\tabu@rc@G              \tabu@rc@L    % <init>
    \let\tabu@evr@Gsave         \tabu@evr@G
    \let\tabu@evr@G             \tabu@evr@L   % <init>
    \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               % <end of \globaldefs>
    \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}}}
%% The Rewriting 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\\%    <shortcut when no option>
         \def\tabu@rewritten{p}\tabucolX \p@        % <default coef = 1>
    \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: rewriting 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 rewriting process -------------------------------
\tabu@newcolumntype \tabu@rewritefirst{%
    \iftabu@long    \aftergroup \tabu@longpream  % <the whole implementation is here !>
    \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     % <siunitx S and s columns>
            \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 <original>
    \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 (inherited 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  % <trials group>
    \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{% <arydshln in nested trials - problem for global column counters!>
    \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                      % <for ialign>
}% \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 % <incompressible material>
    \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
                \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}\egroup    % <got my \tabu@box>
    \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 -------------
\def\tabu@verticalmeasure{\everypar{}%
    \ifnum \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\currentgrouptype=5\vtop
                        \else\ifnum\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       % <got my \tabu@box>
    \@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{%      <local in \noalign>
        \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{%   <local in \noalign>
        \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% <original definition (if fancyvrb is loaded)>
            \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}{Overwriting}}%
        \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}% <for \tabu@message@save>
    \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@   % <first initialisation>
            \@tempcnta  \@M   % <not initialized by array.sty>
            \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 % <only once>
                    \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  % <colortbl + arydshln>
        \def\tabu@endarray{%
            \adl@endarray \egroup \adl@arrayrestore \CT@end \egroup %<original>
            \@arrayright      % <FC>
            \gdef\@preamble{}}% <FC>
        \else                 % <colortbl / no arydshln>
        \def\tabu@endarray{%
            \crcr \egroup \egroup    %<original>
            \@arrayright             % <FC>
            \gdef\@preamble{}\CT@end}%
        \fi
    \else
        \ifdefined\adl@array  % <arydshln / no colortbl>
        \def\tabu@endarray{%
            \adl@endarray \egroup \adl@arrayrestore \egroup %<original>
            \@arrayright      % <FC>
            \gdef\@preamble{}}% <FC>
    \else                   % <no arydshln / no colotbl + \@arrayright missing>
        \PackageWarning{tabu}
        {\string\@arrayright\space is missing from the
        \MessageBreak definition of \string\endarray.
        \MessageBreak Compatibility 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 % <FC> @-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
    \egroup \egroup
    \adl@colhtdp \box\adl@box \hfil
}% \tabu@adl@act@endpbox
\def\tabu@adl@fix {%
    \let\adl@xarraydashrule \tabu@adl@xarraydashrule % <fix> arydshln
    \let\adl@act@endpbox    \tabu@adl@act@endpbox    % <fix> arydshln
    \let\adl@act@@endpbox   \tabu@adl@act@endpbox    % <fix> arydshln
    \let\@preamerror        \@preamerr               % <fix> arydshln
}% \tabu@adl@fix
%% Correction for longtable' \@startbox definition ------------------
%%    => \everypar is ``missing'' : TeX should be in vertical mode
\def\tabu@LT@startpbox #1{%
    \bgroup
        \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       % <colortbl>
                                \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   % <siunitx: ok>
            \expandafter\ifx
                \csname siunitx_table_collect_begin:Nn\endcsname\relax 0\fi\fi\relax
            \tabu@siunitxtrue
    \else   \let\tabu@maybesiunitx   \@firstofone                % <not siunitx: setup>
            \let\tabu@siunitx        \tabu@nosiunitx
            \tabu@siunitxfalse
    \fi
    \ifdefined\adl@array        % <arydshln>
    \else     \let\tabu@adl@fix \relax
              \let\tabu@adl@endtrial \@empty \fi
    \ifdefined\longtable        % <longtable>
    \else     \let\longtabu \tabu@nolongtabu \fi
    \ifdefined\cellspacetoplimit \tabu@warn@cellspace\fi
    \csname\ifcsname ifHy@hyperfootnotes\endcsname % <hyperfootnotes>
            ifHy@hyperfootnotes\else iffalse\fi\endcsname
        \let\tabu@footnotetext \tabu@Hy@ftntext
        \let\tabu@xfootnote    \tabu@Hy@xfootnote \fi
    \ifdefined\FV@DefineCheckEnd% <fancyvrb>
            \tabu@fancyvrb  \fi
    \ifdefined\color            % <color / xcolor>
        \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    % <ragged2e>
        \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% <fix for colortbl & arydshln (delarray)>
    \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 environment}%
}% \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 % <init>
\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                   % <pdfTeX>
        \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'.

/* [<][>][^][v][top][bottom][index][help] */