Trucos matemáticos

Casi todas las herramientas para afinar las matemáticas en LaTeX nacen de una misma idea: separar el aspecto de las dimensiones que ocupa un elemento: su altura, su profundidad y su anchura. \smash hace que algo alto cuente como de altura cero, \vphantom reserva altura sin imprimir nada, y \rlap imprime un carácter con anchura cero. Por eso síntomas como «solo la línea que lleva un radical tiene más interlineado», «dos \sqrt contiguos no coinciden por arriba» o «una condición bajo un sumatorio ensancha la fórmula» ceden todos ante el mismo modo de pensar. Esta página se organiza por síntoma y presenta \smash, \phantom, \mathstrut, \rlap, \raisebox y la diferencia entre \mathrm y \operatorname, con cifras medidas.

Encontrar la herramienta por el síntoma

Primero, el índice. Todos son herramientas para arreglar el resultado impreso en el último momento, y ninguna cambia lo que significa una fórmula. Por eso el orden correcto es escribir primero las matemáticas con sencillez y aplicar esto solo donde aparezca de verdad un defecto visible. Sembrar \smash y \phantom por precaución sale mal en cuanto se cambia la fuente o la anchura del texto. El comando de la primera columna es también el término de búsqueda: parta del síntoma y lea a lo ancho.

ComandoSíntoma que corrigeProcedencia
\smashun elemento alto separa justo esa línea de sus vecinasnúcleo de LaTeX ([t] / [b] de amsmath)
\vphantomradicales o filas contiguos no llegan a la misma alturaplain TeX, utilizable tal cual en LaTeX
\mathstrutlo mismo sin argumento: reserva la altura de un paréntesisplain TeX; su definición es literalmente \vphantom(
\phantomquiere alinear columnas entre líneas pero los lados izquierdos difierenplain TeX; solo para la anchura, \hphantom
\mathclapuna condición larga bajo un sumatorio o producto ensancha toda la fórmulamathtools (\mathllap / \mathrlap van en el mismo lote)
\rlapimprimir algo sin que cuente para la anchuraplain TeX; \llap sobresale a la izquierda
\oversetponer un símbolo cualquiera justo encima de un =amsmath (\underset para debajo)
\operatornameun operador propio de varias letras no recibe espaciadoamsmath; \operatorname* pone los límites debajo
\raiseboxun solo elemento debe subir o bajar una cantidad fijanúcleo de LaTeX; también puede redefinir altura y profundidad
\!los símbolos quedan demasiado separados, como en la integral doble \int\intplain TeX; el inverso exacto de \,, es decir −3 mu

Solo la línea con un radical tiene más interlineado: \smash

\smash{...} hace que TeX trate su contenido como una caja de altura cero y profundidad cero. La tinta se sigue imprimiendo, pero como TeX no ve dimensión vertical, deja de decidir que hay que ensanchar el interlineado. Medido, $\sqrt{1-x^2}$ tiene 9,13329 pt de alto, 1,26668 pt de profundidad y 35,75691 pt de ancho. Envuelto en \smash pasa a 0,0 pt de alto y 0,0 pt de profundidad, con la anchura todavía en 35,75691 pt. Las cifras muestran con claridad que solo se anula lo vertical y que lo horizontal queda intacto.

latex
% the radical inside the fraction pushes this line away from the one above
$y = \frac{1}{\sqrt{1 - x^2}}$

% zero its vertical size, and the leading returns to normal
$y = \frac{1}{\smash{\sqrt{1 - x^2}}}$

Con amsmath cargado, \smash gana un argumento opcional que permite tratar por separado arriba y abajo. \smash[t]{...} anula solo la altura y deja la profundidad; \smash[b]{...} anula solo la profundidad y deja la altura. Medido, \smash[t]{\sqrt{1-x^2}} dio 0,0 pt de alto y 1,26668 pt de profundidad, y \smash[b]{\sqrt{1-x^2}} dio 9,13329 pt de alto y 0,0 pt de profundidad: exactamente el lado pedido y nada más. Ese [t] / [b] no está en el \smash del núcleo de LaTeX; amsmath sobrescribe el comando para añadirlo (el \smash escueto, sin argumento, se remonta a plain TeX y también está en el núcleo de LaTeX).

latex
% the descender of y drops the middle radical below the other two
$\sqrt{x} + \sqrt{y} + \sqrt{z}$

% smash away only the depth of y, and all three line up
$\sqrt{x} + \sqrt{\smash[b]{y}} + \sqrt{z}$

El ejemplo que da la propia amsmath muestra la diferencia con nitidez. En \sqrt{x} + \sqrt{y} + \sqrt{z}, el rasgo descendente de la y hace que el radical central cuelgue algo más bajo que los otros. En cifras, $\sqrt{y}$ mide 7,0305 pt de alto y 3,36946 pt de profundidad, mientras que $\sqrt{x}$ mide 8,00272 pt de alto y 2,39725 pt de profundidad. Pero mida $\sqrt{\smash[b]{y}}$ y obtendrá 8,00272 pt de alto y 2,39725 pt de profundidad: idéntico a $\sqrt{x}$ hasta el último decimal. Quitar solo la profundidad devolvió al radical exactamente las dimensiones que tiene sobre una x.

Dos advertencias. Primera: solo desaparecen las dimensiones, la tinta se queda, así que un elemento aplastado puede chocar con la línea de arriba. En texto corrido con interlineado apretado, mire siempre el resultado. Segunda: escritos antiguos indican anteponer \leavevmode a \smash al principio de un párrafo; eso ya no hace falta en el núcleo actual de LaTeX. \finsm@sh en latex.ltx termina con \leavevmode@ifvmode\box\z@ y gestiona el modo vertical por su cuenta. Usar \smash al inicio de un párrafo no produjo ningún error.

Radicales contiguos no coinciden por arriba: \vphantom y \mathstrut

Si \smash baja lo alto, \vphantom es la operación inversa: sube lo bajo. \vphantom{...} crea una caja con la misma altura y profundidad que su argumento pero de anchura cero y sin imprimir nada. Medido, $\vphantom{a^2}$ mide 8,14003 pt de alto y 0,0 pt de ancho. Su contrapartida $\hphantom{a^2}$ mide 0,0 pt de alto y 9,77202 pt de ancho, y $\phantom{a^2}$, que tiene ambas, mide 8,14003 pt de alto y 9,77202 pt de ancho. El juego queda limpiamente completo: solo vertical, solo horizontal y ambas. Meta en el elemento más bajo un \vphantom del contenido más alto y las alturas coinciden sin que se vea nada.

latex
% level the tops of several radicals with one strut each
$\sqrt{\mathstrut a}\;\sqrt{\mathstrut a^2}\;\sqrt{\mathstrut b}$

% or match a specific height by passing the taller content
$\sqrt{a} \;\sqrt{\vphantom{a^2}\,a}$

Cuando escribir cada vez el contenido de referencia se hace pesado, existe un atajo sin argumento: \mathstrut. Su definición en plain TeX dice: \def\mathstrut{\vphantom(}. No es más que un paréntesis de apertura invisible. En matemáticas un paréntesis es cómodamente alto y sigue el tamaño de la fuente, lo que lo convierte en buena vara para igualar alturas. Las mediciones concuerdan. $($ mide 7,5 pt de alto y 2,5 pt de profundidad. $a$ mide 4,30554 pt de alto y 0,0 pt de profundidad, pero $\mathstrut a$ pasa a 7,5 pt de alto y 2,5 pt de profundidad —exactamente las dimensiones del paréntesis— mientras la anchura se mantiene en 5,28589 pt. Ponga uno al principio de cada elemento y todos se nivelan a la altura de un paréntesis.

Alinear los = en align: \phantom y \MoveEqLeft

Pase a \phantom la propia expresión con la que alinea. Al desarrollar una cadena de transformaciones, uno quiere que desde la segunda línea se omita el miembro izquierdo y se empiece en el =; pero empujar con espacios normales se rompe en cuanto cambia la fuente o la fórmula. Escriba \phantom{f(x)} y obtendrá un blanco exactamente tan ancho como un f(x) realmente compuesto, de modo que los = se alinean solos. A diferencia de una hilera de \quad contada a mano, la anchura del blanco cambia con su contenido.

latex
\begin{align*}
  f(x)           &= x^2 + 2x + 1 \\
  \phantom{f(x)} &= (x + 1)^2
\end{align*}

% mathtools: when the first line is too long to keep on one row
\begin{align*}
  \MoveEqLeft f(x, y, z) = a + b \\
              &= c + d
\end{align*}

A la inversa, cuando el miembro izquierdo de la primera línea es demasiado largo para caber antes del =, ayuda el \MoveEqLeft de mathtools. Empuja la primera línea a la izquierda del punto de alineación y prepara la columna para que las siguientes caigan de forma natural debajo. Puesto al principio del renglón, evita contar los & a mano. La mecánica general de \phantom y \hphantom, y el espaciado matemático en conjunto, se tratan en detalle en la página «Índices y espaciado».

Colocar sin ocupar anchura: \rlap, \llap, \mathclap

Este grupo es la contrapartida horizontal de \smash. \rlap{...} imprime su contenido dando a la caja anchura cero, de modo que el material sobresale hacia la derecha. La definición en plain TeX ocupa una sola línea —\def\rlap#1{\hbox to\z@{#1\hss}}—, es decir «hacer una caja de anchura cero y dejar que una goma infinitamente extensible empuje el sobrante hacia la derecha», y nada más. Medido, \rlap{XX} mide 0,0 pt de ancho, mientras que un XX a secas mide 15,00003 pt. \llap, que sobresale a la izquierda, solo pone el \hss delante. Se usan para notas que se salen de una columna de tabla y para empujar números de línea fuera de la caja de texto.

Para hacer lo mismo dentro de las matemáticas, se usan \mathclap (sobresale simétricamente), \mathllap (a la izquierda) y \mathrlap (a la derecha), de mathtools. El caso clásico es una condición larga bajo un sumatorio: envuélvala como \sum_{\mathclap{1 \le i \le j \le n}} a_{ij} y la anchura de la fórmula vuelve a la del operador. Este grupo, junto con \smashoperator y el \clap de modo texto, se trata en detalle en la página de mathtools. Y cuando prefiera apilar las condiciones en varias líneas en vez de comprimirlas en horizontal, el \substack{...} de amsmath es la respuesta correcta: \sum_{\substack{0<i<m \\ 0<j<n}} compone las dos condiciones, separadas por \\, como dos líneas bajo el sumatorio.

Palabras dentro de las matemáticas: \text, \mathrm y \operatorname

Los tres difieren en exactamente dos puntos: si heredan la fuente circundante y si añaden espaciado de operador. Primero la fuente. \text (definido por amstext, que carga amsmath) hereda la fuente del texto circundante, mientras que \mathrm impone siempre redonda recta. Las mediciones lo dejan claro. Dentro de \textit{...}, \text{ab} mide 14,24867 pt mientras que \mathrm{ab} mide 14,61809 pt. Dentro de \textbf{...}, \text{ab} mide 15,64928 pt mientras que \mathrm{ab} vuelve a medir 14,61809 pt: \mathrm salió idéntico hasta el último dígito con independencia del contexto. Use \text para palabras que deban leerse en el mismo tono que la prosa circundante, y \mathrm para unidades y etiquetas de subíndice que deban ir siempre rectas.

El segundo punto, el espaciado, es lo que separa \mathrm de \operatorname. \operatorname (definido por amsopn, que carga amsmath) trata su contenido como un operador, un \mathop, de modo que aparece automáticamente un respiro a cada lado. Medido, $\mathrm{max} x$ da 24,32645 pt y $\operatorname{max} x$ da 25,99307 pt: una diferencia de 1,66662 pt, exactamente un espacio fino de 3 mu. Con operando a ambos lados, $a \mathrm{mod} b$ y $a \operatorname{mod} b$ dan 28,74428 pt frente a 32,07753 pt, una diferencia de 3,33325 pt, es decir 6 mu (3 mu por lado). Curiosamente, cuando sigue un (, $\mathrm{max}(x)$ y $\operatorname{max}(x)$ midieron ambos 32,10425 pt, exactamente lo mismo, porque las reglas de TeX no insertan espacio entre un operador y un corchete de apertura. Concluir «son iguales» a partir del ejemplo con paréntesis sería precipitado. Para poner el límite bajo el símbolo, use el \operatorname*{max}_{x} con estrella (medido 18,61118 pt, frente a 23,6459 pt de la forma sin estrella, que coloca el índice al lado).

latex
\[
  x_{\text{total}} \quad x_{\mathrm{total}}
  \qquad
  a \operatorname{mod} b \quad a \mathrm{mod} b
\]

% define it once in the preamble instead of repeating \operatorname
\DeclareMathOperator{\rank}{rank}
\DeclareMathOperator*{\argmax}{arg\,max}

Si el mismo operador aparece a menudo, definirlo una vez en el preámbulo es más seguro que teclear \operatorname cada vez. El \DeclareMathOperator{\rank}{rank} de amsmath crea \rank como operador, y el \DeclareMathOperator*{\argmax}{arg\,max} con estrella crea la versión que pone los límites debajo. Con el nombre y su grafía reunidos en un solo sitio, cambiar la notación más tarde es una edición de una línea.

Mover arriba y abajo, y juntar: \raisebox y \!

\raisebox{cantidad}{contenido} eleva su contenido la cantidad indicada (un valor negativo lo baja). Medido, X mide 6,83331 pt de alto y \raisebox{2pt}{X} mide 8,83331 pt: exactamente 2 pt más. Con dos argumentos opcionales más, \raisebox{cantidad}[altura][profundidad]{contenido}, se puede además redefinir la altura y la profundidad que declara al entorno. \raisebox{2pt}[0pt][0pt]{X} midió 0,0 pt de alto y 0,0 pt de profundidad: movido y a la vez reducido al mismo «tamaño cero» que da \smash, de una sola vez. Vale la pena cuando la posición de un símbolo pide la más leve corrección, o cuando cambiar de fuente ha descolocado algo en vertical.

Por último, el caso en que los símbolos quedan demasiado separados. El espacio fino negativo \! se define en plain TeX como \def\!{\mskip-\thinmuskip}, lo que lo convierte en el inverso exacto de \, (3 mu), es decir −3 mu. Medido, $ab$ da 9,57755 pt, $a\,b$ da 11,24417 pt (+1,66662 pt) y $a\!b$ da 7,91092 pt (−1,66663 pt): limpiamente simétrico. La ocasión clásica es una integral múltiple: $\int\int$ mide 14,99997 pt, tan abierto que se lee como dos integrales separadas. Meta dos \! y $\int\!\!\int$ mide 11,66672 pt. Y el $\iint$ específico de amsmath mide también 11,66672 pt: idéntico hasta el último decimal. El anticuado \int\!\!\int produce, pues, un resultado indistinguible del comando dedicado. Aun así, donde existen \iint e \iiint expresan la intención con más claridad y se leen mejor; piense en \! como la herramienta para situaciones sin comando ya hecho.

latex
\[
  \int\int f \, dA
  \qquad
  \int\!\!\int f \, dA
  \qquad
  \iint f \, dA
\]

% an arbitrary symbol set squarely above another
\[
  a \overset{!}{=} b, \qquad x \overset{?}{=} y,
  \qquad A \overset{f}{\longrightarrow} B
\]

Un último asunto: poner un símbolo justo encima de un =. Los índices escritos con ^ y _ se enganchan arriba a la derecha y abajo a la derecha de un símbolo, nunca directamente encima o debajo. \overset{arriba}{base} y \underset{abajo}{base} de amsmath asumen ese papel, y \overset{!}{=} es la manera habitual de escribir «esto debe ser igual», \overset{?}{=} «¿es esto igual?». El segundo argumento es la base; el primero, lo que se añade. Los usos más avanzados —aplicarlos a flechas, anidarlos— se tratan en la página «Decoraciones encima y debajo».