%%
%% This is file `sref.sty',
%% generated with the docstrip utility.
%%
%% The original source files were:
%%
%% sref.dtx  (with options: `package')
%% 
\NeedsTeXFormat{LaTeX2e}[1999/12/01]
\ProvidesPackage{sref}[2016/04/07 v1.2 Semantic Cross-References]
\newif\ifextrefs\extrefsfalse
\DeclareOption{extrefs}{\extrefstrue}
\ProcessOptions
\RequirePackage{metakeys}
\RequirePackage{xspace}
\RequirePackage{etoolbox}
\addmetakey{sref}{linktext}
\addmetakey{sref}{fallback}
\addmetakey{sref}{pre}
\addmetakey{sref}{post}
\newcommand\sref[2][]{%
  \metasetkeys{sref}{#1}%
  \ifcsundef{sref@part}{%
    \sref@hlink[\sref@linktext]{#2}{\sref@fallback}{\sref@pre}{\sref@post}%
  }{%
    \sref@hlink[\sref@linktext]{\sref@part @#2}{\sref@fallback}{\sref@pre}{\sref@post}%
  }%
  \xspace%
}%
\newcommand\srefs[3][]{%
  \def\@test{#1}%
  \ifx\@test\@empty%
    \sref{#2} and \sref{#3}%
  \else%
    #1%
  \fi%
}%
\newcommand\srefl[3][]{%
  \def\@test{#1}%
  \ifx\@test\@empty%
    \sref{#2} to \sref{#3}%
  \else%
    #1%
  \fi%
}%
\newcommand\spageref[1]{%
  \ifcsundef{sref@part}{%
    \sref@pageref{#1}%
  }{%
    \sref@pageref{\sref@part @#1}%
  }%
}%
\newif\ifhref\hreffalse%
\AtBeginDocument{%
  \@ifpackageloaded{hyperref}{%
    \hreftrue%
  }{%
    \hreffalse%
  }%
}%
\newcommand\sref@href@ifh[2]{%
  \ifhref%
    \href{#1}{#2}%
  \else%
    #2%
  \fi%
}%
\newcommand\sref@hlink@ifh[2]{%
  \ifhref%
    \hyperlink{#1}{#2}%
  \else%
    #2%
  \fi%
}%
\newcommand\sref@target@ifh[2]{%
  \ifhref%
    \hypertarget{#1}{#2}%
  \else%
    #2%
  \fi%
}%
\def\sref@target{%
  \ifx\sref@id\@empty%
    \relax%
  \else%
    \edef\@target{sref@\ifcsundef{sref@part}{}{\sref@part @}\sref@id @target}%
    \sref@target@ifh\@target{}%
  \fi%
}%
\newcommand\@sref@def[3]{\csgdef{sref@#1@#2}{#3}}
\ifextrefs%
  \newwrite\refs@file%
\else%
  \def\refs@file{\@auxout}%
\fi%
\newcommand\sref@def[3]{%
  %\@sref@def{#1}{#2}{#3}%
  \protected@write\refs@file{}{\string\@sref@def{#1}{#2}{#3}}%
}%
\addmetakey{srefaddidkey}{prefix}
\newcommand\srefaddidkey[2][]{%
  \metasetkeys{srefaddidkey}{#1}%
  \@metakeys@ext@clear@keys{#2}{sref@id}{}% id cannot have a default
  \metakeys@ext@clear@keys{#2}{id}{}%
  \metakeys@ext@showkeys{#2}{id}%
  \define@key{#2}{id}{%
    \edef\sref@id{\srefaddidkey@prefix ##1}%
   %\expandafter\edef\csname #2@id\endcsname{\srefaddidkey@prefix ##1}%
    \csedef{#2@id}{\srefaddidkey@prefix ##1}%
  }%
}%
\newcommand\makeextrefs[1]{%
  \gdef\sref@part{#1}%
  \makeatletter%
  \IfFileExists{\jobname.refs}{\input{\jobname.refs}}{}%
  \immediate\openout\refs@file=\jobname.refs
  \makeatother%
}%
\newcommand\sref@label[2]{%
  \sref@def{\ifcsundef{sref@part}{}{\sref@part @}#2}{page}{\thepage}%
  \sref@def{\ifcsundef{sref@part}{}{\sref@part @}#2}{label}{#1}%
}%
\newcommand\sreflabel[2]{\sref@label{#1 \@currentlabel}{#2}}
\newcommand\sref@label@id[1]{%
  \ifx\sref@id\@empty%
    \relax%
  \else%
    \sref@label{#1}{\sref@id}%
  \fi%
}%
\newcommand\sref@label@id@arg[2]{%
  \def\@@id{#2}
  \ifx\@@id\@empty%
    \relax%
  \else%
    \sref@label{#1}{\@@id}%
  \fi%
}%
\newcommand\sref@hlink[5][]{%
  \edef\@linktext{#1}%
  \edef\@fallback{#3}%
  \ifcsundef{sref@#2@label}{%
    \ifx\@fallback\@empty% warn about undefined links and show a substitute
      \protect\G@refundefinedtrue\@latex@warning{reference #2 undefined}%
      \ifx\@linktext\@empty%
        ?#2?%
      \else%
        \@linktext%
      \fi%
    \else%
      \protect\G@refundefinedtrue\@latex@warning{using fallback for undefined reference #2}%
      \@fallback%
    \fi
  }{%
    \edef\@link{#4\@nameuse{sref@#2@label}#5}% retrieve the reference label and prepost it
    \ifx\@linktext\@empty%
      \sref@hlink@ifh{sref@#2@target}{\@link}%
    \else%
      \sref@hlink@ifh{sref@#2@target}{\@linktext}%
    \fi%
  }%
}%
\newcommand\sref@page@label[1]{p.~{#1}}
\newcommand\sref@pageref[1]{%
  \ifcsundef{sref@#1@page}{%
    \protect\G@refundefinedtrue\@latex@warning{reference #1 undefined}\sref@page@label{??}%
  }{%
    \sref@hlink@ifh{sref@#1@target}{\sref@page@label{\@nameuse{sref@#1@page}}}%
  }%
}%
\newcommand\sref@href[3][]{%
  \edef\@linktext{#1}%
  \ifcsundef{sref@#2@label}{%
    \protect\G@refundefinedtrue\@latex@warning{reference #2 undefined}??%
  }{%
    \ifcsundef{sref@#3@URI}{%
      \protect\G@refundefinedtrue\@latex@warning{external refs of type  #3 undefined}??%
    }{%
      \edef\@uri{\@nameuse{sref@#3@URI}.pdf\#sref@#2@target}%
      \edef\@label{\ifx\@linktext\@empty\@nameuse{sref@#2@label}\else\@linktext\fi}%
      \sref@href@ifh\@uri\@label%
    }%
  }%
}%
\ifextrefs%
  \newcommand\extref[3][]{%
    \def\theextref{\sref@href[#1]{#2@#3}{#2}}%
    \csname doextref@#2\endcsname%
  }%
\else%
  \newcommand\extref[3][]{\sref[#1]{#3}}%
\fi%
\ifextrefs%
  \newcommand\extpageref[3][]{%
    \def\theextref{\sref@pageref{#2@#3}}%
    \csname doextpageref@#2\endcsname%
  }%
\else%
  \newcommand\extpageref[3][]{\spageref{#3}}%
\fi%
\newcommand\extrefstyle[2]{\csgdef{doextref@#1}{#2}}%
\newcommand\extpagerefstyle[2]{\csgdef{doextpageref@#1}{#2}}%
\newcommand\inputrefs[2]{%
 %\@namedef{sref@#1@URI}{#2}%
  \csdef{sref@#1@URI}{#2}%
  \extrefstyle{#1}{\theextref}\extpagerefstyle{#1}{\theextref}%
  \makeatletter%
  \IfFileExists{#2.refs}{%
    \message{Reading external references: #2.refs}\input{#2.refs}%
  }{%
    \PackageError{sref}{Reference file #2.refs does not exist}%
    {Maybe you have to run LaTeX on #2.tex first}}%
  \makeatother%
}%
\srefaddidkey{sequation}%
\def\sref@sequation@heading{equation}%
\newenvironment{sequation}[1][]{%
  \metasetkeys{sequation}{#1}%
  \ifx\sref@id\@empty%
    \begin{displaymath}%
  \else% no id, using equation*
    \begin{equation}%
    \sref@target\sref@label@id{\sref@sequation@heading~(\theequation)}%
  \fi%
}{%
  \ifx\sref@id\@empty%
    \end{displaymath}%
  \else%
    \end{equation}%
  \fi%
}%
\newenvironment{seqnarray}[1][]{%
  \metasetkeys{sequation}{#1}%
  \begin{eqnarray*}%
  \sref@target%
  \sref@label@id{\sref@sequation@heading~(\theequation)}%
}{%
  \end{eqnarray*}%
}%
\newcommand\withcite[2]{#2~\cite{#1}}%
\newenvironment{withcitation}[1]{\def\citeit{\cite{#1}}}{}%
\endinput
%%
%% End of file `sref.sty'.
