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