组件 pdf 中未定义链接;在 pdfpages 编译时解决

组件 pdf 中未定义链接;在 pdfpages 编译时解决

我正在尝试一些雄心勃勃的事情,并希望有办法实现它。

我有许多 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)。fitpaperpicturecommandcoverpage.texmain.tex\usepackage[pass]{geometry}coverpage.texpass

选项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}

封面上有链接的主文档

相关内容