Overfull / Underfull \hbox

Overfull \hbox es una advertencia, no un error. La compilación de LaTeX llega hasta el final, el PDF existe: sencillamente, una de sus líneas se sale por el margen derecho. Lo primero que hay que hacer, por tanto, no es mirar fijamente el log sino abrir el PDF y observar esa línea. A partir de ahí, esta página recorre qué mide el número de (71.93637pt too wide), en qué se diferencia in paragraph at lines 4--9 de detected at line 3, cuál de \hbadness, \tolerance y \emergencystretch conviene tocar, y por qué arreglar una caja desbordada y callar la advertencia son dos operaciones completamente distintas. Su imagen invertida, Underfull \hbox, y el Overfull \vbox vertical también son competencia de esta página.

Qué mide el número de (71.93637pt too wide)

En cuánto superó esa línea a \hsize, el ancho de columna, medido en puntos. Un punto equivale a unos 0,35 mm: medio punto es invisible a simple vista, setenta puntos son un ancho de pulgar sobresaliendo de la página. Ese único número fija la prioridad: unos pocos puntos no los nota nadie, razón por la cual LaTeX calla por debajo de 0,1 pt de forma predeterminada (\hfuzz=0.1pt). TeX compone en cajas, y la caja que sostiene los caracteres de una línea uno junto a otro es una caja horizontal, una \hbox. Overfull \hbox significa que, al partir el párrafo en líneas, el contenido de una caja resultó más ancho que la columna y no se pudo comprimir más. El motivo es casi siempre el mismo: no había ningún sitio donde cortar en esa línea.

La segunda mitad de la advertencia —algo como in paragraph at lines 4--9— indica dónde ocurrió. Hay cuatro formulaciones y la que aparezca cambia el lugar donde buscar, así que use la tabla siguiente para situar la suya. Cada una se reprodujo aquí con un archivo mínimo bajo pdfLaTeX de TeX Live 2024. La más incómoda es has occurred while \output is active, es decir, «mientras se montaba la página»: el material culpable puede no corresponder a ninguna línea que usted haya escrito. También existe la trampa contraria: un simple \mbox{...} o \makebox[2cm]{...} no emite ningún aviso, por mucho que su contenido sobresalga. El \hss con el que se rellenan puede encogerse sin límite, de modo que para TeX la caja siempre encaja exactamente, y los caracteres cruzan el margen sin dejar rastro en el log.

FormulaciónSignificadoDónde mirar
in paragraph at lines A--Bocurrió al partir un párrafo corrienteel párrafo de las líneas A a B; con diferencia el más común
detected at line Nocurrió en una caja explícita de ancho fijo, no en un párrafoun \hbox to, un \makebox[…][s], una caja construida por un paquete: en la línea N
in alignment at lines A--Bocurrió dentro de la alineación de una tablauna tabla con ancho fijado como tabular* o tabularx
while \output is activeocurrió mientras se montaba la páginaencabezados, pies, notas al pie, flotantes; el número de línea no es fiable

El log le enseña la línea culpable, con sus puntos de división

Justo debajo de la advertencia, TeX imprime el contenido de la línea que se sale, con un - en cada punto de división que encontró. Ahí está el núcleo del diagnóstico. Abajo hay un log real de verter texto inglés en una columna de 4 cm: Wis-senschaft-skol-leg lleva divisiones y electroencephalography- ninguna. TeX excluye de la división automática toda palabra que contenga un guion explícito (la exploración se detiene en ese guion). Esa línea, por tanto, no tiene realmente dónde cortarse, y subir \tolerance no servirá de nada. Leer los guiones del log dice de un vistazo si la división se está intentando o si se ha abandonado, y una línea sin un solo guion hace sospechar mucho de un ajuste de idioma equivocado.

log
Overfull \hbox (13.35585pt too wide) in paragraph at lines 4--9
\OT1/cmr/m/n/10 The Wis-senschaft-skol-leg pub-
 []

Overfull \hbox (80.27266pt too wide) in paragraph at lines 4--9
\OT1/cmr/m/n/10 li-ca-tion de-scribes an electroencephalography-
 []

Para ver el punto conflictivo en la página, añada la opción de clase draft. article.cls contiene \DeclareOption{draft}{\setlength\overfullrule{5pt}}, que coloca un filete negro de 5 pt en el margen junto a cada línea desbordada. Si esas barras no aparecen normalmente es porque latex.ltx ejecuta al final \overfullrule 0pt, anulando el valor 5 pt de INITEX. Las barras solo están apagadas y pueden encenderse cuando se quiera: si prefiere no tocar las opciones de clase, \overfullrule=5pt en el preámbulo hace lo mismo; recuerde quitarlo antes de entregar.

Por qué las columnas estrechas, las tablas y el código producen más overfull

Porque cuanto más estrecha es la columna, más fatal resulta la longitud relativa de una palabra indivisible. En una columna de 10 cm, una palabra de 3 cm ocupa un tercio de la línea; en una de 4 cm es más larga que la línea y ninguna elección de corte la mantendrá dentro. Cuando el mismo original pasa de un puñado de avisos a decenas en cuanto se cambia a dos columnas, no es que la prosa haya empeorado: la justificación se ha reducido a la mitad. Los lugares siguientes concentran las cajas desbordadas; si alguno le suena, empiece por ahí. Reconocer la columna como causa cambia el remedio: revisar el ancho de una columna p{} suele ser más rápido que esparcir \sloppy por los párrafos.

  • Composición a dos columnas (\documentclass[twocolumn], multicol). La justificación se reduce aproximadamente a la mitad y palabras que iban bien a una columna se desbordan todas a la vez.
  • Columnas de tabla p{}, m{} y b{}, y tabularx. Los anchos de columna son cifras elegidas por el autor y suelen quedarse cortos para su contenido.
  • Entornos literales (verbatim, \verb, listings). Los espacios y los finales de línea se reproducen tal cual: TeX no tiene ninguna libertad para cortar.
  • URL, DOI, rutas de archivo, referencias de pieza, nombres químicos, nombres de genes. Una cadena larga sin espacios cuenta como una sola palabra.
  • Fórmulas en línea. Por defecto una fórmula solo puede cortarse tras un operador binario o una relación, y en absoluto dentro de construcciones como \frac.
  • Notas al pie y leyendas de flotantes. A veces se componen con una justificación más estrecha que el texto y se informan con facilidad en la forma \output is active.

Eliminar una overfull hbox, empezando por la mejor solución

Reformular una expresión es la mejor corrección. Es una respuesta poco lucida, pero es la única que ningún programa puede dar por usted, y suele costar cinco segundos: cambiar una palabra larga por un sinónimo corto, reordenar una oración, llevar una referencia interminable a una nota al pie, y la caja encaja. Este primer puesto no es arbitrario: TeX corta las líneas considerando el párrafo entero de una vez, según el algoritmo que Knuth y Michael Plass publicaron en 1981 en Breaking Paragraphs into Lines. Cambiar la última palabra de un párrafo puede, por tanto, alterar el corte de la primera línea. Al revés: una sola palabra movida por el autor amplía enormemente el margen de maniobra de la composición. Los remedios siguientes van ordenados por efecto frente a efecto secundario.

  • Reformular. Suele bastar una palabra y no tiene efecto secundario alguno. Las referencias y nombres de producto interminables van en una nota al pie o en una tabla.
  • Comprobar el idioma. Un texto alemán o francés con patrones de división ingleses no encuentra dónde cortar. Con babel: \usepackage[ngerman]{babel}; bajo XeLaTeX o LuaLaTeX: \setmainlanguage{german} de polyglossia.
  • Hacer divisible esa palabra concreta. \- dentro de una palabra marca un guion discrecional; \hyphenation{Wis-sen-schafts-kol-leg} registra una excepción en el preámbulo. En un compuesto que ya lleva un guion explícito, un \hspace{0pt} tras el guion devuelve una oportunidad de corte.
  • \sloppy o el entorno sloppypar. Afloja el espaciado del párrafo. sloppypar es la variante más segura porque se cierra en \end.
  • Subir \emergencystretch. En la medición hecha aquí, \emergencystretch=3em por sí solo pasó de cinco cajas desbordadas a cero, a cambio de siete cajas demasiado flojas. El efecto secundario, un espaciado suelto, se nota mucho menos que un texto colgando fuera de la página.
  • Cargar microtype. Su protrusión sutil y su expansión de fuente redujeron el desbordamiento de 13,4 pt a 8,9 pt y de 80,3 pt a 74,9 pt en la misma prueba. Es decir: reduce, no elimina.
  • Como último recurso, \linebreak o \mbox. Cortar a mano. Cualquier retoque posterior de la frase desplaza el corte, así que resérvelo para la revisión final antes de entregar.

Qué hace cada uno: \tolerance, \emergencystretch, \hbadness y \hfuzz

Los dos primeros cambian la composición; los dos últimos solo cambian lo que se informa. Confundirlos lleva a «arreglar» un problema que solo se ha ocultado: suba \hfuzz y los avisos de desbordamiento desaparecen, pero ni un carácter se mueve en la página. TeX corta un párrafo en hasta tres pasadas: primero dentro de \pretolerance y sin división de palabras, luego dentro de \tolerance con división, y si aun así falla, una tercera pasada en la que cada línea recibe \emergencystretch de elasticidad adicional. Ahí, y solo ahí, actúa \emergencystretch: la última carta, jugada cuando nada más funcionó. Los valores por defecto de LaTeX están en latex.ltx: \tolerance=200, \hbadness=1000 y \hfuzz=0.1pt. El muy usado \sloppy vive en el mismo archivo y se reduce a cuatro asignaciones: \tolerance 9999, \emergencystretch 3em, \hfuzz .5pt, \vfuzz\hfuzz. \sloppy, por tanto, no se limita a «subir la tolerancia»: también fija \emergencystretch, y en la prueba anterior \emergencystretch=3em por sí solo dio un resultado idéntico al de \sloppy.

ParámetroValor por defecto en LaTeXQué hace
\tolerance200la peor maldad admisible en una línea; subirla cambia la composición
\emergencystretch0ptelasticidad extra añadida solo en la tercera pasada; cambia la composición
\hbadness1000solo las líneas peores que esto se informan como underfull. La salida no cambia
\hfuzz0.1ptun desbordamiento hasta este valor no se informa. La salida no cambia
\overfullrule0ptancho del filete negro junto a una línea desbordada; draft lo pone en 5pt
preamble
% changes the typesetting -- use these to actually fix boxes
\emergencystretch=3em     % last-resort stretch on the third pass
\usepackage{microtype}    % protrusion and font expansion

% changes only the log -- the page looks exactly the same
\hbadness=10000           % never report Underfull \hbox
\hfuzz=1pt                % ignore overhangs below 1pt

Cuando una URL larga o una cadena de código se niega a partirse

Envolverla en \url{} a menudo no basta. Medido en una columna de 5 cm, una URL larga como texto pelado se salía 79,0 pt; puesta en el \url{} del paquete url seguían quedando dos cajas, de 42,4 pt y 10,8 pt. \url{} solo corta tras caracteres como / y ., así que no puede cortar dentro de un nombre de host ni de un segmento de ruta largo. Dos cosas sí funcionan. Añadir \sloppy dejó el recuento de cajas desbordadas en cero, a cambio de cajas demasiado flojas: el espaciado suelto que siempre acompaña a \sloppy es el precio. Mejor todavía: \usepackage{xurl} dio cero cajas desbordadas y cero demasiado flojas, porque xurl permite cortar en cualquier posición dentro de una URL. hyperref carga url internamente, de modo que corta igual, y su opción breaklinks es la que permite partir el enlace en sí. Para listados de código, el interruptor equivalente es breaklines=true en listings.

preamble
\usepackage{hyperref}   % loads url internally; add breaklinks for split links
\usepackage{xurl}       % allows a break at any point inside a URL
...
\url{https://example.org/proceedings/vol12/paper-0037.pdf}

Underfull \hbox (badness N) es el síntoma contrario

Una línea salió demasiado corta y TeX estiró los espacios entre palabras para rellenarla: eso es Underfull \hbox. Es el menos urgente de los dos casos, y la cifra de badness dice cuán grave es. La badness va de 0 (perfecto) a 10000 (el techo: «no puede ir a peor»). Valores intermedios como 1590, 2050 o 7667 aparecen a menudo, pero una tanda de badness 10000 significa blancos visiblemente abiertos: vaya a mirar el PDF. La causa habitual es un efecto secundario de perseguir cajas desbordadas: \sloppy o \emergencystretch convierte overfull en underfull (cinco cajas a cero en la prueba anterior, con siete underfull en su lugar). La otra causa es una línea corta forzada en mitad del párrafo con \linebreak o \\. \linebreak significa «corta aquí pero rellena igualmente la justificación», de ahí el estiramiento; \newline y \\ significan «la línea termina aquí» y no estiran nada. Para una línea deliberadamente corta, use \\. Si solo quiere callar el mensaje, \hbadness=10000 lo consigue, sin alterar nada en la página.

Overfull \vbox (… too high) y Underfull \vbox

La misma historia ocurre en vertical, con la altura en lugar del ancho. Overfull \vbox (56.90552pt too high) significa que el contenido no cupo en una caja vertical de altura fija. En las pruebas, una caja explícita como \vbox to 1cm{\hrule height 3cm} lo informa en la forma detected at line 3. La que se encuentra en documentos reales procede del montaje de la página: una figura o un \rule más alto que \textheight produjo Overfull \vbox (85.35828pt too high) has occurred while \output is active. Ante esa forma, el primer sospechoso es una ilustración demasiado grande para caber en una página. Underfull \vbox (badness 10000) es lo contrario: el pegamento vertical se estiró para rellenar la altura. Bajo \flushbottom, valor por defecto de la clase book, el pie de cada página se alinea estirando espacios verticales, así que las páginas poco llenas lo provocan con facilidad. Si no le importa, cambie a \raggedbottom, o suba los umbrales de aviso con \vbadness y \vfuzz; también aquí, subir un umbral no cambia nada en la página. Cuando una figura de verdad no cabe, \enlargethispage puede alargar la mancha de texto solo en esa página.