%% Copyright (C) 2008-2025 Achim D. Brucker, https://www.brucker.ch
%%
%% License:
%%   This program can be redistributed and/or modified under the terms
%%   of the LaTeX Project Public License Distributed from CTAN
%%   archives in directory macros/latex/base/lppl.txt; either
%%   version 1.3c of the License, or (at your option) any later version.
%%   OR
%%   The 2-clause BSD-style license.
%%
%%   SPDX-License-Identifier: LPPL-1.3c+ OR BSD-2-Clause
\NeedsTeXFormat{LaTeX2e}\relax
\ProvidesPackage{authorarchive}
  [2025/12/25 v1.3.1%
  Self-archiving information for scientific publications.]
%
\PassOptionsToPackage{hyphens}{url}
%
\RequirePackage{ifthen}
\RequirePackage[inline]{enumitem}
\RequirePackage{orcidlink}
\RequirePackage{eso-pic}
\RequirePackage{intopdf}
\RequirePackage{kvoptions}
\RequirePackage{hyperref}
\RequirePackage{calc}
\RequirePackage{qrcode}
\RequirePackage{etoolbox}
\RequirePackage{hologo}
%
%Better url breaking
\g@addto@macro{\UrlBreaks}{\UrlOrds}
%
% Option declarations
% -------------------
\SetupKeyvalOptions{
  family=AA,
  prefix=AA@
}
%
\DeclareStringOption[.]{bibtexdir}
\DeclareStringOption[https://duckduckgo.com/?q=]{baseurl}
\DeclareStringOption[.pdf]{suffix}
\DeclareStringOption[UNKNOWN PUBLISHER]{publisher}[]
\DeclareStringOption[UNKNOWN YEAR]{year}[]
\DeclareStringOption[]{key}[]
\DeclareStringOption[]{doi}[]
\DeclareStringOption[]{doiText}[]
\DeclareStringOption[]{publisherurl}[]
\DeclareStringOption[UNKNOWN START PAGE]{startpage}[]
\DeclareStringOption[UNKNOWN PUBLICATION]{publication}[]

\DeclareBoolOption{ACM}
\DeclareBoolOption{acmart}
\DeclareBoolOption{ENTCS}
\DeclareBoolOption{IEEE}
\DeclareBoolOption{LNCS}
\DeclareBoolOption{LNI}
\DeclareBoolOption{nocopyright}
\DeclareBoolOption{nourl}
\DeclareBoolOption{nobib}
\DeclareBoolOption{orcidicon}
%\ProcessOptions\relax


% Default option rule
\DeclareDefaultOption{%
  \ifx\CurrentOptionValue\relax
    \PackageWarningNoLine{\@currname}{%
      Unknown option `\CurrentOption'\MessageBreak
      is passed to package `authorarchive'%
    }%
    % Pass the option to package color.
    % Again it is better to expand \CurrentOption.
    \expandafter\PassOptionsToPackage\expandafter{\CurrentOption}{color}%
  \else
    % Package color does not take options with values.
    % We provide the standard LaTeX error.
    \@unknownoptionerror
  \fi
}
\ProcessKeyvalOptions*

\newcommand{\AA@defIncludeFiles}{
  \def\AA@bibBibTeX{\AA@bibtexdir/\AA@key.bib}
  \def\AA@bibBibTeXLong{\AA@bibtexdir/\AA@key.bibtex}
  \def\AA@bibWord{\AA@bibtexdir/\AA@key.word.xml}
  \def\AA@bibEndnote{\AA@bibtexdir/\AA@key.enw}
  \def\AA@bibRIS{\AA@bibtexdir/\AA@key.ris}
}
\AA@defIncludeFiles

\newboolean{AA@bibExists}
\setboolean{AA@bibExists}{false}
\newcommand{\AA@defIncludeSwitches}{
  \IfFileExists{\AA@bibBibTeX}{\setboolean{AA@bibExists}{true}}{}
  \IfFileExists{\AA@bibBibTeXLong}{\setboolean{AA@bibExists}{true}}{}
  \IfFileExists{\AA@bibWord}{\setboolean{AA@bibExists}{true}}{}
  \IfFileExists{\AA@bibEndnote}{\setboolean{AA@bibExists}{true}}{}
  \IfFileExists{\AA@bibRIS}{\setboolean{AA@bibExists}{true}}{}
}
\AA@defIncludeSwitches


% Provide command for dynamic configuration setup
% \def\authorsetup{\kvsetkeys{AA}}
\newcommand{\authorsetup}[1]{%
  \kvsetkeys{AA}{#1}
  \AA@defIncludeFiles
  \AA@defIncludeSwitches
}

% Load local configuration
\InputIfFileExists{authorarchive.config}{}{}

%  define proxy command for setting PDF attributes
\ExplSyntaxOn
\@ifundefined{pdfmanagement_add:nnn}{%
    \newcommand{\AA@pdfpagesattribute}[2]{\pdfpagesattr{/#1 #2}}%
 }{%
    \newcommand{\AA@pdfpagesattribute}[2]{\pdfmanagement_add:nnn{Pages}{#1}{#2}}%
 }%
\ExplSyntaxOff

\newlength\AA@x
\newlength\AA@y
\newlength\AA@width

\setlength\AA@x{1in+\hoffset+\oddsidemargin}

\newcommand{\authorcrfont}{\footnotesize}
\newcommand{\authorat}[1]{\AtPageUpperLeft{\put(\LenToUnit{\AA@x},\LenToUnit{.2cm-\paperheight}){#1}}}
\newcommand{\authorwidth}[1]{\setlength{\AA@width}{#1}}
\setlength{\AA@width}{\textwidth}

\def\AA@pageinfo{}

\AtBeginDocument{
\ifthenelse{\equal{\AA@startpage}{UNKNOWN START PAGE}}{%
}{%
  \setcounter{page}{\AA@startpage}%
  \def\AA@pageinfo{pp. \thepage--\pageref{\aa@lastpage}, }
}

%%%% sig-alternate.cls
\ifAA@ACM%
  \ifthenelse{\equal{\AA@publisher}{UNKNOWN PUBLISHER}}{%
    \setkeys{AA}{publisher=ACM}
  }{}
  \global\boilerplate={}
  \global\copyrightetc={}
  \renewcommand{\conferenceinfo}[2]{}
  \renewcommand{\authorcrfont}{\scriptsize}
  \setlength\AA@x{1in+\hoffset+\oddsidemargin}
  \setlength\AA@y{-\textheight+\topmargin+\headheight-\footskip} % -\voffset-\topmargin-\headheight-\footskip}
  \renewcommand{\authorat}[1]{\put(\LenToUnit{\AA@x},\LenToUnit{\AA@y}){#1}}
  \setlength{\AA@width}{\columnwidth}
\fi
%
%%%% acmart.cls
\ifAA@acmart%
  \ifthenelse{\equal{\AA@publisher}{UNKNOWN PUBLISHER}}{%
    \setkeys{AA}{publisher=ACM}
  }{}
  \renewcommand{\authorat}[1]{\AtPageUpperLeft{\put(\LenToUnit{\AA@x},\LenToUnit{0.4cm-\paperheight}){#1}}}
  \setlength{\AA@width}{\textwidth}
\fi
%
%%%% LNCS
\ifAA@LNCS%
  \ifAA@orcidicon%
    \renewcommand{\orcidID}[1]{\orcidlink{#1}}
  \else\relax\fi%
%  
  \ifthenelse{\equal{\AA@publisher}{UNKNOWN PUBLISHER}}{%
    \setkeys{AA}{publisher=Springer-Verlag}
  }{}
  \renewcommand{\authorcrfont}{\scriptsize}
  \@ifclasswith{llncs}{a4paper}{%
    \AA@pdfpagesattribute{CropBox}{[92 114 523 780]}%
    \renewcommand{\authorat}[1]{\put(\LenToUnit{\AA@x},41){#1}}%
  }{%
    \AA@pdfpagesattribute{CropBox}{[92 65 523 731]}%
    \renewcommand{\authorat}[1]{\put(\LenToUnit{\AA@x},24){#1}}%
  }
  \setlength{\AA@width}{\textwidth}
  \setcounter{tocdepth}{2}
\fi
%
%%%% LNI
\ifAA@LNI%
  \ifthenelse{\equal{\AA@publisher}{UNKNOWN PUBLISHER}}{%
    \setkeys{AA}{publisher=GI}
  }{}
  \renewcommand{\authorat}[1]{\put(\LenToUnit{\AA@x},30){#1}}
  \renewcommand{\authorcrfont}{\scriptsize}
  \AA@pdfpagesattribute{CropBox}{[70 65 526.378 748.15]}
  \setlength{\AA@width}{\textwidth}
  \setcounter{tocdepth}{2}
\fi
%
%%%% ENTCS
\ifAA@ENTCS%
  \addtolength{\voffset}{1cm}
  \ifthenelse{\equal{\AA@publisher}{UNKNOWN PUBLISHER}}{%
    \setkeys{AA}{publisher=Elsevier Science B.~V.}
  }{}
  \renewcommand{\authorat}[1]{\put(\LenToUnit{\AA@x},\LenToUnit{-.5cm-\the\ht\AA@authoratBox}){#1}}
  \renewcommand{\authorcrfont}{\scriptsize}
  \setlength{\AA@width}{\textwidth}
\fi
%
%%%% IEEE
\ifAA@IEEE%
  \ifthenelse{\equal{\AA@publisher}{UNKNOWN PUBLISHER}}{%
    \setkeys{AA}{publisher=IEEE}
  }{}
  \renewcommand{\authorat}[1]{\put(\LenToUnit{\AA@x},6){#1}}
  \renewcommand{\authorcrfont}{\scriptsize}
  \setlength{\AA@width}{\textwidth}
  \setcounter{tocdepth}{2}
\fi
}

\hypersetup{%
  draft         = false,
  bookmarksopen = true,
  bookmarksnumbered= true,
}

\@ifpackageloaded{totpages}{%
  \def\aa@lastpage{TotPages}
}{%
  \RequirePackage{lastpage}
  \def\aa@lastpage{LastPage}
}
\newsavebox{\AA@authoratBox}

\AddToShipoutPicture*{%
  \setlength{\unitlength}{1mm}%
  \savebox{\AA@authoratBox}{%
    \parbox{1.8cm}{%
      \bgroup%
        \normallineskiplimit=0pt%
        \ifAA@nourl%
           \ifx\AA@doi\@empty\relax%
           \else%
              \qrcode[hyperlink,height=1.4cm,tight]{https://doi.org/\AA@doi}%
            \fi%
        \else%
          \qrcode[hyperlink,height=1.4cm,tight]{\AA@baseurl/\AA@key\AA@suffix}%
        \fi%
      \egroup%
    }%
    \ifAA@nourl\ifx\AA@doi\@empty\addtolength{\AA@width}{1.8cm}\fi\fi
    \parbox{\AA@width-1.8cm}{\authorcrfont%
      \ifAA@LNCS%
        \AA@publication, \AA@pageinfo  \AA@year. %
        \ifAA@nocopyright\else
          \ifthenelse{\equal{\AA@publisher}{UNKNOWN PUBLISHER}}%
            {\textcopyright~\AA@year.}{\textcopyright~\AA@year~\AA@publisher.} %
        \fi
        This is the author's
        version of the work. It is posted
        \ifAA@nourl\relax\else%
          at \url{\AA@baseurl/\AA@key\AA@suffix} %
        \fi
        \ifAA@nocopyright\relax\else
          by permission of \ifthenelse{\equal{\AA@publisher}{UNKNOWN PUBLISHER}}{the publisher}{\AA@publisher{}} %
        \fi
        for your personal use.
        \ifx\AA@doi\@empty%
          \relax
        \else
          The final publication is available at 
          \ifx\AA@doiText\@empty%
            \url{https://doi.org/\AA@doi}.
          \else
            \href{https://doi.org/\AA@doi}{\AA@doiText}.
          \fi
        \fi
      \else
        \ifAA@nocopyright\relax\else
          \ifthenelse{\equal{\AA@publisher}{UNKNOWN PUBLISHER}}%
            {\textcopyright~\AA@year.}{\textcopyright~\AA@year~\AA@publisher.} %
        \fi%
        This is the author's
        version of the work. It is posted
        \ifAA@nourl\relax\else%
          at \url{\AA@baseurl/\AA@key\AA@suffix} %
        \fi
        \ifAA@nocopyright\relax\else
          by permission of \ifthenelse{\equal{\AA@publisher}{UNKNOWN PUBLISHER}}{the publisher}{\AA@publisher{}} %
        \fi
        for your personal use. Not for redistribution. The definitive
        version was published in \emph{\AA@publication}, \AA@pageinfo \AA@year%
        \ifx\AA@doi\@empty%
          \ifx\AA@publisherurl\@empty%
            .%
          \else
            \url{\AA@publisherurl}.%
          \fi
        \else
          \ifx\AA@doiText\@empty%
            , doi: \href{https://doi.org/\AA@doi}{\AA@doi}.%
          \else
            , doi: \href{https://doi.org/\AA@doi}{\AA@doiText}.%
          \fi
        \fi
      \fi
      \ifAA@nobib\relax\else%
        \ifthenelse{\boolean{AA@bibExists}}{%
          \hfill
          \begin{itemize*}[label={}, itemjoin={,}]
            \IfFileExists{\AA@bibBibTeX}{%
              \item \expanded{\attachandlink[\AA@key.bib]{\AA@bibBibTeX}[application/x-bibtex]{BibTeX entry of this paper}{\hologo{BibTeX}}}%
            }{%
              \IfFileExists{\AA@bibBibTeXLong}{%
                \item \expanded{\attachandlink[\AA@key.bib]{\AA@bibBibTeXLong}[application/x-bibtex]{BibTeX entry of this paper}{\hologo{BibTeX}}}%
              }{%
                \typeout{No file \AA@bibBibTeX{} (and no \AA@bibBibTeXLong) found. Not embedded reference in BibTeX format.}%
              }%
            }%
            \IfFileExists{\AA@bibWord}{%
              \item \expanded{\attachandlink[\AA@key.word.xml]{\AA@bibWord}[application/xml]{XML entry of this paper (e.g., for Word 2007 and later)}{Word}}%
            }{%
              \typeout{No file \AA@bibWord{} found. Not embedded reference for Word 2007 and later.}%
            }%
            \IfFileExists{\AA@bibEndnote}{%
              \item \expanded{\attachandlink[\AA@key.enw]{\AA@bibEndnote}[application/x-endnote-refer]{Endnote entry of this paper}{EndNote}}%
            }{%
              \typeout{No file \AA@bibEndnote{} found. Not embedded reference in Endnote format.}%
            }%
            \IfFileExists{\AA@bibRIS}{%
              \item \expanded{\attachandlink[\AA@key.ris]{\AA@bibRIS}[application/x-research-info-systems]{RIS entry of this paper}{RIS}}%
            }{%
              \typeout{No file \AA@bibRIS{} found. Not embedded reference in RIS format.}%
            }%
          \end{itemize*}\\
        }{%
          \PackageError{authorarchive}{No bibliographic files found. Specify option 'nobib' if this is intended.}
        }
      \fi
    }
  }
  \authorat{\raisebox{\the\ht\AA@authoratBox}{\usebox{\AA@authoratBox}}}
}
