自定义 \href 命令中使用“#”的问题

自定义 \href 命令中使用“#”的问题

我遇到了如下描述的类似问题: 如何将 \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 打开一个#将被视为普通字符的组,只有在此之后我们才会吸收参数。

相关内容