PDF の割り付け(pdfpages)

\includepdf{paper.pdf} と書いて、なぜ 1 ページしか入らないのか——pdfpages を初めて使った人がまず踏む段差です。オプションの既定値が pages=1、つまり「1 ページ目だけ」だからで、実測でも 5 ページの PDF を無指定で読み込むと出力は 1 ページでした。全部入れるには pages=- と書きます(同じ PDF で 5 ページ)。この一文字を覚えれば、あとは pdfpages(作者 Andreas Matthias、TeX Live 2024 同梱は v0.5y・2024/01/21)の広い機能が使えます。表紙を頭に付ける、章ごとの PDF をつないで学位論文にする、スライドを 2×2 に並べて配布資料にする、全ページに DRAFT を刷り込む、しおりと目次に項目を足す——このページでは、それぞれを実際にコンパイルして確かめながら見ていきます。

includepdf の使い方 — includegraphics と何が違うか

プリアンブルで \usepackage{pdfpages} を読み込み、本文で \includepdf[…]{ファイル} を呼びます。違いは ページ単位で紙に載る ことです。\includegraphics は PDF を「図」として本文の流れに置くので、版面より大きければはみ出しますし、余白も本文のものが効きます。\includepdf は新しい紙を起こして、そこへ元 PDF のページを 自動で拡大縮小して収めます。実測すると、A5(419.5 x 595.3pt)で作った PDF を レター判の文書に読み込んだ結果は、出力ページが 612 x 792pt のレター判——元ページのほうが紙に合わせて縮尺されました。ファイル名に 空白を含めてはいけません

内部では \includepdfgraphicx\includegraphics を呼んでいます。だから pdfpages が自分で解釈しないオプション——trimclipscaleangle など——は、そのまま \includegraphics へ渡されます。取り込む PDF のヘッダとフッタを切り落としたいときは \includepdf[pages=-, trim=0 2cm 0 2cm, clip]{paper.pdf} のように書けます。自動の拡大縮小を止めたいときは noautoscale、位置をずらしたいときは二つの寸法を取る offset を使います。

document.tex
\documentclass{article}
\usepackage{pdfpages}
\begin{document}

% body text ...
\includepdf[pages=-]{cover.pdf}
% ... body text continues

\end{document}

pages の書き方 — 全ページ、逆順、白ページの挟み込み

pages は挿入するページとその 順序 をカンマ区切りで並べます。範囲は m-n で書き、m を省けば先頭、n を省けば末尾の意味になります。だから pages=- は「先頭から末尾まで」。最終ページは範囲の中でだけ使えるキーワード last でも指せます。ここが効いてくるのは順序です——pages=last-1 と書けば 逆順 に入り、実測でも 8 ページの PDF が PAGE 8 から PAGE 1 の順で出力されました。

もう一つ覚えておく価値があるのが 空の {} です。リストの中に {} を書くと、そこに 白紙が 1 枚 入ります。pages={1,{},2-21} と書けば「表紙、白ページ、本文 1〜20 ページ」の順に並びます。実測でも pages={1,{},2} は 3 ページを出力し、抽出したテキストは PAGE 1PAGE 2 の二つだけ——真ん中が確かに白紙でした。両面印刷の学位論文で、章の始まりを必ず右ページにそろえるときに使います。

latex
% cover, then one blank leaf, then body pages 1-20
\includepdf[pages={1,{},2-21}]{thesis-cover.pdf}

% every page, in reverse order
\includepdf[pages=last-1]{scan.pdf}

% a hand-picked selection, in this order
\includepdf[pages={3,1,4,1,5}]{notes.pdf}
書き方入るページ
(omitted)1 ページ目だけ。既定は pages=1 です
pages=-先頭から末尾まで、全ページ
pages={2-8}2 ページ目から 8 ページ目まで
pages={1,3,5}1・3・5 ページ目だけを、この順で
pages={3,{},15}3 ページ目、白紙 1 枚、15 ページ目
pages=last-1全ページを逆順に。last は範囲の中でだけ使えます
pages={1-3,5,{},7}範囲・単独ページ・白紙は自由に混ぜられます

nup で 2x2 の配布資料を作る — landscape は /Rotate を書き込む

nup=横x縦 と書くと、複数の論理ページを 1 枚の紙に並べます。実測では 8 ページのスライド PDF を nup=2x2 で読み込んで出力は 2 枚nup=2x1, landscape なら 4 枚 になりました。既定の並び順は行方向(左から右へ、次の行へ)で、列方向にしたければ column、最後の紙でも列順を崩したくなければ columnstrict を足します。ページのあいだに隙間を空けるのは deltadelta=5mm 5mm のように二つの寸法)、各ページを枠で囲むのは frame です。

landscape が回すのは 紙のほう で、載っているページ自体は起きたままです。ページそのものを回したいときは angle=90 を使います。そして興味深いのは、この landscapePDF に /Rotate 90 を書き込む ことです。nup=2x1, landscape で作った PDF を pdfinfo -f 1 -l 1 で調べると Page 1 rot: 90、用紙サイズは 612 x 792 のまま——ビューアが自動で回して表示します。この挙動を止めたければ turn=false を指定します(既定は turn=true)。同じ仕掛けを pdflscape パッケージも使っていて、横長の表を扱うページで詳しく比べています。

latex
% four slides per sheet, boxed, with a gap between them
\includepdf[pages=-, nup=2x2, frame, delta=5mm 5mm]{slides.pdf}

% two pages side by side on a landscape sheet
\includepdf[pages=-, nup=2x1, landscape]{report.pdf}

fitpaper — 紙のほうを元 PDF に合わせる

既定では元 PDF が紙に合わせて縮尺されますが、fitpaper=true を渡すと逆になり、紙のサイズが元 PDF に合わせて変わります。実測では、A5 で作った 8 ページの PDF をレター判の文書に fitpaper=true で読み込むと、出力ページのサイズは 419.527 x 595.275pt——元の A5 そのままでした。縮尺による画質やフォント寸法の変化を避けたいスキャン原稿や、既に版面が決まっている提出用書類を差し込むときに使います。

取り込む PDF のページサイズが揃っていない場合の道具もあります。既定では 最初に挿入したページが型紙 になり、以降のページはその輪郭に収まるよう縮尺されます。別のページを型紙にしたければ pagetemplate=ページ番号、寸法を直接与えたければ templatesize={幅}{高さ}(丸め誤差を避けるため、望む値より少し大きめに)。縦置きの型紙に横置きのページが来ると既定では縮小されますが、rotateoversize=true を渡すと 回して収めます。同じ内容を 2 面付けして刷り、あとで裁って二部にしたいときは doublepages が各ページを二度挿入します。

オプション何をするか(既定値)
nup1 枚の紙に複数ページを並べる。nup=2x2 は横 2 × 縦 2。既定 1x1
frame各論理ページを \fboxrule の太さの枠で囲む。既定 false
delta面付けしたページのあいだの隙間。二つの寸法を空白で区切る。既定 0 0
landscape紙を横向きにし、PDF に /Rotate 90 を書き込む。既定 false
turn横長のページをビューアで回して表示させるか。既定 true
scale\includegraphics へ渡される倍率。noautoscale と組み合わせて手動で制御する
fitpaper紙のサイズを元 PDF に合わせる。既定 false
offset挿入したページの原点をずらす。二つの寸法。既定 0 0
pagecommand各挿入ページで実行する LaTeX コード。既定 \thispagestyle{empty}
picturecommand各ページの左下を原点とする picture 環境で実行する命令。既定は空
link挿入ページをリンク先にする。名前は ⟨ファイル名⟩.⟨ページ番号⟩。既定 falselinkname で改名

ページ番号を戻す・DRAFT を刷り込む — pagecommand と picturecommand

取り込んだページに 自分の文書のページ番号を印刷したい ときは pagecommand を使います。このオプションは、挿入する各ページで実行される LaTeX コードを受け取ります。既定値は pdfpages.sty の中で \thispagestyle{empty} と定義されていて、だから取り込みページにはノンブルもヘッダも出ません。pagecommand={\thispagestyle{plain}} に変えると、あなたの文書のページ番号がその上に刷られます。

ここに落とし穴があります。pagecommand を自分の用途で書き換えると、既定の \thispagestyle{empty} ごと消えます。 実測では、透かしを描くだけのコードを pagecommand に渡した文書で、意図していないのに取り込みページに 1・2・3… とページ番号が刷られました。番号を出したくないなら、自分のコードの先頭に \thispagestyle{empty} を書き足しておく必要があります。

透かしや押印そのものには、専用のフックが用意されています。picturecommand は、各ページの 左下を原点とする picture 環境 の中で実行される命令を受け取ります(landscape などでページが回っても原点は動きません)。実測では picturecommand={\put(30,30){\Large CONFIDENTIAL}} を渡した 8 ページの取り込みが、pdftotext の出力で PAGE 1 CONFIDENTIAL PAGE 2 CONFIDENTIAL … と全ページに刷り込まれました。最初の 1 ページだけに押したいときは picturecommand* を使います。

latex
% your own page numbers on the imported pages
\includepdf[pages=-, pagecommand={\thispagestyle{plain}}]{paper.pdf}

% stamp every imported page; the picture origin is its lower-left corner
\includepdf[pages=-,
            picturecommand={\put(30,30){\Large CONFIDENTIAL}}]{paper.pdf}

% ...and picturecommand* would stamp only the first inserted page

章ごとの PDF から学位論文を組み立てる — includepdfmerge と addtotoc

別々に組んだ PDF をつなぐ命令が \includepdfmerge です。引数は「ファイル名, ページ指定, ファイル名, ページ指定, …」の並びで、ページ指定は pages と同じ書式。省略するとそのファイルの 1 ページ目だけが入ります。実測では \includepdfmerge{a.pdf,1-2,b.pdf,3} が 3 ページを出力し、中身は PAGE 1PAGE 2SOURCE PAGE 3 の順でした。同じオプションを毎回書きたくなければ \includepdfset{…} で既定をまとめて設定でき、個別の \includepdf に書いたオプションがそれを上書きします。

差し込んだ PDF は、そのままでは目次にもしおりにも出ません。それを解決するのが addtotoc で、五つの引数をカンマ区切りで取ります——addtotoc={ページ番号, 節種別, レベル, 見出し, ラベル}。「ページ番号」は挿入したページのうち何枚目か、「節種別」は section などの名前、「レベル」は深さの数、「見出し」は目次に出す文字列、「ラベル」は \ref\pageref で参照するための名前です。順序を入れ替えてはいけません。

hyperref と組み合わせると、これが三つの仕事を一度に片付けます。実測してみましょう。hyperref を読み込んだ文書で addtotoc={1,section,1,Imported paper,sec:paper} を指定すると、.toc\contentsline {section}{\numberline {2}\ignorespaces Imported paper}{2} が書かれ、.out には \BOOKMARK [1][-]{section.2}{Imported paper}{} が現れ、そして本文からの \ref{sec:paper}\pageref{sec:paper} が正しく解決しました。目次項目・PDF のしおり・相互参照の三つが、この一行から出てきます。 図表一覧に足したいときは addtolist を使います。

document.tex
\documentclass{article}
\usepackage{hyperref}
\usepackage{pdfpages}   % load pdfpages after hyperref
\begin{document}
\tableofcontents
\section{Front matter}

% one contents entry, one PDF bookmark, one \ref target
\includepdf[pages=-,
            pagecommand={\thispagestyle{plain}},
            addtotoc={1,section,1,Imported paper,sec:paper}]{paper.pdf}

\section{After}
See \ref{sec:paper} on page \pageref{sec:paper}.

% assemble a thesis from separately typeset parts
\includepdfmerge{frontmatter.pdf, -, chap1.pdf, -, chap2.pdf, -}
\end{document}

signature=8 が並べ替える順序 — 8, 1, 2, 7, 6, 3, 4, 5

中綴じの小冊子を作るには、ページを 折ったときに正しく並ぶ順序 へ並べ替えなければなりません。pdfpagessignature オプションに 4 の倍数を渡すと、その丁数で折丁を組み、向きに応じて自動的に nup=1x2 または nup=2x1 で面付けします。実測してみましょう。8 ページの PDF に signature=8, landscape を指定すると出力は 4 面になり、抽出したページ順は PAGE 8, PAGE 1, PAGE 2, PAGE 7, PAGE 6, PAGE 3, PAGE 4, PAGE 5。これを両面で 2 枚に刷り、重ねて半分に折ると、開いた順に 1 から 8 が現れます。

注意したいのは、pages=-, nup=1x2, landscape では 並べ替えが起こらない ことです。二ページを横に並べるだけで、折っても順序は合いません。折り丁を組みたいなら必ず signature を使ってください。より複雑な面付け(複数の折丁、断ち代、トンボなど)が必要なら、専用の booklet パッケージも TeX Live に入っています。

latex
% a saddle-stitched booklet in signatures of eight pages
\includepdf[pages=-, signature=8, landscape]{booklet-doc.pdf}

\includepdf が写し取るのは各ページの 見た目だけ です。元 PDF の中のリンクは働かなくなります——pdfpages の説明書も、失われるのはリンクだけでなく あらゆる PDF 注釈(annotation) だと明記しています。元のリンクを残したいなら、注釈を取り出して貼り直す pax(Heiko Oberdiek)を併用します。

逆方向の話として、pdfpages自分でリンクの行き先を作る こともできます。link=true を渡すと、挿入した各ページが ⟨ファイル名⟩.⟨ページ番号⟩ という名前のリンク先になり、本文から \hyperlink{paper.pdf.3}{…} のように飛べます。名前を変えたければ linkname=mylink、外部ファイルを指したければ linkfilenamelinktodoclinkfitnewwindow があります。しおりのスレッドを作る threadthreadname も同じ系列です。

エンジンとドライバ — pLaTeX と dvipdfmx で白紙になるとき

pdfpages の説明書が挙げるエンジンは pdfTeX・VTeX・XeTeX・LuaTeX・pTeX で、pdfLaTeX でも LuaLaTeX でも XeLaTeX でも、そして (up)pLaTeX でも動きます。ただし PDF を直接書き出すエンジンを前提にしているため、DVI を経由する経路では PDF を取り込めず、代わりに白紙が入ります。日本語圏でよくある pLaTeX + dvipdfmx の構成では、PDF の取り込みは dvipdfmx の仕事 になるので、グラフィックドライバを正しく指定する必要があります。説明書が推奨する書き方は、クラスオプションに dvipdfmx を渡す方法です。

document.tex
% the driver the pdfpages manual recommends for the platex route
\documentclass[dvipdfmx]{article}
\usepackage{pdfpages}

% ...or state it explicitly on graphicx
% \usepackage[dvipdfmx]{graphicx}

この経路にはもう一つ知っておくべき癖があります。pdfpages は取り込む PDF の総ページ数を調べるために外部プログラム extractbb を呼びます が、対応する .xbb ファイルが既にあると extractbb を呼ばずにその内容を使います。元の PDF を差し替えたのに古い .xbb が残っていると、ページ数が合わずに挿入が狂うので、PDF を更新したら .xbb も作り直してください。最後にもう一つ、背景色を使う文書の落とし穴——最初の \pagecolor\usepackage{pdfpages} より前に置く 必要があります。