如何修补 \href 使它看起来像 \url?

如何修补 \href 使它看起来像 \url?

至少有两个问题要求回答这个问题但没有明确提到这一点,所以我们开始吧。

两者都不 也不实际上回答了问题,如何使\href样式与\url- 相同,而无需在第二个参数中添加其他命令\href。我看过 Heiko 的评论在另一个相关问题中,这\href要复杂得多,因为它支持图像和其他东西。但修补\href以额外包含一个\texttt不是相当无害吗?

但是,\href看起来相当复杂;如何以侵入性最小的方式修补它以潜入强制等宽字体样式?

我的天真解决方案/MWE 只是重新定义\href并插入一个\texttt,它在简单的测试用例中工作正常,但我不知道在更复杂的 hyperref 用法中会产生什么后果。

\documentclass{article}

\usepackage[hidelinks]{hyperref}

\usepackage{letltxmacro}

\begin{document}
\bigskip
url: \url{www.yahoo.com}

original href: \href{http://www.yahoo.com/}{www.yahoo.com}

\bigskip
url: \url{www.yahoo.com}

nolink-url href: \href{http://www.yahoo.com/}{\nolinkurl{www.yahoo.com}}

% patch it - usually in the preamble of course...
\LetLtxMacro\oldhref\href
\renewcommand{\href}[3][]{%
  \oldhref[#1]{#2}{\texttt{#3}}
}

\bigskip
url: \url{www.yahoo.com}

patched href: \href{http://www.yahoo.com/}{www.yahoo.com}

\medskip
yay!

\end{document}

截屏

这可能造成什么后果(会破坏它的测试用例)以及如何做得更好?

答案1

您可以像这样将 \ttfamily 添加到 \href。我还添加了一个关键选项来在本地进行更改

\documentclass{article}

\usepackage[hidelinks]{hyperref}
\makeatletter
\define@key{href}{font}{#1}
\makeatother
\usepackage{xpatch}
\newcommand\hrefdefaultfont{\ttfamily}
\xpatchcmd\href{\setkeys{href}{#1}}{\setkeys{href}{font=\hrefdefaultfont,#1}}{}{\fail}

\begin{document}
\bigskip
url: \url{www.yahoo.com}

original href: \href{http://www.yahoo.com/}{www.yahoo.com}

some text
\href[font=\rmfamily\bfseries]{http://www.yahoo.com/}{www.yahoo.com}

\end{document}

在此处输入图片描述

答案2

这并没有回答我的问题,但我认为它对某些人可能仍然有用...
经过一番思考,我最终得到了一些完全不同的东西:\url它有两个参数,基本思想相同,\href但第二个参数是可选的:

\documentclass{article}

\PassOptionsToPackage{hyphens}{url}
\usepackage[hidelinks]{hyperref}

\usepackage{xparse}
\usepackage{letltxmacro}

\LetLtxMacro\oldurl\url
\RenewDocumentCommand \url{mg}{%
  \IfNoValueTF{#2}{%
    \oldurl{#1}%
  }{%
    \href{#1}{\nolinkurl{#2}}%
  }
}

\begin{document}

\smallskip
\noindent\rule{\linewidth}{1ex}

\smallskip
\noindent url\hfill\hspace{0.6\linewidth}\url{https://www.yahoo.com/break/me}

\smallskip
\noindent url\#2\hfill\hspace{0.6\linewidth}\url{https://www.yahoo.com/break-me/please}{www.yahoo.com/break/me/please}

\smallskip
\noindent url\#2\hfill\hspace{0.6\linewidth}\url{https://www.yahoo.com/break-me/please}{www.yahoo.com/break-me/please}

\noindent\rule{\linewidth}{1ex}

\end{document}

有了它,您可以轻松创建格式与纯文本相同的链接,\url但仍可以自定义显示的字符(例如,省略https://)。此外,界面更加美观且易于记忆 - 无需\nolinkurl像其他解决方案一样一直重复。

在此处输入图片描述

相关内容