Cuándo sale a cuenta una fuente variable
De qué está hecho el archivo, dónde está el punto de equilibrio frente a las estáticas, cómo recortar el espacio de diseño con el instanciador, y la tabla de decisión honesta.
“Un archivo en lugar de seis” es cierto y es una comparación tramposa, porque el archivo variable no pesa lo que una estática: pesa entre dos y tres veces más. El punto de equilibrio está en dos o tres pesos, y la mayoría de los proyectos que adoptan una fuente variable acaban usando exactamente dos. Esta lección es la cuenta que hay que hacer antes, con los números y con el comando que casi nadie ejecuta.
- Enumerar qué añade una fuente variable sobre una estática dentro del archivo.
- Calcular el punto de equilibrio para un caso concreto.
- Recortar ejes y rangos con el instanciador de fonttools.
- Aplicar una tabla de decisión razonada en lugar de una regla general.
De qué está hecho el archivo
Una fuente variable contiene todo lo que contiene una estática —contornos, tabla de caracteres, kerning, hinting— y además:
fvar, la definición de los ejes y de las instancias nombradas.gvar, los deltas de cada punto de cada contorno por cada eje. Esta es, con diferencia, la tabla grande.HVARyMVAR, las variaciones de las métricas horizontales y generales.- Variaciones de las tablas de posicionamiento, para que el kerning siga siendo correcto en cada instancia.
gvar crece con el número de ejes y con el número de másters. Un eje de peso con tres másters añade bastante; tres ejes con másters en las esquinas del espacio añaden mucho más, porque los deltas se combinan.
Los órdenes de magnitud, con un subconjunto latino y en woff2:
| archivo | peso típico |
|---|---|
| estática, un peso | 15 a 25 KB |
| variable, un eje de peso | 35 a 60 KB |
| variable, dos ejes | 55 a 90 KB |
| variable, tres o más ejes | 70 a 140 KB |
El punto de equilibrio
Con esos rangos, la cuenta es directa. Tomando 20 KB por estática y 45 KB por variable de un eje:
| pesos que necesitas | estáticas | variable | gana |
|---|---|---|---|
| 1 | 20 KB | 45 KB | estáticas |
| 2 | 40 KB | 45 KB | empate |
| 3 | 60 KB | 45 KB | variable |
| 5 | 100 KB | 45 KB | variable, de lejos |
Y ahora la parte que estropea la cuenta bonita: la cursiva es otro archivo. Una familia variable completa son dos archivos, redonda y cursiva. Rehaciendo la tabla con cursivas:
| lo que necesitas | estáticas | variable |
|---|---|---|
| regular y negrita | 40 KB | 45 KB |
| regular, negrita y sus cursivas | 80 KB | 90 KB |
| cuatro pesos y sus cursivas | 160 KB | 90 KB |
Con dos pesos y cursivas, las estáticas ganan. Es exactamente la configuración más frecuente en un sitio de contenido, y es la razón por la que la respuesta correcta a “¿usamos variable?” tantas veces es que no.
Los casos donde la variable gana sin discusión son tres: muchos pesos, animar un eje —imposible con estáticas— y necesitar anchura u óptico, que las estáticas no ofrecen a menos que compres cortes condensados aparte.
Recortar el espacio de diseño
Aquí está la herramienta que cambia la cuenta y que casi nadie usa: una fuente variable se puede recortar antes de servirla. El instanciador de fonttools fija ejes o limita rangos y reescribe el archivo con los deltas que sobran eliminados.
# limitar el eje de peso al rango que de verdad usas
python3 -m fontTools.varLib.instancer texto-var.ttf \
wght=300:700 \
-o texto-300-700.ttf
# fijar un eje en un valor y eliminarlo del archivo
python3 -m fontTools.varLib.instancer texto-var.ttf \
wght=300:700 opsz=16 wdth=100 \
-o texto-recortada.ttf
La sintaxis distingue dos operaciones. wght=300:700 limita el eje: sigue siendo variable, con menos recorrido y menos deltas. opsz=16 fija el eje: deja de ser variable, se aplica ese valor y la tabla de variaciones correspondiente desaparece.
El ahorro típico de recortar un eje que no usabas está entre el 20% y el 40% del archivo. Es un comando, se ejecuta una vez en la construcción, y después hay que volver a subconjuntar y convertir a woff2:
pyftsubset texto-recortada.ttf \
--unicodes="U+0000-00FF,U+2000-206F,U+20AC" \
--layout-features="kern,liga,clig,calt,ccmp,mark,mkmk" \
--flavor=woff2 \
--output-file=texto.woff2
El orden importa: primero instanciar, después subconjuntar, y la conversión a woff2 al final.
La tabla de decisión
| situación | elección |
|---|---|
| uno o dos pesos, sin cursiva | estáticas |
| dos pesos con sus cursivas | estáticas, por poco |
| tres o más pesos | variable |
| animar el peso o el grado | variable, no hay alternativa |
| necesitas anchura o tamaño óptico | variable |
| tipografía de sistema | ninguna de las dos, y ahorras todo |
Y por encima de la tabla, la disciplina que la sustituye: mídelo tú. Genera los dos juegos con el mismo subconjunto y las mismas características de OpenType, y compara los tamaños reales. Cinco minutos de trabajo dan un número exacto para tu fuente concreta, y las tablas generales, esta incluida, dejan de hacer falta.
font-family: system-ui no descarga nada, se pinta en el primer fotograma, no tiene FOIT ni FOUT, no consume presupuesto y en cada plataforma es una tipografía cuidadosamente diseñada para pantalla. Para una herramienta interna, un panel de control o cualquier interfaz donde la marca no aporte, es una elección técnica excelente que además se toma en cero minutos. Compararla con la alternativa antes de empezar el trabajo de optimización evita optimizar algo que no hacía falta.
El argumento comercial de las fuentes variables compara un archivo contra seis, y esa comparación solo es válida si realmente ibas a servir seis. Lo que ocurre en la práctica es otra cosa, y es un patrón tan repetido que merece nombre propio: el equipo adopta la variable porque “es más eficiente”, diseña con la libertad de tener nueve pesos disponibles, y acaba usando dos en el noventa por ciento de la interfaz —porque las jerarquías reales no necesitan nueve— con lo que ha servido un archivo que pesa el doble de lo necesario para lograr exactamente lo que dos estáticas habrían dado por menos. La ironía es que el remedio es un solo comando de instancer que nadie ejecuta, porque el archivo llegó del proveedor como un artefacto terminado y a nadie se le ocurre que se puede recortar. La lección se generaliza más allá de la tipografía: un formato que ofrece capacidad no usada te está cobrando por ella, y la pregunta que separa la ingeniería de la adopción por moda es siempre la misma, “¿qué parte de esto voy a usar de verdad?”, seguida de la incómoda, “¿y qué me costaría eliminar el resto?”. Con las fuentes variables la respuesta a la segunda es media hora de trabajo en el proceso de construcción, y sale mucho más a cuenta que cualquier ajuste de font-display.