PDFs ausschießen (pdfpages)

Man schreibt \includepdf{paper.pdf} und es kommt nur eine Seite an. Das ist die erste Stufe, über die jeder mit LaTeXs pdfpages stolpert, und der Grund ist, dass die Option standardmäßig auf pages=1 steht – nur Seite eins. Gemessen: Ein fünfseitiges PDF, ohne Optionen eingebunden, ergab genau eine Ausgabeseite. Für alle Seiten schreibt man pages=- (dasselbe PDF lieferte dann fünf). Mit diesem einen Zeichen öffnet sich der Rest von pdfpages – das Paket stammt von Andreas Matthias, die Fassung in TeX Live 2024 ist v0.5y vom 2024/01/21. Ein Deckblatt voranstellen, Kapitel-PDFs zu einer Dissertation zusammensetzen, Folien 2×2 zum Handout anordnen, jede Seite mit DRAFT stempeln, Einträge in Lesezeichen und Inhaltsverzeichnis ergänzen: Diese Seite geht all das durch und übersetzt dabei mit.

Wie \includepdf verwendet wird und wie es sich von \includegraphics unterscheidet

In der Präambel \usepackage{pdfpages} laden und im Rumpf \includepdf[…]{Datei} aufrufen. Der Unterschied: Es arbeitet blattweise. \includegraphics setzt das PDF als Bild in den Textfluss; alles, was größer als der Satzspiegel ist, läuft über, und die Ränder des Dokuments gelten weiter. \includepdf beginnt ein neues Blatt und skaliert die Quellseite automatisch darauf. Gemessen: Ein in A5 (419,5 x 595,3pt) erzeugtes PDF, in ein Letter-Dokument eingebunden, erschien auf Letter-Blättern von 612 x 792pt – skaliert wurde die Quellseite, nicht das Papier. Der Dateiname darf keine Leerzeichen enthalten.

Intern ruft \includepdf das \includegraphics aus graphicx auf; jede Option, die pdfpages nicht selbst auswertet – trim, clip, scale, angle und Ähnliches –, wird also direkt weitergereicht. Um Kopf und Fuß der importierten Seiten abzuschneiden, schreibt man \includepdf[pages=-, trim=0 2cm 0 2cm, clip]{paper.pdf}. Gegen die automatische Skalierung gibt es noautoscale, und zum Verschieben der eingefügten Seite offset, das zwei Maße nimmt.

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

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

\end{document}

Die Option pages schreiben: alle Seiten, umgekehrt, Leerblätter einfügen

Die Option pages listet die einzufügenden Seiten und ihre Reihenfolge kommagetrennt auf. Ein Bereich ist m-n; lässt man m weg, ist die erste Seite gemeint, lässt man n weg, die letzte. pages=- liest sich also als „von der ersten bis zur letzten“. Die Schlussseite lässt sich auch mit dem Schlüsselwort last benennen, das nur innerhalb eines Bereichs gilt. Spannend wird die Reihenfolge: pages=last-1 fügt die Datei rückwärts ein, und gemessen erschien ein achtseitiges PDF als PAGE 8 bis PAGE 1.

Der zweite lohnende Kniff ist das leere {}. Ein {} in der Liste erzeugt an dieser Stelle ein leeres Blatt. pages={1,{},2-21} ergibt Deckblatt, Leerseite, dann die Seiten 1–20 des Textes. Gemessen lieferte pages={1,{},2} drei Seiten, deren extrahierter Text nur PAGE 1 und PAGE 2 enthielt – die mittlere war tatsächlich leer. So sorgt man in einer beidseitig gedruckten Dissertation dafür, dass jedes Kapitel auf einer rechten Seite beginnt.

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}
Was Sie schreibenEingefügte Seiten
(omitted)nur Seite 1 – die Vorgabe lautet pages=1
pages=-alle Seiten, von der ersten bis zur letzten
pages={2-8}die Seiten 2 bis 8
pages={1,3,5}nur die Seiten 1, 3 und 5, in dieser Reihenfolge
pages={3,{},15}Seite 3, ein leeres Blatt, Seite 15
pages=last-1alle Seiten rückwärts; last gilt nur innerhalb eines Bereichs
pages={1-3,5,{},7}Bereiche, Einzelseiten und Leerblätter lassen sich frei mischen

Mit nup ein 2x2-Handout bauen – und landscape schreibt ein /Rotate

nup=quer x hoch kachelt mehrere logische Seiten auf ein Blatt. Gemessen ergab ein achtseitiges Folien-PDF mit nup=2x2 zwei Blätter, mit nup=2x1, landscape vier. Standardmäßig füllen sich die Seiten zeilenweise; column schaltet auf spaltenweise um, columnstrict hält diese Reihenfolge auch auf dem letzten Blatt ein. delta legt Abstände zwischen die Seiten (zwei Maße, etwa delta=5mm 5mm), frame umrahmt jede einzelne.

landscape dreht das Blatt, nicht die darauf platzierten Seiten; um die Seiten selbst zu drehen, dient angle=90. Interessant ist, dass dieses landscape ein /Rotate 90 ins PDF schreibt. Prüft man eine mit nup=2x1, landscape erzeugte Datei mit pdfinfo -f 1 -l 1, erhält man Page 1 rot: 90, während die Seitengröße bei 612 x 792 bleibt – der Betrachter dreht sie für einen. Unterdrücken lässt sich das mit turn=false (Vorgabe ist turn=true). Dasselbe Verfahren nutzt das Paket pdflscape; die Seite über Tabellen, die breiter als der Satzspiegel sind, vergleicht beides im Detail.

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: das Blatt an das Quell-PDF anpassen

Standardmäßig wird die Quellseite auf das eigene Papier skaliert; fitpaper=true kehrt das um und passt die Blattgröße an das Quell-PDF an. Gemessen ergab ein achtseitiges A5-PDF, mit fitpaper=true in ein Letter-Dokument eingebunden, Ausgabeseiten von 419,527 x 595,275pt – das ursprüngliche A5, unverändert. Nützlich bei Scans, deren Bildqualität unter der Skalierung litte, und bei Einreichungsformularen mit bereits festgelegter Seitengeometrie.

Für Quelldateien mit uneinheitlichen Seitengrößen gibt es eigene Werkzeuge. Standardmäßig wird die zuerst eingefügte Seite zur Schablone, und alle weiteren werden in deren Umriss skaliert. Eine andere Schablone wählt pagetemplate=⟨Seitenzahl⟩; die Größe direkt gibt templatesize={⟨Breite⟩}{⟨Höhe⟩} an – etwas größer als gewünscht, um Rundungsfehlern auszuweichen. Eine Querformatseite an einer Hochformatschablone wird standardmäßig verkleinert; rotateoversize=true dreht sie stattdessen passend. Und wer zweifach drucken und den Stapel später in zwei Exemplare schneiden will, fügt mit doublepages jede Seite zweimal ein.

OptionWas sie tut (Vorgabe)
nupmehrere Seiten auf ein Blatt kacheln; nup=2x2 heißt 2 quer × 2 hoch. Vorgabe 1x1
framejede logische Seite mit einer Linie der Stärke \fboxrule umrahmen. Vorgabe false
deltaAbstand zwischen gekachelten Seiten; zwei durch Leerzeichen getrennte Maße. Vorgabe 0 0
landscapedas Blatt querstellen und /Rotate 90 ins PDF schreiben. Vorgabe false
turnob Querformatseiten vom Betrachter gedreht angezeigt werden. Vorgabe true
scaleein an \includegraphics durchgereichter Skalierungsfaktor; mit noautoscale zur manuellen Steuerung
fitpaperdie Blattgröße an die des eingefügten Dokuments anpassen. Vorgabe false
offsetden Ursprung der eingefügten Seiten verschieben; zwei Maße. Vorgabe 0 0
pagecommandLaTeX-Code, der auf jeder eingefügten Seite läuft. Vorgabe \thispagestyle{empty}
picturecommandBefehle in einem picture, dessen Ursprung die linke untere Seitenecke ist. Vorgabe leer
linkdie eingefügten Seiten zu Linkzielen namens ⟨Dateiname⟩.⟨Seitenzahl⟩ machen. Vorgabe false; Umbenennung mit linkname

Seitenzahlen zurückholen und DRAFT stempeln: pagecommand und picturecommand

Sollen die Seitenzahlen des eigenen Dokuments auf den eingefügten Seiten erscheinen, greift man zu pagecommand. Die Option nimmt LaTeX-Code, der auf jeder eingefügten Seite ausgeführt wird; pdfpages.sty definiert ihre Vorgabe als \thispagestyle{empty} – deshalb kommen importierte Seiten ohne Pagina und ohne Kolumnentitel. Mit pagecommand={\thispagestyle{plain}} erscheinen die eigenen Seitenzahlen darauf.

Hier lauert eine Falle: Überschreibt man pagecommand für eigene Zwecke, verschwindet damit auch das voreingestellte \thispagestyle{empty}. Gemessen druckte ein Dokument, das an pagecommand nichts als Wasserzeichen-Code übergab, die Seitenzahlen 1, 2, 3 … auf die importierten Seiten – völlig unbeabsichtigt. Wer sie nicht will, stellt dem eigenen Code ein \thispagestyle{empty} voran.

Für das Stempeln selbst gibt es einen eigenen Haken. picturecommand nimmt Befehle entgegen, die in einer picture-Umgebung ausgeführt werden, deren Ursprung die linke untere Ecke jeder Seite ist – ein Ursprung, der sich auch dann nicht verschiebt, wenn die Seite durch landscape gedreht wird. Gemessen kam ein achtseitiger Import mit picturecommand={\put(30,30){\Large CONFIDENTIAL}} aus pdftotext als PAGE 1 CONFIDENTIAL PAGE 2 CONFIDENTIAL … zurück, auf jeder Seite gestempelt. Nur die allererste Seite bestempelt 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

Eine Dissertation aus Kapitel-PDFs bauen: includepdfmerge und addtotoc

Der Befehl, der getrennt gesetzte PDFs zusammenfügt, heißt \includepdfmerge. Sein Argument ist eine Folge „Dateiname, Seitenangabe, Dateiname, Seitenangabe, …“, wobei die Seitenangabe dieselbe Syntax wie pages verwendet; lässt man sie weg, wird nur die erste Seite jener Datei genommen. Gemessen erzeugte \includepdfmerge{a.pdf,1-2,b.pdf,3} drei Seiten mit PAGE 1, PAGE 2, SOURCE PAGE 3. Wer dieselben Optionen nicht wiederholen möchte, setzt mit \includepdfset{…} Vorgaben für alle; Optionen an einem einzelnen \includepdf überschreiben diese.

Ein eingefügtes PDF taucht von sich aus weder im Inhaltsverzeichnis noch in den Lesezeichen auf. Dem hilft addtotoc ab; es nimmt fünf kommagetrennte Argumente: addtotoc={⟨Seitenzahl⟩,⟨section⟩,⟨Ebene⟩,⟨Überschrift⟩,⟨Label⟩}. Die Seitenzahl zählt innerhalb der eingefügten Seiten, section ist ein Gliederungsname wie section, die Ebene deren Tiefe als Zahl, die Überschrift der Text fürs Verzeichnis und das Label ein Name, auf den \ref und \pageref zeigen können. Die Reihenfolge der fünf darf nicht vertauscht werden.

Zusammen mit hyperref erledigt diese eine Option drei Aufgaben gleichzeitig. Gemessen: Bei geladenem hyperref schrieb addtotoc={1,section,1,Imported paper,sec:paper} die Zeile \contentsline {section}{\numberline {2}\ignorespaces Imported paper}{2} in die .toc, erzeugte \BOOKMARK [1][-]{section.2}{Imported paper}{} in der .out und ließ \ref{sec:paper} sowie \pageref{sec:paper} aus dem Text korrekt auflösen. Verzeichniseintrag, PDF-Lesezeichen und funktionierender Querverweis – alles aus einer Zeile. Für Abbildungs- und Tabellenverzeichnisse gibt es 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}

Die Reihenfolge, die signature=8 erzeugt: 8, 1, 2, 7, 6, 3, 4, 5

Für eine rückstichgeheftete Broschüre müssen die Seiten so umgeordnet werden, dass sie nach dem Falzen richtig stehen. Gibt man der Option signature von pdfpages ein Vielfaches von vier, ordnet sie die Seiten zu Lagen dieser Größe und schießt sie je nach Ausrichtung automatisch mit nup=1x2 oder nup=2x1 aus. Gemessen: Ein achtseitiges PDF mit signature=8, landscape ergab vier Nutzenseiten, und die extrahierte Reihenfolge lautete PAGE 8, PAGE 1, PAGE 2, PAGE 7, PAGE 6, PAGE 3, PAGE 4, PAGE 5. Beidseitig auf zwei Blätter gedruckt, gestapelt und einmal gefalzt, öffnen sich die Seiten in der Folge 1 bis 8.

Beachten Sie: pages=-, nup=1x2, landscape ordnet gar nichts um. Es stellt lediglich zwei Seiten nebeneinander; gefalzt stimmt die Reihenfolge nicht. Für Lagen muss signature verwendet werden. Für aufwendigeres Ausschießen – mehrere Lagen, Bundzuwachs, Schnittmarken – liegt in TeX Live zusätzlich das eigens dafür gedachte Paket booklet.

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

\includepdf überträgt nur das Erscheinungsbild jeder Seite. Links im Quell-PDF funktionieren danach nicht mehr – und das Handbuch von pdfpages sagt ausdrücklich, dass nicht nur Links, sondern jede Art von PDF-Annotation verloren geht. Wer die ursprünglichen Links behalten will, kombiniert es mit pax von Heiko Oberdiek, das die Annotationen extrahiert und wieder einsetzt.

Umgekehrt kann pdfpages auch eigene Linkziele anlegen. Mit link=true wird jede eingefügte Seite zu einem Ziel namens ⟨Dateiname⟩.⟨Seitenzahl⟩, sodass \hyperlink{paper.pdf.3}{…} im Text zur importierten Seite 3 springt. linkname=mylink ändert den Basisnamen; linkfilename, linktodoc, linkfit und newwindow regeln Links auf externe Dateien. Zur selben Familie gehören thread und threadname für Artikel-Threads.

Engines und Treiber: wenn pLaTeX und dvipdfmx leere Seiten liefern

Die im Handbuch von pdfpages genannten Engines sind pdfTeX, VTeX, XeTeX, LuaTeX und pTeX; es läuft also unter pdfLaTeX, LuaLaTeX, XeLaTeX ebenso wie unter (up)pLaTeX. Vorausgesetzt wird allerdings eine Engine, die PDF direkt schreibt: auf einem DVI-Weg lässt sich das PDF nicht importieren, stattdessen kommen leere Seiten. In der im japanischen Umfeld verbreiteten Kombination pLaTeX plus dvipdfmx ist der Import Aufgabe von dvipdfmx, weshalb der Grafiktreiber korrekt benannt sein muss. Das Handbuch empfiehlt, dvipdfmx als Klassenoption zu übergeben.

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}

Dieser Weg hat noch eine erwähnenswerte Eigenheit. pdfpages ruft das externe Programm extractbb auf, um die Gesamtseitenzahl des importierten PDFs zu ermitteln; existiert jedoch bereits eine passende .xbb-Datei, verwendet es diese, statt extractbb aufzurufen. Tauscht man das Quell-PDF aus und lässt eine veraltete .xbb liegen, stimmt die Seitenzahl nicht mehr und die Einfügung gerät durcheinander – erzeugen Sie die .xbb also bei jeder Änderung des PDFs neu. Zuletzt eine Falle für Dokumente mit Seitenhintergrund: das erste \pagecolor muss vor \usepackage{pdfpages} stehen.