使用 \href 在本地文件之间进行交叉引用

使用 \href 在本地文件之间进行交叉引用

我正在努力创建不同文件之间的交叉引用。我想做的是以下几点。我想创建两个单独的文档(书籍)。其中一个文档(doc1)将包含练习,另一个文档(doc2)将提供这些练习的解决方案。我想要的是在 doc1 中的每个练习后创建一个链接,上面写着:“解决方案在这里”,当你点击“这里”时,它会打开 doc2 并带你到练习的解决方案。

类似地,在 doc2 中,每个练习解决方案都会有一个标题,指出“这是练习 x 的解决方案”,当您单击 x 时,它会带您回到练习开始处的 doc1。

我查看了论坛上的许多相关主题,根据我的发现,我最初认为我可以使用 hyperref 和 xr-hyper 包的组合来完成这项工作。我尝试了类似这样的方法:

文档1:

\documentclass[11pt,a4paper,fleqn]{book}
\usepackage{xr-hyper}
\externaldocument[doc2-]{doc2}
\usepackage{hyperref} 
\usepackage[nopar]{lipsum} 

\begin{document}

\lipsum[1-6]
\\ \\
This is exercise 1 \label{ex1} \\
\lipsum[1-6] \\
Solution is \href{doc2.pdf#correx1}{\textbf{here}}.
\\ \\
This is exercise 2 \label{ex2} \\
\lipsum[1-6] \\
Solution is \href{doc2.pdf#correx2}{\textbf{here}}.
\\ \\
\lipsum[1-6]

\end{document} 

和文档2:

\documentclass[11pt,a4paper,fleqn]{book}
\usepackage{xr-hyper}
\externaldocument[doc1-]{doc1}
\usepackage{hyperref}
\usepackage[nopar]{lipsum}

\begin{document}

\lipsum[1-6]
\\ \\
This is the solution to exercise \href{doc1.pdf#ex1}{1} \label{correx1} \\
\lipsum[1-6]
\\ \\
This is the solution to exercise \href{doc1.pdf#ex2}{2} \label{correx2} \\
\lipsum[1-6]
\\ \\
\lipsum[1-6]

\end{document} 

从某种意义上说,它是有效的:超链接已创建,并且它们确实打开了其他文档。但是,单击链接时,它不会指向 \ref-erenced 标签,而是指向文档中的某个随机位置。这毁了整个事情。

您有什么建议吗?

答案1

这只是一个概念证明,需要完善,但它可以按要求工作并说明了相关方法。

您应该创建一个新的空目录,然后将以下三个文件保存在该目录下,并使用下面指定的名称。


文件内容CommonMacros.tex

\newcommand*{\SolutionBook}{SoluBook.pdf}
\newcommand*{\ExerciseBook}{MainBook.pdf}

\newcommand*{\exercisename}[1]{Exercise~#1.}
\newcommand*{\exercisecategory}{exercise}
\newcommand*{\solutionname}[1]{Solution of Exercise~#1.}
\newcommand*{\solutioncategory}{solution}

% In the following two commands, #1 stands for the part that is to be made
% clickable:
\newcommand*{\seeexercisephrase}[1]{See exercise #1.}
\newcommand*{\seesolutionphrase}[1]{See solution #1.}
\newcommand*{\herename}{here}

\newcommand*{\exesolubreak}{%
    \addpenalty{-200}%
    \addvspace{\bigskipamount}%
}

\newcounter{exercise}[section]
\renewcommand*{\theexercise}{\thesection.\arabic{exercise}}
\newenvironment*{exercise}{%
    \exesolubreak
    \noindent
    \refstepcounter{exercise}%
    \hyperdef{\exercisecategory}{\theHexercise}%
        {\textbf{\exercisename{\theexercise}}}%
    \nobreak\quad
    \ignorespaces
}{%
    \par
    \nobreak\smallskip
    \begingroup
        \footnotesize
        \noindent
        \seesolutionphrase{%
            \hyperref{\SolutionBook}{\solutioncategory}{\theHexercise}%
                {\herename}%
        }%
        \par
    \endgroup
    \addvspace{\bigskipamount}%
}

% In a real-life example, the two books would "communicate" through some sort 
% of auxiliary file; here, we assume that each solution correspond to the 
% exercise with the same number.
\newcounter{solution}[section]
\renewcommand*{\thesolution}{\thesection.\arabic{solution}}
\newenvironment*{solution}{%
    \exesolubreak
    \noindent
    \refstepcounter{solution}%
    \hyperdef{\solutioncategory}{\theHsolution}%
        {\textbf{\solutionname{\thesolution}}}%
    \nobreak\quad
    \ignorespaces
}{%
    \par
    \nobreak\smallskip
    \begingroup
        \footnotesize
        \noindent
        \seeexercisephrase{%
            \hyperref{\ExerciseBook}{\exercisecategory}{\theHsolution}%
                {\herename}%
        }%
        \par
    \endgroup
    \addvspace{\bigskipamount}%
}

文件内容MainBook.tex

% My standard header for TeX.SX answers:
\documentclass[a4paper]{article} % To avoid confusion, let us explicitly 
                                 % declare the paper format.

\usepackage[T1]{fontenc}         % Not always necessary, but recommended.
% End of standard header.  What follows pertains to the problem at hand.

\usepackage{hyperref}
\usepackage{lipsum}

\input{CommonMacros}



\begin{document}

\section{Some argument}

\lipsum[1-2]

\begin{exercise}
    \lipsum*[\arabic{exercise}]
\end{exercise}

\lipsum[3]

\begin{exercise}
    \lipsum*[\arabic{exercise}]
\end{exercise}

\lipsum[4-6]

\begin{exercise}
    \lipsum*[\arabic{exercise}]
\end{exercise}

\lipsum[7-8]

\begin{exercise}
    \lipsum*[\arabic{exercise}]
\end{exercise}

\lipsum[9]

\begin{exercise}
    \lipsum*[\arabic{exercise}]
\end{exercise}



\section{Another argument}

\lipsum[10]

\begin{exercise}
    \lipsum*[1\arabic{exercise}]
\end{exercise}

\lipsum[11-12]

\begin{exercise}
    \lipsum*[1\arabic{exercise}]
\end{exercise}

\lipsum[13]

\begin{exercise}
    \lipsum*[1\arabic{exercise}]
\end{exercise}

\lipsum[14]

\begin{exercise}
    \lipsum*[1\arabic{exercise}]
\end{exercise}

\lipsum[15-16]

\begin{exercise}
    \lipsum*[1\arabic{exercise}]
\end{exercise}

\end{document}

文件内容SoluBook.tex

% My standard header for TeX.SX answers:
\documentclass[a4paper]{article} % To avoid confusion, let us explicitly 
                                 % declare the paper format.

\usepackage[T1]{fontenc}         % Not always necessary, but recommended.
% End of standard header.  What follows pertains to the problem at hand.

\usepackage{hyperref}
\usepackage{lipsum}

\input{CommonMacros}



\begin{document}

\section{Some argument}

\begin{solution}
    \lipsum*[\arabic{solution}]
\end{solution}

\begin{solution}
    \lipsum*[\arabic{solution}]
\end{solution}

\begin{solution}
    \lipsum*[\arabic{solution}]
\end{solution}

\begin{solution}
    \lipsum*[\arabic{solution}]
\end{solution}

\begin{solution}
    \lipsum*[\arabic{solution}]
\end{solution}



\section{Another argument}

\begin{solution}
    \lipsum*[1\arabic{solution}]
\end{solution}

\begin{solution}
    \lipsum*[1\arabic{solution}]
\end{solution}

\begin{solution}
    \lipsum*[1\arabic{solution}]
\end{solution}

\begin{solution}
    \lipsum*[1\arabic{solution}]
\end{solution}

\begin{solution}
    \lipsum*[1\arabic{solution}]
\end{solution}

\end{document}

现在,编译文件MainBook.texSoluBook.tex。忽略有关重复目标的警告,这是绝对正常的,因为不止一个练习/解决方案会出现在同一页上。生成的两个文件MainBook.pdfSoluBook.pdf应该会表现出所要求的行为。

答案2

因此,我又开始寻找问题的简单解决方案。@GustavoMezzeti 提出了一个不错的解决方案,但看起来确实很复杂。除此之外,我不确定他创建的超链接类型不仅可以实现超链接,还可以实现超引用(自动引用与链接元素关联的潜在标签)。

经过更多研究,我想我找到了解决方案。它主要建立在以下元素之上: 这个帖子,建议使用 \hyperdef(标签)+ \hyperref(链接)。这个想法是双重标记。一个标签是实际的 \label,它为以后的引用生成编号,并且必须插入到可标记的环境中(出于这个原因,我在练习和解决方案中使用定理环境)。第二个“标签”实际上是 \hyperdef:它主要是用作超链接锚点的幻像元素。

该解决方案有优点也有缺点。

优点:它有效;它很简单;它很灵活,因为它不仅允许链接到其他文档,还允许引用外部标签,如代码末尾的方程式示例所示。

缺点:很重:所有东西都必须贴双重标签。

代码如下:

文档1:`

\documentclass[11pt,a4paper,fleqn]{book}
\usepackage{xr-hyper}
\externaldocument[doc2-]{doc2}
\usepackage{hyperref}
\usepackage[nopar]{lipsum}
\usepackage{amsthm}
\newtheoremstyle{standardstyle}{}{}{}{}{\bfseries}{:}{ }{}
\theoremstyle{standardstyle}
\newtheorem{exrc}{exercise}[chapter]


\begin{document}

\chapter{}
\label{chap1}

\lipsum[1]

\hyperdef{categoryname}{hrex1}{}
\begin{exrc} \label{ex1} This is an exercise.\\ \lipsum[2] \\
Solution is \hyperref{doc2}{categoryname}{hrsolex1}{\textbf{here}}.
\end{exrc}

\lipsum[3]

\hyperdef{categoryname}{hrex2}{}
\begin{exrc} \label{ex2} This is a second exercise.\\ \lipsum[4] \\
Solution is \hyperref{doc2}{categoryname}{hrsolex2}{\textbf{here}}.
\end{exrc}

\lipsum[5] \\

Finally, this is a link to equation \hyperref{doc2}{categoryname}{hreq1}{\ref*{doc2-eq1}} in doc2.

\end{document}

对于 doc2:`

\documentclass[11pt,a4paper,fleqn]{book}
\usepackage{xr-hyper}
\externaldocument[doc1-]{doc1}
\usepackage{hyperref}
\usepackage[nopar]{lipsum}
\usepackage{amsthm}
\newtheoremstyle{standardstyle}{}{}{}{}{\bfseries}{:}{ }{}
\theoremstyle{standardstyle}
\newtheorem{sol}{solution}[chapter]


\begin{document}

\chapter{}
\label{chap1}

\lipsum[1]

\hyperdef{categoryname}{hrsolex1}{}
\begin{sol} \label{solex1} This is the solution to the first exercise. \\ \lipsum[2] \\
Exercise is \hyperref{doc1}{categoryname}{hrex1}{\textbf{here}}.
\end{sol}

\lipsum[3]

\hyperdef{categoryname}{hrsolex2}{}
\begin{sol} \label{solex2} This is the solution to the second exercise. \\ \lipsum[4] \\
Exercise is \hyperref{doc1}{categoryname}{hrex2}{\textbf{here}}.
\end{sol}

\lipsum[5] \\

Now this is an equation:
\hyperdef{categoryname}{hreq1}{}
\begin{equation}
2+2 = 4 \label{eq1}
\end{equation}

\end{document} 

相关内容