如何在没有超链接的两个文档之间交叉引用标签,同时仍创建指向同一文档内标签的超链接?

如何在没有超链接的两个文档之间交叉引用标签,同时仍创建指向同一文档内标签的超链接?

我有两个带标签的文档(A 和 B)。我想从文档 B 引用文档 A 中的标签。我想使用该hyperref包在文档 B 中创建指向文档 B 中标签的超链接。我想使用正确的编号解析文档 B 中对文档 A 的引用,但我不想为这些引用创建超链接。这可能吗?我的动机是文档 A 正在外部网站上发布,因此我无法链接到其中的引用,并且我不希望超链接断开。

  • 如果我使用xr-hyper包(一个很好的最小示例可以在这个答案对于“两个文件之间的 hyperref 是否有效?”这个问题,当文档 B 引用文档 A 中的标签时,LaTeX 会从文档 B 创建到文档 A 的链接。
  • 如果我使用xr包而不是xr-hyper,当文档 B 引用文档 A 的标签 1 时,LaTeX 将创建指向文档 B 的标签 1 的超链接(即,它仍会尝试创建超链接,但不会将它们链接到文档之外)。

有关完整的最小工作示例,请查看此示例的改编版本答案在这里

docA.tex

\documentclass{article} 
\usepackage{xr-hyper} 
\usepackage{hyperref} 
\externaldocument[B-]{docB}[docB.pdf]% <- full or relative path 
\begin{document}
    This is a test for math.
    \begin{equation}
        E=mc^2 \label{eq:1}
    \end{equation}
    This is a second test for math.
    \begin{equation}
        r = \sqrt{x^2 + y^2} \label{eq:2}
    \end{equation}
    In document B Eq.~~(\ref{B-eq:x}) 
\end{document}

docB.tex

\documentclass{article}
\usepackage{xr-hyper}
\usepackage{hyperref}
\externaldocument[A-]{docA}[docA.pdf]% <- full or relative path
\begin{document}
  \setcounter{equation}{5}

  As was shown in Eq.~(\ref{A-eq:1}) is it
  ... or in Eq.~(\ref{A-eq:2}) is ...
  \begin{equation}
    \mathrm{e}^{i\pi}-1=0 \label{eq:x}
  \end{equation}

  Here is a hyperlinked internal reference to \ref{eq:x}.
\end{document}

我想制作一个 pdf,其中\ref文档 B 中的第一个变成“1”但不超链接到外部文档,\ref文档 B 中的最后一个变成“6”并超链接到eq:x

答案1

感谢您发布一个带有可编译代码的示例。正如@UlrikeFischer 在之前的评论中指出的那样,如果包hyperref已加载,则应使用\ref*而不是\ref创建不是超目标的交叉引用。请注意,这适用于不管交叉引用的目标是否位于同一文档或其他文档中。

仍然假设hyperref已加载,应该使用\autoref*而不是\autoref创建交叉引用,以便(a)自动提供姓名被交叉引用的项目(例如,“部分”、“图”、“脚注”等)作为调用的一部分,并且 (b) 不是超目标。同样,如果cleveref除了包之外还加载了包hyperref,则应该使用\cref*\Cref*而不是\cref\Cref来创建“巧妙的”交叉引用,这些引用也不是超目标。

答案2

我的想法是:

  1. 修补xr-hyper软件包,以便它记录从外部文档读取的所有标签;这使我们能够区分应该自动超链接的内部引用和不应该超链接的外部引用。
  2. hyperref重新定义未加星号的版本\ref来检查引用是否是外部的,如果是的话,则基本上假设使用了加星号的版本。

我相信以下内容可以满足您的要求,仅需进行以下更改docB.tex

\documentclass{article}
\usepackage{xr-hyper}
\usepackage{hyperref}


% following code is to meet objectives of [How to cross-reference labels between two documents without hyperlinks, while still creating hyperlinks to labels within the same document?](http://tex.stackexchange.com/questions/112603/how-to-cross-reference-labels-between-two-documents-without-hyperlinks-while-st)
% insert this after loading xr-hyper and hyperref but before calling \externaldocument
\makeatletter
% patch XR so that it records whether or not the label has come from an external file
\long\def\XR@test#1#2#3#4\XR@{%
  \ifx#1\newlabel
     \expandafter\protected@xdef\csname r@\XR@prefix#2\endcsname
       {\XR@addURL{#3}}%
     \expandafter\protected@xdef\csname isxr@r@\XR@prefix#2\endcsname{1}%
  \else\ifx#1\@input
     \edef\XR@list{\XR@list\filename@area#2\relax}%
  \fi\fi
  \ifeof\@inputcheck\expandafter\XR@aux
  \else\expandafter\XR@read\fi}

% every time \ref is used without an explicit star, check if it is an external reference or not
\AtBeginDocument{%
    \let\orig@T@ref\T@ref
    %patched \T@ref checks if the ref is from xr, and redirects to \@refstar if so
    % else it passes to \orig@T@ref
    \def\T@ref#1{%
        \ifcsname isxr@r@#1\endcsname
            %\typeout{sending #1 to refstar}%
            \@refstar{#1}%
        \else
            %\typeout{sending #1 to orig@T@ref}%
            \orig@T@ref{#1}%
        \fi
    }%
}%
\makeatother
% end patch

\externaldocument[A-]{docA}[docA.pdf]% <- full or relative path
\begin{document}
  \setcounter{equation}{5}

  As was shown in Eq.~(\ref{A-eq:1}) is it
  ... or in Eq.~(\ref{A-eq:2}) is ...
  \begin{equation}
    \mathrm{e}^{i\pi}-1=0 \label{eq:x}
  \end{equation}

  Here is a hyperlinked internal reference to \ref{eq:x}.
\end{document}

输出:

docB 输出

\ref请注意,这可能与挂接到等的其他包不太兼容。

相关内容