Un espacio tecleado en una fuente LaTeX no es un carácter sino una medida. En Computer Modern de 10 puntos, el espacio entre dos palabras vale exactamente 3,33252 pt — y, al medirlos, ~ y \ (barra invertida más espacio) valen lo mismo. En otros lugares, en cambio, ninguno de los espacios tecleados sobrevive: por eso \LaTeX is sale como «LaTeXis». Esta página trata las anchuras medidas de los espacios que LaTeX inserta por su cuenta, los comandos que devuelven un espacio desaparecido, y cómo elegir entre ~, \hspace y \quad cuando se coloca uno a mano.
¿Cuánto mide un espacio de LaTeX, en puntos?
Medido en un article de 10 puntos con Computer Modern T1, el espacio entre palabras vale 3,33252 pt, con 1,66626 pt de estiramiento y 1,11084 pt de encogimiento. Esos tres números pertenecen a la propia fuente; TeX los llama \fontdimen2, \fontdimen3 y \fontdimen4. Un espacio de LaTeX no es, pues, una anchura sino una anchura elástica: lo que TeX llama glue. Las líneas justificadas cuadran precisamente porque esa elasticidad se reparte línea a línea, algo imposible si el espacio fuera un carácter.
Los espacios que uno coloca a mano incluyen, en cambio, varios que no se estiran en absoluto. \, (un espacio fino) mide 1,6663 pt, \enspace 4,99878 pt, \quad 9,99756 pt y \qquad 19,99512 pt. Los cuatro están definidos en em: \quad es exactamente 1 em, \qquad 2 em, \, un sexto de em y \enspace medio em. Como el em sigue al cuerpo de la letra, el mismo \quad crece a 11,74713 pt dentro de \large, mientras que \hspace{10pt} sigue siendo 10 pt se escriba donde se escriba. Medidas en em cuando el hueco debe seguir al texto; longitudes absolutas cuando debe casar con una figura o un filete: en eso se agota la elección.
| Comando | Medido a 10pt | Definición y comportamiento |
|---|---|---|
(ordinary blank) | 3,33252 pt | \fontdimen2; glue, con 1,66626 pt de estiramiento y 1,11084 pt de encogimiento |
\ | 3,33252 pt | espacio de control; anchura entre palabras, pero inmune a la regla de fin de frase |
~ | 3,33252 pt | \ precedido de \nobreak: misma anchura, pero sin salto de línea |
\, | 1,6663 pt | espacio fino de un sexto de em; igual que \thinspace; rígido |
\negthinspace | −1,66631 pt | el inverso de \,; sirve para acercar |
\enspace | 4,99878 pt | medio em; útil alrededor de las etiquetas de lista |
\quad | 9,99756 pt | exactamente 1 em; crece a 11,74713 pt dentro de \large |
\qquad | 19,99512 pt | 2 em; para separar fórmulas o ejemplos |
\hspace | según se indique | \hspace{10pt} vale siempre 10 pt, pero se descarta al principio de línea |
\hspace* | según se indique | la versión que sobrevive al principio de línea; tampoco corta allí |
\LaTeX\ is y \LaTeX{} is no miden lo mismo
Un espacio tecleado justo después de un comando formado solo por letras se consume como señal de que el nombre del comando ha terminado, y ni un punto llega al papel. Medido, \LaTeX is ocupa 32,37791 pt y \LaTeX\ is ocupa 35,71043 pt: una diferencia de exactamente 3,33252 pt, un espacio entre palabras. Es el primer síntoma con el que topa quien busca «LaTeX desaparece el espacio», y pdftotext extrae del PDF realmente un LaTeXis pegado. Teclear más espacios, o doblar la fuente a la línea siguiente, no cambia nada.
Hay tres arreglos, y \LaTeX\ is, \LaTeX{} is y {\LaTeX} is miden todos 35,71043 pt. Pero «los tres son iguales» solo vale bajo una condición. Tras un punto se separan: etc.\ Next mide 39,99023 pt mientras que etc.{} Next mide 41,10107 pt, una diferencia de 1,11084 pt: exactamente el suplemento que se añade al final de frase (\fontdimen7). La razón es que \ es un espacio que nunca recibe ese suplemento, mientras que un blanco ordinario tecleado tras {} se ensancha como espacio de fin de frase. Así que \ no solo devuelve un espacio perdido: también cancela el tratamiento de fin de frase, y por eso es el arreglo para abreviaturas como Fig.\ 5. La heurística del espacio de fin de frase —\sfcode, \@, \frenchspacing— se trata en la página de puntuación.
% widths measured with \sbox0{...}\typeout{\the\wd0}
% pdfLaTeX, TeX Live 2024, 10pt article, T1 Computer Modern
\LaTeX is % 32.37791pt -> "LaTeXis" (the blank is eaten)
\LaTeX\ is % 35.71043pt
\LaTeX{} is % 35.71043pt
{\LaTeX} is % 35.71043pt
% ...but after a period the two fixes are NOT the same:
etc.\ Next % 39.99023pt (control space: no sentence space)
etc.{} Next % 41.10107pt (+1.11084pt = \fontdimen7)Por qué xspace es tan a menudo trampa como solución
El paquete xspace permite terminar los comandos propios con \xspace para que se añada un espacio «salvo que el carácter siguiente sea puntuación», ahorrando teclear \LaTeX{} cada vez. Pero la prueba no es más que una comparación con una lista de excepciones. La de xspace.sty tal como se distribuye en TeX Live 2024 (mantenido por el LaTeX Project, dentro del paquete tools) contiene la coma, el punto, el apóstrofo, la barra, la interrogación, el punto y coma, los dos puntos, la exclamación, la tilde, el guion y el paréntesis de cierre, además de \ , \/, las llaves, \space, \footnote y \footnotemark. Ante cualquier cosa que no esté en esa lista, \xspace inserta un espacio.
El corchete de cierre ] no está en la lista. Así que si se define \newcommand{\eg}{e.g.\xspace} y se escribe [\eg], la salida es [e.g. ]: un espacio justo antes del corchete. Peor aún, como el carácter previo es un punto, el espacio insertado es de anchura de fin de frase; medido 22,2168 pt frente a 17,77344 pt sin \xspace, una diferencia de 4,44336 pt. Lo mismo ocurre ante \eg\% (que da e.g. %), ante \eg\@. y ante una comilla recta. Y el fallo también va en sentido contrario: escribir \eg{} por precaución hace que la llave coincida con una excepción, no se añade espacio alguno y \eg{}x sale como e.g.x.
\usepackage{xspace}
\newcommand{\eg}{e.g.\xspace}
\eg foo % "e.g. foo" correct
\eg, foo % "e.g., foo" correct (comma is an exception)
[\eg] % "[e.g. ]" WRONG -- ] is not an exception
\eg\% % "e.g. %" WRONG
\eg{}x % "e.g.x" WRONG -- the brace matches an exception
% You can patch the list, but every new case needs another patch:
\xspaceaddexceptions{]}Se puede ampliar la lista con \xspaceaddexceptions{]}, pero cada añadido deja contando qué se ha olvidado a continuación. Por eso los autores con experiencia suelen prescindir de \xspace: definen sin más \newcommand{\eg}{e.g.} y escriben \eg{} foo en la llamada, o renuncian a la macro de abreviatura y teclean directamente e.g.. \xspace solo compensa de verdad donde la macro se llama a menudo y se puede garantizar que solo la siguen palabras corrientes: el nombre de un producto o de un proyecto, por ejemplo.
Dónde es obligatorio ~: el espacio que nunca corta
~ es un espacio de la misma anchura que uno entre palabras en el que la línea no puede cortarse. Detrás no hay ninguna clase especial de blanco: la definición en latex.ltx reza \DeclareRobustCommand{\nobreakspace}{\leavevmode\nobreak\ }, un simple \ con \nobreak delante. Medido, x~y da por tanto el mismo hueco de 3,33252 pt que x\ y, y como \ rechaza el suplemento de fin de frase (x.~y mide 16,6626 pt frente a 17,77344 pt de un x. y corriente). Todo lo que se busca bajo «LaTeX tilde salto de línea» se reduce a ese único \nobreak.
El efecto se aprecia mejor en una columna estrecha. Componga «We show in Figure 5 that it holds.» en una parbox de 3 cm y la línea termina en Figure, dejando 5 para abrir la siguiente. Cámbielo a Figure~5 y TeX prefiere partir Fig-ure antes que separar ambos. Así que ~ no solo prohíbe un corte: hace que TeX busque otro reparto de cortes. Los lugares donde es realmente obligatorio son aquellos en que un número, un símbolo o una abreviatura varados al principio de línea dejan de entenderse: Figure~5, Section~2, Eq.~(3), Chapter~12, Dr.~Smith, Knuth~(1984), iniciales como D.~E. Knuth, y un valor con su unidad como 10~kg. En referencias cruzadas y citas, la tilde va delante de \ref y \cite: Figure~\ref{fig:main}, see~\cite{knuth1984}.
% in a 3cm column, the plain space breaks the reference in half:
We show in Figure 5 that it holds. % -> "...in Figure / 5 that..."
We show in Figure~5 that it holds. % -> "...in Fig-/ure 5 that..."
See Section~\ref{sec:method} and Figure~\ref{fig:main}.
As shown by Knuth~\cite{texbook}, a mass of 10~kg suffices.
D.~E. Knuth, Dr.~Smith, Eq.~(3), Chapter~12.Dos advertencias. Primero, ~ solo rechaza el corte de línea; no impide la separación silábica. Es justo lo que ocurrió arriba al partirse Fig-ure, y si hay que mantener la palabra entera se usa \mbox{...}. Segundo, LaTeX hace de ~ un carácter activo, de modo que fuera de verbatim no se puede teclear sin más para obtener una tilde en una URL o una ruta de archivo. Para imprimir el carácter tilde en texto corriente se usa \textasciitilde.
La diferencia entre \hspace y \hspace*
En mitad de una línea ambos se comportan igual. La diferencia aparece cuando la línea se corta justo en ese hueco. TeX descarta el glue que queda inmediatamente tras un corte, así que \hspace{1.5cm} desaparece por completo si el corte cae allí. Medido: componga alpha beta gamma\hspace{1.5cm}epsilon zeta en una columna de 3 cm y TeX corta en el hueco, de modo que los 1,5 cm no aparecen en ninguna parte. Cámbielo a \hspace*{1.5cm} y el corte ya no ocurre allí: se parte epsilon en su lugar y el hueco de 1,5 cm permanece en la página.
En la práctica, elija la forma con asterisco cuando el hueco forme parte de la maqueta: un campo de firma en una portada, un paso fijo antes o después de un título, o una línea donde \hspace colabora con \hfill para empujar elementos a márgenes opuestos. Si solo quiere un poco de aire para la lectura, la forma sin asterisco es la correcta, y que desaparezca al final de línea es una ventaja más que un defecto. Los valores negativos también funcionan: \hspace{-1em} retrae el texto exactamente un eme, medido.
\ignorespaces y \unskip: eliminar el espacio que un entorno deja escapar
\ignorespaces se salta todos los blancos que le siguen, mientras que \unskip retira un elemento de glue ya colocado delante. El primero se come entrada, el segundo recorta salida: memorizado así, nunca se confunden. Medido: a b mide 13,8855 pt y a \unskip b mide 10,55298 pt, exactamente un espacio entre palabras menos. a\ignorespaces b, con dos blancos, también da 10,55298 pt.
Se ganan el sueldo sobre todo alrededor de los entornos que uno define. Defina \newenvironment{note}{\textbf{Note:}}{\textbf{.}} y escriba \begin{note} yes \end{note} tail: los blancos tras \begin{note} y antes de \end{note} llegan ambos a la página, y el conjunto mide 70,92018 pt. Añada \ignorespaces al final del código de apertura y \unskip al principio del de cierre y pasa a medir 63,1443 pt, ni un scaled point de diferencia con escribir \textbf{Note:}yes\textbf{.} tail a mano. El texto extraído del PDF cambia de Note: yes . tail a Note:yes. tail. Poner esas dos palabras en una definición de entorno rinde especialmente en manuscritos colectivos: que uno salte de línea tras \begin y otro no deja de alterar la salida.
% leaks a space on both sides -- measured 70.92018pt
\newenvironment{naive}{\textbf{Note:}}{\textbf{.}}
% tight on both sides -- measured 63.1443pt, identical to hand-set text
\newenvironment{tidy}{\textbf{Note:}\ignorespaces}{\unskip\textbf{.}}
\begin{tidy} yes \end{tidy} tail
% \ignorespacesafterend also swallows the blank AFTER \end{...};
% use it only when the environment must butt against what follows.- Ponga las tildes desde el principio. Escriba
Figure~\ref{...},Section~2,10~kgyDr.~Smithcon la tilde ya puesta; rastrearlas después sale caro. - Recuerde que
\hace dos trabajos: devuelve un espacio perdido y cancela el tratamiento de fin de frase. El segundo es el que hace funcionarFig.\ 5. - Evite
\xspacepor defecto. Si lo usa, compruebe al menos un corchete de cierre, un\%y una comilla antes de entregar. \hspace*para huecos que pertenecen a la maqueta,\hspacepara huecos que solo ayudan a leer. Solo la forma con asterisco sobrevive al principio de línea.- Incorpore
\ignorespacesy\unskipa sus entornos desde el primer día. Puestos al definirlos, no aparece ningún blanco suelto según crece el manuscrito.