这个问题之前有人问过(是否可以使用 \includepdf 索引插入的非乳胶 PDF)但无人回答。
可以使用软件包中的命令\bookmark
编译的特定页面来制作书签(例如\includepdf
pdfpages
\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}