\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{doi}[2018/09/09 handle doi numbers]

%% This style file is based original code written by Heiko Oberdiek 
%% and published on comp.text.tex. It was packaged with permission  
%% as a style file by Maarten Sneep, with some minor changes suggested 
%% by Bruno Voisin to accomodate the Apple pdf framework
%%
%% This code is placed under the LPPL.
%%
%% Original discussion on Google under:
%% http://groups.google.com/group/comp.text.tex/msg/922919daa207d613
%%
%% Comments and bug reports may be submitted via
%% https://github.com/ho-tex/doi/issues
%%
%% You can hyperlink DOI numbers to dx.doi.org. Some publishers have elected to 
%% use some nasty characters in their doi numbering scheme (<, >, ; have all 
%% been spotted). This will either upset (La)TeX, or your pdf reader. This style 
%% file contains a user-level command \doi{}, which takes a doi number, 
%% and creates a hyperlink from it. The format of the doi can be controlled by 
%% redefining the \doitext command, which does not take an argument (unlike the
%% command with the same name in the doipubmed package). 
%%
%% Note: the \doi{} command connot be used within other macros.
 
%% Change history:
%% December 15, 2003: original code posted on Usenet (see link above)
%% Somewhere in 2005: Bruno Voisin suggests some changes to accomodate the 
%%     Apple pdf framework on the Tex on Mac OS X mailing list.
%% April 2007: Maarten packages the lot, and Karl Ove Hufthammer fixes a 
%%     few bugs introduced by Maarten (oops).
%%     A \doitext command is added, following the example from doipubmed.
%%     Some comments are added to make the code a little more readable.
%% July 2007: Michael Orlov sends in a patch to correctly handle underscores.
%% September 2018: David Carlisle for "Oberdiek Package Support Group"
%%     Move to github https://github.com/ho-tex/doi/issues
%%     Add macro defaulting to new
%%     https://doi.org/ URL but may be set to old http://dx.doi.org/
%%


%% We need hyperref, but you probably want to load hyperref 
%% beforehand, or set some options later on.
\RequirePackage{hyperref}

%% To change the default prefix, redefine this command within your own code.
%% It takes no argument, which is different from the doipubmed package.
\newcommand{\doitext}{doi:}

%% To change the default DOI URL resoloution URL, redefine this command
%% within your own code.
%% Previous versions of this package always used http://dx.doi.org/ but
%% The preferred address is now as given here, https://doi.org/
\newcommand{\doiurl}{https://doi.org/}

%% The meat of the code.
%% The first command opens a group, and changes a few catcodes.
\newcommand*{\doi}{% 
  \begingroup 
  \lccode`\~=`\#\relax 
  \lowercase{\def~{\#}}%
  \lccode`\~=`\_\relax
  \lowercase{\def~{\_}}%
  \lccode`\~=`\<\relax 
  \lowercase{\def~{\textless}}%
  \lccode`\~=`\>\relax 
  \lowercase{\def~{\textgreater}}%
  \lccode`\~=0\relax 
  \catcode`\#=\active 
  \catcode`\_=\active 
  \catcode`\<=\active 
  \catcode`\>=\active 
  \@doi
}

%% This is the actual command which processes the argument, with the catcodes 
%% set in the previous command
%% it closes the group, and spits out the url.
\def\@doi#1{% 
  \let\#\relax
  \let\_\relax
  \let\textless\relax 
  \let\textgreater\relax 
  \edef\x{\toks0={{#1}}}% 
  \x
  \edef\#{\@percentchar23}%
  \edef\_{_}%
  \edef\textless{\@percentchar3C}% instead of {\string<} for Apple
  \edef\textgreater{\@percentchar3E}% instead of {\sting>} for Apple
  \edef\x{\toks2={\noexpand\href{\doiurl#1}}}% 
  \x
  \edef\x{\endgroup\doitext\the\toks2 \the\toks0}%
  \x
}

%% That's all folks.
\endinput
