%% -*-mode: tex-mode -*-

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Written and (C) by Jérôme Lelong <[email protected]>            %%
%%                                                                       %%
%% This program is free software; you can redistribute it and/or modify  %%
%% it under the terms of the GNU General Public License as published by  %%
%% the Free Software Foundation; either version 3 of the License, or     %%
%% (at your option) any later version.                                   %%
%%                                                                       %%
%% This program is distributed in the hope that it will be useful,       %%
%% but WITHOUT ANY WARRANTY; without even the implied warranty of        %%
%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         %%
%% GNU General Public License for more details.                          %%
%%                                                                       %%
%% You should have received a copy of the GNU General Public License     %%
%% along with this program.  If not, see <http://www.gnu.org/licenses/>. %%
%%                                                                       %%
%% This file is part of the chklref package.                             %%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


\NeedsTeXFormat{LaTeX2e}%
\ProvidesPackage{chklref}%
\RequirePackage{afterpackage}%

\gdef\CHK@stack{}

\newwrite\CHK@write
\immediate\openout\CHK@write\jobname.chk%
\def\CHK@immediate@write{\immediate\write}
\def\CHK@print#1{%
 \protect\CHK@immediate@write\CHK@write{#1}%
}

% Make sure the auxiliary files are still suitable for usage without the
% chklref package.
\RequirePackage{auxhook}
\AddLineBeginAux{\string\let\string\CHK@immediate@write\string\@gobbletwo}
\let\@starttoc@orig\@starttoc
\def\@starttoc#1{%
 \@starttoc@orig{#1}%
 \addtocontents{#1}{\string\let\string\CHK@immediate@write\string\@gobbletwo}
}

% Track the name of the file currently processed.
% This is successfuly done by currfile for
% \include{toto}, \input{toto} but NOT \input toto
% So we need an extra trick, but do it as late as possible.
\RequirePackage{currfile}
\def\CHK@currentfile{\expandafter\expandafter\currfilename}
\def\CHK@@input#1 {\input{#1}}
\AtBeginDocument{%
 \def\input{\@ifnextchar\bgroup\@iinput\CHK@@input}
}

\def\CHK@redefine#1#2{%
 \expandafter\let\csname CHK@#1@orig\expandafter\endcsname\csname#1\endcsname%
 \expandafter\def\csname#1\endcsname##1{%
   \CHK@print{#2{##1} line \the\inputlineno\space file \CHK@currentfile}%
   \expandafter\expandafter\csname CHK@#1@orig\endcsname{##1}}
}

\def\CHK@redefine@#1#2{%
 \expandafter\let\csname CHK@#1@orig\expandafter\endcsname\csname#1\endcsname%
 \expandafter\def\csname#1\endcsname##1{%
   \CHK@print{#2 ##1 line \the\inputlineno\space file \CHK@currentfile}%
   \expandafter\expandafter\csname CHK@#1@orig\endcsname{##1}}
}

\CHK@redefine{begin}{begin}
\CHK@redefine{end}{end}

\AfterPackage{hyperref}{
 \AtBeginDocument{%
   \let\CHK@label@orig=\label
   \def\label#1{%
     \CHK@print{label #1 line \the\inputlineno\space file \CHK@currentfile}%
     \CHK@label@orig{#1}}

   \Hy@SetCatcodes
   \def\HyPsd@ref#1{\HyPsd@@ref#1*\END}%
   \def\HyPsd@@ref#1*#2\END{%
     \ifx\\#2\\%
       \HyPsd@@@ref{#1}%
     \else
       \expandafter\HyPsd@@@ref
     \fi
   }%
   \def\HyPsd@@@ref#1{%
     \expandafter\ifx\csname r@#1\endcsname\relax
       ??%
     \else
       \expandafter\expandafter\expandafter\@car\csname r@#1\endcsname\@nil
     \fi
     \CHK@print{ref #1 line \the\inputlineno\space file \CHK@currentfile}%
   }
   \let\ref=\HyPsd@ref
   \Hy@RestoreCatcodes
 }
}

\AtBeginDocument{%
 \newif\ifCHK@hyperref
 \newif\ifCHK@amsmath
 \@ifpackageloaded{hyperref}{\CHK@hyperreftrue}{}
 \@ifpackageloaded{amsmath}{\CHK@amsmathtrue}{}

 \ifCHK@amsmath% %With AMS-LaTeX tags
    %%\CHK@redefine{label@in@display}{label@in@display}
    \let\CHK@label@in@display@orig=\label@in@display
    \def\label@in@display#1{%
      \CHK@print{label #1 line \the\inputlineno\space file \CHK@currentfile}
      \CHK@label@in@display@orig{#1}}

    \CHK@redefine@{eqref}{ref}
    \CHK@redefine@{ref}{ref}
    \CHK@redefine@{label}{label}
    \CHK@redefine@{citation}{citation}
    \CHK@redefine@{bibcite}{bibcite}

 \else
   \ifCHK@hyperref\else
     \CHK@redefine@{label}{label}
     \CHK@redefine@{ref}{ref}
     \CHK@redefine@{citation}{citation}
     \CHK@redefine@{bibcite}{bibcite}
   \fi
 \fi
}

\AtEndDocument{
 \message{\CHK@stack}
}
% To prevent error with packages already defining the \AfterPackage macro.
\let\AfterPackage=\relax
\endinput