El salto de página en LaTeX no se parece en nada al salto de línea. Un párrafo se divide sopesando de golpe todas las particiones posibles y quedándose con la mejor en conjunto; una página, en cambio, nunca se reconsidera una vez cerrada. Escribir \newpage sin entender por qué la página terminó donde terminó puede arrastrar consigo las cuarenta páginas siguientes. Esta página mide la mecánica del ritmo de un documento —viudas y huérfanas (\widowpenalty y \clubpenalty, ambos con valor por defecto 150), la diferencia entre \raggedbottom y \flushbottom y el modo en que los flotantes empujan el texto— y construye un procedimiento para diagnosticar un mal salto en lugar de forzarlo.
Por qué una página acaba donde acaba: la diferencia con el salto de línea
Una página termina donde termina basándose únicamente en la información disponible mientras se compone esa página. TeX vierte el texto hacia abajo vigilando los puntos de corte legales que aparecen entre líneas y, en cuanto la altura acumulada supera el objetivo, vuelve al candidato más barato que ha visto hasta ese momento y corta ahí. El salto de línea dentro de un párrafo es una optimización global sobre todas las disposiciones posibles; el salto de página es una decisión secuencial tomada mientras se avanza. Esa es la diferencia que importa en la práctica, y por eso corregir el salto de la página 40 desplaza todo a partir de la página 41.
Decidir de forma secuencial significa también que después no hay nada que renegociar. A TeX solo le queda un modo de declarar, en forma de número, cuánto le disgusta cortar en cada candidato: la penalización. Una penalización es un entero adjunto a un punto de corte; cuanto mayor es, más se resiste TeX a cortar ahí. 10000 es el valor especial que significa «no cortar nunca aquí» y -10000 significa lo contrario, «cortar aquí sin falta». El mecanismo que evita dejar aislada una línea de párrafo, el que coloca los flotantes y el que prohíbe cortar justo después de un título se expresan todos con esta única clase de número. Ajustar los saltos de página es, en la práctica, ajustar penalizaciones.
Viudas y huérfanas: \widowpenalty y \clubpenalty valen 150 por defecto
Medidos en la clase article, \widowpenalty y \clubpenalty valen ambos 150, y \displaywidowpenalty vale 50. Una viuda es la última línea de un párrafo que queda sola al principio de una página; una huérfana es la primera línea que queda sola al final. Los tipógrafos alemanes las distinguen como Hurenkind y Schusterjunge. Lo primero que despista es el nombre: el parámetro que suprime la huérfana no se llama \orphanpenalty —esa variable no existe ni en TeX ni en LaTeX— sino \clubpenalty, resto del viejo término de imprenta club line para una línea inicial aislada.
% Print the defaults into the .log yourself:
% pdflatex penalties.tex -> grep MEASURE penalties.log
\documentclass{article}
\begin{document}
\typeout{MEASURE widowpenalty=\the\widowpenalty}
\typeout{MEASURE clubpenalty=\the\clubpenalty}
\typeout{MEASURE displaywidowpenalty=\the\displaywidowpenalty}
\typeout{MEASURE brokenpenalty=\the\brokenpenalty}
x
\end{document}El número 150 tiene pedigrí. En TeX Live 2024 esas tres asignaciones ocupan las líneas 514–516 de latex.ltx, y las tres líneas idénticas aparecen en las líneas 290–292 del plain.tex de Knuth. LaTeX se limitó a heredar los valores por defecto de plain TeX y no los ha revisado en cuarenta años. Y 150 apenas hace nada en la práctica: la fealdad —la badness— de acortar una página en una línea supera con facilidad 1000 en texto corrido, donde hay poco blanco vertical elástico. Una penalización de 150 pierde esa discusión casi siempre.
| Parámetro | Valor por defecto | Qué desalienta |
|---|---|---|
\widowpenalty | 150 | la última línea de un párrafo sola al principio de la página |
\clubpenalty | 150 | la primera línea de un párrafo sola al final de la página |
\displaywidowpenalty | 50 | una línea aislada justo antes de una fórmula aparte |
\brokenpenalty | 100 | cortar la página justo después de una línea con guion |
\interlinepenalty | 0 | cortar en cualquier punto interior de un párrafo (no se desalienta por defecto) |
\predisplaypenalty | 10000 | cortar justo antes de una fórmula aparte (prohibido de hecho) |
Hay exactamente un lugar donde LaTeX abandona por su cuenta estos valores. El entorno thebibliography de article.cls llama a \sloppy al entrar y fija \clubpenalty4000 y \widowpenalty4000 (líneas 576–579 del article.cls que acompaña a TeX Live 2024). Una lista de referencias es una larga sucesión de entradas breves, las viudas abundan y una entrada partida entre dos páginas resulta de veras incómoda de leer: por eso la clase estándar se esfuerza justo ahí. Lo que implica lo contrario: en el texto corrido las clases estándar no hacen nada por usted.
Qué cuesta de verdad \widowpenalty=10000: el trueque, medido
La viuda desaparece y en su lugar llega una página corta. Componga un documento de 20 líneas por página con párrafos de seis líneas en \flushbottom y mida: con los valores por defecto, la página 1 admite 23 líneas y la última línea del cuarto párrafo queda sola al principio de la página 2. Añada \widowpenalty=10000 y la página 1 baja a 22 líneas, las dos últimas líneas viajan juntas a la página siguiente y la viuda desaparece. Pero el registro gana una línea:
Underfull \vbox (badness 10000) has occurred while \output is active []El aviso significa que TeX no pudo rellenar la página hasta su altura objetivo, y solo aparece con \flushbottom. El mismo experimento con \raggedbottom no lo dispara ni una vez: la página puede quedarse corta, así que no hay nada que rellenar. El coste de \widowpenalty=10000 se manifiesta, pues, como interlineado estirado y desigual con \flushbottom y una franja de blanco variable al pie con \raggedbottom. En ninguno de los dos casos el coste es cero. Aun así, para un original hecho sobre todo de texto corrido, 10000 es defendible: una línea aislada se nota siempre, y una página que acaba una línea antes casi nunca.
% A defensible pair of settings for a text-heavy manuscript.
\widowpenalty=10000
\clubpenalty=10000
% Also stop a two-line gap opening before a displayed formula:
\displaywidowpenalty=10000
% Prefer this over sprinkling \newpage through the source.\raggedbottom frente a \flushbottom, y cuál tiene ya
\flushbottom estira el espacio vertical para que todas las páginas terminen a la misma altura; \raggedbottom permite que los pies varíen. Aquí es donde se equivocan muchos consejos publicados: el valor por defecto de un article a una cara es \raggedbottom, no \flushbottom. article.cls, report.cls y book.cls ejecutan al final \if@twoside \else \raggedbottom \fi, así que, si no pidió twoside, está en modo ragged bottom. Solo book, que es twoside por defecto, se queda del lado flush bottom. Pida dos columnas y cada una de esas clases llama explícitamente a \flushbottom.
| Opciones de clase | Qué rige realmente | Aspecto del pie |
|---|---|---|
\documentclass{article} | \raggedbottom | el pie queda a distinta altura en cada página |
\documentclass[twoside]{article} | \flushbottom | los pies se alinean; el interlineado puede estirarse |
\documentclass{book} | \flushbottom | book es twoside por defecto, así que es esto |
\documentclass[twocolumn]{article} | \flushbottom | lo llama la clase explícitamente; las columnas desiguales cantan |
El mecanismo es casi decepcionante de tan simple. En latex.ltx, \raggedbottom se define como \def\@textbottom{\vskip \z@ \@plus.0001fil} y \flushbottom como \let\@textbottom\relax. El primero coloca al pie de la página un pegamento de longitud cero pero elasticidad infinita; ese fil aplasta la escasa elasticidad finita del texto de arriba, de modo que toda la holgura se absorbe abajo. Pida \meaning\@textbottom y article responde macro:->\vskip \z@ \@plus .0001fil, mientras que book responde \relax: una línea en el preámbulo le dice en qué modo está su documento.
% Which bottom mode am I in? Put this in the preamble and read the .log.
\makeatletter
\AtBeginDocument{\typeout{MEASURE textbottom=\meaning\@textbottom}}
\makeatother
% article -> macro:->\vskip \z@ \@plus .0001fil (\raggedbottom)
% book -> \relax (\flushbottom)Cuando los flotantes empujan el texto: \topfraction y \textfraction
Cuando un salto de página parece inexplicable, el culpable suele ser un flotante. Antes de colocar una figura o una tabla, LaTeX comprueba qué parte de la página puede ocupar y cuántas hay ya. Medido en las clases estándar: los flotantes superiores pueden llenar hasta \topfraction = .7 de la altura de texto, los inferiores hasta \bottomfraction = .3, debe quedar al menos \textfraction = .2 de texto real y una página admite como mucho totalnumber = 3 flotantes (topnumber = 2 arriba, bottomnumber = 1 abajo). Una figura que falle una sola de esas comprobaciones no se coloca en esa página sino que se aplaza a otra posterior. Los flotantes aplazados se sitúan antes del texto que los sigue: así acaba la prosa en la página 12 y su figura en la 14.
| Parámetro | Valor por defecto | Significado |
|---|---|---|
\topfraction | .7 | fracción de la altura de texto que pueden ocupar los flotantes superiores |
\bottomfraction | .3 | fracción que pueden ocupar los flotantes inferiores |
\textfraction | .2 | fracción mínima de la página que debe seguir siendo texto |
\floatpagefraction | .5 | llenado mínimo para permitir una página solo de flotantes |
totalnumber | 3 | total de flotantes admitidos en una página |
topnumber | 2 | flotantes admitidos en la parte superior |
bottomnumber | 1 | flotantes admitidos en la parte inferior |
Cuando la culpa es de un flotante, el registro lo dice antes que nadie. Si una figura marcada [h] no cabe ahí, LaTeX anuncia LaTeX Warning: 'h' float specifier changed to 'ht'. y la traslada calladamente arriba. Si se acumulan demasiados flotantes aplazados, se detiene con ! LaTeX Error: Too many unprocessed floats. (el mensaje \@fltovf de latex.ltx). En la práctica los remedios habituales son \FloatBarrier de placeins en los límites de sección, que retiene las figuras dentro de su sección, o \afterpage{\clearpage} del paquete afterpage, que vacía la cola solo cuando la página en curso ya está terminada. Un \clearpage desnudo escrito ahí mismo deja un gran hueco en mitad del texto.
\usepackage{placeins} % \FloatBarrier
\usepackage{afterpage} % \afterpage{\clearpage}
% Keep every figure inside the section that discusses it:
\let\oldsection\section
\renewcommand\section{\FloatBarrier\oldsection}
% Or loosen the rules instead of forcing breaks:
\renewcommand{\topfraction}{0.85}
\renewcommand{\textfraction}{0.1}
\renewcommand{\floatpagefraction}{0.75}Cómo arreglar un mal salto de página: antes de forzarlo
Hay un orden: localizar la causa, corregir después un ajuste global y solo entonces retocar a mano la única página que siga mal. Al revés, una sola frase añadida más arriba destruye todo el trabajo manual. La localización empieza en el .log. Un Underfull \vbox indica que \flushbottom y sus penalizaciones tiran en sentidos opuestos; un mensaje float specifier changed señala a un flotante; una tanda de Overfull \hbox significa que el problema está en el salto de línea, terreno de otra página. Conocida la causa, queda elegir qué mover: una penalización, una fracción de flotante o la longitud del párrafo mismo.
- Leer el
.log. Según aparezcaUnderfull \vbox,float specifier changeduOverfull \hbox, cambia el culpable. - Subir
\widowpenaltyy\clubpenaltyen el preámbulo. Como rige en todo el documento, lo arreglado sigue arreglado. - Si la culpa es de un flotante:
\FloatBarriero un ajuste de\topfraction. Ampliar el especificador a[htbp]también ayuda. - Acortar o alargar el párrafo en una línea. Reformular una sola frase suele ser la corrección más duradera de todas.
\enlargethispage{\baselineskip}hace una línea más alta solo esa página. El trabajo manual empieza aquí y no antes.\newpagey\pagebreakson el último recurso. Una vez insertados, hay que revisar su posición cada vez que cambie el texto.
\looseness es la manera de pedirle a TeX «una línea menos». Escrito dentro de un párrafo, \looseness=-1 significa «compónlo una línea más corto si puedes» y +1, una línea más largo. La medición, sin embargo, es aleccionadora: en un párrafo con \tolerance=9999 y \emergencystretch=3em, \looseness=1 sí estiró seis líneas a siete, al precio de seis avisos Underfull \hbox. Y \looseness=-1, la dirección que todo el mundo quiere en realidad, no cambió el número de líneas, porque dentro de \tolerance no existía ninguna disposición más corta. \looseness es una jugada que vale la pena intentar, no una palanca fiable. Cuando no hace nada, borrar una palabra del original es más rápido.
% Ask for one line fewer inside the paragraph itself.
% \looseness is reset by every \par, so it must sit inside the paragraph.
\tolerance=9999 \emergencystretch=3em
Some paragraph text ... \looseness=-1
% Only after the above has failed: one page, one line taller.
\enlargethispage{\baselineskip}Dónde se tratan \pagebreak, \linebreak y \-
Esta página trata del ritmo a escala de documento; las órdenes de corte individuales pertenecen a otro sitio. Del lado de la página —\pagebreak[n] y \nopagebreak[n] (n de 0 a 4), el \newpage incondicional, \clearpage, que además vacía los flotantes pendientes, y \cleardoublepage, que añade una página en blanco a doble cara— véase el ajuste fino de saltos de página. Del lado de la línea —\\, \newline, \linebreak[n], \nolinebreak[n], el guion discrecional \-, la lista de excepciones \hyphenation{man-u-script} del preámbulo y el paquete hyphenat— véase el ajuste fino de saltos de línea. La estructura del párrafo y \par pertenecen a la página de párrafos. Y Overfull \hbox, \sloppy y \emergencystretch tienen una página de errores propia, donde \sloppy queda medido como nada más que cuatro asignaciones (\tolerance 9999, \emergencystretch 3em, \hfuzz .5\p@, \vfuzz\hfuzz).
Por último, uno de los miembros de esta familia ya se emplea sin decir nada en su favor. Las órdenes de seccionado elevan temporalmente \clubpenalty a 10000 para el párrafo que sigue a un título, de modo que ningún salto de página pueda caer justo después: para eso está la maquinaria \@clubpenalty de latex.ltx. Por eso un título aislado al pie de una página prácticamente nunca ocurre en LaTeX de fábrica. Si ocurre, es porque una macro casera ha sustituido a la orden de seccionado.