我正在尝试添加外部链接符号(来自https://tex.stackexchange.com/a/294990/163482) 到 href,但出于某种原因,当我重新定义 href 命令时,符号后的间距是错误的。正确的做法是什么(以及正确的间距是多少)?
\documentclass{article}
\usepackage{tikz,hyperref}
\newcommand{\ExternalLink}{%
\tikz[x=1.2ex, y=1.2ex, baseline=-0.5ex, scale=0.75]{%
\begin{scope}[x=1ex, y=1ex]
\clip (-0.1,-0.1)
--++ (-0, 1.2)
--++ (0.6, 0)
--++ (0, -0.6)
--++ (0.6, 0)
--++ (0, -1);
\path[draw=black, line width = 0.5,
rounded corners=0.5] (0,0) rectangle (1,1);
\end{scope}
\path[draw=black, line width = 0.5] (0.5, 0.5) -- (1, 1);
\path[draw=black, line width = 0.5] (0.6, 1) -- (1, 1) -- (1, 0.6);
}
}
\let\orighref\href
\renewcommand{\href}[2]{\orighref{#1}{#2}$\,$\ExternalLink}
\begin{document}
\noindent
Some text \href{http://google.com}{link} some more text.\\
Some text \orighref{http://google.com}{link}$\,$\ExternalLink some more text.
\end{document}
答案1
当你写:
Some text \orighref{http://google.com}{link}$\,$\ExternalLink some more text.
\ExternalLink
TeX 会忽略后面的空格,因为\ExternalLink
是名称以字母结尾的控制序列。相反,使用:
Some text \href{http://google.com}{link} some more text.
后面有一个空格标记{link}
,它不会被忽略。它为正在构建的水平列表贡献了一个单词间空格。这就是为什么您在示例的第一个案例中看到更大的空间(此处为第二个案例)。为了摆脱这个额外的空间,您可以编写:
Some text \href{http://google.com}{link}some more text.
\ignorespaces
或者在重新定义中使用\href
,以忽略输入中的空格(\ignorespaces
根据 TeX 语法,从输入流中扩展标记,直到找到不是 〈空格标记〉 的不可扩展标记):
\renewcommand*{\href}[2]{\orighref{#1}{#2}$\,$\ExternalLink\ignorespaces}
但实际上,您不想使用任何这些建议。这是因为在您的\ExternalLink
命令中,有一个很可能不需要的空格:
\newcommand{\ExternalLink}{%
...
\path[draw=black, ...] ... ;
} % <------- here, remove the space
}
因此,您的\ExternalLink
命令无条件地在图标后添加了这个空格。我认为,当超链接后面跟着逗号或句号时,这是不必要的。因此,我会删除这个空格;这样您就不再需要了\ignorespaces
。
还请注意,您无需处于数学模式即可使用;在数学模式之外使用时\,
会产生。因此,您可以执行以下操作:\thinspace
\renewcommand*{\href}[2]{\orighref{#1}{#2}\,\ExternalLink}
其他建议:您可能希望在可点击链接中包含图标:
\renewcommand*{\href}[2]{\orighref{#1}{#2\,\ExternalLink}}
我使用是\renewcommand*
因为大多数可能的参数\href
不应该包含\par
标记;这使得查找错误更容易。
注意:在 处不会有换行符\,
,因为此宏\thinspace
在非数学模式下会扩展为 ,而它本身会扩展为,并且只有紧接着粘连符时\kern
才能在 处换行——但此处并非如此,因为以一个框开头:Ti\kern
\ExternalLink
钾Z 图片。
最后说明:您的链接将使 TeX 在 Ti 上努力工作钾每次使用时都会重新定义 Z 图片\href
(即,对于每个超链接)。由于图标始终相同,因此有一种方法可以节省编译时间:保存图片一次放在一个框中,然后在需要时使用该框。这非常节省计算资源。总而言之,这是我的建议(由于我们在评论中的讨论,我添加了一张带标题的图片——该\usebox
命令不需要编辑\protect
,如示例所示):
\documentclass{article}
\usepackage{tikz}
\usepackage[hidelinks]{hyperref} % 'hidelinks' removes the border around links
\newsavebox{\ExternalLinkIcon}
\begin{lrbox}{\ExternalLinkIcon}
\begin{tikzpicture}[x=1.2ex, y=1.2ex, baseline=-0.5ex, scale=0.75]
\begin{scope}[x=1ex, y=1ex]
\clip (-0.1,-0.1)
--++ (-0, 1.2)
--++ (0.6, 0)
--++ (0, -0.6)
--++ (0.6, 0)
--++ (0, -1);
\path[draw=black, line width = 0.5,
rounded corners=0.5] (0,0) rectangle (1,1);
\end{scope}
\path[draw=black, line width = 0.5] (0.5, 0.5) -- (1, 1);
\path[draw=black, line width = 0.5] (0.6, 1) -- (1, 1) -- (1, 0.6);
\end{tikzpicture}% <--- important!
\end{lrbox}
\let\orighref\href
\renewcommand*{\href}[2]{%
\orighref{#1}{#2\,\usebox{\ExternalLinkIcon}}%
}
\begin{document}
\noindent
Some text \href{http://example.com}{link} some more text. Spacing is also fine
before a \href{http://example.com}{comma}, as you can see. Periods are fine
too, of course---we don't have to do anything special.
\begin{figure}[htbp]
\centering
This is the figure contents.
\caption{A caption containing a \href{http://example.com}{hyperlink}}
\end{figure}
\end{document}