Editorial Craft Bible
Elementos corrientes: folios y encabezados
Inicio Paginación HTML/CSS → PDF Elementos corrientes: folios y encabezados
Paginación HTML/CSS → PDF

Elementos corrientes: folios y encabezados

11 reglas W3C CSS Paged Media · Paged.js Generated Content in Margin BoxesW3C CSS Paged Media · MDN counter()W3C CSS GCPM · Paged.js Named StringsW3C CSS Paged Media · The Chicago Manual of Style
16

Elementos corrientes: folios y encabezados

11 reglas
166

Pon encabezados y pies corrientes en cajas de margen

Un encabezado o pie corriente se repite en cada hoja desde el margen de la página, no desde la caja de texto. En CSS Paged Media lo colocas en una caja de margen como @top-center o @bottom-right. Hay 16 cajas (cuatro por borde mas las cuatro esquinas); la caja solo imprime si le das content. Mantenlo fuera del bloque de texto para que el cuerpo fluya intacto.

@page {
  @top-center { content: "Editorial Craft Bible"; }
  @bottom-right { content: counter(page); }
}
Correcto
Craft Bible
12
Encabezado y folio viven en el margen; el cuerpo queda intacto.
Evitar
Craft Bible
12
Titulo escrito en la primera linea de texto: se mueve con la copia y rompe la paginacion.
W3C CSS Paged Media · Paged.js Generated Content in Margin Boxes
167

Numera con counter(page) de counter(pages)

Nunca teclees numeros de pagina a mano. counter(page) da la pagina actual y counter(pages) el total del documento, asi "3 de 20" sigue correcto tras cualquier reflow. Concatena cadenas y contadores dentro de content. Un numero fijo se desincroniza en cuanto un parrafo se recorre.

@page {
  @bottom-center {
    content: counter(page) " de " counter(pages);
  }
}
Correcto
3 de 20
Ambos numeros calculados; el total se actualiza si se agregan paginas.
Evitar
3 de 18
Total escrito 18 a mano; miente en cuanto el archivo crece a 20.
W3C CSS Paged Media · MDN counter()
168

Lleva el titulo de capitulo vivo al header con string-set

Un header corriente dinamico muestra el capitulo actual. Pon string-set: chapter content() en el titulo y luego imprimelo con content: string(chapter) en la caja de margen. Paged.js acepta un segundo argumento: string(chapter, first) toma la primera asignacion de la pagina, start el valor vigente al inicio. Asi el header se mantiene sincronizado con el contenido, sin reteclear nada.

h1.chapter { string-set: chapter content(text); }
@page {
  @top-center { content: string(chapter, start); }
}
Correcto
Cap. 2 · Color
2. Color
Cap. 3 · Fuentes
3. Fuentes
El header refleja el capitulo con que abre cada pagina.
Evitar
Cap. 1 · Intro
2. Color
Cap. 1 · Intro
3. Fuentes
Header estatico clavado en capitulo 1 mientras el cuerpo ya avanzo.
W3C CSS GCPM · Paged.js Named Strings
169

Coloca el folio en el borde exterior

En un documento a doble cara el folio va en la esquina exterior, donde descansa el pulgar al hojear. Usa @page :left para mandarlo a @bottom-left y @page :right a @bottom-right. Un folio pegado al lomo (borde interior) es invisible al pasar hojas y pierde su unico proposito: localizar rapido.

@page :left { @bottom-left { content: counter(page); } }
@page :right { @bottom-right { content: counter(page); } }
Correcto
24
25
24 al extremo izquierdo, 25 al derecho: caen bajo el pulgar.
Evitar
24
25
Ambos folios pegados al lomo, escondidos en el medianil al hojear.
W3C CSS Paged Media · The Chicago Manual of Style
170

Suprime los corrientes en la portada con @page :first

La portada y las paginas de apertura no deben llevar header corriente y a menudo tampoco folio visible. Apunta a la primera pagina con @page :first y vacia sus cajas de margen con content: none. Dejar el header en la portada se ve amateur y satura una pagina que deberia respirar.

@page :first {
  @top-center { content: none; }
  @bottom-right { content: none; }
}
Correcto
Editorial
Craft Bible
Guia de preprensa
Portada sin header ni folio: limpia y deliberada.
Evitar
Craft Bible · 1
Editorial
Craft Bible
Guia de preprensa
El header corriente invade la portada: se ve sin terminar.
W3C CSS Paged Media · Paged.js Page Selectors
171

Sube un elemento real al margen con running()

Cuando el header necesita marcado rico (un logo, spans con estilo, un filete) una named string no basta. GCPM permite sacar un elemento real del flujo con position: running(name) y soltarlo en una caja de margen con content: element(name). El elemento conserva su estructura y estilo. Paged.js lo soporta; ojo, es mover, no copiar, asi que el origen ya no imprime en el cuerpo.

.runhead { position: running(rh); }
@page {
  @top-center { content: element(rh); }
}
Correcto
Craft Bible
Logo mas titulo con estilo movidos intactos a @top-center.
Evitar
Craft Bible
El header rico queda dentro del cuerpo; no se repite por pagina.
W3C CSS GCPM · Paged.js Running Elements
172

Numeracion romana en preliminares, reset a arabiga en el cuerpo

Los preliminares (portada, creditos, indice) se numeran en romano minuscula: counter(page, lower-roman) da i, ii, iii. El cuerpo reinicia en 1 arabigo. En la primera pagina del cuerpo resetea el contador con counter-reset: page 0 sobre una pagina nombrada. Nunca corras una cuenta arabiga continua por los preliminares; delata un export sin editar.

@page frontmatter { @bottom-center { content: counter(page, lower-roman); } }
@page body :first { counter-reset: page 1; }
.body { page: body; }
Correcto
Preliminar
iii
Cuerpo
1
Preliminares en iii, cuerpo reinicia en 1: dos secuencias limpias.
Evitar
Preliminar
3
Cuerpo
4
Una sola cuenta arabiga: el cuerpo abre en 4 en vez de 1.
W3C CSS Lists (counter styles) · Chicago Manual of Style
173

Da encabezado distinto a par e impar

Convencion de libro: el header del verso (izquierda, par) lleva el titulo de la obra y el header del recto (derecha, impar) el titulo del capitulo. Sepáralos con @page :left y @page :right. Asi quien abre en cualquier punto lee a la vez el libro y donde esta dentro. El mismo header en ambos lados desperdicia el par.

@page :left { @top-center { content: string(booktitle); } }
@page :right { @top-center { content: string(chapter); } }
Correcto
Craft Bible
Cap. 4 Negro
Verso = titulo de obra, recto = capitulo: ubicacion de un vistazo.
Evitar
Craft Bible
Craft Bible
Ambas paginas repiten el titulo; el capitulo nunca aparece.
Chicago Manual of Style · Bringhurst, Elements of Typographic Style
174

Reserva margen para que el folio no encime el texto

Las cajas de margen se dibujan dentro del margen de la pagina, asi que ese margen debe ser lo bastante alto para alojar el header o el folio con aire. Si el margen superior es muy chico, el header corriente choca con la primera linea de texto. Regla practica: deja el header al menos su propio interlineado libre del cuerpo y ajusta el margen de pagina (por ejemplo margin: 20mm 18mm). El folio vive en el margen, no encima de la copia.

Correcto
Craft Bible
El margen superior aloja el header con un hueco claro al texto.
Evitar
Craft Bible
Margen muy chico: el header aterriza en la primera linea de copia.
W3C CSS Paged Media · Paged.js Margin Boxes
175

Manten el folio pequeno, discreto y en familia

Un folio es una ayuda de orientacion, no un titular. Ponlo un par de puntos bajo el cuerpo (aprox. 8 a 9pt para un cuerpo de 10 a 11pt), en tono tenue (var(--text-2)), en la misma familia que el texto. Un folio grande, en negrita y a color compite con el contenido y abarata la pagina. Discreto y consistente le gana a llamativo siempre.

Correcto
47
Folio pequeno y tenue: presente pero nunca distrae.
Evitar
47
Folio enorme en negrita grita mas fuerte que el texto.
Bringhurst, Elements of Typographic Style · The Book Designer
176

Sin soporte de margin boxes, recurre a Paged.js o headers HTML

Headless Chrome --print-to-pdf ignora las cajas de margen, las named strings y counter(pages): tu @top-center simplemente no imprime nada. Dos salidas: usar Paged.js (un polyfill JS que construye margin boxes reales, headers corrientes y contadores en el navegador) o WeasyPrint, o dar la plantilla de header/footer propia de Chrome via banderas de --print-to-pdf con class="pageNumber" / class="totalPages". No esperes que Chrome puro respete GCPM.

# Paged.js: polyfills margin boxes in the browser
<script src="paged.polyfill.js"></script>

# o la plantilla de header propia de Chrome
--print-to-pdf --header-template='<span class="pageNumber"></span>'
Correcto
Craft Bible · 5
Paged.js construye la caja de margen
El polyfill dibuja el header corriente que Chrome tiraria.
Evitar
(vacio)
Chrome puro ignora @top-center
Esperar que Chrome puro respete margin boxes: el header sale vacio.
Paged.js Documentation · Chrome DevTools Protocol Page.printToPDF