我需要一个包含超链接的引用%
。如果使用url 中的\usepackage{hyperref}
格式,
\href{https://www.wikibooks.org}{Wikibooks home}
则会出现问题%
。如何避免此问题?
答案1
如果其他宏的参数中没有使用\href
或,那么就可以起作用,因为逐字读取 URL 参数。\url
%
hyperref
但是,如果在其他命令的参数中使用 或 ,则逐字类别代码的类别更改来得太晚,字符串已被 TeX 读取。在这种情况下,一些有问题的字符(如\href
或)可以通过使用反斜杠转义来保护。\url
%
#
例子:
\documentclass{article}
\usepackage{hyperref}
\begin{document}
\url{http://example.org/a%20b.html}
\href{http://example.org/a%20b.html}{a b}
\textbf{\url{http://example.org/a\%20b.html}}
\textbf{\href{http://example.org/a\%20b.html}{a b}}
\end{document}
PDF 文件包含正确的 URL:
/Subtype/Link/A<</Type/Action/S/URI/URI(http://example.org/a%20b.html)>>
/Subtype/Link/A<</Type/Action/S/URI/URI(http://example.org/a%20b.html)>>
/Subtype/Link/A<</Type/Action/S/URI/URI(http://example.org/a%20b.html)>>
/Subtype/Link/A<</Type/Action/S/URI/URI(http://example.org/a%20b.html)>>
答案2
三条评论,三个可行的解决方案:全部有效,至少对于pdftex
驱动程序而言。
% My standard header for TeX.SX answers:
\documentclass[a4paper]{article} % To avoid confusion, let us explicitly
% declare the paper format.
\usepackage[T1]{fontenc} % Not always necessary, but recommended.
% End of standard header. What follows pertains to the problem at hand.
\usepackage{hyperref}
\urldef{\MYurl}\url{http://www.w3.org/file%query}
\begin{document}
See \url{http://www.w3.org/file\%query}.
See \MYurl.
See
\begingroup
\catcode`\% = 12
\url{http://www.w3.org/file%query}.
\endgroup
\showboxbreadth = 1000
\showboxdepth = 10
\showlists
\end{document}
该\showlists
命令将在转录文件中写入由 pdfTeX 生成的内部列表的描述:您可以检查链接是否始终正确编码。
编辑:作为Heiko Oberdiek 评论道,上述内容并不是特别令人兴奋;更有趣的是,所有这三种解决方案(包括基于的解决方案\urldef
)也在命令的参数中起作用。
% My standard header for TeX.SX answers:
\documentclass[a4paper]{article} % To avoid confusion, let us explicitly
% declare the paper format.
\usepackage[T1]{fontenc} % Not always necessary, but recommended.
% End of standard header. What follows pertains to the problem at hand.
\usepackage{hyperref}
\urldef{\MYurl}\url{http://www.w3.org/file%query}
\newcommand*{\WrapInArgument}[1]{%
\typeout{}%
\typeout{\unexpanded{#1}}%
\typeout{}%
#1%
}
\begin{document}
See \WrapInArgument{\url{http://www.w3.org/file\%query}}.
See \WrapInArgument{\MYurl}.
See
\begingroup
\catcode`\% = 12
\WrapInArgument{\url{http://www.w3.org/file%query}}.
\endgroup
\showboxbreadth = 1000
\showboxdepth = 10
\showlists
\end{document}