Fondos de página (eso-pic)

Una página de LaTeX se arma como una lista vertical y luego se expulsa (shipout) entera, ya terminada, de modo que no queda ningún hueco por donde deslizar un fondo por debajo. Los fondos de página —un color plano, una foto a sangre, una marca de agua DRAFT en diagonal— existen igualmente porque todos los paquetes que los ofrecen hacen el mismo truco: se interponen justo antes de la salida y depositan su tinta antes que el texto. El texto se imprime después, encima, y el resultado parece un fondo. Esta página sigue esa única idea a través de \pagecolor, eso-pic, el paquete background y draftwatermark, y termina donde casi todo el mundo se quema: la impresora y el tamaño del archivo.

\pagecolor frente a una capa de fondo real

Si basta con un color plano detrás de toda la página, la respuesta cabe en una línea, \pagecolor{color}, y no interviene ningún paquete de fondos. El comando procede de color/xcolor y no del núcleo de LaTeX, así que escribir \pagecolor{yellow} sin \usepackage{xcolor} da ! Undefined control sequence. \nopagecolor lo revierte. Dos de sus propiedades sorprenden. La primera: es global e ignora la agrupación; aunque se fije dentro de un entorno o entre llaves, el tono sigue desde esa página hasta el final del documento (cómo se escriben los colores corresponde a la página de colores). La segunda: solo puede pintar un rectángulo liso, sin fotografía, sin logotipo, sin texto girado. Casi todo lo demás de esta página nace de ese segundo límite.

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}

¿Qué ocurre entonces cuando hace falta algo más complicado que un color detrás del texto? Cuando LaTeX sabe qué contiene una página, la página ya está terminada: la rutina de salida ha ensamblado una gran caja vertical y solo queda escribirla. No hay ninguna capa que deslizar por debajo. Lo que el núcleo ofrece en su lugar es un par de ganchos, shipout/background y shipout/foreground, y el mecanismo es de una franqueza casi cómica. shipout/background inserta una caja de tamaño cero como primerísimo elemento de la caja de salida, de modo que su contenido se imprime primero y el resto de la página lo sobreimprime sin más. shipout/foreground añade otra como último elemento, elevada de nuevo hasta la esquina, así que se imprime al final y tapa el texto. El PDF no tiene coordenada z: el orden en que se deposita la tinta es la única profundidad que existe. Ambos ganchos abren un entorno picture cuyo origen (0,0) está en la esquina superior izquierda de la página, con \unitlength a 1 pt; por eso las coordenadas verticales de los \put allí suelen ser negativas.

Lo interesante es que esos dos ganchos son mucho más jóvenes que los paquetes que los usan. Llegaron con la versión de LaTeX del 2020-10-01; antes, cada paquete de fondos parcheaba por su cuenta la rutina de salida, y de ahí la acumulación de atbegshi, everyshi y everypage. Siguen funcionando, pero hoy son capas de compatibilidad delgadas: \AddEverypageHook{...} de everypage es hoy literalmente \AddToHook{shipout/background}{\put(1in,-1in){...}}, donde 1in,-1in desplaza el origen una pulgada hacia dentro y una hacia abajo desde la esquina del pliego, es decir, hasta el punto de referencia tradicional de TeX. La consecuencia práctica es sencilla: eso-pic, background y draftwatermark depositan su material en el mismo gancho del núcleo. Por eso se pueden combinar, y por eso también pueden disputarse quién se imprime primero.

Arte en cada página con eso-pic — \AddToShipoutPictureBG

eso-pic es la herramienta de uso general. \AddToShipoutPictureBG{...} dibuja su argumento detrás del texto en cada página a partir de ese punto, y \AddToShipoutPictureFG{...} lo dibuja delante. El paquete de Rolf Niepraschk es más antiguo que los ganchos del núcleo y se mudó a ellos en la versión 3; sobrevive porque no da nada por supuesto sobre lo que se quiere dibujar. Las formas con estrella \AddToShipoutPictureBG* y \AddToShipoutPictureFG* afectan solo a la página actual: internamente, el material con estrella se vacía en cuanto esa página sale. Para detener un fondo más adelante se llama a \ClearShipoutPictureBG (o \ClearShipoutPictureFG para el primer plano). \AddToShipoutPicture y \AddToShipoutPicture* son alias antiguos de las formas BG y se comportan igual.

Dentro del gancho se está en un entorno picture, así que la colocación se hace con \put(x,y){...}. Por defecto, eso-pic traslada el origen a la esquina inferior izquierda del pliego (opción pscoord, activa por defecto). Cargado como \usepackage[texcoord]{eso-pic}, el origen pasa a la esquina superior izquierda y la y crece hacia abajo. Contar desde una esquina cada vez resulta penoso, así que el paquete trae ayudas: \AtPageLowerLeft, \AtPageUpperLeft y \AtPageCenter respecto al pliego, \AtTextUpperLeft, \AtTextLowerLeft y \AtTextCenter respecto al área de texto, además de \AtStockLowerLeft y compañía cuando interviene la clase memoir. El LaTeX actual admite dimensiones reales en \put, de modo que \put(0,-\paperheight) es válido y la vieja envoltura \LenToUnit, pensada para eso, es hoy un simple paso a través conservado por compatibilidad. Si las coordenadas se están adivinando, \usepackage[grid]{eso-pic} traza una cuadrícula rotulada sobre cada página: gridunit=mm por defecto, y también bp, in y pt.

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}

Si lo que se busca es un motivo dibujado y no una fotografía, se pone un tikzpicture dentro del gancho. El anclaje cómodo aquí es \AtPageCenter, porque entonces las coordenadas propias de TikZ irradian desde el centro del pliego y todo puede razonarse respecto de (0,0). En la práctica, el método consiste en dejar activa la opción grid mientras se coloca todo y quitarla después.

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}

Limitar un fondo a una página o a la portada

La respuesta: usar la forma con estrella y escribirla donde empieza esa página. \AddToShipoutPictureBG*{...} afecta solo a la página que se está ensamblando en el momento en que LaTeX lee la línea. Un fondo de portada va, pues, en el preámbulo o justo antes de \maketitle; más adelante caería en la página que estuviera abierta. El mismo razonamiento revela una trampa en \ClearShipoutPictureBG: es global y surte efecto de inmediato, así que llamarlo a media página quita el fondo de esa misma página, no solo de la siguiente. Si la página actual debe conservar su fondo, primero se expulsa con \clearpage y se borra después. Para un fondo que abarque varias páginas, la forma habitual es por tanto: empezar sin estrella y luego \clearpage seguido de \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}

Los paquetes especializados ofrecen el mismo atajo en su propio idioma. background tiene firstpage=true para solo la primera página, y la combinación de pages=some con \BgThispage para páginas elegidas. draftwatermark se limita a la página uno con \usepackage[firstpageonly]{draftwatermark} y puede apagarse y volver a encenderse a mitad de documento con \DraftwatermarkOptions{stamp=false} y {stamp=true}. Si solo se va a colocar una imagen, el paquete wallpaper —una capa fina sobre eso-pic— resulta cómodo: \CenterWallPaper{factor}{archivo} centra una imagen, \TileWallPaper{ancho}{alto}{archivo} la repite en mosaico y \ULCornerWallPaper y compañía la anclan a una esquina. Y lo más útil para esta sección: cada uno de esos comandos tiene un gemelo limitado a la página actual cuyo nombre lleva un This, como \ThisCenterWallPaper.

El paquete background: marcas de agua declaradas con \backgroundsetup

Para no calcular coordenadas a mano, el paquete background de Gonzalo Medina es la respuesta. Toda la configuración se reúne en \backgroundsetup{clave=valor, ...} y el dibujo lo hace TikZ. Un \usepackage{background} a secas ya produce los valores por defecto: un gran Draft rojizo (color=red!45, contents=Draft) que cruza el centro de cada página a 60 grados con opacity=0.5. Las claves principales son contents= (el material: texto, un \includegraphics o un dibujo), color= (toda la gama de xcolor), opacity= (0 totalmente transparente, 1 totalmente opaco), angle= (sentido antihorario, de −360 a 360), scale=, position= (sintaxis de colocación de nodos de TikZ como current page.center; las coordenadas desnudas no deben ir entre paréntesis), placement= (los tres preajustes center, top y bottom), nodeanchor= y anchor=, además de hshift= y vshift= para afinar. \backgroundsetup puede llamarse en el preámbulo o en el cuerpo cuantas veces haga falta, así que el diseño puede cambiar a mitad de camino.

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}

Tres trampas. Primera: compilar siempre dos veces. El material es un tikzpicture con remember picture, overlay anclado al nodo current page, así que su posición absoluta en el pliego depende de lo que la compilación anterior escribió en el archivo .aux. En la primera pasada aparece LaTeX Warning: Label(s) may have changed. Rerun to get cross-references right. y la marca queda mal colocada o no aparece. Segunda: si el material de contents= contiene comandos de LaTeX, hay que declararlo mediante \backgroundsetup y no como opción de \usepackage, porque la cadena de opciones se analiza de un modo que los rompe. Tercera: pages=some junto con \BgThispage funciona bien, pero el comando contrario, \NoBgThispage, no debe usarse en documentos a dos columnas: su implementación depende de afterpage, y afterpage no coopera con el modo a dos columnas. A dos columnas conviene invertir la lógica: pasar a pages=some y llamar a \BgThispage en las páginas que deban llevar el fondo.

draftwatermark: una marca de agua DRAFT en una línea

Si basta con una marca de agua textual, draftwatermark de Sergio Callegari es el camino más corto. Un \usepackage{draftwatermark} coloca un gran DRAFT gris en el centro de cada página; los valores por defecto son text=DRAFT, angle=45, scale=1, fontsize=0.25\paperwidth y un color colorspec=0.8 en el modelo colormodel=gray. La configuración vive en \DraftwatermarkOptions{clave=valor}: text=, angle=, scale=, fontsize=, color= (que puede llevar modelo, como en {[gray]{0.85}}), hpos=/vpos= (o ambos a la vez con pos={x,y}), hanchor=/vanchor= (o las letras juntas, como en anchor=lt) y alignment= para texto de varias líneas. Hay exactamente una excepción: firstpageonly es solo opción de paquete; escribir \DraftwatermarkOptions{firstpageonly} produce ! Package keyval Error: firstpageonly undefined. Para marcar solo la primera página hay que cargar \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}

La razón misma de que este paquete exista es un pequeño trozo de historia. Su predecesor draftcopy, de Jürgen Vollmer, dibujaba la marca con \special de PostScript, que pdfLaTeX no sabe interpretar; según el manual, esa incompatibilidad con los motores que generan PDF directamente fue la primera motivación para escribir draftwatermark. El paquete actual no usa, por tanto, ningún truco dependiente del driver y se comporta igual bajo pdfLaTeX, XeLaTeX y LuaLaTeX. Los comandos antiguos \SetWatermarkText{...}, \SetWatermarkScale{...}, \SetWatermarkColor{...}, \SetWatermarkAngle{...} y \SetWatermarkLightness{...} (0 es negro, 1 es blanco) sobreviven por compatibilidad, pero cada uno se limita a reenviar a \DraftwatermarkOptions, así que los documentos nuevos deberían usar la forma clave-valor. Lo que de verdad ayuda al cerrar un proyecto es la familia stamp: \usepackage[final]{draftwatermark}nostamp es sinónimo— quita la marca sin tocar nada de la configuración, y como final es una opción de clase muy común, un \documentclass[final]{article} también la alcanza. El límite es igual de claro: draftwatermark solo añade material a shipout/background, de modo que no puede estampar por encima del texto. Para una superposición, o para controlar con rigor el orden de capas, hay que recurrir a \AddToShipoutPictureFG de eso-pic, a scrlayer de KOMA-Script o directamente al gancho shipout/foreground. draftwatermark incluso declara su orden dentro del gancho: pide dibujarse antes que eso-pic, así que al combinar ambos el arte de eso-pic queda sobre la marca de agua.

Qué paquete elegir y dónde se suele fallar

En la práctica conviene subir desde la herramienta más humilde: \pagecolor para un color, draftwatermark para una marca textual, background para una configuración declarativa ordenada y, solo cuando nada de eso se doblega, bajar a eso-pic y colocar directamente con \put. En cuanto hace falta algo delante del texto, el abanico se reduce a eso-pic (o scrlayer, o el gancho a pelo).

HerramientaMejor para¿Puede ir delante?Ojo con
\pagecolorUn color plano detrás de todoNo — es el color del papelRequiere xcolor; global e ignora la agrupación
eso-picArte arbitrario en posiciones absolutasSí — \AddToShipoutPictureFGLa colocación es manual con \put; las formas con estrella solo afectan a la página actual
backgroundMarcas diagonales declarativas; ángulo y opacidad fácilesNo — solo fondoRequiere dos pasadas; \NoBgThispage falla a dos columnas
draftwatermarkUna marca DRAFT o CONFIDENTIAL en una líneaNo — solo fondofirstpageonly es únicamente opción de paquete
wallpaperFondos de imagen centrados, en mosaico o anclados a una esquinaNo — solo fondoCapa fina sobre eso-pic; las variantes \This... solo afectan a la página actual
shipout/backgroundControl total sin ningún paqueteSí — mediante shipout/foregroundEl origen es la esquina superior izquierda y la y es negativa; se registra con \AddToHook
  • No aparece nada, o está en el sitio equivocado → compilar background dos veces. Con eso-pic, sospechar del signo de la coordenada y (el origen está abajo a la izquierda por defecto) y de espacios sobrantes fuera del \put.
  • Debía ir solo en la portada pero sale en todas las páginas → se usó la forma sin estrella. Cambiar a \AddToShipoutPictureBG* y colocarla justo antes de \maketitle.
  • Al borrarlo desapareció también de la página actual\ClearShipoutPictureBG surte efecto de inmediato; poner antes un \clearpage.
  • Quiero la marca por encima del texto\AddToShipoutPictureFG. Ni draftwatermark ni background pueden hacerlo: ambos son solo de fondo.
  • Quitar la marca de la versión entregada\usepackage[final]{draftwatermark} o \DraftwatermarkOptions{stamp=false}; la configuración queda y la marca se va.
  • Compilación por DVI (dvipdfmx / dvips) → todo funciona, pero color, opacidad e inclusión de imágenes dependen del driver; eso-pic tiene además una opción dvips.

Impresión y tamaño de archivo: lo que cuesta de verdad un fondo a página completa

Un fondo que se ve precioso en pantalla suele ser otro animal sobre el papel. Primero la restricción física: las impresoras láser y de inyección de oficina no pueden depositar tinta hasta el borde del pliego. Una imagen estirada a \paperwidth con la idea de que sangrará vuelve con un marco blanco de unos milímetros en los cuatro lados. Si de verdad hace falta impresión a sangre, el pliego debe ser mayor que la página final y luego recortarse; es decir, lo correcto es pedir a la clase o a geometry un papel con demasía, no estirar más la imagen. El segundo coste es aún más llano: un tono que parece suave en una pantalla retroiluminada es, en papel, un bloque de tóner que cubre la página entera. Es lento, es caro y casi siempre sale más oscuro de lo previsto. La legibilidad también paga, porque todo fondo reduce el contraste con el texto; el objetivo prudente para la opacity de una marca de agua es «apenas perceptible».

El tamaño del archivo se comporta de forma muy distinta según de qué esté hecho el fondo. Una imagen traída con \includegraphics se incrusta en el PDF una sola vez y cada página se limita a referenciarla, de modo que un informe de cien páginas con fondo fotográfico apenas pesa más que el informe más una copia de la foto. Un fondo dibujado con TikZ no funciona así: los comandos de trazado se ejecutan de nuevo para cada página y las formas acaban en el flujo de contenido de todas ellas, con lo que el archivo crece más o menos en proporción al número de páginas. Si un fondo vectorial elaborado ha llevado el PDF a varios megabytes, el remedio es sencillo: compilar ese dibujo aparte en un PDF independiente e incluirlo con \includegraphics. Se conserva la calidad vectorial y la incrustación ocurre exactamente una vez.