LaTeX의 페이지는 세로 목록으로 조립된 뒤 완성된 상자 하나로 통째로 출력(ship out)됩니다. 즉 나중에 배경을 그 아래로 끼워 넣을 틈은 어디에도 없습니다. 그런데도 페이지 배경 ―― 전면 바탕색, 재단선까지 채우는 사진, 비스듬히 가로지르는 DRAFT 워터마크 ―― 이 가능한 것은, 배경을 제공하는 패키지가 모두 같은 수법을 쓰기 때문입니다. 출력 직전에 끼어들어 본문보다 먼저 잉크를 놓는 것입니다. 본문은 그 뒤에 위로 겹쳐 찍히고, 결과적으로 배경처럼 보입니다. 이 페이지는 그 하나의 줄기를 따라 \pagecolor, eso-pic, background 패키지, draftwatermark를 차례로 살펴보고, 마지막에는 많은 사람이 발목을 잡히는 지점 ―― 인쇄와 파일 크기 ―― 까지 내려갑니다.
\pagecolor와 진짜 배경 레이어의 차이
페이지 전체를 단색으로 채우기만 하면 된다면 답은 \pagecolor{색} 한 줄이고, 배경 패키지는 전혀 필요 없습니다. 다만 이 명령은 LaTeX 커널이 아니라 color/xcolor가 제공하므로, \usepackage{xcolor} 없이 \pagecolor{yellow}를 쓰면 ! Undefined control sequence.가 납니다. 되돌리려면 \nopagecolor를 씁니다. 뜻밖으로 여겨지는 성질이 둘 있습니다. 첫째, 전역이며 그룹을 무시합니다. 환경 안이나 중괄호 안에서 지정해도 그 페이지부터 문서 끝까지 계속 칠해집니다(색을 지정하는 방법 자체는 색 페이지에서 다룹니다). 둘째, 칠할 수 있는 것은 평평한 직사각형뿐입니다. 사진도 로고도 회전한 글자도 놓을 수 없습니다. 이 페이지의 나머지는 거의 전부 이 두 번째 한계에서 나옵니다.
\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이 한 페이지의 내용을 확정했을 때 그 페이지는 이미 완성되어 있습니다. 출력 루틴이 커다란 세로 상자 하나를 다 조립했고, 남은 일은 그것을 써 내보내는 것뿐입니다. 끼워 넣을 레이어는 존재하지 않습니다. 그래서 커널이 대신 제공하는 것이 shipout/background와 shipout/foreground라는 두 훅이고, 그 방식은 허탈할 만큼 직설적입니다. shipout/background는 출력 상자의 맨 앞에 크기 0인 \hbox를 끼워 넣습니다. 그래서 그 내용이 가장 먼저 찍히고, 나머지 페이지 내용이 그 위에 겹쳐 찍힙니다. shipout/foreground는 반대로 맨 뒤에 붙이고 다시 모서리까지 끌어올리므로, 마지막에 찍혀 본문을 덮습니다. PDF에는 z 좌표가 없습니다. 잉크를 올리는 순서만이 유일한 깊이입니다. 두 훅 모두 원점 (0,0)이 페이지 왼쪽 위 모서리이고 \unitlength가 1 pt인 picture 환경을 엽니다. 그래서 그 안에 \put하는 세로 좌표는 보통 음수가 됩니다.
흥미로운 대목은 이 두 훅이 그것을 쓰는 패키지들보다 훨씬 젊다는 점입니다. 훅이 커널에 들어온 것은 2020-10-01 릴리스의 LaTeX입니다. 그 전에는 배경을 다루는 패키지가 저마다 출력 루틴에 패치를 댔고, atbegshi, everyshi, everypage 같은 무리가 그 흔적입니다. 이들은 지금도 동작하지만 내용은 얇은 호환 계층이 되었습니다. everypage의 \AddEverypageHook{...}은 이제 말 그대로 \AddToHook{shipout/background}{\put(1in,-1in){...}}이며, 여기서 1in,-1in은 원점을 종이 모서리에서 안쪽으로 1인치, 아래로 1인치, 곧 TeX의 전통적 기준점까지 옮기는 몫입니다. 실무적 의미는 단순합니다. eso-pic도 background도 draftwatermark도 결국 같은 커널 훅에 재료를 놓습니다. 그래서 함께 쓸 수 있고, 그래서 "누가 먼저 찍히는가"를 두고 다투기도 합니다.
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이며 bp, in, pt도 고를 수 있습니다.
\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 옵션을 켜 두고, 다 잡히면 뗍니다.
\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}배경을 한 페이지에만, 또는 표지에만 넣기
답은 "별표 형태를 쓰고, 그 페이지가 시작되는 자리에 적는다"입니다. \AddToShipoutPictureBG*{...}는 LaTeX이 그 줄을 읽는 시점에 조립 중인 페이지에만 적용됩니다. 그래서 표지 배경은 프리앰블이나 \maketitle 바로 앞에 둡니다. 그보다 뒤에 쓰면 그때 열려 있던 페이지에 떨어집니다. 같은 이유로 \ClearShipoutPictureBG에도 함정이 있습니다. 이 명령은 전역이며 즉시 효력이 있어서, 페이지 도중에 호출하면 지금 조판 중인 바로 그 페이지에서도 배경이 사라집니다. 현재 페이지에 배경을 남기고 싶다면 먼저 \clearpage로 페이지를 내보낸 뒤에 지우십시오. 여러 페이지에 걸쳐 깔고 싶다면 별표 없이 시작한 다음 \clearpage와 \ClearShipoutPictureBG를 잇는 것이 정석입니다.
\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}전용 패키지들도 같은 용도의 지름길을 각자의 방식으로 제공합니다. background는 firstpage=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)의 큰 Draft(contents=Draft)가 opacity=0.5로 모든 페이지 중앙을 60도 기울어 가로지릅니다. 주요 키는 contents=(내용: 텍스트, \includegraphics, 그림), color=(xcolor의 모든 색), opacity=(0이 완전 투명, 1이 완전 불투명), angle=(반시계 방향, −360부터 360), scale=, position=(TikZ 노드 배치 문법, 예 current page.center. 맨 좌표는 괄호로 감싸면 안 됩니다), placement=(center, top, bottom 세 가지 프리셋), nodeanchor=와 anchor=, 그리고 미세 조정용 hshift=, vshift=입니다. \backgroundsetup은 프리앰블에서도 본문에서도 몇 번이든 호출할 수 있어 중간에 디자인을 바꿀 수 있습니다.
\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}함정이 셋 있습니다. 첫째, 반드시 두 번 컴파일하십시오. background의 재료는 remember picture, overlay를 붙인 tikzpicture로 current page 노드에 고정되므로, 지면 위 절대 위치는 이전 실행이 .aux 파일에 남긴 정보에 의존합니다. 첫 실행에서는 LaTeX Warning: Label(s) may have changed. Rerun to get cross-references right.가 나오고 워터마크는 어긋나거나 아예 나오지 않습니다. 둘째, contents= 재료에 LaTeX 명령이 들어 있다면 \usepackage 옵션이 아니라 \backgroundsetup 쪽에서 지정하십시오. 옵션 문자열의 해석 방식 때문에 깨집니다. 셋째, pages=some과 \BgThispage의 조합은 문제없지만, 반대 명령인 \NoBgThispage는 2단 조판 문서에서 쓰면 안 됩니다. 구현이 afterpage에 의존하는데 afterpage가 2단 조판과 어울리지 않기 때문입니다. 2단에서는 논리를 뒤집는 편이 확실합니다. pages=some으로 바꾸고, 배경이 필요한 페이지에서 \BgThispage를 부르는 것입니다.
draftwatermark — DRAFT 워터마크를 한 줄로
문자 워터마크만 필요하다면 Sergio Callegari의 draftwatermark가 가장 짧은 길입니다. \usepackage{draftwatermark} 한 줄이면 모든 페이지 가운데에 큰 회색 DRAFT가 나타납니다. 기본값은 text=DRAFT, angle=45, scale=1, fontsize=0.25\paperwidth이고 색은 colormodel=gray의 colorspec=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.가 납니다. 첫 페이지만 표시하려면 \usepackage[firstpageonly]{draftwatermark}로 읽으십시오.
\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}이 패키지가 존재하는 이유 자체가 작은 역사입니다. 선행 패키지인 Jürgen Vollmer의 draftcopy는 워터마크를 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}에도 반응합니다. 한계도 분명합니다. draftwatermark는 shipout/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 | 선언적 대각선 워터마크. 각도와 불투명도 조정이 쉬움 | 아니요(배경 전용) | 두 번 컴파일 필요. \NoBgThispage는 2단에서 불가 |
draftwatermark | DRAFT / CONFIDENTIAL 문자 워터마크를 한 줄로 | 아니요(배경 전용) | firstpageonly는 패키지 옵션 전용 |
wallpaper | 중앙, 타일, 모서리 배치의 이미지 배경 | 아니요(배경 전용) | eso-pic 위의 얇은 층. \This... 판은 현재 페이지 전용 |
shipout/background | 패키지 없이 전부 직접 제어 | 예(shipout/foreground 사용) | 원점은 페이지 왼쪽 위 모서리, y는 음수. \AddToHook으로 등록 |
- 배경이 나오지 않거나 위치가 어긋난다 →
background는 두 번 컴파일합니다.eso-pic이라면 y 좌표의 부호(기본 원점은 왼쪽 아래)와\put바깥에 섞여 든 여분의 공백을 의심합니다. - 표지에만 넣으려 했는데 모든 페이지에 나온다 → 별표 없는 형태를 썼습니다.
\AddToShipoutPictureBG*로 바꾸고\maketitle바로 앞에 둡니다. - 지웠더니 지금 페이지에서도 사라졌다 →
\ClearShipoutPictureBG는 즉시 효력이 있습니다. 앞에\clearpage를 넣으십시오. - 워터마크를 본문 위에 찍고 싶다 →
\AddToShipoutPictureFG.draftwatermark와background는 배경 전용이라 불가능합니다. - 제출본에서 워터마크만 빼고 싶다 →
\usepackage[final]{draftwatermark}또는\DraftwatermarkOptions{stamp=false}. 설정은 남고 표시만 사라집니다. - DVI 경유(dvipdfmx / dvips)로 처리한다 → 모두 동작하지만 색, 불투명도, 이미지 삽입은 드라이버에 의존합니다.
eso-pic에는dvips옵션도 있습니다.
인쇄와 파일 크기 — 전면 배경이 실제로 치르는 대가
화면에서 아름다운 전면 배경은 종이 위에서 종종 전혀 다른 물건이 됩니다. 먼저 물리적 제약이 있습니다. 사무용 레이저나 잉크젯 프린터는 용지 가장자리까지 토너를 올리지 못합니다. 재단선까지 채울 셈으로 \paperwidth에 맞춰 늘린 이미지는 네 변에 몇 밀리미터짜리 흰 테두리를 달고 돌아옵니다. 정말 재단까지 채워 인쇄하려면 완성 크기보다 큰 종이에 찍고 잘라야 합니다. 즉 이미지를 더 늘릴 것이 아니라, 클래스나 geometry에 재단 여백이 포함된 용지를 요구하는 것이 올바른 순서입니다. 두 번째 대가는 더 단순합니다. 백라이트 너머로는 은은해 보이는 옅은 바탕색도 종이 위에서는 페이지 전면을 덮는 토너입니다. 느리고, 비싸고, 대개 예상보다 진하게 나옵니다. 가독성도 값을 치릅니다. 배경이 짙어질수록 본문과의 대비가 줄기 때문에, 워터마크의 opacity는 "겨우 알아볼 정도"를 노리는 편이 안전합니다.
파일 크기는 배경이 무엇으로 만들어졌느냐에 따라 뚜렷하게 갈립니다. \includegraphics로 불러온 이미지는 PDF에 한 번만 삽입되고 각 페이지는 그것을 참조할 뿐입니다. 그래서 100쪽짜리 보고서에 사진 배경을 깔아도 파일은 "원래 보고서 + 사진 한 장"만큼만 커집니다. 그런데 TikZ로 그린 배경은 다릅니다. 그리기 명령이 페이지마다 다시 실행되고 도형이 각 페이지의 콘텐츠 스트림에 그대로 기록되므로, 파일은 페이지 수에 거의 비례해 부풀어 오릅니다. 공들인 벡터 배경 때문에 PDF가 몇 MB로 자랐다면 해법은 간단합니다. 그 그림만 따로 한 번 컴파일해 독립된 PDF로 만들고 \includegraphics로 불러오면 됩니다. 벡터 품질은 그대로 유지되고, 삽입은 딱 한 번만 일어납니다.