\input ptb-utils
\_checkloaded{hyperlinks}

\def\linkborder#1{%
    \ifx^#1^%
        /C [\default@border] /Border [0 0 \default@border@wd]%
    \else\ifcsname #1@border\endcsname%
        \_xp\ifx\csname #1@border\endcsname\empty%
            /Border [0 0 0]%
        \else%
            /C [\csname #1@border\endcsname] /Border [0 0 \csname #1@border@wd\endcsname]%
        \fi%
    \fi\fi%
}

\def\createbordertype#1#2#3{%
    \_xp\def\csname #1@border\endcsname{#2}%
    \_xp\def\csname #1@border@wd\endcsname{#3}%
}

\def\anchorheight{1.5em} % Raise anchor since it should be at top of line
\def\_anchor[#1]#2{\vbox to\z@{\kern-\anchorheight\pdfdest name{#1:#2} xyz\relax\vss}}
\def\anchor{\_ifnextchar[ {\_anchor}{\_anchor[]}}

\def\@anchorbuf{0pt}
\def\@anchorwbuf{1pt}
\def\_gotoanchor[#1]#2#3{{%
    \setbox0=\hbox{#3}%
    \quitvmode%
    \pdfstartlink height \dimexpr\ht0 + \@anchorbuf\relax depth \dimexpr\dp0 + \@anchorbuf\relax
        attr {\linkborder{#1}} goto name{#1:#2}\relax{\kern\@anchorwbuf\relax#3\kern\@anchorwbuf\relax}\pdfendlink%
}}

\def\gotoanchor{\_ifnextchar[ {\_gotoanchor}{\_gotoanchor[]}}

\def\_url#1#2{%
    \pdfstartlink user{
        /Subtype /Link
        \linkborder{url}
        /A <<
            /Type /Action
            /S /URI
            /URI (#1)
        >>
    }%
    #2%
    \pdfendlink{}%
    \egroup%
}

\def\url{%
    \bgroup%
    \catcode`~=12 \catcode`_=12 \catcode`\%=12 %
    \_url%
}

\createbordertype{default}{1 0 0}{0.6}
\createbordertype{url}{1 0 0}{0.6}