使用 fancyvrb 和 hyperref 时 URL 中出现连字符问题

使用 fancyvrb 和 hyperref 时 URL 中出现连字符问题

使用 hyperref 包时,在 fancyvrb Verbatim 环境内的 URL 中使用连字符似乎存在问题。

问题

以下文件:

\documentclass{article}
\usepackage{fancyvrb}
\usepackage{hyperref}

\begin{document}
\begin{Verbatim}[commandchars=\\\{\}]
\url{http://a-z.example}
\end{Verbatim}
\end{document}

在输出 pdf 中产生以下文本:

http://a\unhbox\voidb@x\kern\z@\char`\discretionary{-}{}{}z.example

不太理想的解决方法

我能想到的最佳解决方法是将url命令替换为 \href{http://a%2dz.example}{http://a-z.example}。请注意,连字符需要进行百分比编码。这并不理想。

有办法解决这个问题吗?或者至少有一个更好的解决方法?

答案1

在逐字环境中,-为了打破连字,被激活,但是\url,在其检查中并不照顾这一点。

您可以通过以下方式修复此行为:

\documentclass{article}
\usepackage{fancyvrb}
\usepackage{hyperref}

\makeatletter
\let\ORIGhyper@normalise\hyper@normalise
\def\grigg@hyper@normalise{%
  \begingroup\begingroup\lccode`\~=`\-
   \lowercase{\endgroup\edef~}{\string-}\expandafter\@gobble\ORIGhyper@normalise}
\def\fixurl{\let\hyper@normalise\grigg@hyper@normalise}
\makeatother

\begin{document}
\begin{Verbatim}[commandchars=\\\{\},formatcom=\fixurl]
\url{http://a--z.example}
\end{Verbatim}
\end{document}

在此处输入图片描述

过于简单的话,\detokenize你就失去了在 URL 中使用的可能性%:检查一下

\url{http://a--z.example.com/%7Exyz}

按照预期工作,不会

\url{\detokenize{http://a--z.example.com/%7Exyz}}

正如沃纳所建议的那样。

答案2

以下是一个解决方法:

在此处输入图片描述

\documentclass{article}
\usepackage{fancyvrb,hyperref}% http://ctan.org/pkg/{fancyvrb,hyperref}
\newcommand{\URL}[1]{\url{\detokenize{#1}}}

\begin{document}
\begin{Verbatim}[commandchars=\\\{\}]
\URL{http://a-z.example}
\end{Verbatim}
\end{document}

相关内容