Longitudes y espaciado

Escribe «deja 2cm aquí» y LaTeX deja 2cm. Pero en cuanto ese mismo \vspace{2cm} cae al principio de una página, la longitud desaparece sin dejar rastro. No es un error. En LaTeX el espacio no es una cota fija sino goma (glue): algo que se estira, se encoge y se descarta en cuanto deja de hacer falta. Esta página recorre las unidades de longitud (pt, bp, em, ex), los comandos que emiten espacio de verdad (\hspace, \vspace y sus formas con estrella) y las longitudes elásticas siguiendo un solo hilo: por qué pt y bp difieren un 0,375 %, por qué em cambia entre dos fuentes del mismo cuerpo nominal y qué protege la estrella de \hspace*.

pt frente a bp: las unidades de longitud de LaTeX

Una longitud se escribe siempre como número más unidad. Se admiten decimales y valores negativos —12pt, 2.5cm, -3mm—, pero si falta la unidad la compilación se detiene con ! Illegal unit of measure (pt inserted)., el mensaje que producen \hspace{2} o \setlength{\mylen}{5} y uno de los errores más frecuentes de todo LaTeX. Las unidades se reparten en dos familias: las unidades absolutas, cuyo valor es fijo sea cual sea la fuente activa (pt, bp, in, cm, mm, pc), y las unidades relativas a la fuente, que leen su valor de la fuente en uso (em, ex).

La referencia de las unidades absolutas es pt, el punto TeX. Knuth adoptó sin cambios el punto tipográfico angloamericano: 1 inch = 72.27pt. Junto a él, TeX arrastra un segundo punto, bp (big point), definido como exactamente 1/72 de pulgada: la cifra redonda que PostScript, y después PDF, convirtieron en estándar. No son iguales: 1bp = 1.00375pt exactos, de modo que el big point es un 0,375 % mayor y 100bp resultan 100.375pt. Como la propia rejilla de coordenadas de PDF cuenta en 1/72 de pulgada, todos los números de una BoundingBox de EPS o PDF son bp; reescribir \includegraphics[width=100pt] como [width=100bp] altera el tamaño de la imagen justo en ese 0,375 %. Dar las medidas de una figura en milímetros es más seguro sencillamente porque allí la confusión no puede darse.

UnidadQué es / conversiónDónde se usa
ptPunto TeX. 1in = 72.27ptReferencia de toda longitud; también los cuerpos de fuente
bpBig point. 1bp = 1.00375pt (72bp = 1in)Punto de PostScript/PDF; unidad de la BoundingBox
inPulgada. 1in = 72.27ptMedidas de papel estadounidenses
cmCentímetro. 1cm = 28.45274ptLa opción práctica para márgenes y figuras
mmMilímetro. 1mm = 2.84526ptMedidas de detalle
pcPica. 1pc = 12ptUnidad tipográfica tradicional; anchos de columna
ddPunto Didot. 1157dd = 1238pt (≈ 1,07pt)Tradición tipográfica continental
ccCícero. 1cc = 12dd = 12.8401ptEl equivalente del pica en el sistema Didot
spScaled point. 1pt = 65536spEl paso interno de TeX para toda longitud; no se escribe a mano
pxPíxel. Por omisión 1px = 1bp = 1.00375ptSolo en pdfTeX y afines; se fija con \pdfpxdimen
emEl cuadratín que declara la fuente actual (\fontdimen6)Relativo a la fuente; sangrías y espacios horizontales
exAltura de x de la fuente actual (\fontdimen5)Relativo a la fuente; ajustes verticales ligados a las minúsculas
muUnidad matemática. 18mu = 1emSolo en modo matemático; \, es 3mu y \; es 5mu

Hacia el final de la tabla aparece sp, el scaled point: el paso más pequeño con el que TeX guarda las longitudes, con 1pt = 65536sp. Casi nunca se escribe a mano, pero ese paso fija a la vez la precisión de TeX y su techo. Un sp mide unos 5,4 nanómetros, mucho más fino que la longitud de onda de la luz visible (400–700 nm); en el otro extremo, la mayor dimensión que TeX puede almacenar, \maxdimen, es 16383.99998pt, apenas unos 5,76 metros. Ambas cifras salen de una única restricción: una longitud es un número entero de sp y debe quedar por debajo de 2^30. Las unidades del taller tipográfico continental dd (punto Didot, 1157dd = 1238pt) y cc (cícero, 1cc = 12dd) siguen funcionando, pero rara vez asoman en un documento moderno.

em y ex cambian con la fuente

em no es «el tamaño de la fuente». Es el cuadratín (quad) que la fuente activa declara por sí misma, el valor que TeX llama \fontdimen6. Un mismo cuerpo nominal de 10pt da por tanto respuestas distintas: en Computer Modern Roman a 10pt, 1em vale exactamente 10.00002pt, pero en la mecanográfica Computer Modern Typewriter, también a 10pt, 1em pasa a 10.4999pt, y la cursiva da 10.22217pt. La explicación habitual de que «em es el ancho de una M mayúscula» tampoco sobrevive a la medición: en cmr10 una M mide 9.16669pt, menos que 1em. El nombre es una herencia del plomo, donde el cuadratín era un cuadrado del cuerpo; la cifra real la decide la fuente.

ex funciona igual y guarda la altura de x que declara la fuente (\fontdimen5). Computer Modern Roman a 10pt informa 4.30554pt; la de palo seco Computer Modern Sans, también a 10pt, informa 4.44444pt. Elegir entre ambas no es una cuestión de dirección —«em para lo horizontal, ex para lo vertical»— sino de con qué quieres que el espacio vaya acompasado. El blanco que debe seguir el avance del texto toma em; el retoque que debe seguir la altura de las minúsculas toma ex. El modo matemático añade una tercera, mu (math unit), con 18mu = 1em. \quad es literalmente \hskip1em y \qquad el doble, 2em; el espacio fino \, vale 3mu en fórmula y un kern de 0.16667em (un sexto de cuadratín) en el texto. El ancho \; vale 5mu, y el medio \:4mu— solo está disponible tras cargar amsmath.

latex
% absolute units: the same length whatever font is active
\hspace{12pt}  \hspace{2.5cm}  \hspace{-3mm}  \hspace{100bp}

% font-relative units: the font decides the value
\hspace{1em}   \vspace{2ex}

% proof that em follows the font, not the point size
\rmfamily \the\dimexpr 1em\relax   % 10.00002pt at 10pt
\ttfamily \the\dimexpr 1em\relax   % 10.4999pt  at 10pt

Longitudes elásticas: qué hacen de verdad plus y minus

plus concede margen para estirar y minus margen para encoger. Una longitud inmóvil como 12pt es una longitud rígida; una con holgura, como 1cm plus 2mm minus 1mm, es una longitud elástica, y se lee «1cm normalmente, hasta 1,2cm si hace falta, hasta 0,9cm si se aprieta». Para TeX esto no es una función aparte: dentro de una línea, de un párrafo o de una página, casi todo el blanco es goma estirable. Que las líneas lleguen exactamente a ambos márgenes se debe solo a que los espacios entre palabras son elásticos. Al revés: alinear una serie de \vspace{12pt} rígidos es quitarle a TeX el margen de negociación que necesitaba.

latex
% rigid: exactly 1cm, always
\vspace{1cm}

% rubber: 1cm normally, up to 1.2cm, down to 0.9cm
\vspace{1cm plus 2mm minus 1mm}

% infinite stretch: 0pt at rest, grows without limit
\vspace{\fill}

El \fill de LaTeX es un registro de tipo skip que contiene 0pt plus 1fill: cero en reposo y infinitamente estirable. Como el estiramiento infinito siempre gana al finito, basta un \fill en una línea o una columna para que toda la goma finita de alrededor deje de estirarse por completo. TeX gradúa el infinito en tres escalones, fil < fill < filll: \hfil lleva plus 1fil y \hfill lleva plus 1fill, de modo que si ambos aparecen en una línea, \hfill se queda con todo el sobrante. Para repartir según una proporción se usa \stretch{n}, es decir 0pt plus n fill: \hspace{\stretch{2}} frente a \hspace{\stretch{1}} divide el resto 2:1, mientras que dos \fill de igual fuerza lo dividen por partes iguales.

¿Sirve de algo esa elasticidad en vertical? A veces. Bajo \flushbottom, que iguala todas las páginas a la misma profundidad, TeX estira la goma flexible que ya hay en la página —el \parskip entre párrafos (0pt plus 1pt por omisión), los blancos alrededor de los títulos, algún \bigskip suelto— hasta que la columna alcanza exactamente la altura de la caja de texto. Bajo \raggedbottom no ocurre, y el motivo cabe en una sola línea del núcleo de LaTeX: \raggedbottom añade una única goma al pie del texto, \vskip 0pt plus.0001fil. Ese hilo de estiramiento infinito supera a todos los plus finitos de la página y se traga el sobrante entero; la goma del texto conserva su longitud natural y lo que resta se amontona abajo. Las clases estándar deciden luego por ti: article, report y book invocan \raggedbottom para un documento de una cara y \flushbottom para twoside y twocolumn. Como article viene con oneside, allí los plus y minus que escribiste en un \vspace apenas se emplean para ajustar la página: declara \flushbottom si quieres que cuenten.

\hspace frente a \hspace*, más \hfill y \dotfill

\hspace{longitud} es lo que pone espacio horizontal dentro de una línea: \hspace{2cm} da 2cm, siempre que ese espacio no caiga en el borde de una línea. Cada vez que TeX corta un párrafo en líneas descarta la goma adyacente a cada corte, para que no quede blanco colgando más allá del margen derecho ni ninguna línea empiece inexplicablemente sangrada. La forma con estrella \hspace*{longitud} lo esquiva. Su definición se reduce a colocar una \vrule de anchura cero y un \nobreak delante del espacio: un filete es una caja, no goma, así que no puede descartarse, y el espacio que va detrás ya no es vecino del punto de corte. Es justo lo que hace falta cuando una primera línea debe llevar una sangría forzada.

\hfill es lo mismo que \hspace{\fill}: separa lo que tiene a ambos lados tanto como la línea permita, la manera habitual de poner una palabra a bandera izquierda y otra a bandera derecha. También es goma, así que se descarta en el borde de línea; escribe \hspace*{\fill} cuando deba sobrevivir. Cuando el hueco debe quedar relleno y no en blanco, \hrulefill traza un filete y \dotfill siembra puntos; ambos son un \hfill que TeX rellena mediante el mecanismo de leaders (\leaders y \cleaders). La guía entre una entrada del índice y su número de página es eso, igual que la raya bajo un campo de formulario. Para huecos pequeños y fijos, los \quad (1em), \qquad (2em) y \, relativos a la fuente conservan su equilibrio visual al cambiar el cuerpo; un 6pt escrito a mano, no.

latex
Name:\hspace{2cm}Date:\par
\noindent Chapter 1\quad Introduction\dotfill 1\par
\noindent left\hfill centre\hfill right\par
\noindent Signature:\hrulefill\par
% 2:1 split of the leftover space
\noindent A\hspace{\stretch{2}}B\hspace{\stretch{1}}C\par
% survives even at the start of a line
\noindent\hspace*{2cm}forced indent

Por qué \vspace desaparece en un salto de página

Porque la misma regla vale en vertical. TeX descarta la goma contigua a un corte caiga donde caiga, de modo que un \vspace{3cm} que aterriza al principio de una página desaparece por completo; medido directamente, un \vspace{3cm} colocado justo después de un \newpage no aporta absolutamente nada. Eso suele estar detrás de «el espacio funciona en todas partes menos aquí». La intención coincide con la de \hspace: que no quede una franja blanca inexplicable en la cabeza de la página. La forma con estrella \vspace*{longitud} lo esquiva con el mismo truco: una \hrule de altura cero y un \nobreak justo antes del espacio. Recurre a \vspace* siempre que el espacio deba sobrevivir caiga donde caiga el corte, como el blanco fijo sobre la apertura de un capítulo.

Para los blancos verticales de todos los días hay tres tamaños ya preparados: \smallskip, \medskip y \bigskip, cuyos valores estándar son 3pt plus 1pt minus 1pt, 6pt plus 2pt minus 2pt y 12pt plus 4pt minus 4pt. En un documento de 10pt, \baselineskip vale 12pt, así que un \bigskip equivale más o menos a una línea. Los tres son longitudes elásticas y ceden un poco según la página. Y aquí muerde el párrafo anterior: cada uno está definido como un \vspace sin estrella (\vspace\smallskipamount, etc.), de modo que en un límite de página se descartan con la misma crudeza que cualquier otra goma. Por eso el blanco que pusiste encima de un título se evapora en cuanto ese título cae al principio de una página; si debe quedarse, escribe \vspace*{\bigskipamount}. El \fill vertical se llama \vfill (\vspace{\fill}) y sirve para centrar verticalmente una página de una sola línea o para empujar un bloque de firma hasta el pie.

ComandoEspacio que inserta¿Se descarta en un corte?
\hspace{len}Goma horizontal del ancho indicadoSí, en el borde de línea
\hspace*{len}El mismo ancho, precedido de una \vrule de ancho ceroNo
\hfillIgual que \hspace{\fill}: 0pt plus 1fill
\hfil0pt plus 1fil; un orden más débil que \hfill
\stretch{n}0pt plus n fill; reparte el espacio por proporción
\hrulefillUn \hfill que rellena el hueco con un filete
\dotfillUn \hfill que rellena el hueco con puntos; guías del índice
\quad\hskip1em; hueco fijo acompasado a la fuente
\qquad\hskip2em; el doble de \quad
\,Espacio fino: 3mu en fórmula, 0.16667em en textoNo, en texto es un kern
\vspace{len}Goma vertical de la altura indicadaSí, en un salto de página
\vspace*{len}La misma altura, precedida de una \hrule de altura ceroNo
\vfillIgual que \vspace{\fill}; separa verticalmente lo que resta
\smallskipUn \vspace de 3pt plus 1pt minus 1pt
\medskipUn \vspace de 6pt plus 2pt minus 2pt
\bigskipUn \vspace de 12pt plus 4pt minus 4pt; una línea aprox. en 10pt

\newlength, \setlength, \addtolength: longitudes como variables

Si la misma longitud reaparece por todo un documento, declarar un solo registro de longitud y referirse a él por su nombre resulta mucho más fácil de mantener. \newlength{\mylen} declara una longitud nueva, \setlength{\mylen}{2em} le da valor y \addtolength{\mylen}{-1pt} lo ajusta; cambia el valor en un sitio y todos los usos lo siguen. La declaración ocurre una sola vez: repetir \newlength con el mismo nombre produce ! LaTeX Error: Command \mylen already defined. Para medir algo realmente compuesto, \settowidth{\mylen}{Total:} (junto con \settoheight y \settodepth) guarda el ancho que ese texto ocupa de verdad. Y \the\mylen imprime el valor actual en el PDF cuando quieras comprobarlo.

Las longitudes ya existentes entran directamente en los cálculos: \textwidth (ancho del bloque de texto), \linewidth (ancho de la línea que se está componiendo ahora mismo, más estrecha que \textwidth dentro de un minipage o de una lista), \baselineskip (interlineado), \parindent (sangría) y \parskip (blanco entre párrafos, 0pt plus 1pt por omisión). Anteponer un factor las escala —0.8\textwidth— y eso funciona sin paquete alguno. Aquí acecha, sin embargo, una trampa más peligrosa justamente porque no produce ningún error. Sin el paquete calc, \setlength{\mylen}{\textwidth - 2em} no provoca la menor queja. Y lo que ocurre no es una resta: \mylen recibe \textwidth tal cual (345.0pt en un article por omisión) y el resto, - 2em, se compone en el documento como texto. Te enteras cuando la cadena «- 2em» asoma en el PDF. Con \usepackage{calc}, la misma línea da correctamente 324.99997pt, y expresiones con paréntesis como (\textwidth - 2em)/2 pasan a ser posibles.

document.tex
\usepackage{calc}   % needed for + - * / inside \setlength
% ...
\newlength{\gutter}
\setlength{\gutter}{2em}
\addtolength{\gutter}{-1pt}

\newlength{\halfcol}
\setlength{\halfcol}{(\textwidth - \gutter) / 2}

\newlength{\labelw}
\settowidth{\labelw}{Total:}   % width of that text once typeset

\the\halfcol                   % prints the value, e.g. 162.49998pt
\noindent\hspace*{0.8\textwidth}right-aligned heading

En la práctica, tres hábitos cubren casi todo. Los valores fijos escritos a mano son el último recurso: en cuanto pones 8cm, la proporción se rompe al primer cambio de formato de papel o de márgenes, mientras que una expresión apoyada en una longitud existente —0.8\textwidth, 2\baselineskip— sobrevive al cambio. Prefiere los \smallskip, \medskip y \bigskip ya preparados a un \vspace{12pt} crudo, y todo el documento respirará de manera uniforme. Y pon estrella solo al espacio que de verdad deba sobrevivir a un corte, porque un espacio sin estrella es un espacio que TeX tiene permiso para tirar. Con esas tres reglas, el misterioso «solo aquí falta el blanco» deja prácticamente de aparecer.