pdfpages 宏包(作者 Andreas Matthias)可以把*已有* PDF 文件中的页面直接插入到你正在排版的文档里。无论是在前面加封面或签字表单、把多个 PDF 拼成一本论文,还是把幻灯片按 2×2 排成讲义,都不用忍受裸用 \includegraphics 时常见的页边距溢出。核心只有一个命令:\includepdf[⟨options⟩]{file.pdf}。
基本用法
在导言区加载 \usepackage{pdfpages},然后在正文中调用 \includepdf。下面是最小示例;它会插入 cover.pdf 的所有页面,并把每页缩放到铺满纸张且不留周围空白。参数中的文件名 不能包含空格。
\documentclass{article}
\usepackage{pdfpages}
\begin{document}
% 本文…
\includepdf[pages=-]{cover.pdf}
% …続きの本文
\end{document}\includepdf 在内部会调用 graphicx 宏包的 \includegraphics,因此凡是 pdfpages 自己不解释的选项(下面会提到的 trim、clip、scale 等)都会原样传给 \includegraphics。默认情况下,每一页都会 自动缩放 以适合纸张。
官方手册(v0.6g)列出的支持引擎是 pdfTeX、VTeX、XeTeX、LuaTeX 和 pTeX,因此它可以在 pdfLaTeX、LuaLaTeX、XeLaTeX 以及 (up)pLaTeX 下使用。不过它假定使用的是直接写出 PDF 的引擎:在输出 DVI 的流程中无法导入 PDF,pdfpages 会改为插入空白页。 因此日文排版中常见的 pLaTeX + dvipdfmx 配置,需要正确接好 dvipdfmx 驱动(见下一节)。
选择插入哪些页面(pages)
最重要的选项是 pages。它用逗号分隔的列表指定要插入的页面及其顺序。默认值是 pages=1(只插入第一页),所以只要想插入更多页面就必须设置它。
| 写法 | 效果 | 插入的页面 |
|---|---|---|
pages=- | 所有页面,按顺序 | 被插入 PDF 的全部页面 |
pages={1,3,5} | 只插入列出的页面 | 第 1、3、5 页 |
pages={2-8} | 一个范围 | 第 2 页到第 8 页 |
pages={3,{},15} | 用 {} 插入空白页 | 第 3 页、空白页、再第 15 页 |
pages=last-1 | 倒序 | 从最后一页到第一页(last = 最后一页) |
pages={1-3,5,{},7} | 组合使用 | 范围、单页和空白页混合 |
范围写作 ⟨m⟩-⟨n⟩。省略 m 表示第一页;省略 n 表示最后一页。因此 pages=- 就是“从第一页到最后一页”,也就是全部页面。最后一页也可以用关键字 last 表示(只能在范围中使用)。空白页只需放一个空的 {},例如想在封面和正文之间插入一张白页时很方便。
% 表紙の次に白ページ、そのあと本文 1–20 ページ
\includepdf[pages={1,{},2-21}]{thesis-cover.pdf}
% 全ページを逆順で
\includepdf[pages=last-1]{scan.pdf}主要选项
所有选项都采用 ⟨key⟩=⟨value⟩ 的形式,在 \includepdf 的方括号中用逗号分隔。布尔选项(如 frame)省略值时表示“真”。常用选项如下:
| 选项 | 作用(默认值) | 适用场景 |
|---|---|---|
nup | 在一张纸上排列多个页面(n-up 拼版)。nup=2x2 = 横向 2 个 × 纵向 2 个。默认 1x1 | 讲义、缩小打印 |
frame | 给每个页面画边框(默认 false) | 显示页面边界 |
delta | 平铺页面之间的间距。delta=⟨x⟩ ⟨y⟩(默认 0 0) | 给 nup 页面之间留空 |
landscape | 将纸张旋转 90° 为横向(默认 false) | 宽幅 PDF、小册子 |
scale | 缩放倍率;传给 graphicx(与 noautoscale 配合使用) | 手动决定缩放大小 |
fitpaper | 让输出纸张匹配被插入 PDF 的尺寸(默认 false) | 保留原始页面尺寸 |
offset | 移动页面位置。offset=⟨x⟩ ⟨y⟩(默认 0 0) | 调整装订边距 |
pagecommand | 在每个插入页面上执行的代码(默认 \thispagestyle{empty}) | 添加页码或页眉 |
link / linkname | 把插入页面设为超链接目标 / 更改其名称(默认 false) | 让页面可以点击跳转 |
nup(n-up 拼版) 用来把多个逻辑页面平铺到一张纸上。语法是 nup=⟨across⟩x⟨down⟩。默认按行(横向)填充;加上 column 会改为按列优先,columnstrict 则会直到最后一张纸都严格保持列优先。页面之间需要间距时配合 delta,需要画框时配合 frame。注意 landscape 只旋转纸张(若要旋转页面内容本身,请用 angle=90)。
pagecommand 指定在每个插入页面上执行的 LaTeX 代码。默认值是 pagecommand={\thispagestyle{empty}}(不显示页码等)。如果改成 pagecommand={\thispagestyle{plain}},被导入的 PDF 上也会出现当前文档的页码。它也是叠加页眉、页脚或水印的入口。
也可以使用来自 \includegraphics 的 trim 和 clip(因为 pdfpages 不认识的选项会转发给那里)。当你想裁掉导入页面上下的页眉或页脚时很方便。例如:\includepdf[pages=-, trim=0 2cm 0 2cm, clip]{paper.pdf}。
实例
制作讲义 — 把幻灯片 PDF 按每张纸 4 页(2×2)排版,给每页加框,并在页面之间留出间距。
\includepdf[pages=-, nup=2x2, frame, delta=5mm 5mm]{slides.pdf}拼接多个 PDF — 要把不同文件合并成一个文档,请使用 \includepdfmerge。它的参数是一串“filename, page-spec, filename, page-spec, …”。page-spec 与 pages 使用相同语法;省略时只插入该文件的第一页。
% a.pdf の 1–2 ページと b.pdf の 3 ページ目をこの順に
\includepdfmerge{a.pdf, 1-2, b.pdf, 3}
% 学位論文を別々の章 PDF から組み立てる
\includepdfmerge{frontmatter.pdf, -, chap1.pdf, -, chap2.pdf, -}\includepdfmerge 接受与 \includepdf 相同的选项(只是用上面的 page-spec 代替 pages)。如果不想每次重复相同选项,可以用 \includepdfset{⟨options⟩} 一次性设置默认值;单独写在某个 \includepdf 上的选项会覆盖这些默认值。
为小册子拼版 — 骑马订小册子需要把页面重新排列成折叠顺序。pdfpages 提供 signature 选项:传入 4 的倍数后,它会按折帖(signature)重排页面,并自动用 nup=2x1 布局。简单地写 pages=-, nup=1x2, landscape 也能把两页并排放置,但*不会*按折叠顺序重排。更完整的小册子拼版也可以使用 booklet 宏包。
% 縦長の文書を 8 ページ折丁の冊子に
\includepdf[pages=-, signature=8, landscape]{booklet-doc.pdf}日文与驱动注意事项
对 pTeX 系列(pLaTeX / upLaTeX)的支持从 pdfpages v0.5a 开始加入。这些引擎输出 DVI,再通过 dvipdfmx 转为 PDF,因此导入 PDF 是 dvipdfmx 的工作。只要图形驱动选择正确,\includepdf 就能直接工作。如果页面变成空白,请重新检查驱动设置(例如把 dvipdfmx 作为文档类或全局选项传入,或显式写 \usepackage[dvipdfmx]{graphicx})。
有一个行为需要记住:复制进来的只是每页的 内容(外观),源 PDF 中的链接和注释会丢失。若要保留链接,需要借助 pax 等宏包。另外,如果用 \pagecolor 设置页面背景色,第一次 \pagecolor 必须放在 \usepackage{pdfpages} 之前。