Getting those %#!^& signs in the footnote!

The url package (used by hyperref) gives you the \Url@HyperHook hook, which is also used in \urldef (see Getting percent sign into an URL in a footnote). The original URL string is located in \Url@String (expandable) and the already formatted string in \Url@FormatString (not expandable).

This can be used to implement your own \url like macros. The code below then creates the wanted \footnote with an \href. A second macro is required to read the second argument of \href after the URL. This is a little tricky because the rest of the internal code of \url most be jumped over first and then reinserted.

\documentclass{article}

\usepackage{hyperref}

\makeatletter

\def\hreffootnote{%
    %\unskip % maybe required
    \begingroup
    \def\Url@HyperHook ##1\endgroup{%
        \let\Url@HyperHook\relax
        \href@footnote
    }%
    \url
}

\let\realhref\href
\def\href@footnote#1\endgroup#2{%
   \footnote{\expandafter\realhref\expandafter{\Url@String}{#2}}%
   \endgroup\endgroup#1\endgroup%  #1 is some internal `\url` code
}


\begin{document}

Text\hreffootnote{http://foobar.com/~test/%^&*$_##/test}{there} after

Text \href{http://foobar.com/~test/%^&*$_##/test}{there} after

\let\href\hreffootnote
Text \href{http://foobar.com/~test/%^&*$_##/test}{there} after

Hello\hreffootnote{http://www.google.com/#sclient=psy&hl=en&site=&source=hp&q=numbers&aq=f&aqi=&aql=&oq=&pbx=1&fp=d5033c56880e0199}{b} world.


\end{document}

Alternatively a home made solution which reads the first argument verbatim (except { } characters):

\documentclass{article}

\usepackage{hyperref}

\makeatletter

\def\hreffootnote{%
    %\unskip
    \begingroup
    \let\do\@makeother
    \dospecials
    \catcode`\{=1\relax
    \catcode`\}=2\relax
    \href@footnote
}
\def\href@footnote#1{%
    \endgroup
    \href@@footnote{#1}%
}
\let\realhref\href
\def\href@@footnote#1#2{%
    \footnote{\realhref{#1}{#2}}%
}

\begin{document}

Text\hreffootnote{http://foobar.com/~test/%^&*$_##/test}{there} after

Text \href{http://foobar.com/~test/%^&*$_##/test}{there} after

\let\href\hreffootnote
Text \href{http://foobar.com/~test/%^&*$_##/test}{there} after

Hello\hreffootnote{http://www.google.com/#sclient=psy&hl=en&site=&source=hp&q=numbers&aq=f&aqi=&aql=&oq=&pbx=1&fp=d5033c56880e0199}{b} world.

\end{document}

Update 2011-07-27:

I now published a new version of newverbs which provides \collectverb and \Collectverb to collect verbatim arguments easily. For the sake of completeness here again the full solution based on this package. (It is also an answer to Changing href's to footnotes).

\documentclass{article}

\usepackage{hyperref}
\usepackage{newverbs}[2011/07/24]

\let\orighref\href
\renewcommand{\href}{\Collectverb{\hrefii}}
\newcommand\hrefii[2]{\footnote{\orighref{#1}{#2}}}

\usepackage{lipsum}% Dummy text
\begin{document}

\lipsum*[1]\href{http://test.com/%$^£$%^_@~}{Test URL}

% With other argument separators as { }:
\lipsum*[2]\href|http://test.com/%$^£$}{%^_@~|{Test URL}

% If a real \href is wanted (also used for comparison here)
\lipsum*[3]\orighref{http://test.com/%$^£$%^_@~}{Test URL}

\end{document}

Use the bigfoot package:

\documentclass{article}
\usepackage{bigfoot}
\usepackage{hyperref}

\begin{document}
Hello\footnote{\href{http://www.google.com/#sclient=psy&hl=en&site=&source=hp&q=numbers&aq=f&aqi=&aql=&oq=&pbx=1&fp=d5033c56880e0199}{b}} world.

\end{document}

Unfortunately this doesn't seem to work to solve the original questioner's problem, since putting this into another macro definition seems to break it.


This definition seems to work with the hyperref package. \hyper@normalise takes care of all those nasty characters.

\makeatletter
\newcommand\myhref@[2]{#2\footnote{\url@{#1}}}
\DeclareRobustCommand{\myhref}{\hyper@normalise\myhref@}
\makeatother

Edit: This typesets the link as a footnote. To just get a footnote with a link labelled by the text in the second argument, this should work:

\makeatletter
\newcommand\hreffootnote@[2]{\footnote{\hyper@linkurl{\Hurl{#2}}{#1}}}
\DeclareRobustCommand{\hreffootnote}{\hyper@normalise\hreffootnote@}
\makeatother