% refcheck.sty % checks lost and useless labels, shows `keys' of \label % in the margins % % version 1.9.1 for LaTeX2e, 14 February 2013 % (minor correction of ver. 1.9, issued on 31 March 2004) % % Copyright 1997--2004, 2013 by Oleg Motygin % (mov222@gmail.com, mov@mail15.com) % this program is free software; you can redistribute it and/or % modify it under the terms of the GNU General Public License % % Usage is \usepackage{refcheck} with options showrefs, norefs, showcites, % nocites, msgs, nomsgs, chkunlbld, ignoreunlbld % % Options showrefs and norefs, e.g. \usepackage[showrefs]{refcheck} % sets on and off (`on' is default) writing label keys to output margins. % '{?}' instead of a key means that the equation is not labelled. % '?'s appear around a label name if the label is not used in references. % % Option showcites and nocites sets on and off (`on' is default) % refcheck to show keys of bibitems in the margins. % % Options msgs (default) and nomsgs state whether refcheck writes % its messages to .log file or not. % The messages have the format % Package refcheck Warning: Unused bibitem.. % Package refcheck Warning: Unused label.. % Package refcheck Warning: Unlabelled equation.. % % The check of unlabelled equations can be switched off by the option % ignoreunlbld and on (default) by the option chkunlbld. % % refcheck generally works with AMS-LaTeX and HyperRef % but amsmath and/or hyperref packages must be loaded before % the refcheck package. % % refcheck can be used with the xr package. Suppose one invokes % \usepackage{xr} \externaldocument[A:]{apps} in document foo1.tex and % \usepackage{xr} \externaldocument[B:]{apps} in document foo2.tex. % Then the commands \refcheckxrdoc[A:]{foo1} and \refcheckxrdoc[B:]{foo2} % used in apps.tex allows to check usage of labels from apps.tex in the % external files foo1.tex and foo2.tex. % % NOTE the problem with implicitly cited labels. % For example, if there is a set of equations which are % labelled by a1, a2,... an and referred in document by % (\ref{a1})--(\ref{an}), then the labels a2, a3,...an-1 % cannot be recognized as `used'. % \def\filename{refcheck} \def\fileversion{v1.9.1} \def\filedate{2013/02/14} \NeedsTeXFormat{LaTeX2e} \ProvidesPackage{refcheck}[2013/02/14 v1.9.1] \let\mark@size=\footnotesize \newif\if@labelled \@labelledfalse \newif\if@show@ref \newif\if@show@cite \newif\if@give@msgs \newif\if@show@unl@bld \def\set@fbox@par{\fboxrule=0.01em\fboxsep=0.2em} \def\unl@bld@mark{{\mark@size\textup{\{\textbf{?}\}}}} \DeclareOption{showrefs}{\@show@reftrue} \DeclareOption{showcites}{\@show@citetrue} \DeclareOption{msgs}{\@give@msgstrue} \DeclareOption{chckunlbld}{\@show@unl@bldtrue} \DeclareOption{norefs}{\@show@reffalse} \DeclareOption{nocites}{\@show@citefalse} \DeclareOption{nomsgs}{\@give@msgsfalse} \DeclareOption{ignoreunlbld}{\@show@unl@bldfalse} \ExecuteOptions{showrefs,showcites,msgs,chckunlbld} \ProcessOptions\relax \def\showrefnames{\global\@show@reftrue} \def\norefnames{\global\@show@reffalse} \def\showcitenames{\global\@show@citetrue} \def\nocitenames{\global\@show@citefalse} \def\setonmsgs{\global\@give@msgstrue} \def\setoffmsgs{\global\@give@msgsfalse} \def\checkunlbld{\global\@show@unl@bldtrue} \def\ignoreunlbld{\global\@show@unl@bldfalse} \def\@warning@rc@#1{\if@give@msgs\PackageWarning{refcheck}{#1}\else\relax\fi} \newif\if@unsdlbl \newtoks\btoks \AtBeginDocument{% \typeout{Package: `refcheck' v1.9.1\space<2013/02/14>}% \typeout{options: showrefs, showcites, msgs, chckunlbld}% \immediate\write\@auxout{% \string\providecommand\string{\string\usedref\string}[1]% \string{\string\relax\string}}% \let\@@ref@@=\ref \let\@@pageref@@=\pageref \let\@@bibitem@@=\bibitem \let\@@@biblabel@@=\@biblabel \let\@@label@@=\label \renewcommand{\label}[1]{\@bsphack\global\@labelledtrue \gdef\last@lbl{\@verbatim@{#1}}% \@ifundefined{lab@#1}{\global\@unsdlbltrue \@warning@rc@{Unused label `#1'}}% {\global\@unsdlblfalse}% \ifmmode\relax\else {\setbox0=\vbox{\vss\@setnmmarginlbl}% \wd0=0pt\ht0=0pt\dp0=0pt% \ifvmode \@tempdima=\prevdepth \nointerlineskip\box0\nobreak \prevdepth=\@tempdima \else \vadjust{\box0\nobreak}% \fi}% \fi \@@label@@{#1}\@esphack}% \expandafter\DeclareRobustCommand\expandafter {\csname relax\string\ref\endcsname}[1]{\@@ref@@{#1}\wrtusdrf{#1}}% \expandafter\let\expandafter\ref\csname relax\string\ref\endcsname \expandafter\DeclareRobustCommand\expandafter {\csname relax\string\pageref\endcsname}[1]{\@@pageref@@{#1}\wrtusdrf{#1}}% \expandafter\let\expandafter\pageref\csname relax\string\pageref\endcsname % \def\@bibitem@proceed@#1{% \@ifundefined{cit@#1}{\@warning@rc@{Unused bibitem `#1'}% \if@show@cite \gdef\@biblabel{\makebox[0pt][r]{\zero@height{{\mark@size{\bfseries\upshape?}}% \underline{\@verbatim@{#1}}{\mark@size{\bfseries\upshape?}}$\,$}}% \@@@biblabel@@}% \fi }{% \if@show@cite \set@fbox@par \gdef\@biblabel{\makebox[0pt][r]{\zero@height{\fbox{\@verbatim@{#1}}$\,$}}\@@@biblabel@@}% \fi }}% \def\bibitem{\@ifnextchar[\@lbibitem@rc@\@bibitem@rc@}% \def\@lbibitem@rc@[#1]#2{% \@bibitem@proceed@{#2}\@@bibitem@@[#1]{#2}}% \def\@bibitem@rc@#1{% \@bibitem@proceed@{#1}\@@bibitem@@{#1}}% % \@ifpackageloaded{amsmath}{% With AMS-LaTeX tags \let\@@label@@in@@=\label@in@display \def\label@in@display#1{\@bsphack\global\@labelledtrue \gdef\last@lbl{\@verbatim@{#1}}% \@ifundefined{lab@#1}{% \global\@unsdlbltrue \@warning@rc@{Unused label `#1'}}% {\global\@unsdlblfalse}% \@@label@@in@@{#1}\@esphack }% \let\@@eqref@@=\eqref \let\@tagform@@@@=\tagform@ \expandafter\DeclareRobustCommand\expandafter {\csname relax\string\eqref\endcsname}[1]% {{\let\tagform@=\@tagform@@@@\@@eqref@@{#1}}}% \expandafter\let\expandafter\eqref\csname relax\string\eqref\endcsname \def\tagform@#1{\@tagform@@@@{#1}% \ifmeasuring@\relax\else\if@display \if@labelled\relax\else\if@show@unl@bld \@warning@rc@{Unlabelled equation (\theequation)}% \fi\fi \@setmarginlbl \fi\fi }% }{\let\@@eqnnum@@=\@eqnnum \def\@eqnnum{% \if@labelled\relax\else\if@show@unl@bld \@warning@rc@{Unlabelled equation (\theequation)}% \fi\fi \@@eqnnum@@ \@setmarginlbl }% }}% \def\@setmarginlbl{% \if@show@ref \if@labelled \set@fbox@par \if@unsdlbl \makebox[0pt][l]{\zero@height{$\,${\mark@size {\bfseries\upshape?}\underline{\last@lbl}{\bfseries\upshape?}}}}% \else \makebox[0pt][l]{\zero@height{$\,$\fbox{{\mark@size\last@lbl}}}}% \fi \else \if@show@unl@bld \makebox[0pt][l]{\zero@height{$\,$\unl@bld@mark}}% \fi\fi \fi \global\@labelledfalse } \def\@setnmmarginlbl{% \if@show@ref \set@fbox@par \if@unsdlbl \hbox to \textwidth{\makebox[0pt][r]{{\mark@size{\bfseries \upshape?}$\langle$\last@lbl$\rangle${\bfseries \upshape?}}$\,$}\hfill}% \else \hbox to \textwidth{\makebox[0pt][r]{{\mark@size$\langle$% \last@lbl$\rangle$}$\,$}\hfill}% \fi \fi \global\@labelledfalse } \def\zero@height#1{\setbox0=\hbox{#1}\dp0=0pt\ht0=0pt\copy0} \long\def\@verbatim@#1{\edef\next{#1}% {\mark@size\ttfamily\upshape\frenchspacing\expandafter\@strip@\meaning\next}} \def\@strip@#1>{} \def\usedref#1{\@ifundefined{lab@#1}{\global\@namedef{lab@#1}{}}{}} \let\@@citation@@=\citation \renewcommand{\citation}[1]{\@@citation@@{#1}% \@for\@tempa:=#1\do{\@ifundefined{cit@\@tempa}% {\global\@namedef{cit@\@tempa}{}}{}}% } \DeclareRobustCommand{\wrtusdrf}[1]{% \@ifundefined{la@#1}{\global\@namedef{la@#1}{}% \used@write{#1}{\usedref}}{\null}} \def\used@write#1#2{% \protected@write, but \immediate \@bsphack \begingroup \let\thepage\relax \let\protect\@unexpandable@protect \edef\reserved@a{\immediate\write\@auxout{\string#2{#1}}}% \reserved@a \endgroup \if@nobreak\ifvmode\nobreak\fi\fi \@esphack } \def\refcheckxrdoc{\@ifnextchar[\rchXD@{\rchXD@[]}} \def\rchXD@[#1]#2{{% \makeatletter \xdef\rchXD@prefix{#1}% \rchXD@next#2.aux\relax\\}} \def\rchXD@next#1\relax#2\\{% \edef\rchXD@list{#2}% \rchXD@loop{#1}} \def\rchXD@aux{% \ifx\rchXD@list\@empty\else\expandafter\rchXD@explist\fi} \def\rchXD@explist{\expandafter\rchXD@next\rchXD@list\\} \def\rchXD@loop#1{\openin\@inputcheck#1\relax \ifeof\@inputcheck \PackageWarning{refcheck}{^^JNo file #1^^JLABELS USAGE NOT IMPORTED.^^J}% \expandafter\rchXD@aux \else \PackageInfo{refcheck}{IMPORTING LABELS USAGE FROM #1}% \expandafter\rchXD@read \fi } \def\rchXD@read{% \read\@inputcheck to\rchXD@line \expandafter\rchXD@test\rchXD@line..\rchXD@} \def\cleanprefix#1#2{% \if#1\@empty \usedref{#2}\else \def\@test##1#1##2\@nil{\edef\@tempa{##1}\edef\@tempb{##2}}% \@test#2#1\@nil \ifx\@tempb\@empty \relax\else \ifx\@tempa\@empty \def\@tempb#1##1\@nil{\edef\@tempa{##1}}\@tempb#2\@nil \ifx\@tempa\@empty \relax\else\usedref{\@tempa}\fi \fi\fi \fi } \long\def\rchXD@test#1#2#3\rchXD@{% \ifx#1\usedref \edef\exp@nddef{\noexpand\cleanprefix{\rchXD@prefix}{#2}}% \exp@nddef \else\ifx#1\@input \edef\rchXD@list{\rchXD@list#2\relax}% \fi\fi \ifeof\@inputcheck\expandafter\rchXD@aux \else\expandafter\rchXD@read\fi } \endinput %% %% End of file `refcheck.sty'.