在脚注中获取那些 %#!^& 符号!

在脚注中获取那些 %#!^& 符号!

这基本上是控制命令参数。最初的提问者想要重新定义\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需要第二个宏来读取\hrefURL 后的 的第二个参数。这有点棘手,因为 的其余内部代码\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}}

相关内容