Можно ли индексировать закладки, указывающие на определенные страницы, вставленные с помощью `\includepdf`?

Можно ли индексировать закладки, указывающие на определенные страницы, вставленные с помощью `\includepdf`?

Этот вопрос был задан ранее (Можно ли индексировать не-латексный PDF, вставленный с помощью \includepdf?). Ответов не последовало.

Закладки можно создавать с помощью \bookmark, которые направляют на определенные страницы, скомпилированные с помощью \includepdfкоманды из pdfpagesпакета (например,\pdfсоздать закладку на номер страницы и местоположение с помощью \includepdf.

Мы также знаем, что можно получить правильный номер страницы, вставленной с помощью \includepdf. Это демонстрируется с помощью опции addtolist, \includepdfкоторую можно использовать для построения списка элементов в формате списка таблиц или списка рисунков.

Поэтому возможно ли прикрепить записи указателя к тем же номерам страниц, которые используются в этой addtolistфункции?

test.pdfМой MWE делает следующее: создается простой двухстраничный PDF-файл с именем \lipsumи изображением.

Вторая часть MWE использует \includepdfдважды для объединения двух копий test.pdf. Это дает файл с 4 страницами. Создание оглавления добавляет страницу в начало документа. Используя опцию addtolist, список закладок создается с помощью @starttoc{lot}. Эти закладки указывают на страницы 1 и 2 первого test.pdfфайла, а затем на страницы 1 и 2 второго test.pdfфайла. Закладки создаются с помощью макроса, который использует \bookmarkи который был размещен на TeX.SE здесь (\pdfсоздать закладку на номер страницы и местоположение с помощью \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}

Связанный контент