amsmath apenas ha cambiado desde los años noventa. La estabilidad es una virtud, pero el precio fue una pila creciente de pequeñas molestias que nadie podía arreglar: el aspecto de :=, unas barras de valor absoluto que se niegan a seguir la altura de su contenido, una condición larga bajo un sumatorio que estira toda la fórmula. mathtools es el paquete de LaTeX creado en 2002 para alojar esas correcciones, y no sustituye a amsmath: carga amsmath y construye encima. Esta página recorre \DeclarePairedDelimiter, \coloneqq, \mathclap, \prescript, matrix*, dcases y showonlyrefs, con medidas reales para cada uno. Todos ellos son un paso que amsmath por sí solo no podía dar.
amsmath o mathtools: ¿cuál se carga?
Basta con cargar mathtools. Este arrastra amsmath consigo, así que un \usepackage{amsmath} aparte sobra. Las opciones destinadas a amsmath también pasan sin más: \usepackage[fleqn,tbtags]{mathtools} equivale a \usepackage[fleqn,tbtags]{amsmath} seguido de \usepackage{mathtools}. No hace falta nombrar ambos ni preocuparse por el orden.
% one line is enough: mathtools loads amsmath itself
\usepackage{mathtools}
% options aimed at amsmath are passed straight through
\usepackage[fleqn,tbtags]{mathtools}Ese planteamiento —«construir sobre amsmath»— sobrevivió a tres generaciones de responsables. El bloque de copyright de mathtools.sty indica 2002–2011 Morten Høgholm, 2012–2019 Lars Madsen, y desde 2020 Lars Madsen junto con el proyecto LaTeX3. mathtools pasó así de ser la caja de herramientas de una persona a un cuasiestándar que cuida el equipo que desarrolla LaTeX. Se nota: en el preámbulo de un documento con matemáticas, la primera línea nombra hoy más a menudo a mathtools que a amsmath. mathtools depende además del paquete auxiliar mhsetup, que distribuciones como TeX Live incluyen, así que nunca reclama atención.
Valores absolutos y normas que se ajustan solos: \DeclarePairedDelimiter
Una línea en el preámbulo —\DeclarePairedDelimiter\abs{\lvert}{\rvert}— da un \abs propio con tres tamaños conmutables. El casero \newcommand{\abs}[1]{\lvert#1\rvert} que todos escriben primero acierta con el espaciado horizontal, pero en cuanto recibe algo alto como \abs{\frac{a}{b}} las barras se niegan a crecer y quedan plantadas junto a una fracción que las rebasa. Ahí es justo donde \DeclarePairedDelimiter toma el relevo. Encerrar el nombre del comando entre llaves, \DeclarePairedDelimiter{\abs}{\lvert}{\rvert}, compila igual de bien.
% in the preamble; braces around the command name are optional
\DeclarePairedDelimiter\abs{\lvert}{\rvert}
\DeclarePairedDelimiter\norm{\lVert}{\rVert}
% three ways to call it
\[
\abs{x} = \abs{-x}
\qquad
\abs*{\frac{a}{b}} = \frac{\abs{a}}{\abs{b}}
\qquad
\norm[\big]{v}
\]La diferencia no es cuestión de impresión: se mide. Con TeX Live 2024, \sbox0{$\abs{\frac ab}$} mide 7,5 pt de alto, mientras que \abs*{\frac ab} con estrella mide 8,50006 pt. La estrella envuelve el cuerpo en \left … \right, así que las barras crecieron la altura de la fracción. La tercera forma, pasando [\big], [\Big], [\bigg] o [\Bigg], elige el escalón a mano; aquí [\big] midió también 8,50006 pt, cayendo en el mismo escalón que eligió el automático. Recuérdelo así: estrella = estirar, corchetes = fijar en este escalón. Para notaciones que necesitan un separador dentro del delimitador, como \Set{x}{x>0}, use \DeclarePairedDelimiterX.
| Forma | Tamaño | Cuándo usarla |
|---|---|---|
\abs{x} | fijo (medido 7,5 pt) | cuando el cuerpo es una variable o un número bajo |
\abs*{x} | automático (medido 8,50006 pt) | cuerpos altos: fracciones, radicales, sumatorios |
\abs[\big]{x} | escalón elegido a mano | para mantener una serie de fórmulas a la misma altura |
\DeclarePairedDelimiterX | como arriba, con varios argumentos | notaciones con separador interno, como \Set{x}{x>0} |
Por qué := se ve mal y qué cambia realmente \coloneqq
Hay dos cosas que corregir: la altura de los dos puntos y el hueco entre los dos puntos y el signo igual. Una explicación frecuente dice que el espaciado falla porque : no es una relación; eso es sencillamente falso. Si se pide a LaTeX el math code de :, responde 12346, o "303A en hexadecimal, cuyo 3 inicial marca la clase 3, una relación. Por tanto envolverlo como $a\mathrel{:=}b$ no cambia absolutamente nada. La medición coincide: $a:=b$ y $a\mathrel{:=}b$ dieron ambos exactamente 25,68855 pt.
¿Qué hace entonces \coloneqq? Su definición es \vcentcolon\mathrel{\mkern-1.2mu}=. Primero, en lugar del : ordinario emplea \vcentcolon, unos dos puntos centrados en el eje matemático (medido: $:$ mide 4,30554 pt de alto y $\vcentcolon$ 4,65277 pt, elevado 0,34723 pt). Segundo, un kern negativo de -1.2mu arrima los dos puntos al igual, porque cuando dos relaciones van seguidas TeX también inserta espacio de relación entre ellas y : y = acaban leyéndose como dos símbolos sueltos. Resultado: $a\coloneqq b$ mide 25,02191 pt, exactamente 0,66664 pt menos que un := crudo, es decir 1,2 mu a 10 pt.
\[
f(x) \coloneqq x^2 + 1, \qquad y \eqqcolon g(x), \qquad
A \Coloneqq B
\]Una trampa: mathtools cambió el significado de \coloneq. Hoy, por omisión, \coloneq compone el mismo «:=» que \coloneqq; en la definición antigua componía dos puntos y un guion, «:−». Lo mismo le ocurrió a \eqcolon, que ahora coincide con \eqqcolon en «=:». Para documentos que necesiten los glifos antiguos existe \usepackage[legacycolonsymbols]{mathtools}. A la inversa, \coloneqq y \eqqcolon nunca se retiraron y dan lo mismo bajo cualquiera de los dos ajustes: en la duda, escriba el de las dos q. La familia incluye además \dblcolon (::), \Coloneqq (::=), \Eqqcolon, \colonapprox, \colonsim, y los más recientes \approxcolon y \simcolon.
Una condición larga bajo un sumatorio ensancha la fórmula: \mathclap y \smashoperator
Meta la condición en una caja de anchura cero y el problema desaparece. \sum_{1 \le i \le j \le n} a_{ij} mide 48,21771 pt de ancho; envuelta como \sum_{\mathclap{1 \le i \le j \le n}} a_{ij}, la misma fórmula mide 28,43983 pt, es decir 19,78 pt menos. Los caracteres de la condición no desaparecen: siguen bien visibles bajo el sumatorio. Simplemente dejan de contar para la anchura de la fórmula. \mathclap reparte el saliente a ambos lados, \mathllap lo lanza a la izquierda y \mathrlap a la derecha. El \clap de modo texto responde a la misma idea.
% the wide condition stretches the whole formula
\[ \sum_{1 \le i \le j \le n} a_{ij} \]
% zero-width box: same look, width of the operator only
\[ \sum_{\mathclap{1 \le i \le j \le n}} a_{ij} \]
% same result, but this one can flatten a single side
\[ \smashoperator{\sum_{1 \le i \le j \le n}} a_{ij} \]
\[ \smashoperator[r]{\sum_{1 \le i \le j \le n}} a_{ij} \]mathtools ofrece una segunda herramienta, \smashoperator. Medido, \smashoperator{\sum_{1 \le i \le j \le n}} da 28,43983 pt, exactamente la cifra de \mathclap. La diferencia está en la flexibilidad: \smashoperator recibe el operador junto con sus índices y permite elegir qué lado aplastar mediante [l], [r] o [lr] (el valor por omisión). Cuando el sumatorio está en el margen izquierdo y no debe invadirlo, [r] es la respuesta: medido en 38,32878 pt, a medio camino entre el aplastado bilateral y el original. \mathclap apunta a un punto dentro de la fórmula; \smashoperator se ocupa del operador al principio del renglón.
Índices a la izquierda del símbolo: \prescript y \adjustlimits
Tres argumentos —\prescript{arriba}{abajo}{base}— colocan índices arriba a la izquierda y abajo a la izquierda de un símbolo. La notación de isótopos es el caso más claro: \prescript{238}{92}{\mathbf{U}} compone el uranio-238 con el número másico 238 arriba a la izquierda y el número atómico 92 abajo a la izquierda. También puede escribirse {}^{238}_{92}\mathbf{U} a mano, pero así los índices cuelgan de un grupo vacío y ni su posición ni su tamaño son fiables. Si no hace falta el de abajo, deje el segundo argumento como un {} vacío. La fuente de los índices se cambia con prescript-sub-format y prescript-sup-format en \mathtoolsset.
\[
\prescript{238}{92}{\mathbf{U}}, \qquad
\prescript{n}{}{C}_{k}
\]
% limits of two nested operators lined up
\[ \adjustlimits \sum_{i} \sum_{j} a_{ij} \]Otra herramienta cabe aquí, discreta pero eficaz. \adjustlimits alinea los límites inferiores de dos operadores anidados. Cuando se suceden índices de distinto tamaño, como en \sum_i \sum_j, el segundo límite puede parecer ligeramente flotante, y \adjustlimits absorbe ese escalón. Medido: \sum_i\sum_j da 30,55557 pt y \adjustlimits\sum_i\sum_j da 32,2222 pt, una diferencia de 1,66663 pt, exactamente 3 mu. Sirve igual cuando se suceden operadores de anchuras distintas, como \lim_{n\to\infty}\sup_{x}.
Alinear columnas de matrices: pmatrix* y [r], [l], [c]
El pmatrix de amsmath centra siempre sus columnas. Eso se vuelve un problema en cuanto aparecen números negativos: con -1 sobre 2, las cifras parecen desplazadas la anchura del signo menos. mathtools ofrece una versión con estrella de cada entorno —matrix*, pmatrix*, bmatrix*, Bmatrix*, vmatrix*, Vmatrix*, smallmatrix*— que acepta como argumento opcional el mismo especificador de columna que array. Escriba \begin{pmatrix*}[r] y las columnas se alinean a la derecha, con los signos menos sobresaliendo limpiamente a la izquierda. El valor por omisión es c, así que la estrella por sí sola no cambia nada. La alineación por omisión de las variantes pequeñas se fija con smallmatrix-align en \mathtoolsset.
\[
\begin{pmatrix*}[r]
-1 & 3 \\
2 & -4
\end{pmatrix*}
\qquad
\begin{pmatrix}
-1 & 3 \\
2 & -4
\end{pmatrix}
\]Distinción de casos y una línea muy larga: dcases, rcases, multlined
El cases de amsmath compone su contenido en estilo de texto, de modo que una fracción dentro sale aplastada: \frac{1}{2} encoge. El dcases de mathtools mantiene la misma sintaxis pero compone el cuerpo en tamaño de display; la d viene de displaystyle. Si la llave debe ir a la derecha —varias condiciones que llevan a una conclusión—, use rcases y haga seguir a \end{rcases} un \Rightarrow o lo que corresponda. Existe un drcases combinado, y los dcases* y rcases* con estrella que componen la última columna como texto. Si necesita un entorno de casos propio, \newcases lo construye.
\[
f(x) =
\begin{dcases}
\frac{1}{2} & x > 0 \\
0 & x \le 0
\end{dcases}
\qquad
\begin{rcases}
a \\ b
\end{rcases} \Rightarrow c
\]
% [t] aligns on the first row; the second optional argument fixes the width
\[
\begin{multlined}[t][0.6\textwidth]
a + b + c + d \\ {} + e + f
\end{multlined}
\]multlined es el entorno multline de amsmath encerrado en una sola caja. multline se adueña de todo un renglón en display, así que no puede usarse dentro de align ni a la derecha de un =. multlined, al ser un entorno, se incrusta en cualquier punto de una fórmula y permite plegar solo el largo miembro derecho. Toma dos argumentos opcionales: el primero es la alineación vertical respecto al entorno (t, b, centrado por omisión) y el segundo la anchura. Si no se indica anchura, ocupa solo la necesaria. Para deslizar una flecha entre dos filas alineadas está \ArrowBetweenLines; para aflojar el interlineado de toda una alineación, el entorno spreadlines.
Numerar solo las ecuaciones que se citan: showonlyrefs
Escriba \mathtoolsset{showonlyrefs} y solo las ecuaciones citadas desde el texto reciben número; las demás pierden el suyo. En un borrador los números de ecuación aparecen y desaparecen sin parar, y numerar una ecuación que nadie cita manda al revisor a buscar dónde se usa «(7)». Al componer con TeX Live 2024 un align de dos ecuaciones y citar solo una con \eqref, la ecuación citada recibió (1) y la otra ningún número. Hay una condición: citar con \eqref, no con \ref. Si además deben sobrevivir los números puestos a mano con \tag{}, añada showmanualtags.
\mathtoolsset{
showonlyrefs, % number only what \eqref points at
showmanualtags, % but keep \tag{} numbers visible
centercolon % a bare : is set at axis height
}¿Cuáles vienen de amsmath y cuáles de mathtools?
Cargar solo mathtools difumina la frontera, pero importa al retocar el documento de otra persona o al topar con normas de envío que solo admiten amsmath. Los archivos .sty lo zanjan. Las flechas extensibles \xrightarrow y \xleftarrow son de amsmath (definidas en amsmath.sty); lo que mathtools añade es el resto de la familia: las de doble trazo \xRightarrow, \xLeftarrow y \xLeftrightarrow, la bidireccional \xleftrightarrow, las de gancho \xhookrightarrow y \xhookleftarrow, la de aplicación \xmapsto, la más larga \xlongrightarrow y los arpones. Todas usan la misma forma [abajo]{arriba}. \intertext es de amsmath y el \shortintertext apretado es de mathtools. \overset, \underset y \substack son de amsmath; los \overbracket y \underbracket de ángulo recto son de mathtools.
| Comando/entorno | Procedencia | Función |
|---|---|---|
\xrightarrow | amsmath | flecha que se estira hasta sus etiquetas; [abajo]{arriba} |
\xleftrightarrow | mathtools | el resto de la familia extensible: \xRightarrow, \xmapsto y más |
\overbracket | mathtools | la contrapartida de ángulo recto de \overbrace / \underbrace; el primer argumento opcional es el grosor y el segundo la altura (0,7 ex por omisión) |
\intertext | amsmath | inserta prosa entre filas sin perder la alineación |
\shortintertext | mathtools | lo mismo, con los espacios superior e inferior apretados |
\substack | amsmath | apila un índice en varias líneas, contrapartida de comprimirlo con \mathclap |
\MoveEqLeft | mathtools | empuja la primera línea de un align a la izquierda para alinear las siguientes |
\splitfrac | mathtools | parte en dos líneas un numerador o denominador demasiado largo |