将 href 更改为脚注

将 href 更改为脚注

这正是我想做的事情。我有一个文件,其中包含许多\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}

相关内容