Alfabetos matemáticos (\mathbf, \mathbb, \mathcal)

El modo matemático de LaTeX no conoce el «cambio de fuente» del texto corrido. Lo que conoce son los alfabetos matemáticos: \mathbf, \mathbb, \mathcal y compañía, que reasignan cada carácter encerrado a otra tipografía. El problema es que las plazas están contadas: en los motores clásicos una fórmula puede usar dieciséis como máximo. Ese techo se fijó en 1978 y sigue vigente; aparece sin avisar como ! LaTeX Error: Too many math alphabets used in version normal. Esta página va de los siete comandos que no requieren paquete al \mathbb de pizarra (que exige amssymb) y al \mathscr (que exige mathrsfs), luego a la negrita matemática \bm y a los comandos \sym… de unicode-math, en torno a una sola pregunta: cómo gastar esas dieciséis plazas.

Un alfabeto matemático es una familia, no una fuente

Una letra en modo matemático se toma como variable y se compone en itálica matemática: ese es el alfabeto matemático por defecto. Envolverla en un comando como \mathbf{v} traslada solo ese tramo a otra familia; TeX la llama \fam. Aquí es donde los alfabetos matemáticos se separan de los comandos de fuente del modo texto. TeX guarda cada carácter de una fórmula como «número de familia, número de casilla», así que una tipografía no es un flujo continuo como en el texto corrido, sino una etiqueta pegada a cada símbolo. Por eso \mathbf{fit} no es la palabra «fit» sino el producto de tres símbolos en negrita f, i y t, con el espacio entre variables intercalado. Para poner una palabra real en vertical dentro de una fórmula se usa \text{…} de amsmath.

LaTeX estándar trae siete comandos de alfabeto matemático. Todos tienen la forma \math…, nombrados en paralelo a los comandos de texto \textbf, \textsf y demás. La pareja que más se confunde es \mathnormal y \mathit: \mathnormal (por defecto) compone cada letra como variable, con la separación mayor entre variables, mientras que \mathit es la itálica de texto y sirve para una palabra de varias letras como una sola unidad inclinada, como \mathit{diff}. \mathrm y \mathbf son romanas verticales, la segunda en negrita. \mathsf aparece en nombres de tensores y categorías, y \mathtt cuando un token con aspecto de código debe ir dentro de una fórmula.

ComandoAspectoNotas
\mathnormalItálica matemática por defectoIntegrado; aspecto por defecto de una variable, con espaciado entre variables
\mathrmRomana verticalIntegrado; constantes, operadores y abreviaturas verticales
\mathbfNegrita verticalIntegrado; al ser vertical no conviene para variables y no alcanza al griego
\mathsfSans serifIntegrado; tensores, nombres de categorías y similares
\mathttMonoespaciada (máquina de escribir)Integrado; tokens con aspecto de código dentro de una fórmula
\mathitItálica de textoIntegrado; palabra de varias letras como unidad inclinada, como \mathit{diff}
\mathcalCaligráfica; solo mayúsculasIntegrado; familias de conjuntos, categorías, transformadas. Los glifos vienen del cmsy de Computer Modern

Qué paquete necesitan \mathbb, \mathscr y \mathfrak

La pizarra \mathbb y la Fraktur \mathfrak exigen amssymb (o el más ligero amsfonts); el script \mathscr exige mathrsfs. Solo \mathcal está integrado. \mathbb es una negrita de trazos duplicados —imita la costumbre de repasar el trazo en la pizarra para indicar negrita— y su uso está prácticamente fijado a los conjuntos numéricos: reales ℝ, complejos ℂ, enteros ℤ, racionales ℚ, naturales ℕ. Cubre las mayúsculas A–Z y nada más: ni minúsculas ni cifras.

Elegir entre \mathcal y \mathscr resulta mucho más fácil cuando se conoce su origen. La fuente que carga \mathscr es rsfs, abreviatura de Ralph Smith’s Formal Script, publicada en octubre de 1991. Su autor explica en el README que se trata de una escritura formal basada en las manos spencerianas o copperplate del siglo XVIII, calcada de un tipo del diseñador R. Hunter Middleton y parecida a la que usaban los cajistas de Springer Verlag. \mathcal, en cambio, es la capital ornamentada más informal que vive en la fuente de símbolos cmsy de Computer Modern. ℒ y 𝓛 contraponen una mano formal a una floritura desenfadada, sin que ninguna sea la correcta. Esa formalidad es justo lo que hace preferir rsfs para el dominio 𝒟 en análisis funcional y el lagrangiano ℒ en teoría de campos.

La tipografía tras \mathfrak también tiene nombre. amssymb escribe \DeclareMathAlphabet{\mathfrak}{U}{euf}{m}{n}, y euf es Euler Fraktur: el README de AMSFonts indica que las fuentes Euler fueron diseñadas por Hermann Zapf y publicadas originalmente en los años noventa. El mismo README recoge que Euler 3.0, en la que Zapf rediseñó muchos glifos, le fue entregada a Donald Knuth el 10 de enero de 2008, el día de su cumpleaños. Así que la cara angular que usas para álgebras de Lie 𝔤 e ideales 𝔭 procede de uno de los grandes tipógrafos del siglo XX y, a diferencia de \mathbb y \mathcal, cubre mayúsculas y minúsculas. El Euler Script (eus) que ofrece el paquete euscript pertenece a la misma familia.

document.tex
\usepackage{amssymb}   % \mathbb and \mathfrak
\usepackage{mathrsfs}  % \mathscr (Ralph Smith's Formal Script)
% ...
\[
  \mathbb{R} \subset \mathbb{C}, \qquad
  \mathcal{F}(f) = \hat{f}, \qquad
  \mathscr{L}(f) = F, \qquad
  \mathfrak{g} = \operatorname{Lie}(G).
\]
ComandoPaquete necesarioCobertura y uso típico
\mathbbamssymb (o amsfonts)Solo mayúsculas A–Z; conjuntos ℝ ℂ ℤ ℚ ℕ
\mathcalIntegrado (ninguno)Solo mayúsculas; familias, categorías, transformadas. Glifos de cmsy
\mathscrmathrsfs (o euscript)Solo mayúsculas; el script más formal. Glifos de rsfs10
\mathfrakamssymb / amsfonts (euf)Mayúsculas y minúsculas; álgebras de Lie, ideales. Euler Fraktur

\mathbb{2} no da error: compone otro símbolo

Intentar un uno o un dos de pizarra escribiendo \mathbb{1} o \mathbb{2} produce un símbolo completamente distinto, sin aviso y sin error. Al componer $\mathbb{2}$ con amssymb en TeX Live 2024 y extraer el carácter del PDF se obtiene U+22AD (⊭, «not true»). La causa está en el propio mecanismo: \mathbb se limita a buscar la misma casilla en la fuente msbm, así que sale lo que ocupe la casilla 2 de msbm10, que es ⊭. Nada comprueba que el carácter exista. Cuando necesites la función indicadora 𝟙, usa \mathds{1} de dsfont (la fuente Type 1 dsrom10) o sustituye todo el alfabeto de pizarra con el paquete mathalpha. \mathbbm{1} de bbm también es conocido, pero la versión que trae TeX Live carece de contornos Type 1 y acaba en el PDF como mapa de bits Type 3 (se ve con pdffonts), así que conviene evitarlo donde las normas de envío rechacen las fuentes de mapa de bits.

document.tex
% A blackboard-bold digit is NOT available from amssymb:
%   $\mathbb{2}$  ->  U+22AD, silently. Use one of these instead.
\usepackage{dsfont}                              % \mathds{1}, Type 1 outlines
\usepackage[bb=dsserif,scr=rsfs]{mathalpha}      % replace the whole \mathbb alphabet
% ...
\[ \mathds{1}_{A}(x), \qquad \mathbb{1}_{A}(x) \]

Dieciséis alfabetos como máximo: Too many math alphabets

Si se siguen añadiendo alfabetos, tarde o temprano aparece ! LaTeX Error: Too many math alphabets used in version normal. El techo es dieciséis. Los códigos de carácter matemático de TeX dedican solo cuatro bits al número de familia, así que nunca puede haber más que las familias 0 a 15. latex.ltx lo dice sin rodeos con \chardef\e@mathgroup@top=16, y lo eleva a 256 en los motores que tienen \Umathcode (XeTeX y LuaTeX). Un article desnudo ya ocupa cuatro familias al arrancar —operators, letters, symbols, largesymbols— y con amssymb más mathrsfs llegan a siete. Quedan unas nueve plazas, en las que se van colocando \mathbf, \mathsf, \mathtt, \mathit, \mathcal, \mathbb, \mathfrak y \mathscr. El presupuesto se parece más a uno por documento que por fórmula: las plazas se llenan en el orden de primer uso y no se devuelven.

Un segundo guardián vigila esas mismas dieciséis plazas. \DeclareSymbolFont, que registra una fuente de símbolos, está protegido dentro de latex.ltx por la comprobación codificada a mano \ifnum\count18<15, y más allá aparece ! LaTeX Error: Too many symbol fonts declared. Aquí está la trampa importante: el número 15 rige con independencia del motor, así que aunque LuaLaTeX permite 256 alfabetos, las fuentes de símbolos siguen limitadas a dieciséis. Escribir una decimoséptima \DeclareSymbolFont provoca el mismo error tanto en pdfLaTeX como en LuaLaTeX. Solo si llamas tú mismo al \newfam de bajo nivel y superas el tope aparece el mensaje propio de TeX, ! No room for a new \mathgroup.\mathgroup, no \fam, porque LaTeX2e convierte \newfam en alias de \new@mathgroup.

También hay alivio. Los núcleos recientes de LaTeX reservan las dos últimas de las dieciséis plazas para reciclarlas (\c@localmathalphabets vale 2 por defecto). Cuando en el cuerpo del documento hace falta un decimoquinto o decimosexto alfabeto, el núcleo presta la plaza a esa fórmula concreta y la recupera después. Así que, mientras ninguna fórmula necesite más de dos alfabetos extra, un documento pasa de catorce sin detenerse: en una prueba el contador se quedó congelado en 14 y no apareció ningún error. La otra cara: mete tres o más alfabetos nuevos en una misma fórmula y ahí es donde se rompe. Si el error salta en una sola fórmula, sospecha esto primero. La documentación de isomath dice sin rodeos que hace opcional su propio \mathsfit por este límite de dieciséis alfabetos. Si prefieres no llevar la cuenta, pasar a XeLaTeX o LuaLaTeX con unicode-math es la solución de fondo.

Añadir tu propio alfabeto con \DeclareMathAlphabet

Un alfabeto matemático nuevo cabe en una línea: \DeclareMathAlphabet{comando}{codificación}{familia}{serie}{forma}. Solo vale en el preámbulo. ¿Quieres una sans inclinada para tensores? \DeclareMathAlphabet{\mathsfsl}{OT1}{cmss}{m}{sl} y ya está. Si además debe engrosar dentro de las matemáticas en negrita (el \mathversion{bold} de más abajo), añade \SetMathAlphabet{\mathsfsl}{bold}{OT1}{cmss}{bx}{sl}. Si lo único que quieres es otro nombre para una fuente ya registrada como fuente de símbolos, \DeclareSymbolFontAlphabet lo hace sin gastar plaza: mathrsfs.sty se reduce en esencia a esas dos líneas. Un detalle más: \DeclareMathAlphabet no reclama plaza al declararse, sino la primera vez que se usa de verdad. Un paquete que solo has cargado no puede comerse el presupuesto, lo que facilita mucho el diagnóstico.

document.tex
% preamble only
\DeclareMathAlphabet{\mathsfsl}{OT1}{cmss}{m}{sl}
\SetMathAlphabet{\mathsfsl}{bold}{OT1}{cmss}{bx}{sl}

% costs no slot: just another name for a symbol font already declared
\DeclareSymbolFont{rsfs}{U}{rsfs}{m}{n}
\DeclareSymbolFontAlphabet{\mathscr}{rsfs}
% ...
\[ \mathsfsl{T}_{ij} \]

Matemáticas en negrita: \mathbf, \boldsymbol y \bm

\mathbf es una negrita vertical, así que no sirve ni para variables ni para vectores que deban inclinarse, y no tiene absolutamente ningún efecto sobre las letras griegas. Una medición lo hace concreto: compila con pdfLaTeX un documento que solo contenga $\mathbf{\alpha}$, pásalo por pdffonts y verás incrustada exactamente una fuente: CMMI10. La α salió en itálica matemática corriente, no en la negrita CMMIB10. Es por diseño: \mathbf cambia de familia, y α ocupa una casilla cuya forma no cambia con ese salto. Como no aparece ni error ni aviso, es justo el tipo de fallo que se entrega sin que nadie lo note.

Para poner en negrita sin perder la inclinación, el primer candidato es \boldsymbol de amsmath (su amsbsy), y el más robusto en la práctica es \bm del paquete bm. Como bm forma parte del conjunto obligatorio latex-tools, toda distribución TeX estándar lo incluye: nada que instalar. \bm{…} está diseñado para añadir solo peso, conservando la inclinación, el resto de la forma y los espacios de alrededor, y maneja variables, griego y símbolos —incluso entradas complicadas— de forma casi transparente. bm además redefine \boldsymbol como alias de \bm. Pero \bm no es gratis: bm.sty tiene un límite llamado \bmmax (4 por defecto) que acota cuántas familias reclama para la versión en negrita. Los alfabetos matemáticos en negrita salen de esas mismas dieciséis plazas, así que entran en el presupuesto de la sección anterior. Si te quedas corto puedes subirlo con \chardef\bmmax=6, a costa de los alfabetos ordinarios.

Cuando una fórmula entera debe ir en negrita —dentro de un título, en el rótulo de una figura— se cambia la versión matemática en vez de buscar un comando. Eso hacen \boldmath y \mathversion{bold}; LaTeX estándar trae dos versiones, normal y bold. Puedes crear una tercera: declara \DeclareMathVersion{heavy}, registra los alfabetos con \SetMathAlphabet{…}{heavy}{…} y \mathversion{heavy} lo cambia todo. El \hm de bm (alias \heavysymbol) es el comando de esa versión heavy, con \hmmax en 3 por defecto. Ojo, sin embargo: mientras no hayas definido de verdad una versión heavy, \hm es simplemente \bm, así que escribir \hm no da por sí solo nada más grueso.

document.tex
\usepackage{amsmath}   % \boldsymbol
\usepackage{bm}        % \bm -- recommended
% \chardef\bmmax=6     % raise bm's family budget if it runs out
% ...
\[
  \mathbf{v} \neq \bm{v}, \qquad
  \bm{\beta} = (\beta_1, \dots, \beta_n), \qquad
  \nabla \bm{F} = \bm{0}.
\]
\section{\boldmath A whole heading in bold maths: $E = mc^2$}
  • \mathbf — negrita vertical; integrado, pero malo para variables que deben inclinarse y sin efecto sobre el griego (medido arriba).
  • \boldsymbol — de amsmath (amsbsy); mantiene la inclinación y puede poner en negrita griego y símbolos.
  • \bm — del paquete bm; recomendado. Añade solo peso, conservando la forma y los espacios de alrededor. Su consumo de familias lo acota \bmmax (4 por defecto).
  • \boldmath / \mathversion{bold} — cambia toda la versión matemática en lugar de un tramo; para títulos y rótulos de figuras.

Los comandos \sym…: alfabetos que apuntan a Unicode

Al cargar unicode-math en XeLaTeX o LuaLaTeX, los comandos de alfabeto quedan sustituidos por la familia \sym…: \symbf (negrita), \symbb (pizarra), \symcal (caligráfica), \symscr (script), \symfrak (Fraktur), \symup (vertical), \symit (itálica), \symsf (sans serif). Los nombres antiguos sobreviven, pero \mathbb está de hecho redefinido como alias de \symbb, y \mathcal como alias de \symcal. La diferencia decisiva es que \sym… no es un cambio de familia sino una proyección sobre los Mathematical Alphanumeric Symbols de Unicode. Compón $\symbb{2}\ \symbb{r}\ \symcal{L}$ con STIX Two Math bajo LuaLaTeX y recupera los caracteres del PDF: obtienes U+1D7DA (𝟚), U+1D563 (𝕣) y U+2112 (ℒ). El \mathbb{2} que daba ⊭ en la sección anterior es aquí un dos de pizarra auténtico, y también hay minúsculas. Esa proyección es además la razón de que un carácter copiado del PDF conserve su significado.

Esa proyección tiene una consecuencia con la que tropezarás seguro si nadie te avisa: \symcal y \symscr apuntan a los mismos caracteres Unicode. Los Mathematical Alphanumeric Symbols contienen un único alfabeto script, así que \symcal{L} y \symscr{L} son ambos U+2112. Para distinguirlos visualmente se recurre a los conjuntos estilísticos OpenType de la fuente mediante range=. Con STIX Two Math, tras el \setmathfont principal añade \setmathfont{STIX Two Math}[range=\symscr,StylisticSet=1]; medida, esa única línea da a \symcal{L} una anchura de 6,99 pt frente a 8,63 pt de \symscr{L}: los números confirman que se eligió otro glifo. Lo que la vía heredada resolvía gastando dos plazas de alfabeto, unicode-math lo resuelve nombrando una característica de la fuente.

document.tex
% compile with xelatex or lualatex
\usepackage{amsmath}
\usepackage{unicode-math}
\setmathfont{STIX Two Math}
\setmathfont{STIX Two Math}[range=\symscr,StylisticSet=1]  % a second script shape
% ...
\[
  \symbb{R} \subset \symbb{C}, \qquad \symbb{2}, \qquad
  \symcal{F} \neq \symscr{F}, \qquad \symfrak{g}, \qquad
  \symbfit{v} = \symbf{0}.
\]

Una última advertencia sobre \symbf con unicode-math. Con la configuración por defecto (bold-style=TeX), \symbf{v} es negrita *vertical*. Medido, \symbf{v} dio U+1D42F (v romana negrita) y \symbfit{v} dio U+1D497 (v itálica negrita). Si tu convención escribe los vectores en negrita itálica, usa \symbfit o fija bold-style=ISO. Elegir la fuente matemática para todo el documento —qué pasarle a \setmathfont y cómo casarla con la tipografía del texto— es asunto de otra página.