这基本上是控制命令参数。最初的提问者想要重新定义\href
,以便所有链接都出现在脚注中(而不是主文档中),所以我的建议是老\let\oldcmd=\cmd \def\cmd{reimplement \cmd in some fancy way}
办法。结果发现这并没有解决问题。但破坏这个解决方案的真正原因并不是解决方案,而是 URL 中的那些 @&*@%y$#@ 字符和……*叹息*……脚注。
我不是这方面的专家hyperref
,所以我呼吁社区提供帮助。(而且花了半个小时查看的文档和来源hyperref
也没有得到启发。)我尝试了以下解决方案:将百分号添加到脚注中的 URL 中和是否有可靠的脚注命令?毫无效果(虽然我可能做错了……抱歉,错了)。另外,请注意如何在脚注中显示 href 链接?是错误的做法:提问者想要脚注中的可点击链接。
这是提问者向我提供的嵌入在 MWE 中的 URL:
\documentclass{article}
\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}
这会产生错误:
! Illegal parameter number in definition of \Hy@tempa.
<to be read again>
s
l.9 ...qi=&aql=&oq=&pbx=1&fp=d5033c56880e0199}{b}}
world.
这让我认为这就是#
导致问题的原因。
答案1
包url
(由hyperref
) 为您提供了\Url@HyperHook
钩子,它也用于\urldef
(参见将百分号添加到脚注中的 URL 中)。原始URL字符串位于\Url@String
(可扩展),而已经格式化的字符串位于\Url@FormatString
(不可扩展)。
这可用于实现您自己的\url
类似宏。下面的代码随后使用 来创建所需的\footnote
。\href
需要第二个宏来读取\href
URL 后的 的第二个参数。这有点棘手,因为 的其余内部代码\url
大部分会先跳过,然后重新插入。
\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}
或者,一个自制的解决方案,逐字读取第一个参数({ }
字符除外):
\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}
更新2011-07-27:
我现在发布了新版本newverbs
它提供\collectverb
并\Collectverb
轻松收集逐字参数。为了完整起见,这里再次基于此包提供完整的解决方案。(这也是对将 href 更改为脚注)。
\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}
答案2
使用bigfoot
包裹:
\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}
不幸的是,这似乎无法解决原始提问者的问题,因为将其放入另一个宏定义似乎会破坏它。
答案3
此定义似乎与 hyperref 包一起工作。\hyper@normalise
处理所有这些令人讨厌的字符。
\makeatletter
\newcommand\myhref@[2]{#2\footnote{\url@{#1}}}
\DeclareRobustCommand{\myhref}{\hyper@normalise\myhref@}
\makeatother
编辑:这会将链接排版为脚注。要获取带有由第二个参数中的文本标记的链接的脚注,应该可以这样做:
\makeatletter
\newcommand\hreffootnote@[2]{\footnote{\hyper@linkurl{\Hurl{#2}}{#1}}}
\DeclareRobustCommand{\hreffootnote}{\hyper@normalise\hreffootnote@}
\makeatother
答案4
这个对我来说很好用:
Hello\footnote{\url{http://www.google.com/\#sclient=psy&hl=en&site=&source=hp&q=numbers&aq=f&aqi=&aql=&oq=&pbx=1&fp=d5033c56880e0199}}{b} world.
方案如下:\footnote{\url{yoururl\#yoururl}}