我使用的是(普通)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
不能写入后最后一页。
由于输出了许多\special
s ,因此需要识别正确的一个,它包含字符串/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}