我使用自定义命令 \blink马丁·沙勒的代码在 beamer 演示文稿中显示带蓝色下划线的链接。 \blink 在 \href 命令中使用其命令 \blurl。它可以工作,但是,我无法将自定义命令 \blink 与包含 # 的 URL 一起使用。编译时出现错误:
\documentclass{beamer}
\usepackage{ulem}
% Colored links https://tex.stackexchange.com/questions/23208/i-cannot-get-a-properly-underlined-hyperlink-in-blue
\useunder{\uline}{\ulined}{}%
\DeclareUrlCommand{\blurl}{\def\UrlFont{\color{blue}\ulined}}
\providecommand{\blink}[2]{\href{#1}{\blurl{#2}}}
\begin{document}
\begin{frame}[fragile]
\frametitle{Nasty Link}
\blink{https://docs.python.org/3.7/library/stdtypes.html#string-methods}{string methods}
\end{frame}
\end{document}
错误:
! Illegal parameter number in definition of \Hy@tempa.
<to be read again>
s
l.2 ...dtypes.html#string-methods}{string methods}
我曾尝试将 URL 中的 # 替换为 %23(我在 latetex 代码中转义了 % 符号)。该版本编译得很好,但我链接到的网站似乎不接受 %23 代替 #,因此结果文档中的可点击链接不符合目标。
当我不使用自定义命令 \blink 并像
\href{https://docs.python.org/3.7/library/stdtypes.html#string-methods}{\blurl{href with blurl}}
然后文档就可以顺利编译,并且链接可以正常工作。我该如何改进 \blink 命令,以便它可以处理带有 # 和其他 Latex 控制字符的 URL?
答案1
我尝试制作你的代码的通用版本,这引发了这个问题:宏字符“#”在变成字母时会加倍吗?,这反过来让我能够在下面给出答案。它基本上将 -character 变成#
字母,然后读取链接及其描述。然后它返回#
到宏 char(通过作用域)
\documentclass{beamer}
\usepackage{ulem}
% Colored links https://tex.stackexchange.com/questions/23208/i-cannot-get-a-properly-underlined-hyperlink-in-blue
\useunder{\uline}{\ulined}{}%
\DeclareUrlCommand{\blurl}{\def\UrlFont{\color{blue}\ulined}}
\def\blink{%
%% We want the #-sign only to be a letter (catcode 11) temporarily, so begin the scope group
\bgroup%
% Below, # is made a letter until \egroup is called
\catcode`\#=11\relax%
% Trigger the URL-reader
\makeblinkurl%
}
\def\makeblinkurl#1#2{%
% This will read the link and link description
% after the # is made a letter by the \blink macro
\href{#1}{\blurl{#2}}%
% We want the #-sign only to be a letter up til here, so we group it.
% the broup will start in the below \blink macro,
% and we wnd it here:
\egroup%
}
\begin{document}
\begin{frame}[fragile]
\frametitle{Nice Link}
\blink{https://docs.python.org/3.7/library/stdtypes.html#string-methods}{string methods}
\end{frame}
\end{document}