![自定义 \href 命令中使用“#”的问题](https://linux22.com/image/242781/%E8%87%AA%E5%AE%9A%E4%B9%89%20%5Chref%20%E5%91%BD%E4%BB%A4%E4%B8%AD%E4%BD%BF%E7%94%A8%E2%80%9C%23%E2%80%9D%E7%9A%84%E9%97%AE%E9%A2%98.png)
我遇到了如下描述的类似问题: 如何将 \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 打开一个#
将被视为普通字符的组,只有在此之后我们才会吸收参数。