\ProvidesPackage{threeparttablex}[2010/02/12 v0.1 by daleif]

%%
%% This package can 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
%% and version 1.3 or later is part of all distributions of LaTeX
%% version 2003/12/01 or later.
%% 
%% This work has the LPPL maintenance status "maintained".
%% 
%% The Current Maintainer of this work is Lars Madsen (daleif@imf.au.dk).
%%


\newif\ifTPTL@referable
\DeclareOption{referable}{\TPTL@referabletrue}
\DeclareOption*{\PassOptionsToPackage{\CurrentOption}{threeparttable}}

\ProcessOptions\relax

\RequirePackage{threeparttable}
\RequirePackage{environ}


\newcommand\TPTL@font{}
\newcommand\setTableNoteFont[1]{\renewcommand\TPTL@font{#1}}

% length to store the longtable width in
\newlength\TPTL@width
% macro to store the optional argument for tablenotes
\def\TPTL@optarg{}
% wrapper env used to collect the tablenotes for later use
\newenvironment{TableNotes}[1][]{
  \gdef\TPTL@optarg{#1}%
  \Collect@Body\TPTL@collector}{}
\newcommand\TPTL@collector[1]{%
  \long\gdef\TPTL@body{#1}}
% the macro used to store the tablenotes contents
\gdef\TPTL@body{}
\newcommand\insertTableNotes{%
  % first we need to know the width of the longtable, remember that it
  % will only settle after a few compilations
  \noalign{\begingroup
  \setlength\TPTL@width{0pt}
  \renewcommand\LT@entry[2]{\global\advance\TPTL@width by ##2}
  \@nameuse{LT@\roman{LT@tables}}
  \ifdim\TPTL@width<\TPTminimum\relax\global\TPTL@width=\TPTminimum\fi
  \endgroup}
  % then add the table notes inside a \parbox of the required width
  \multicolumn{\LT@cols}{c}{%
    \makebox[0pt][c]{\parbox{\TPTL@width}{%
        \let\TPT@hsize\@empty% otherwise the width is not reset
                             % correctly as \TPT@hsize messes with \@parboxrestore
        \begin{tablenotes}[\TPTL@optarg]%
          \TPTL@font%
          \TPTL@body
        \end{tablenotes}
    }}}}

% the alternative threeparttable env, it only enables \TPToverlap
\newenvironment{ThreePartTable}{\let\TPToverlap\TPTrlap}{}



\ifTPTL@referable\else\endinput\fi

% we only come here if we need to make tablenotes referable


% define an extra \tnote command that table a label instead of a string
\DeclareRobustCommand\tnotex{\@ifstar{\TPTL@tnotex{01}}{\TPTL@tnotex{00}}}

\newcommand\TPTL@tnotex[2]{\tnote{\ref{#2}}}

% if hyperref is loaded we activate a starred version
\AtBeginDocument{%
  \@ifpackageloaded{hyperref}{%
    \renewcommand\TPTL@tnotex[2]{%
      \if#1\relax%
      \tnote{\ref{#2}}%
      \else%
      \tnote{\ref*{#2}}
      \fi}}{}}


\newcommand\TPTL@generator[2]{%
  \providecommand{#1}{}% just to make it exist
  \renewcommand#1[1][#2]{%
    \let\TPTL@oldmakelabel=\makelabel
    \renewcommand\makelabel[1]{\TPTLnotesnamefontcommand{##1:}}
  \item
    \let\makelabel=\TPTL@oldmakelabel}}

\providecommand\TPTLnotename{Note}
\providecommand\TPTLsourcename{Source}
\providecommand\TPTLnotesnamefontcommand{\textit}



\let\TPTL@tablenotes=\tablenotes

% \makelabel (i.e. \item) hides its argument inside a group, making it
% difficult to set \@currentlabel, so we locally overload \item to get
% the argument and set \@currentlabel AFTER \item[...]
\renewcommand\tablenotes{%
  \let\TPTL@item=\item
  \renewcommand\item[1][]{\TPTL@item[##1]%
    \phantomsection\protected@edef\@currentlabel{##1}}
  \TPTL@generator\note{\TPTLnotename}
  \TPTL@generator\source{\TPTLsourcename}
  \TPTL@font\TPTL@tablenotes}

% just in case it is not already there
\providecommand\phantomsection{}


\endinput

The End
