我正在努力创建不同文件之间的交叉引用。我想做的是以下几点。我想创建两个单独的文档(书籍)。其中一个文档(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.tex
和SoluBook.tex
。忽略有关重复目标的警告,这是绝对正常的,因为不止一个练习/解决方案会出现在同一页上。生成的两个文件MainBook.pdf
和SoluBook.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}