背景(eso-pic)

LaTeX のページは縦のリストとして組み上げられ、完成した一枚の箱としてそのまま出力(シップアウト)されます。つまり、あとから 背景 を「下に差し込む」隙間はどこにも残っていません。それでも全面の地色、裁ち落としの写真、斜めに走る DRAFT の透かしが入れられるのは、どのパッケージも同じ一つの手を使っているからです。出力の直前に割り込んで、本文より 先に インクを置く。あとから刷られる本文がその上に重なるので、結果として「背景」に見えるわけです。このページでは \pagecolor から eso-picbackgrounddraftwatermark までをその一本の筋で追い、最後に多くの人がつまずく場所 ―― 印刷とファイルサイズ ―― まで降ります。

\pagecolor と本当の背景レイヤーの違い

全面をベタの一色で塗るだけなら、答えは \pagecolor{色} の一行で終わりで、背景パッケージは一切要りません。ただしこの命令は LaTeX カーネルではなく colorxcolor が提供するもので、\usepackage{xcolor} を書かずに \pagecolor{yellow} とすると ! Undefined control sequence. になります。元に戻すのは \nopagecolor です。意外に思われる性質が二つあります。ひとつは グループを無視して大域的に効く こと ―― 環境の中や {...} の中で指定しても、そのページ以降ずっと塗られたままです(色の指定方法そのものは色のページが扱います)。もうひとつは、塗れるのが平らな長方形だけ、という点です。写真もロゴも回転した文字も置けません。このページの残りは、ほぼすべてこの二つ目の限界から生まれています。

document.tex
\documentclass{article}
\usepackage{xcolor}     % \pagecolor lives here, not in the kernel

\begin{document}
\pagecolor{yellow!10}   % tints this page and every page after it
Text on tinted paper.
\clearpage
\nopagecolor            % back to plain paper
Text on plain paper.
\end{document}

では、色より複雑なものを本文の下に敷きたくなったとき、何が起きているのでしょうか。LaTeX がページの中身を確定したときには、そのページはもう出来上がっています ―― 出力ルーチンが一つの大きな縦ボックスを組み終え、あとはそれを書き出すだけ。差し込むべき「レイヤー」はどこにも存在しません。そこで LaTeX カーネルが用意しているのが shipout/backgroundshipout/foreground という二つのフックで、その仕掛けは拍子抜けするほど直接的です。shipout/background は出力ボックスの いちばん先頭 に大きさゼロの \hbox を差し込みます。だからその中身が最初に刷られ、残りのページ内容が上から重ね刷りする。shipout/foreground は逆に いちばん末尾 に置いて元の隅まで持ち上げるので、最後に刷られて本文を覆います。PDF に z 座標はありません ―― インクを置く順序だけが唯一の奥行きです。どちらのフックも原点 (0,0) が ページ左上隅\unitlength が 1 pt の picture 環境を張るので、そこへ \put する縦座標はふつう負の値になります。

おもしろいのは、この二つのフックが、それを使うパッケージたちよりずっと若いことです。カーネルにフックが入ったのは 2020-10-01 リリースの LaTeX。それ以前は、背景を扱うパッケージが各自で出力ルーチンにパッチを当てていて、その名残が atbegshieveryshieverypage といった一群です。これらは今も動きますが、中身は薄い互換層になりました ―― everypage\AddEverypageHook{...} は、いまや文字どおり \AddToHook{shipout/background}{\put(1in,-1in){...}} です。この 1in,-1in は、原点を紙の隅から 1 インチ内側・1 インチ下、すなわち TeX 伝統の基準点まで動かす分にあたります。実務上の意味は単純で、eso-picbackgrounddraftwatermark も、結局は 同じカーネルフックに材料を置いている。だから併用できますし、だからこそ「どちらが先に刷られるか」の取り合いも起こります。

eso-pic で全ページに絵を敷く — \AddToShipoutPictureBG

汎用の道具は eso-pic です。\AddToShipoutPictureBG{...} は引数の中身をそれ以降すべてのページの本文の下に、\AddToShipoutPictureFG{...} は本文の上に描きます。Rolf Niepraschk のこのパッケージはカーネルフックより古く、バージョン 3 でその上に乗り換えました。それでも生き残っているのは、何を描きたいかについて一切の前提を置かないからです。星付きの \AddToShipoutPictureBG*\AddToShipoutPictureFG*現在のページだけ に効きます ―― 内部では、そのページが出力された瞬間に星付きの材料が空にされる仕組みです。あとから止めるには \ClearShipoutPictureBG(前面側は \ClearShipoutPictureFG)。\AddToShipoutPicture\AddToShipoutPicture* は BG 版の古い別名で、動作は完全に同じです。

フックの中は picture 環境なので、配置は \put(x,y){...} で行います。eso-pic は既定で原点を 紙の左下隅 に移します(既定で有効な pscoord オプション)。\usepackage[texcoord]{eso-pic} と読み込めば原点は左上隅に移り、y は下向きに増えます。毎回隅から数えるのは苦行なので、補助命令が用意されています ―― 紙を基準にする \AtPageLowerLeft\AtPageUpperLeft\AtPageCenter、本文領域を基準にする \AtTextUpperLeft\AtTextLowerLeft\AtTextCenter、そして memoir クラスのときに効く \AtStockLowerLeft などです。現行の LaTeX では \put が寸法をそのまま受け取れるので \put(0,-\paperheight) と書けますし、そのための旧ラッパー \LenToUnit は互換のために残っているだけの実質的な素通しになりました。座標を当てずっぽうで探しているなら \usepackage[grid]{eso-pic} が効きます ―― 全ページに目盛り付きのマス目が引かれ、単位は既定で gridunit=mm、ほかに bpinpt を選べます。

document.tex
\documentclass{article}
\usepackage{eso-pic}
\usepackage{graphicx}

% one image stretched over the whole sheet, on every page
\AddToShipoutPictureBG{%
  \AtPageLowerLeft{%
    \includegraphics[width=\paperwidth,height=\paperheight]{background.jpg}}%
}

\begin{document}
The text sits on top of the full-bleed image.
\end{document}

写真ではなく描いた地紋がほしいなら、フックの中に tikzpicture を入れます。ここで便利なのが \AtPageCenter で、TikZ 側の座標が紙の中心から放射状に伸びるため、(0,0) を基準に考えられます。位置が決まるまで grid オプションを付けておき、決まったら外す ―― これが実際の作業手順になります。

document.tex
\documentclass{article}
\usepackage[grid,gridunit=mm]{eso-pic}  % drop "grid" once the position is right
\usepackage{tikz}

\AddToShipoutPictureBG{%
  \AtPageCenter{%
    \begin{tikzpicture}
      \fill[blue!8] (0,0) circle (6cm);
    \end{tikzpicture}}%
}

\begin{document}
A soft tinted disc sits behind the text on every page.
\end{document}

背景を1ページだけ・表紙だけに出すには

答えは「星付きを使い、そのページが始まる場所に書く」です。\AddToShipoutPictureBG*{...} は、LaTeX がその行を読んだ時点で 組み立て中のページ にだけ効きます。だから表紙用の背景はプリアンブルか \maketitle の直前に置きます ―― それより後ろに書くと、そのとき開いていたページに落ちてしまいます。同じ理由で \ClearShipoutPictureBG にも罠があります。これは大域的かつ即座に効くので、ページの途中で呼ぶと いま組んでいるそのページからもう背景が消えます。今のページには背景を残したいなら、先に \clearpage でページを送り出してから消してください。数ページ分だけ敷きたいときは、星なしで始めて、\clearpage のあとに \ClearShipoutPictureBG を置く ―― これが定石です。

document.tex
\documentclass{article}
\usepackage{eso-pic}
\usepackage{graphicx}

\title{Annual Report}
\author{A. Author}

\begin{document}
% starred form: the cover art lands on this page only
\AddToShipoutPictureBG*{%
  \AtPageLowerLeft{%
    \includegraphics[width=\paperwidth,height=\paperheight]{cover.pdf}}%
}
\maketitle
\clearpage
No background from here on.
\end{document}

専用パッケージ側にも同じ用途の近道があります。backgroundfirstpage=true で最初のページだけに、pages=some\BgThispage の組み合わせで任意のページだけに出せます。draftwatermark\usepackage[firstpageonly]{draftwatermark} で 1 ページ目限定になり、文書の途中でも \DraftwatermarkOptions{stamp=false}{stamp=true} で透かしを止めたり再開したりできます。画像を敷くだけなら eso-pic の薄い上物である wallpaper パッケージも便利で、\CenterWallPaper{倍率}{ファイル} で中央に、\TileWallPaper{幅}{高さ}{ファイル} でタイル状に、\ULCornerWallPaper などで四隅に置けます。しかもこのパッケージは各命令に \ThisCenterWallPaper のような This 付きの現ページ限定版を用意していて、まさにこの節の用途に合います。

background パッケージ — \backgroundsetup で宣言的に透かしを

座標を自分で決めたくないなら、Gonzalo Medina の background パッケージが答えです。設定はすべて \backgroundsetup{キー=値, ...} に集約され、描画は TikZ が引き受けます。何も指定せず \usepackage{background} と書くだけで既定値が働き、赤系(color=red!45)の大きな Draftcontents=Draft)が不透明度 opacity=0.5 で全ページの中央を角度 60 度で斜めに横切ります。主なキーは contents=(中身。文字でも \includegraphics でも図でもよい)、color=(xcolor の全色域)、opacity=(0 が完全な透明、1 が不透明)、angle=(反時計回り、−360〜360)、scale=position=(TikZ のノード配置構文。例 current page.center。裸の座標を渡すときは括弧で囲まない)、placement=centertopbottom の 3 プリセット)、nodeanchor=anchor=、微調整用の hshift=vshift= です。\backgroundsetup はプリアンブルでも本文中でも何度でも呼べるので、途中でデザインを切り替えられます。

document.tex
\documentclass{article}
\usepackage{background}

\backgroundsetup{
  contents={DRAFT},
  color=red,
  opacity=0.25,
  angle=45,
  scale=8,
  position=current page.center,
}

\begin{document}
Every page carries a diagonal DRAFT watermark. Compile twice.
\end{document}

落とし穴が三つあります。第一に、必ず 2 回コンパイル してください。background の材料は remember picture, overlay を付けた tikzpicture として current page ノードに置かれるので、ページ上の絶対位置は前回の実行が .aux に書き残した情報に依存します。1 回目の実行では LaTeX Warning: Label(s) may have changed. Rerun to get cross-references right. が出て、透かしがずれるか出ないかのどちらかになります。第二に、contents= に LaTeX 命令を含む素材を入れるなら、\usepackage のオプションではなく \backgroundsetup 側で指定してください(オプション文字列の解析の都合で壊れます)。第三に、一部のページだけに出す pages=some\BgThispage は問題なく使えますが、逆にそのページだけ背景を消す \NoBgThispage は二段組では使えません ―― 実装が afterpage に依存していて、afterpage が二段組と協調しないためです。二段組で特定のページを外したいなら、pages=some に切り替えて必要なページで \BgThispage を呼ぶ側に回るのが確実です。

draftwatermark — DRAFT の透かしを一行で

文字の透かしだけでよければ、Sergio Callegari の draftwatermark が最短です。\usepackage{draftwatermark} と読み込むだけで、全ページの中央に大きな灰色の DRAFT が出ます ―― 既定は text=DRAFTangle=45scale=1fontsize=0.25\paperwidth、色は colormodel=graycolorspec=0.8 です。設定は \DraftwatermarkOptions{キー=値} に集約され、text=angle=scale=fontsize=color={[gray]{0.85}} のようにモデル付きでも書ける)・hpos=vpos=(あるいは両方まとめて pos={x,y})・hanchor=vanchor=(あるいは anchor=lt のように文字で)・複数行のときの alignment= を指定できます。ひとつだけ例外がありますfirstpageonly はパッケージオプション専用で、\DraftwatermarkOptions{firstpageonly} と書くと ! Package keyval Error: firstpageonly undefined. になります。1 ページ目だけにしたいときは \usepackage[firstpageonly]{draftwatermark} と読み込んでください。

document.tex
\documentclass{article}
% firstpageonly works only here, as a package option
\usepackage[firstpageonly]{draftwatermark}

\DraftwatermarkOptions{
  text=CONFIDENTIAL,
  color={[gray]{0.85}},
  angle=45,
  fontsize=1.5cm,
}

\begin{document}
Only the first page is marked CONFIDENTIAL.
\end{document}

このパッケージが存在する理由そのものが、ちょっとした歴史です。先行する draftcopy(Jürgen Vollmer 作)は透かしを PostScript の \special で描いていました。pdfLaTeX はそれを解釈できません。マニュアルによれば、PDF を直接出力するエンジンとの非互換こそが draftwatermark を書いた最初の動機でした。だから現行版はドライバ依存の細工を一切使わず、pdfLaTeX・XeLaTeX・LuaLaTeX のどれでも同じように動きます。旧命令の \SetWatermarkText{...}\SetWatermarkScale{...}\SetWatermarkColor{...}\SetWatermarkAngle{...}\SetWatermarkLightness{...}(0 が黒、1 が白)も互換のために残っていますが、中身はすべて \DraftwatermarkOptions への転送なので、新しい文書ではキー=値のほうを使ってください。仕上げのときに便利なのが stamp 系で、\usepackage[final]{draftwatermark}nostamp も同義)と書けば設定を一切いじらずに透かしだけが消えます ―― final はクラス全体のオプションとしてよく使われるので、\documentclass[final]{article} に反応してくれるわけです。仕様上の限界も明快で、draftwatermarkshipout/background にしか材料を置かないので 本文の上に押すスタンプは作れません。前面に重ねたい、あるいは重ね順を厳密に制御したいなら、eso-pic\AddToShipoutPictureFG、KOMA-Script の scrlayer、または shipout/foreground フックを直接使うことになります。なお draftwatermark はフック内での順序も宣言していて、eso-pic より 先に 描かれるよう指定しています。つまり両者を併用すると、eso-pic の絵が透かしの上に乗ります。

どのパッケージを選ぶか — 使い分けとつまずきどころ

実務の順番は「素朴なものから」で足ります。地色なら \pagecolor、文字の透かしなら draftwatermark、宣言的に整えたいなら background、そして思いどおりにならないところまで来たら eso-pic に降りて \put で直接置く。前面に何かを重ねたい時点で選択肢は eso-pic(または scrlayer/生のフック)に絞られます。

手段向いている用途本文の前に出せる?注意点
\pagecolor全面のフラットな地色いいえ(紙の色そのもの)xcolor が必要。大域的でグループを無視する
eso-pic任意の絵を絶対位置に。最も自由な土台はい(\AddToShipoutPictureFG座標は自分で決める。星付きは現ページ限定
background宣言的な斜めの透かし。角度・不透明度が楽いいえ(背景のみ)2 回コンパイル。\NoBgThispage は二段組で不可
draftwatermarkDRAFT / CONFIDENTIAL の文字透かしを一行でいいえ(背景のみ)firstpageonly はパッケージオプション専用
wallpaper中央・タイル・四隅の画像背景いいえ(背景のみ)eso-pic の薄い上物。\This... 版は現ページ限定
shipout/backgroundパッケージなしで全部を自分で制御はい(shipout/foreground原点はページ左上隅、y は負。\AddToHook で登録
  • 背景が出ない・位置がずれるbackground は 2 回コンパイル。eso-pic なら y 座標の符号(既定は左下原点)と、\put の外側に余計な空白が入っていないかを疑う。
  • 表紙にだけ出したいのに全ページに出る → 星なしを使っている。\AddToShipoutPictureBG* に替え、\maketitle の直前に置く。
  • 消したのに今のページから消えてしまう\ClearShipoutPictureBG は即座に効く。先に \clearpage を入れる。
  • 透かしを本文の上に押したい\AddToShipoutPictureFGdraftwatermarkbackground は背景専用でできない。
  • 提出版から透かしだけ外したい\usepackage[final]{draftwatermark}\DraftwatermarkOptions{stamp=false}。設定は残したまま消える。
  • DVI 経由(dvipdfmx / dvips)で使いたい → いずれも動作するが、色・不透明度・画像取り込みはドライバ依存。eso-pic には dvips オプションがある。

印刷とファイルサイズ — 全面背景が本当に払う代償

画面で美しい全面背景は、紙の上ではしばしば別物になります。まず物理的な制約として、事務用のレーザーやインクジェットは用紙の端まで印字できません。裁ち落としのつもりで \paperwidth いっぱいに引き伸ばした画像は、四辺に数ミリの白い枠を付けて戻ってきます。本当に断ち切りで刷りたいなら、仕上がりより大きい紙に刷って裁つ ―― つまり画像を引き伸ばすのではなく、クラスや geometry に塗り足し込みの用紙を用意させるのが正しい順序です。もうひとつは単純にコストで、バックライト越しには上品に見える薄い地色も、紙の上ではページ全面のトナーです。遅く、高く、たいてい思ったより濃く出ます。読みやすさの面でも、本文と背景のコントラストが下がるぶんだけ読者を消耗させるので、透かしの opacity は「気づく程度に薄く」を狙うのが無難です。

ファイルサイズは、背景が何でできているかで挙動がはっきり分かれます。\includegraphics で読み込んだ画像は PDF に 一度だけ 埋め込まれ、各ページはそれを参照するだけです。だから 100 ページの報告書に写真の背景を敷いても、ファイルは「元の報告書 + 写真 1 枚」ぶんしか太りません。ところが TikZ で描いた背景はそうなりません。描画命令はページごとに実行し直され、各ページのコンテンツストリームに図形がそのまま書き込まれるので、ファイルはページ数にほぼ比例して膨らみます。凝ったベクター背景で PDF が数 MB に育っていたら、対処は簡単です ―― その図だけを一度コンパイルして単独の PDF にし、\includegraphics でそれを読み込む。ベクターの品質を保ったまま、埋め込みは一度きりになります。