我遇到了如下描述的类似问题: 如何将 \newcommand 用于 \href?
但是,我想指定一个#
带有符号的 URL。我知道我应该用 转义#
,\#
但由于我们有许多包含 的链接#
,因此能够将 URL 直接复制并粘贴到 LaTeX 代码中可能会更好。
我当前的解决方案如下:
\documentclass{article}
\usepackage{hyperref}
\usepackage{ifthen}
\newcommand*{\myhref}[2][]{\href{http://myserver/#2}%
{\ifthenelse{\equal{#1}{}}{#2}{#1}}}
\begin{document}
\myhref{somewhere} % WORKS
\myhref[LINK TEXT]{somewhere} % WORKS
\myhref{somewhere\#anchor} % WORKS
\myhref[LINK TEXT]{somewhere\#anchor} % WORKS
\myhref{somewhere/#anchor} % WORKS NOT - BUT I WANT IT TO WORK !!!
\myhref[LINK TEXT]{somewhere#anchor} % WORKS NOT - BUT I WANT IT TO WORK !!!
\end{document}
有没有办法自动转义#
参数中的字符\myhref
?
答案1
你必须#
以“正常角色”的身份去吸收
\makeatletter
\newcommand*{\myhref}{\begingroup\@makeother\#\@myhref}
\newcommand*{\@myhref}[2][]{%
\href{http://myserver/#2}{\ifthenelse{\equal{#1}{}}{#2}{#1}}%
\endgroup}
\makeatother
包裹超链接可以很好地处理这些奇怪的字符,但这里的问题是,当你说\myhref{somewhere#anchor}
已经#
被类别代码为 6 的 TeX 吸收时,这会破坏\href
。
在这里我们告诉 LaTeX 打开一个#
将被视为普通字符的组,只有在此之后我们才会吸收参数。