分析一个例子hyperref

分析一个例子hyperref

我使用的是(普通)TeX(不是 LaTeX 或任何其他...TeX)。我想要一个由 TeX 源/输出生成的 pdf 文件,该文件能够让 Acrobat Reader 显示逻辑页码。我的文档的序言页码在 Acrobat Reader 的工具栏中应该显示为“vi (6 of 123)”,而正文部分应该显示为“2 (12 of 123)”。

我该如何实现?我必须使用\special, pdfTeX,吗dvipdfm(x)?如何在 TeX 源中指定罗马数字页码?是否有 (TeX) 宏包?

感谢所有 TeX 奇才的回答!

答案1

PDF 页面标签是 中的一种数据结构/Catalog,例如:

/PageLabels <<
  /Nums [
    0 <<
      /P (Title)
    >>
    1 <<
      /S /D
    >>
    3 <<
      /S /A
      /St 7
    >>
  ]
>>

这意味着,

  • 第一页的页码(页码从零开始)包含一个/P以字符串“ Title”为前缀的页码。

  • 接下来的两页(2 和 3)用阿拉伯数字编号,以1(默认)开头。

  • 最后一页(第 4 页)用大写字母(LaTeX:\Alph)编号,页码的数值以 7 开头。因此,最后一页 4 标记为G

PDF 页面标签的文档可以在PDF 规范

分析一个例子hyperref

您可以研究如何hyperref为 PDF 页面标签写入 PDF 数据结构。

该示例与一些内部组件挂钩,以公开 PDF 页面标签所需的书面 PDF 数据结构:

\documentclass{article}
\usepackage[
  pdfpagelabels=true,
  bookmarks=false,
  pageanchor=false,
]{hyperref}

\makeatletter
\newcommand*{\print@arg}[2]{%
  \begingroup
    \edef\x{#2}%
    \@onelevel@sanitize\x
    \typeout{==> \string#1{\x}}%
  \endgroup
}

% DVI drivers
\@ifdefinable\org@special{%
  \let\org@special\special
  \renewcommand*{\special}[1]{%
    \org@special{#1}%
    \print@arg\special{#1}%
  }%
}

% pdfTeX
\ltx@IfUndefined{pdfcatalog}{%
}{%
  \ifpdf
    \@ifdefinable\org@Hy@PutCatalog{%
      \let\org@Hy@PutCatalog\Hy@PutCatalog
      \def\Hy@PutCatalog#1{%
        \org@Hy@PutCatalog{#1}%
        \print@arg\pdfcatalog{#1}%
      }%
    }%
  \fi
}
\makeatother

\begin{document}
\null
\thispdfpagelabel{Title}
\newpage
\pagenumbering{arabic}
\null
\newpage
\null   
\newpage
\pagenumbering{Alph}
\setcounter{page}{7}
\null
\newpage
\end{document}

现在控制台输出或.log文件包含可用于纯 TeX 的数据。

pdfTeX/LuaTeX

\pdfcatalog{/PageLabels<</Nums[0<</P(Title)>>1<</S/D>>3<</S/A /St 7>>]>>}

XeTeX/dvipdfm(x)

需要两次编译运行,因为页面标签在文档末尾已知,并且\special不能写入最后一页。

由于输出了许多\specials ,因此需要识别正确的一个,它包含字符串/PageLabels

\special{pdf:docview <</PageLabels<</Nums[0<</P(Title)>>1<</S/D>>3<</S/A /St 7>>]>>>>}

德维普

目前需要运行两次。(也许将来我会将其减少到一次,使用通用的 PostScript 头文件来克服这个\special限制)。

再次,通过搜索找到正确的特殊内容/PageLabels

\special{ps:SDict begin [ {Catalog} <</PageLabels<</Nums[0<</P(Title)>>1<</S/D>>3<</S/A /St 7>>]>>>> /PUT pdfmark end}

相关内容