如何在 hyperref 的 \href 中将标签(由 \ref 生成)用作 URL?

如何在 hyperref 的 \href 中将标签(由 \ref 生成)用作 URL?

如何在命令中使用标签(的结果\ref)作为第一个参数(URL)\href?我希望能够做到:

\documentclass{article}
\usepackage{hyperref}
\begin{document}
\def\URLcite#1#2{%\href{\ref{URL:#1}} % fatal error if not commented out
{#2}~\cite{#1}}

The \URLcite{WP:plain}{wikipedia page for ``plain text''} explains that ...

\begin{thebibliography}{WW}
\def\WPURL#1#2{\def\@currentlabel{http://en.wikipedia.org/wiki/#2}\label{URL:#1}
Available at URL: %\href{\ref{URL:#1}} % fatal error if not commented out
{\texttt{\ref{URL:#1}}}}

\bibitem {WP:plain} Wikipedia: \emph{Plain text}. \WPURL{WP:plain}{Plain\_text}

\end{thebibliography}

一切都按预期运行,除了那些\href不幸地在未注释掉时产生“TeX 容量超出,抱歉 [...]”的命令(在两种情况下)。我还尝试了在其他地方找到的\protected@edefand/or \phantomsection,但它没有改变任何东西。

对于第二个实例,在\bibitem定义标签 {URL:...} 的位置,我可以使用解决方法

\def\WPURL#1#2{\edef\tmp{http://en.wikipedia.org/wiki/#2}
\edef\@currentlabel{\tmp}\label{URL:#1}
Available at URL: \url{\tmp}} %% or equivalenty \href{\tmp}{\tt\tmp}

然后再次,\ref{URL:WP:plain}产生预期的结果(与\tmp在 内相同\bibitem),并且在 \bibitem 内,只要使用而不是 ,\url/命令就可以工作。\href\tmp\ref{URL:WP:plain}

但是,我希望能够在主文本中使用该标签的值。我尝试将其复制到命令中的 temp.variable 中\URLcite,其中包含许多\expandafter\edef,但如果我理解问题所在,就无法删除\protect似乎由\label命令生成的 。

是否可以\label在命令中使用存储在 URL 中的值(第一个参数)\href

答案1

我建议使用.bib 文件和 biblatex。

如果您不喜欢维护两个包含输入源的文件,您可以通过 -environment 在 .tex 文件中维护 .bib 文件filecontents*,可能切换filecontents*-environment-options overwrite=false/ overwrite=true

如果你真的不喜欢这个,你可以使用这个包引用计数 用于使用\href命令的 URL 参数可扩展地提取交叉引用数据。在任何情况下,交叉引用标签在第一次 latex 运行期间都不会定义。因此,我添加了一些检查和默认处理这种情况的方法。(指向 pdf 文件本身第 1 页的超链接,而不是尝试创建指向未知 URL 的超链接,因为引用应该传递它的交叉引用标签未定义。)

\documentclass{article}
\usepackage{hyperref}
\usepackage{refcount}

\newcommand\URLcite[2]{%
  \refused{URL:#1}%
  \IfRefUndefinedBabel{URL:#1}{%
    \hyperlink{Doc-Start}%
  }{%
    \href{\getrefbykeydefault{URL:#1}{}{}}%
  }{#2}~\cite{#1}%
}

\makeatletter
\newcommand\WPURL[2]{%
  \begingroup
  \def\@currentlabel{http://en.wikipedia.org/wiki/#2}%
  \label{URL:#1}%
  \endgroup
  Available at URL: %
  \refused{URL:#1}%
  \IfRefUndefinedBabel{URL:#1}{%
    \hyperlink{Doc-Start}%
  }{%
    \href{\getrefbykeydefault{URL:#1}{}{}}%
  }%
  {\texttt{\getrefbykeydefault{URL:#1}{}{\textsf{??}}}}%
}% 
\makeatother


\begin{document}

The \URLcite{WP:plain}{wikipedia page for ``plain text''} explains that ...

\begin{thebibliography}{1}
\bibitem {WP:plain}Wikipedia: \emph{Plain text}.\\ \WPURL{WP:plain}{Plain\_text}
\end{thebibliography}

\end{document}

第一次运行 LaTeX 之后的 Pdf 文件,其中引用和交叉引用标签仍然未定义/未知 - 也遵循控制台和 .log 文件中的消息:

在此处输入图片描述

随后运行 LaTeX 之后的 Pdf 文件(其中引用和交叉引用标签已定义/已知)仍然遵循控制台和 .log 文件中的消息 ;-) :

在此处输入图片描述

答案2

感谢 Ulrich 的回答,我找到了问题的答案,我将在这里写下来以供自己参考,也供其他正在寻找此问题的人士不受干扰地参考:完成这项工作的关键和所需要做的就是用 替换普通命令\ref{...}\getrefbykeydefault{URL:#1}{}{}这可以避免由于第一次运行期间未定义的标签导致的错误而导致编译中止)。不需要出现其他包和命令:

\documentclass{article}
\usepackage{hyperref}
\newcommand\URLcite[2]{\href{\getrefbykeydefault{URL:#1}{}{}}{#2}~\cite{#1}}
\makeatletter
\newcommand\WPURL[2]{{\def\@currentlabel{http://en.wikipedia.org/wiki/#2}\label{URL:#1}}
 Available at URL: \href{\getrefbykeydefault{URL:#1}{}{}}{\texttt{\ref{URL:#1}}}}

\begin{document}

The \URLcite{WP:plain}{wikipedia page for ``plain text''} explains that ...

\begin{thebibliography}{1}
\bibitem {WP:plain}Wikipedia: \emph{Plain text}. \WPURL{WP:plain}{Plain\_text}
\end{thebibliography}

\end{document}

显然,保存 URL 的标签是在参考书目环境/“参考”部分中定义的,这与问题完全无关。正如问题标题明确指出的那样,关键在于在文档中的任何地方定义 URL,并将其用作其他任何地方\href命令的第一个参数,特别是在定义之前。

然而,这个问题与我有些相关关于如何避免{WP:plain}在命令中手动放置/重复 bibitem 的标签(此处:) \WPURL

相关内容