可以使用“\includepdf”插入指向特定页面的书签吗?

可以使用“\includepdf”插入指向特定页面的书签吗?

这个问题之前有人问过(是否可以使用 \includepdf 索引插入的非乳胶 PDF)但无人回答。

可以使用软件包中的命令\bookmark编译的特定页面来制作书签(例如\includepdfpdfpages\pdfbookmark 到页码和位置,使用 \includepdf

我们还知道可以使用 来获取插入的正确页码\includepdf。这可以通过 选项来演示addtolist\includepdf该选项可用于构建表格列表或图形列表格式的项目列表。

因此,是否可以将索引条目附加到该功能使用的相同页码addtolist

我的 MWE 执行以下操作:使用和图像test.pdf制作一个名为的简单 2 页 pdf 文件。\lipsum

MWE 的第二部分使用\includepdf两次来连接两个副本test.pdf。这会产生一个包含 4 页的文件。目录的生成会在文档前面添加一个页面。使用选项addtolist,使用创建书签列表@starttoc{lot}。这些书签指向第一个test.pdf文件的第 1 页和第 2 页,然后指向第二个test.pdf文件的第 1 页和第 2 页。书签是使用宏创建的,该宏使用\bookmark和发布在 TeX.SE 上(此处)\pdfbookmark 到页码和位置,使用 \includepdf)。我修改了宏,添加了\index{#5}#5 是书签页面的标签(我没想到它会起作用)。使用\makeidx,在文档的第 6 页上创建索引。

但是,索引中的页码不正确。第一个副本的书签所附的索引条目test.pdf仅引用文件的第一页(第 1 页),而第二个文件中书签所关联的索引条目则引用第 3 页。至少索引可以识别物理页码,但书签 2 和 4 与第 2 页和第 4 页相关联,而索引报告的是第 1 页和第 3 页。这与使用该addtolist功能时与页码的关联形成对比,该功能确实会生成具有正确页码的表格条目。

我更愿意为页面创建索引,而不是使用表格列表功能。这是因为在索引中我们可以嵌套条目,并且索引项可以指向多个页面。

这是test.pdf为了测试目的而创建的。

\documentclass[10pt,a4paper]{article}
\usepackage[utf8]{inputenc}
\usepackage{lipsum}
\usepackage{graphicx}
\usepackage[left=3.00cm, right=3.00cm, top=3.00cm, bottom=3.00cm]{geometry}
\begin{document}
    \pagestyle{empty}
    \lipsum[1-10]

    \includegraphics{example-image-a}

    \lipsum[2]
\end{document}

这个 MWE 合并了 2 个 test.pdf 文件,生成了一个书签页面列表(带有正确的页码)和一个带有错误页码的索引。

\documentclass[a4paper]{article}

\usepackage{fancyhdr}
\usepackage{pdfpages}
\usepackage{multicol}
\usepackage{refcount}
\usepackage{imakeidx}
\usepackage{hyperref}
\usepackage{bookmark}

\makeindex[program=makeindex,columns=2,intoc=true]

%https://tex.stackexchange.com/a/55654
\makeatletter
\define@key{pdfpages}{linkname}{\def\AM@linkname@option{#1}\label{pdfpages@#1@begin}}
\newcommand*{\mypdfbookmark}[5]{\bookmark[page=\numexpr\getpagerefnumber{pdfpages@#1@begin}+#2\relax,view={#3}]{#4}\index{#5}}
\makeatother

\hypersetup{
    backref=true,
    pagebackref=true, 
    hyperindex=true,  
    colorlinks=true,   
    linkcolor= purple,  
    bookmarks=true,  
} 

\renewcommand{\headrulewidth}{0pt}% % No header rule
\renewcommand{\footrulewidth}{0pt}% % No footer rule

\begin{document}


\thispagestyle{empty}

\tableofcontents

\section*{List of bookmarked items}
\begin{multicols}{2}
    \makeatletter
    \@starttoc{lot}
    \makeatother
\end{multicols}

\clearpage
\setcounter{page}{1}
\pagestyle{plain}

\mypdfbookmark{Test1}{1}{FitH \calc{\paperheight-2cm}}{Mark1}{Cat!a}
\mypdfbookmark{Test1}{2}{FitH \calc{\paperheight-4cm}}{Mark2}{Cat!b}

\includepdf[
  pages=-,
  link,
  scale=0.95,
  linkname=Test1,
  addtotoc={1,section,1,file 1,aa},
  addtolist=
  {
      1,table,{Cat a},lab:CatA,
      2,table,{Cat b},lab:CatB
  },
  pagecommand={\pagestyle{plain}},
]{test.pdf}

\mypdfbookmark{Test2}{1}{FitH \calc{\paperheight-2cm}}{Mark3}{Dog!a}
\mypdfbookmark{Test2}{2}{FitH \calc{\paperheight-4cm}}{Mark4}{Dog!b}

\includepdf[
  pages=-,
  link,
  scale=0.95,
  linkname=Test2,
  addtotoc={1,section,1,file 2,aa},
  addtolist=
  {
      1,table,{Dog a},lab:DogA,
      2,table,{Dog b},lab:DogB
  },
  pagecommand={\pagestyle{plain}},
]{test.pdf}
\printindex

\end{document}

这是输出(将目录页(物理页 1)与索引页(物理页 6)连接之后)。

在此处输入图片描述

答案1

你说得对,pdfpages 中没有这个addtoindex选项。事实上,我很惊讶没有这个选项。可能是因为从来没有人要求这个功能。

无论如何,可以使用pagecommand选项和一个小宏来获取索引条目。以下是一个例子:

\documentclass[a4paper]{article}
\usepackage{pdfpages}
\usepackage{makeidx}\makeindex
\usepackage{hyperref}

\makeatletter
\newcommand\addtoindex[2]{%
  \ifnum\AM@page=#2\relax\index{#1}\fi
}
\makeatother %

\begin{document}

\includepdf[
  pages=1-3,
  pagecommand={\thispagestyle{empty}\addtoindex{foo}{1}\addtoindex{bar}{2}}
]{dummy.pdf}

\includepdf[
  pages=1-3,
  pagecommand={\thispagestyle{empty}\addtoindex{foo}{2}}
]{dummy.pdf}

\printindex
\end{document}

相关内容