![使用 fancyvrb 和 hyperref 时 URL 中出现连字符问题](https://linux22.com/image/268613/%E4%BD%BF%E7%94%A8%20fancyvrb%20%E5%92%8C%20hyperref%20%E6%97%B6%20URL%20%E4%B8%AD%E5%87%BA%E7%8E%B0%E8%BF%9E%E5%AD%97%E7%AC%A6%E9%97%AE%E9%A2%98.png)
使用 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}