这正是我想做的事情。我有一个文件,其中包含许多\href{a}{b}
字符串a
和形式的命令b
。我想重新定义它\href
,以便它执行以下操作:\footnote{\href{a}{b}}
。因此想将 URL 更改为 URL 的脚注。 – 这可能吗?
答案1
这可以使用标准\let
技术来完成:
\let\oldhref=\href
\renewcommand{\href}[2]{\footnote{\oldhref{#1}{#2}}}
答案2
此解决方案还适用于包含活动字符(例如 &、% 和 #)的 URL(需要hyperref
):
\makeatletter
\newcommand\hreffootnote@[2]{\footnote{\hyper@linkurl{\Hurl{#2}}{#1}}}
\DeclareRobustCommand{\hreffootnote}{\hyper@normalise\hreffootnote@}
\makeatother
然而,据我了解,你的博客文章,您实际上希望其\href{a}{b}
行为类似于b\footnote{\url{a}}
。这可以通过以下方式实现:
\makeatletter
\newcommand\myhref@[2]{#2\footnote{\url@{#1}}}
\DeclareRobustCommand{\myhref}{\hyper@normalise\myhref@}
\makeatother
另外,请参阅我的回答这个问题。
答案3
的第一个参数\href
必须逐字处理,这使得重新定义变得棘手。Michael Ummels 的答案正确地展示了如何使用hyperref
内部宏来实现这一点。但是,我的包的最新更新newverbs
提供了一种轻松逐字收集参数的方法:
\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}