% \iffalse
% ----------------------------------------------------------------
% The achemso package - A BibTeX style for American Chemical
% Society publications
% Maintained by Joseph A. Wright
% E-mail: joseph.wright@morningstar2.co.uk
% Originally developed by Mats Dahlgren
%  (c) 1996-98 by Mats Dahlgren
%  (c) 2007 Joseph Wright
% Released under the LaTeX Project Public license v1.3 or later
% ----------------------------------------------------------------
%
%<package>\NeedsTeXFormat{LaTeX2e}[2005/12/01]
%<package>\ProvidesPackage{achemso}
%<package> [2007/01/17 v2.0 Enhancements for ACS publications]
%
%<*driver>
\documentclass[a4paper]{ltxdoc}
\usepackage[T1]{fontenc}
\usepackage[english,UKenglish]{babel}
\usepackage{achemso,rsc,booktabs,array,url}
\EnableCrossrefs
%\DisableCrossrefs   % Say \DisableCrossrefs if index is ready
\RecordChanges                  % Gather update information
\CodelineIndex                  % Index code by line number
%\OnlyDescription
\GetFileInfo{achemso.sty}
\title{The \textsf{achemso} package --- A BibTeX style for American
        Chemical Society publications\thanks{This file has version
        number \fileversion, last revised \filedate.}}
\author{Joseph Wright
        \thanks{E-mail:
        joseph.wright@morningstar2.co.uk}}
\date{\filedate}
\begin{document}
  \DocInput{achemso.dtx}
\end{document}
%</driver>
% \fi
% \CheckSum{73}
% \changes{v1.0}{1998/06/01}{Initial release of package by Mats Dahlgren}
% \changes{v2.0}{2007/01/17}{Re-write of package by Joseph Wright}
% \changes{v2.0}{2007/01/17}{Several improvements to BibTeX style files}
% \changes{v2.0}{2007/01/17}{License changed to LPPL}
%
% \DoNotIndex{\def,\else,\fi,\global,\texttt,\ifx,\newif,\undefined}
% \DoNotIndex{\ProcessOptions,\DeclareOption,\OptionNotUsed,\@gobble}
% \DoNotIndex{\RequirePackage,\PackageWarning,\renewcommand,\@eha}
% \DoNotIndex{\@ifpackageloaded,\PackageError,\relax}
%
% \maketitle
%
% \begin{abstract}
% The |achemso| package provides a BibTeX style in accordance with
% the requirements of the journals of the American Chemical Society,
% along with a supporting LaTeX package file. Also provided is a
% BibTeX style file to be used for bibliography database listings.
% \end{abstract}
%
% \section{Introduction}
%
% Although synthetic chemists do not, in the main, use LaTeX for the
% preparation of journal articles, it would be nice to be able to use
% it for reports.  Some (mainly) physical chemistry journals do
% also accept LaTeX submissions, and so the need for BibTeX styles
% for chemistry is real. The package |achemso| provides for a BibTeX
% style and other support for articles and reports in the style of
% the American Chemical Society (A.C.S.).  Journals which use the
% standard A.C.S. citation style are summarised in
% \ref{tbl:journals}.
% \begin{table}
%   \begin{tabular}{>{\itshape}l>{\itshape}l}
%     \toprule
%     \upshape{Journal Title} & \upshape{Abbreviation} \\
%     \midrule
%     Journal of the American Chemical Society & J.~Am.~Chem.~Soc. \\
%     Accounts of Chemical Research & Acc.~Chem.~Res. \\
%     Chemical Reviews & Chem.~Rev. \\
%     Inorganic Chemistry & Inorg.Chem. \\
%     Journal of Medicinal Chemistry & J.~Med.~Chem. \\
%     Journal of Organic Chemistry & J.~Org.~Chem. \\
%     Journal of Physical Chemistry A & J.~Phys.~Chem.~A \\
%     Journal of Physical Chemistry B & J.~Phys.~Chem.~B \\
%     Journal of Physical Chemistry C & J.~Phys.~Chem.~C \\
%     Langmuir & Langmuir \\
%     Macromolecules & Macromolecules \\
%     Nano Letters & Nano Lett. \\
%     Organic Letters & Org.~Lett. \\
%     Organometallics & Organometallics \\
%     \bottomrule
%   \end{tabular}
%   \caption{Journals using the A.C.S.~citation style}
%   \label{tbl:journals}
% \end{table}
%
% This package consists of two BibTeX files (|achemso.bst|
% and |achemsol.bst|) along with a small LaTeX file |achemso.sty|.
% The naming of the package is slightly unusual, but follows from
% the need to pick a unique name.  To quote the documentation to the
% first version:
% \begin{quote}
%   [\dots] there is already a LaTeX 2.09 and
%   BibTeX style package called |acsarticle| and
%   |acs.bst|, which are not ``ACS'' as in `American Chemical
%   Society' (rather, this package is
%   formatting the output according to the instructions of
%   \emph{Advances in Control Systems}).  Hence, \emph{this}
%   new package had to be given another name.  The name of choice
%   was then |achemso|, which is made from the words
%   ``\emph{A}merican \emph{Chem}ical \emph{So}ciety''.
% \end{quote}
%
% \subsection{Change of maintainer}
%
% This package was initially released by Mats Dahlgren.  He no
% longer has time to devote to LaTeX development.  With his permission,
% the package has therefore been taken over by Joseph
% Wright, the maintainer of the the |rsc| package.  The majority of
% the package has been rebuilt and the BibTeX style file has been
% totally overhauled.  Any mistakes are entirely the fault of the
% new maintainer!
%
% \section{The BibTeX style files}
%
% The BibTeX style files implement the bibliographic style specified
% by the A.C.S.\ in \emph{The ACS Style Guide: A Manual for Authors
% and Editors}, on the A.C.S.\ website
% (\url{http://pubs.acs.org/books/references.shtml}) and in current
% A.C.S.~publications.  Some of this information can be
% contradictory; the consensus of current practice in the printed
% journals has been taken as the correct approach.
%
% \subsection{Additional record types}
%
% In general, the database record types supported here follow those
% in the standard BibTeX style files.  Four additional record types
% are provided:
% \begin{description}
%   \item[|patent|] A patent: formatting is similar to other record
%       types.  The data entry for this record type follows the
%       pattern used in |rsc.bst|: |journal| is used to hold
%       the patent type (\emph{e.g.} ``U.S. Pat.''), with the
%       patent number given in |pages|. Whilst this format is
%       non-standard, it is relatively easy to use and implement!
%   \item[|submitted|] Articles submitted to journals but not
%       yet accepted: appends ``submitted'' in a suitable fashion
%       to the entry.
%   \item[|inpress|] Articles in press: appends ``in press'' or,
%       if available, the DOI number assigned to the article.
%   \item[|remark|] A note with no other information to be
%       included.  Output consists purely of the |note| field.
% \end{description}
%
% \subsection{BibTeX database entry requirements}
%
% The requirements for entries in the BibTeX database are slightly
% different using |achemso.bst| to the standard style files. This
% is mainly because some fields are not cited in
% A.C.S.\ bibliographies.   In particular, journal articles do not
% require a title (as the |title| field is ignored).  Articles
% in books only need the title of the book; the title of the
% subunit (given in |title|) is again ignored.
%
% \subsection{The \textsf{annotate} field}
%
% The standard BibTeX styles use the |note| field for notes to be
% added to the citation.  However, it is common to want personal
% notes about references.  This is catered for using the |annotate|
% field.  The style |achemso| ignores the |annotate| field, whilst
% the |achemsol| style appends the |annotate| information to the
% bibliographic output.  Thus |achemsol| is intended for use in
% database maintenance, whilst |achemso| is for production
% bibliographies.
%
% \DescribeMacro{\refin}
% For use in the |annotate| field the macro \cmd{\refin}
% is defined in |achemso.bst| and |achemsol.bst|.
% The command takes a single argument \marg{text}, and
% gives the output \textbf{Referenced in: text}.
% This command takes one argument (normally text) which is
% preceded by the text ``\textbf{Referenced in:} \meta{text}''.
% The |\refin| command is intended for tracking citations
% ``backward'' through the database.  For example, this could be
% used to link citations in a database to the writers own papers.
%
% \subsection{Predefined journal abbreviations}
%
% A number of journal abbreviations are defined in the |.bst| files.
% The abbreviations cover a number A.C.S.\ journals, several other
% physical chemistry publications and other journals listed as
% highly cited by \emph{Chem.\ Abs.}  The interested user should
% consult the |.bst| files for full details.
%
% \section{The LaTeX Package}
%
% The current version of |achemso.sty| is a
% complete re-implementation of the functionality of the original
% file, designed to ensure greater compatibility with other packages.
% The only change for the user is that the bibliography section does
% \emph{not} start a new page when using the |article| document
% class. However, the package now supports all of the standard
% classes, and so the |report| class may be used to ensure a new
% page is started.
%
% \DescribeMacro{\bibliographystyle}
% Loading the |achemso| package adds the appropriate
% \cmd{\bibliographystyle} command to the LaTeX source.  As a result,
% subsequent \cmd{\bibliographystyle} statements will be ignored:
% a suitable warning is given.  The format of citations is altered
% (using the |cite| package), and the package ensures that the
% bibliography will be named ``References'' in all standard document
% types.\footnote{This only works if the |babel| package is
% \emph{not} loaded.}
%
%  The |achemso| package has three options: |note|,
%  |list|, and |number|:
% \begin{description}
%   \item[|note|] If the bibliography contains notes as well
%       as citations, then the section heading should be
%       ``References and Notes''.  This is altered by the
%       |note| package option.
%   \item[|number|] This option numbers the bibliography
%       section (using the |tocbibind| package), and causes it to
%       be entered in the Table of Contents.
%   \item[|list|] This option is intended for creating a listing
%       of the entire BibTeX database.  The BibTeX style is
%       changed to |achemsol|, which will output the additional
%       database field |annotate|, intended for personal notes
%       about a particular database entry.  It also adds the
%       BibTeX key for each citation as a marginal note to the
%       output, using the |showkeys| package.
% \end{description}
%
% \StopEventually{\PrintChanges}
%
% \section{The Package Code}
%
%  The package code is not very complicated.  For the
%  interested reader(s), it is presented here.
%
% \begin{macro}{\ACSver}
% An identifying macro is provided, so that other packages
% can detect the version of achemso in use.
%    \begin{macrocode}
%<*package>
\def\ACSver{\texttt{achemso} v2.0 (2007/01/17)}
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\ACS@sctnnmbr}
% \begin{macro}{\ACS@lst}
% \begin{macro}{\ACS@note}
% \changes{v2.0}{2007/01/17}{Boolean values made internal to package}
% Three Boolean values are used to handle the options.
%    \begin{macrocode}
\newif \ifACS@sctnnmbr \ACS@sctnnmbrfalse
\newif \ifACS@lst      \ACS@lstfalse
\newif \ifACS@note     \ACS@notefalse
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% The options are processed, and the |cite| package is loaded to
% sort and compress references correctly.  The ACS also have
% no gaps in between reference numbers, so the |nospace| option
% is used.
%    \begin{macrocode}
\DeclareOption{note}{\global\ACS@notetrue}
\DeclareOption{number}{\global\ACS@sctnnmbrtrue}
\DeclareOption{list}{\global\ACS@lsttrue}
\DeclareOption*{\OptionNotUsed}
\ProcessOptions
\RequirePackage[super,nospace]{cite}
%    \end{macrocode}
% If the |babel| package is loaded, the |note| option does not
% work.  So it is disabled here with a suitable warning.
%    \begin{macrocode}
 \@ifpackageloaded{babel}
  {\ACS@notefalse\PackageWarning{achemso}%
    {babel package loaded - note option disabled}}
  {\relax}
%    \end{macrocode}
% \begin{macro}{\ACS@biberror}
% The function \cmd{\ACS@biberror} is defined here to provide an
% easy way of generating a warning if there is no name for a
% bibliography section.  This will only happen with non-standard
% class files.
%     \begin{macrocode}
\def\ACS@biberror{\PackageError{achemso}%
  {No bibliography name command defined}\@eha}
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\refname}
% \begin{macro}{\bibname}
% The |note| option renames the references section to
% ``References and Notes''.  This applies for all standard
% document classes.
% The term ``Bibliography'' is not used in chemistry, the value of
% \cmd{\bibname} is redefined here in all cases where it exists.
%     \begin{macrocode}
\ifx\refname\undefined
   \ifx\bibname\undefined
      \ACS@biberror
    \else
      \ifACS@note
        \renewcommand*{\bibname}{References and Notes}
      \else
        \renewcommand*{\bibname}{References}
      \fi
    \fi
 \else
   \ifACS@note
     \renewcommand*{\refname}{References and Notes}
   \fi
\fi
%    \end{macrocode}
% \end{macro}
% \end{macro}
% If the |number| option is set, the |tocbibind| package is
% used to number the bibliography.
% \changes{v2.0}{2007/01/17}{Switched to using \textsf{tocbibind}
% to produce number bibliography}
%    \begin{macrocode}
\ifACS@sctnnmbr
  \RequirePackage[numbib]{tocbibind}
\fi
%    \end{macrocode}
% \begin{macro}{\bibliographystyle}
% Depending on the package option, the bibliography style
% will either be |achemso| or |achemsol|.  The later is intended
% for listing the entire database.  The |list| option of the
% package selects this, and for listing also generates boxed
% labels for each reference.  The |showkeys| package provides
% this functionality.
% \changes{v2.0}{2007/01/17}{Replaced custom code with
% \textsf{showkeys} package}
%    \begin{macrocode}
\ifACS@lst
  \bibliographystyle{achemsol}
  \RequirePackage[notcite]{showkeys}
\else
  \bibliographystyle{achemso}
\fi
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\@biblabel}
% In order to re-format the bibliography labels, the easiest
% method is to redefine the \cmd{\@biblabel} macro from the LaTeX
% kernel.
%    \begin{macrocode}
\def\@biblabel#1{#1.}
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\ACS@bibwarning}
% \begin{macro}{\bibliographystyle}
% To ensure that additional \cmd{\bibliographystyle} commands in the
% source are killed off.  The \cmd{\ACS@bibwarning} provides a clean
% method of generating the warning message.
% \changes{v2.0}{2007-01-17}{Command ignored in document body}
%    \begin{macrocode}
\def\ACS@bibwarning{\PackageWarning{achemso}%
  {Additional bibliographystyle command ignored}}
\def\bibliographystyle{\ACS@bibwarning\@gobble}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% The package is complete.
%    \begin{macrocode}
%</package>
%    \end{macrocode}
%
% \iffalse
%<*bib>
ENTRY
  { address
%<list>    annotate
    author
    booktitle
    chapter
    doi
    edition
    editor
    howpublished
    institution
    journal
    note
    number
    organization
    pages
    publisher
    school
    series
    title
    type
    volume
    year
  }
  {}
  { label }

INTEGERS { output.state before.all mid.sentence after.sentence }
INTEGERS { after.block after.item author.or.editor }

FUNCTION {init.state.consts}
{ #0 'before.all :=
  #1 'mid.sentence :=
  #2 'after.sentence :=
  #3 'after.block :=
  #4 'after.item :=
}

FUNCTION {add.comma}
{ ", " * }

FUNCTION {add.semicolon}
{ "; " * }

FUNCTION {add.colon}
{ ": " * }

STRINGS { s t }

FUNCTION {output.nonnull}
{ 's :=
  output.state mid.sentence =
    { add.comma write$ }
    { output.state after.block =
      { add.semicolon write$
        newline$
        "\newblock " write$
      }
      { output.state before.all =
          'write$
          { output.state after.item =
            { " " * write$ }
            { add.period$ " " * write$ }
          if$
          }
        if$
        }
      if$
      mid.sentence 'output.state :=
    }
  if$
  s
}

FUNCTION {output}
{ duplicate$ empty$
    'pop$
    'output.nonnull
  if$
}

FUNCTION {output.check}
{ 't :=
  duplicate$ empty$
    { pop$ "Empty " t * " in " * cite$ * warning$ }
    'output.nonnull
  if$
}

FUNCTION {output.bibitem}
{ newline$
  "\bibitem{" write$
  cite$ write$
  "}" write$
  newline$
  ""
  before.all 'output.state :=
}

FUNCTION {new.block}
{ output.state before.all =
    'skip$
    { after.block 'output.state := }
  if$
}
%<*list>

FUNCTION {add.note}
{ annotate empty$
    'skip$
    { new.block
      "{\footnotesize " annotate * "}" * output }
  if$
}
%</list>

FUNCTION {fin.entry}
%<list>{ add.note
%<list>  add.period$
%<!list>{ add.period$
  write$
  newline$
}
FUNCTION {not}
{   { #0 }
    { #1 }
  if$
}

FUNCTION {and}
{   'skip$
    { pop$ #0 }
  if$
}

FUNCTION {or}
{   { pop$ #1 }
    'skip$
  if$
}

FUNCTION {field.or.null}
{ duplicate$ empty$
    { pop$ "" }
    'skip$
  if$
}

FUNCTION {emphasize}
{ duplicate$ empty$
    { pop$ "" }
    { "\emph{" swap$ * "}" * }
  if$
}

FUNCTION {boldface}
{ duplicate$ empty$
    { pop$ "" }
    { "\textbf{" swap$ * "}" * }
  if$
}

FUNCTION {paren}
{ duplicate$ empty$
    { pop$ "" }
    { "(" swap$ * ")" * }
  if$
}

FUNCTION {bbl.and}
{ "and" }

FUNCTION {bbl.chapter}
{ "Chapter" }

FUNCTION {bbl.editor}
{ "Ed." }

FUNCTION {bbl.editors}
{ "Eds." }

FUNCTION {bbl.edition}
{ "ed." }

FUNCTION {bbl.etal}
{ "et~al." }

FUNCTION {bbl.in}
{ "In" }

FUNCTION {bbl.inpress}
{ "in press" }

FUNCTION {bbl.msc}
{ "M.Sc.\ thesis" }

FUNCTION {bbl.page}
{ "p" }

FUNCTION {bbl.pages}
{ "pp" }

FUNCTION {bbl.phd}
{ "Ph.D.\ thesis" }

FUNCTION {bbl.submitted}
{ "submitted for publication" }

FUNCTION {bbl.techreport}
{ "Technical Report" }

FUNCTION {bbl.volume}
{ "Vol." }

FUNCTION {bbl.first}
{ "1st" }

FUNCTION {bbl.second}
{ "2nd" }

FUNCTION {bbl.third}
{ "3rd" }

FUNCTION {bbl.fourth}
{ "4th" }

FUNCTION {bbl.fifth}
{ "5th" }

FUNCTION {bbl.st}
{ "st" }

FUNCTION {bbl.nd}
{ "nd" }

FUNCTION {bbl.rd}
{ "rd" }

FUNCTION {bbl.th}
{ "th" }

FUNCTION {eng.ord}
{ duplicate$ "1" swap$ *
  #-2 #1 substring$ "1" =
     { bbl.th * }
     { duplicate$ #-1 #1 substring$
       duplicate$ "1" =
         { pop$ bbl.st * }
         { duplicate$ "2" =
             { pop$ bbl.nd * }
             { "3" =
                 { bbl.rd * }
                 { bbl.th * }
               if$
             }
           if$
          }
       if$
     }
   if$
}

FUNCTION{is.a.digit}
{ duplicate$ "" =
    {pop$ #0}
    {chr.to.int$ #48 - duplicate$
     #0 < swap$ #9 > or not}
  if$
}

FUNCTION{is.a.number}
{
  { duplicate$ #1 #1 substring$ is.a.digit }
    {#2 global.max$ substring$}
  while$
  "" =
}

FUNCTION {extract.num}
{ duplicate$ 't :=
  "" 's :=
  { t empty$ not }
  { t #1 #1 substring$
    t #2 global.max$ substring$ 't :=
    duplicate$ is.a.number
      { s swap$ * 's := }
      { pop$ "" 't := }
    if$
  }
  while$
  s empty$
    'skip$
    { pop$ s }
  if$
}

FUNCTION {bibinfo.check}
{ swap$
  duplicate$ missing$
    { pop$ pop$
      ""
    }
    { duplicate$ empty$
        {
          swap$ pop$
        }
        { swap$
          pop$
        }
      if$
    }
  if$
}

FUNCTION {convert.edition}
{ extract.num "l" change.case$ 's :=
  s "first" = s "1" = or
    { bbl.first 't := }
    { s "second" = s "2" = or
        { bbl.second 't := }
        { s "third" = s "3" = or
            { bbl.third 't := }
            { s "fourth" = s "4" = or
                { bbl.fourth 't := }
                { s "fifth" = s "5" = or
                    { bbl.fifth 't := }
                    { s #1 #1 substring$ is.a.number
                        { s eng.ord 't := }
                        { edition 't := }
                      if$
                    }
                  if$
                }
              if$
            }
          if$
        }
      if$
    }
  if$
  t
}

FUNCTION {tie.or.space.connect}
{ duplicate$ text.length$ #3 <
    { "~" }
    { " " }
  if$
  swap$ * *
}

FUNCTION {space.connect}
{ " " swap$ * * }

INTEGERS { nameptr namesleft numnames }

FUNCTION {format.names}
{ 's :=
  #1 'nameptr :=
  s num.names$ 'numnames :=
  numnames 'namesleft :=
  numnames #15 >
    { s #1 "{vv~}{ll,}{~jj,}{~f.}" format.name$ 't :=
      t bbl.etal space.connect
    }
    {
       { namesleft #0 > }
       { s nameptr "{vv~}{ll,}{~jj,}{~f.}" format.name$ 't :=
           nameptr #1 >
             { namesleft #1 >
               { add.semicolon t * }
               { numnames #2 >
                 { "" * }
                 'skip$
               if$
               t "others," =
                 { bbl.etal space.connect }
                 { add.semicolon t * }
               if$
               }
             if$
             }
           't
         if$
         nameptr #1 + 'nameptr :=
         namesleft #1 - 'namesleft :=
         }
     while$
  }
  if$
}

FUNCTION {format.authors}
{ author empty$
    { "" }
    { #1 'author.or.editor :=
      author format.names }
  if$
}

FUNCTION {format.editors}
{ editor empty$
    { "" }
    { #2 'author.or.editor :=
      editor format.names
      add.comma
      editor num.names$ #1 >
        { bbl.editors }
        { bbl.editor }
      if$
      *
    }
  if$
}

FUNCTION {n.separate.multi}
{ 't :=
  ""
  #0 'numnames :=
  t text.length$ #4 > t is.a.number and
    {
      { t empty$ not }
      { t #-1 #1 substring$ is.a.number
          { numnames #1 + 'numnames := }
          { #0 'numnames := }
        if$
        t #-1 #1 substring$ swap$ *
        t #-2 global.max$ substring$ 't :=
        numnames #4 =
          { duplicate$ #1 #1 substring$ swap$
            #2 global.max$ substring$
            "," swap$ * *
            #1 'numnames :=
          }
          'skip$
        if$
      }
      while$
    }
    { t swap$ * }
  if$
}

FUNCTION {format.bvolume}
{ volume empty$
    { "" }
    { bbl.volume volume tie.or.space.connect }
  if$
}

FUNCTION {format.title.noemph}
{ 't :=
  t empty$
    { "" }
    { t }
  if$
}

FUNCTION {format.title}
{ 't :=
  t empty$
    { "" }
    { t emphasize }
  if$
}

FUNCTION {format.number.series}
{ volume empty$
    { number empty$
       { series field.or.null }
       { series empty$
         { "There is a number but no series in " cite$ * warning$ }
         { series number space.connect }
       if$
       }
      if$
    }
    { "" }
  if$
}

FUNCTION {n.dashify} { 't :=
  ""
    { t empty$ not }
    { t #1 #1 substring$ "-" =
    { t #1 #2 substring$ "--" = not
        { "--" *
          t #2 global.max$ substring$ 't :=
        }
        {   { t #1 #1 substring$ "-" = }
        { "-" *
          t #2 global.max$ substring$ 't :=
        }
          while$
        }
      if$
    }
    { t #1 #1 substring$ *
      t #2 global.max$ substring$ 't :=
    }
      if$
    }
  while$
}

FUNCTION {format.date}
{ year empty$
    { "" }
    { year boldface }
  if$
}

FUNCTION {format.bdate}
{ year empty$
    { "There's no year in " cite$ * warning$ }
    'year
  if$
}

FUNCTION {either.or.check}
{ empty$
    'pop$
    { "Can't use both " swap$ * " fields in " * cite$ * warning$ }
  if$
}

FUNCTION {format.edition}
{ edition duplicate$ empty$
    'skip$
    { convert.edition
      bbl.edition bibinfo.check
      " " * bbl.edition *
    }
  if$
}

INTEGERS { multiresult }

FUNCTION {multi.page.check}
{ 't :=
  #0 'multiresult :=
    { multiresult not
      t empty$ not
      and
    }
    { t #1 #1 substring$
      duplicate$ "-" =
      swap$ duplicate$ "," =
      swap$ "+" =
      or or
        { #1 'multiresult := }
        { t #2 global.max$ substring$ 't := }
      if$
    }
  while$
  multiresult
}

FUNCTION {format.pages}
{ pages empty$
    { "" }
    { pages multi.page.check
      { bbl.pages pages n.dashify tie.or.space.connect }
      { bbl.page pages tie.or.space.connect }
    if$
    }
  if$
}


FUNCTION {format.pages.required}
{ pages empty$
    { ""
      "There are no page numbers for " cite$ * warning$
      output
    }
    { pages multi.page.check
      { bbl.pages pages n.dashify tie.or.space.connect }
      { bbl.page pages tie.or.space.connect }
    if$
    }
  if$
}

FUNCTION {format.pages.nopp}
{ pages empty$
    { ""
      "There are no page numbers for " cite$ * warning$
      output
    }
    { pages multi.page.check
      { pages n.dashify space.connect }
      { pages space.connect }
    if$
    }
  if$
}

FUNCTION {format.pages.patent}
{ pages empty$
    { "There is no patent number for " cite$ * warning$ }
    { pages multi.page.check
      { pages n.dashify }
      { pages n.separate.multi }
      if$
    }
  if$
}

FUNCTION {format.vol.pages}
{ volume emphasize field.or.null
  duplicate$ empty$
    { pop$ format.pages.required }
    { add.comma pages n.dashify * }
  if$
}

FUNCTION {format.chapter.pages}
{ chapter empty$
    'format.pages
    { type empty$
    { bbl.chapter }
    { type "l" change.case$ }
      if$
      chapter tie.or.space.connect
      pages empty$
    'skip$
    { add.comma format.pages * }
      if$
    }
  if$
}

FUNCTION {format.title.in}
{ 's :=
  s empty$
    { "" }
    { editor empty$
      { bbl.in s format.title space.connect }
      { bbl.in s format.title space.connect
        add.semicolon format.editors *
      }
    if$
    }
  if$
}

FUNCTION {format.pub.address}
{ publisher empty$
    { "" }
    { address empty$
        { publisher }
        { publisher add.colon address *}
      if$
    }
  if$
}

FUNCTION {format.school.address}
{ school empty$
    { "" }
    { address empty$
        { school }
        { school add.colon address *}
      if$
    }
  if$
}

FUNCTION {format.organization.address}
{ organization empty$
    { "" }
    { address empty$
        { organization }
        { organization add.colon address *}
      if$
    }
  if$
}

FUNCTION {empty.misc.check}
{ author empty$ title empty$ howpublished empty$
  year empty$ note empty$
  and and and and
    { "all relevant fields are empty in " cite$ * warning$ }
    'skip$
  if$
}

FUNCTION {empty.doi.note}
{ doi empty$ note empty$ and
    { "Need either a note or DOI for " cite$ * warning$ }
    'skip$
  if$
}

FUNCTION {format.thesis.type}
{ type empty$
    'skip$
    { pop$
      type emphasize
    }
  if$
}

FUNCTION {article}
{ output.bibitem
  format.authors "author" output.check
  after.item 'output.state :=
  journal emphasize "journal" output.check
  after.item 'output.state :=
  format.date "year" output.check
  volume empty$
    { ""
      format.pages.nopp output
    }
    { format.vol.pages output }
  if$
  note output
  fin.entry
}

FUNCTION {book}
{ output.bibitem
  author empty$
    { booktitle empty$
        { title format.title "title" output.check }
        { booktitle format.title "booktitle" output.check }
      if$
      new.block
      editor empty$
        { "Need either an author or editor for " cite$ * warning$ }
        { "" format.editors * "editor" output.check }
      if$
    }
    { format.authors output
      after.item 'output.state :=
      "author and editor" editor either.or.check
      booktitle empty$
        { title format.title "title" output.check }
        { booktitle format.title "booktitle" output.check }
      if$
    }
  if$
  format.edition output
  new.block
  format.number.series output
  new.block
  format.pub.address "publisher" output.check
  format.bdate "year" output.check
  new.block
  format.bvolume output
  pages empty$
    'skip$
    { format.pages output }
  if$
  note output
  fin.entry
}

FUNCTION {booklet}
{ output.bibitem
  format.authors output
  after.item 'output.state :=
  title format.title "title" output.check
  howpublished output
  address output
  format.date output
  note output
  fin.entry
}

FUNCTION {inbook}
{ output.bibitem
  author empty$
    { title format.title "title" output.check
      new.block
      editor empty$
      { "Need at least an author or an editor for " cite$ * warning$ }
      { "" format.editors * "editor" output.check }
    if$
    }
    { format.authors output
      after.item 'output.state :=
      title format.title.in "title" output.check
    }
  if$
  format.edition output
  new.block
  format.number.series output
  new.block
  format.pub.address "publisher" output.check
  format.bdate "year" output.check
  new.block
  format.bvolume output
  format.chapter.pages "chapter and pages" output.check
  note output
  fin.entry
}

FUNCTION {incollection}
{ output.bibitem
  author empty$
    { booktitle format.title "booktitle" output.check
      new.block
      editor empty$
        { "Need at least an author or an editor for " cite$ * warning$ }
        { "" format.editors * "editor" output.check }
      if$
    }
    { format.authors output
      after.item 'output.state :=
      booktitle format.title.in "booktitle" output.check
    }
  if$
  format.edition output
  new.block
  format.number.series output
  new.block
  format.pub.address "publisher" output.check
  format.bdate "year" output.check
  format.bvolume output
  format.chapter.pages "chapter and pages" output.check
  note output
  fin.entry
}

FUNCTION {inpress}
{ output.bibitem
  format.authors "author" output.check
  after.item 'output.state :=
  journal emphasize "journal" output.check
  doi empty$
    {  bbl.inpress output }
    {  after.item 'output.state :=
       format.date output
       "DOI:" doi tie.or.space.connect output
    }
  if$
  note output
  fin.entry
}

FUNCTION {inproceedings}
{ output.bibitem
  format.authors "author" output.check
  after.item 'output.state :=
  booktitle format.title.noemph "booktitle" output.check
  address output
  format.bdate "year" output.check
  pages empty$
    'skip$
    { new.block
      format.pages output }
  if$
  note output
  fin.entry
}

FUNCTION {manual}
{ output.bibitem
  format.authors output
  after.item 'output.state :=
  title format.title "title" output.check
  new.block
  format.organization.address output
  format.edition output
  format.bdate output
  note output
  fin.entry
}

FUNCTION {mastersthesis}
{ output.bibitem
  format.authors "author" output.check
  after.item 'output.state :=
  bbl.msc format.thesis.type output
  format.school.address "school" output.check
  format.bdate "year" output.check
  note output
  fin.entry
}

FUNCTION {misc}
{ output.bibitem
  format.authors output
  after.item 'output.state :=
  title format.title output
  howpublished output
  year output
  note output
  fin.entry
  empty.misc.check
}

FUNCTION {patent}
{ output.bibitem
  format.authors "author" output.check
  after.item 'output.state :=
  journal emphasize "journal" output.check
  format.pages.patent "pages" output.check
  format.bdate "year" output.check
  note output
  fin.entry
}

FUNCTION {phdthesis}
{ output.bibitem
  format.authors "author" output.check
  after.item 'output.state :=
  bbl.phd format.thesis.type output
  format.school.address "school" output.check
  format.bdate "year" output.check
  note output
  fin.entry
}

FUNCTION {proceedings}
{ output.bibitem
  title format.title.noemph "title" output.check
  address output
  format.bdate "year" output.check
  pages empty$
    'skip$
    { new.block
      format.pages output }
  if$
  note output
  fin.entry
}

FUNCTION {remark}
{ output.bibitem
  note "note" output.check
  fin.entry
}

FUNCTION {submitted}
{ output.bibitem
  format.authors "author" output.check
  bbl.submitted output
  fin.entry
}

FUNCTION {techreport}
{ output.bibitem
  format.authors "author" output.check
  after.item 'output.state :=
  title format.title "title" output.check
  institution
  type empty$
    'bbl.techreport
    'type
  if$
  space.connect
  number empty$
    { "t" change.case$ }
    { number tie.or.space.connect }
  if$
  output
  format.pub.address output
  format.bdate "year" output.check
  note output
  fin.entry
}

FUNCTION {unpublished}
{ output.bibitem
  format.authors "author" output.check
  after.item 'output.state :=
  journal empty$
    'skip$
    { journal emphasize "journal" output.check }
  if$
  doi empty$
    {  note output }
    {  after.item 'output.state :=
       format.date output
       "DOI:" doi tie.or.space.connect output
    }
  if$
  fin.entry
  empty.doi.note
}

FUNCTION {conference} {inproceedings}

FUNCTION {other} {patent}

FUNCTION {default.type} {misc}

MACRO {jan} {"Jan."}
MACRO {feb} {"Feb."}
MACRO {mar} {"Mar."}
MACRO {apr} {"Apr."}
MACRO {may} {"May"}
MACRO {jun} {"June"}
MACRO {jul} {"July"}
MACRO {aug} {"Aug."}
MACRO {sep} {"Sept."}
MACRO {oct} {"Oct."}
MACRO {nov} {"Nov."}
MACRO {dec} {"Dec."}

MACRO {acchemr} {"Acc.\ Chem.\ Res."}
MACRO {aacsa} {"Adv.\ {ACS} Abstr."}
MACRO {anchem} {"Anal.\ Chem."}
MACRO {bioch} {"Biochemistry"}
MACRO {bicoc} {"Bioconj.\ Chem."}  % ***
MACRO {bitech} {"Biotechnol.\ Progr."}  % ***
MACRO {chemeng} {"Chem.\ Eng.\ News"}
MACRO {chs} {"Chem.\ Health Safety"} % ***
MACRO {crt} {"Chem.\ Res.\ Tox."} % ***
MACRO {chemrev} {"Chem.\ Rev."} % ***
MACRO {cmat} {"Chem.\ Mat."} % ***
MACRO {chemtech} {"{CHEMTECH}"} % ***
MACRO {enfu} {"Energy \&{} Fuels"} % ***
MACRO {envst} {"Environ.\ Sci.\ Technol."}
MACRO {iecf} {"Ind.\ Eng.\ Chem.\ Fundam."}
MACRO {iecpdd} {"Ind.\ Eng.\ Chem.\ Proc.\ Des.\ Dev."}
MACRO {iecprd} {"Ind.\ Eng.\ Chem.\ Prod.\ Res.\ Dev."}
MACRO {iecr} {"Ind.\ Eng.\ Chem.\ Res."} % ***
MACRO {inor} {"Inorg.\ Chem."}
MACRO {jafc} {"J.~Agric.\ Food Chem."}
MACRO {jacs} {"J.~Am.\ Chem.\ Soc."}
MACRO {jced} {"J.~Chem.\ Eng.\ Data"}
MACRO {jcics} {"J.~Chem.\ Inf.\ Comput.\ Sci."}
MACRO {jmc} {"J.~Med.\ Chem."}
MACRO {joc} {"J.~Org.\ Chem."}
MACRO {jps} {"J.~Pharm.\ Sci."}
MACRO {jpcrd} {"J.~Phys.\ Chem.\ Ref.\ Data"} % ***
MACRO {jpc} {"J.~Phys.\ Chem."}
MACRO {jpca} {"J.~Phys.\ Chem.~A"}
MACRO {jpcb} {"J.~Phys.\ Chem.~B"}
MACRO {lang} {"Langmuir"}
MACRO {macro} {"Macromolecules"}
MACRO {orgmet} {"Organometallics"}
MACRO {orglett} {"Org.\ Lett."}

MACRO {jft} {"J.~Chem.\ Soc., Faraday Trans."}
MACRO {jft1} {"J.~Chem.\ Soc., Faraday Trans.\ 1"}
MACRO {jft2} {"J.~Chem.\ Soc., Faraday Trans.\ 2"}
MACRO {tfs} {"Trans.\ Faraday Soc."}
MACRO {jcis} {"J.~Colloid Interface Sci."}
MACRO {acis} {"Adv.~Colloid Interface Sci."}
MACRO {cs} {"Colloids Surf."}
MACRO {csa} {"Colloids Surf.\ A:\ Physicochem.\ Eng.\ Apects"}
MACRO {csb} {"Colloids Surf.\ B:\ Biointerfaces"}
MACRO {pcps} {"Progr.\ Colloid Polym.\ Sci."}
MACRO {jmr} {"J.~Magn.\ Reson."}
MACRO {jmra} {"J.~Magn.\ Reson.\ A"}
MACRO {jmrb} {"J.~Magn.\ Reson.\ B"}
MACRO {sci} {"Science (Washington,~D.C.)"}
MACRO {nat} {"Nature (London)"}
MACRO {jcch} {"J.~Comput.\ Chem."}
MACRO {cca} {"Croat.\ Chem.\ Acta"}
MACRO {angew} {"Angew.\ Chem.\ Int.\ Ed."}
MACRO {chemeurj} {"Chem.--Eur.\ J."}

MACRO {poly} {"Polymer"}
MACRO {ajp} {"Am.\ J.\ Phys."}
MACRO {rsi} {"Rev.\ Sci.\ Instrum."}
MACRO {jcp} {"J.~Chem.\ Phys."}
MACRO {cpl} {"Chem.\ Phys.\ Lett."}
MACRO {molph} {"Mol.\ Phys."}
MACRO {pac} {"Pure Appl.\ Chem."}
MACRO {jbc} {"J.~Biol.\ Chem."}
MACRO {tl} {"Tetrahedron Lett.\"}
MACRO {psisoe} {"Proc.\ SPIE-Int.\ Soc.\ Opt.\ Eng."}
MACRO {prb} {"Phys.\ Rev.\ B:\ Condens.\ Matter"}
MACRO {jap} {"J.~Appl.\ Phys."}
MACRO {pnac} {"Proc.\ Natl.\ Acad.\ Sci.\ U.~S.~A. "}
MACRO {bba} {"Biochim.\ Biophys.\ Acta"}
MACRO {nar} {"Nucleic.\ Acid Res."}

READ

STRINGS { longest.label }

INTEGERS { number.label longest.label.width }

FUNCTION {initialize.longest.label}
{ "" 'longest.label :=
  #1 'number.label :=
  #0 'longest.label.width :=
}

FUNCTION {longest.label.pass}
{ number.label int.to.str$ 'label :=
  number.label #1 + 'number.label :=
  label width$ longest.label.width >
    { label 'longest.label :=
      label width$ 'longest.label.width :=
    }
    'skip$
  if$
}

EXECUTE {initialize.longest.label}

ITERATE {longest.label.pass}

FUNCTION {begin.bib}
{ preamble$ empty$
    'skip$
    { preamble$ write$ newline$ }
  if$
  "\providecommand{\refin}[1]{\\ \textbf{Referenced in:} #1}"
  write$ newline$
  "\begin{thebibliography}{"  longest.label  * "}" * write$ newline$
}

EXECUTE {begin.bib}

EXECUTE {init.state.consts}

ITERATE {call.type$}

FUNCTION {end.bib}
{ newline$
  "\end{thebibliography}" write$ newline$
}

EXECUTE {end.bib}
%</bib>
% \fi

% \Finale
% \PrintIndex
