我正在尝试一些雄心勃勃的事情,并希望有办法实现它。
我有许多 pdf 文档,最终会将它们合并到一个 pdf 中。其中一个文档是封面页,用于包含最终 pdf 中其他组件的链接。
为此,我设置了三个虚拟文档:
% doc1
\documentclass{article}
\begin{document}
This is the first document.
\end{document}
% doc2
\documentclass{article}
\begin{document}
This is the second document.
\end{document}
% doc3
\documentclass{article}
\begin{document}
This is the third document.
\end{document}
然后,我构建封面文档:
% coverpage
\documentclass{article}
\begin{document}
Here is the link to the first document, \ref{doc1.1}.
Here is the link to the second document, \ref{doc2.1}.
Here is the link to the third documents, \ref{doc3.1}.
\end{document}
最后,我构建了包装文档,它调用所有组件 pdf,并定义链接:
% main document
\documentclass{article}
\usepackage[final]{pdfpages}
\usepackage{url}
\usepackage{hyperref}
\title{Document set}
\begin{document}
\maketitle
%\tableofcontents
\includepdf[link=true]{coverpage.pdf}
\includepdf[link=true, linkname=doc1]{doc1.pdf}
\includepdf[link=true, linkname=doc2]{doc2.pdf}
\includepdf[link=true, linkname=doc3]{doc3.pdf}
\end{document}
我希望在 中编译时显示 coverpage 中的参考资料main.tex
。显然,我想要的coverpage.tex
文件中引用的参考资料存在于main.aux
文件中。我想知道是否有办法简化此过程以使其有效,或者是否有更简单的方法来做到这一点。
我想单独编写封面页而不是在主文档中编写,因为它使用自己的文档类,而这不是我希望主文档的排版方式。
答案1
困难在于:
- 当包含 PDF 页面时,注释(链接)会丢失。
- 即使它们不会丢失,问题仍然存在,即如何将文档间链接转换为文档内链接。
以下示例使用pdfTeX/LuaTeX或XeTeX的定位跟踪功能。步骤如下。
首先,该文档coverpage
没有设置任何链接,但它保存的是文件中链接文本的位置而不是链接.aux
。
\documentclass[a4paper]{article}
\usepackage[pass]{geometry}
\usepackage{zref-savepos}
\newcommand*{\sref}[2]{%
\begingroup
\sbox0{#2}%
\raisebox{-\dp0}{\zsavepos{#1-a}}%
\usebox0%
\raisebox{\ht0}{\zsavepos{#1-b}}%
\endgroup
}
\begin{document}
Here is the link to the \sref{doc1}{first document}.
Here is the link to the \sref{doc2}{second document}.
Here is the link to the \sref{doc3}{third document}.
\end{document}
第一个参数\sref
是链接句柄/标签名称,第二个参数是页面上显示的链接文本。
包zref-savepos
是该功能的包装器\pdfsavepos
。位置是带有隐式单位的数字sp
。原点是左下角。该.aux
文件包含:
\relax
\providecommand\zref@newlabel[2]{}
\zref@newlabel{doc1-a}{\posx{15751804}\posy{46450400}}
\zref@newlabel{doc1-b}{\posx{19907887}\posy{46905511}}
\zref@newlabel{doc2-a}{\posx{15751804}\posy{45663968}}
\zref@newlabel{doc2-b}{\posx{20670654}\posy{46119079}}
\zref@newlabel{doc3-a}{\posx{15751804}\posy{44877536}}
\zref@newlabel{doc3-b}{\posx{20195519}\posy{45332647}}
主文档.aux
使用 package 读取文件中的数据zref-xr
。标签名称以 为前缀,以cover-
避免名称冲突:
\usepackage{zref-xr}
\zexternaldocument[cover-]{coverpage}
然后,将选项和coverpage
包含在内。第一个选项确保包含的页面不会因某些未知的缩放因子而缩放,从而使位置无效。确保和使用相同的纸张大小,其次需要通知输出驱动程序,因为 LaTeX 不会这样做。我为使用了 A4 纸张大小和。选项不会更改当前几何形状,包会将纸张大小通知输出驱动程序 (pdfTeX)。fitpaper
picturecommand
coverpage.tex
main.tex
\usepackage[pass]{geometry}
coverpage.tex
pass
选项picturecommand=\coverlinks
调用宏\coverlinks
,使用导入的位置标签将链接设置在正确的位置。链接文本本身只是一个使用不可见规则的正确大小的空框。
\documentclass[a4paper]{article}
\usepackage[final]{pdfpages}
\usepackage{url}
\usepackage{hyperref}
\usepackage{zref-xr,zref-savepos}
\zexternaldocument[cover-]{coverpage}
\newcommand*{\coverlinks}{%
\setlength{\unitlength}{1sp}%
\coverlink{doc1}%
\coverlink{doc2}%
\coverlink{doc3}%
}
\newcommand*{\coverlink}[1]{%
\put(\zposx{cover-#1-a},\zposy{cover-#1-a}){%
\makebox(0,0)[lb]{%
\hyperlink{#1.1}{%
\rule{0pt}{\dimexpr\zposy{cover-#1-b}sp-\zposy{cover-#1-a}sp}%
\rule{\dimexpr\zposx{cover-#1-b}sp-\zposx{cover-#1-a}sp}{0pt}%
}%
}%
}%
}
\title{Document set}
\begin{document}
\maketitle
%\tableofcontents
\includepdf[fitpaper,link=true,picturecommand=\coverlinks]{coverpage.pdf}
\includepdf[link=true, linkname=doc1]{doc1.pdf}
\includepdf[link=true, linkname=doc2]{doc2.pdf}
\includepdf[link=true, linkname=doc3]{doc3.pdf}
\end{document}