El espacio entre el número y la unidad en «9,81 m/s²» no está ahí por estética. El Folleto del SI, publicado por la Conferencia General de Pesas y Medidas, afirma que ese espacio es un signo de multiplicación: una cantidad forma por tanto un todo indivisible que no debe partirse a final de línea. El paquete siunitx es la herramienta de LaTeX que asume toda esa familia de reglas. Esta página recorre los tres pilares de la versión 3 actual, \num, \unit y \qty, y responde de paso: por qué las unidades se componen en redonda, por qué las cifras se agrupan con un espacio y no con una coma, cómo la columna S alinea una tabla por el separador decimal, y cómo traducir los \SI y \si que aún aparecen en entradas antiguas.
Por qué no basta con escribir \mathrm{kg} a mano
Hacerlo a mano se rompe porque lo que hay que respetar no es cuestión de gusto sino una norma internacional, y tres de sus reglas actúan a la vez. La primera es la letra. El Folleto del SI establece que los símbolos de unidad «se imprimen en redonda, sea cual sea la letra del texto circundante», porque m, kg y s no son variables. Pero en el modo matemático de LaTeX las letras van inclinadas por defecto, de modo que un $9.81 kg$ pelado hace que la unidad parezca el producto de una k y una g cursivas. Escribir \mathrm{kg} arregla ese punto concreto, y un artículo tiene varias decenas de puntos así.
La segunda regla es el espacio. La sección 5.4.3 del Folleto establece que el valor numérico precede siempre a la unidad y que siempre se usa un espacio para separarlos, y a continuación explica que ese espacio se considera un signo de multiplicación. Ni 9.81kg ni 9.81 kg son correctos, por tanto. La única excepción que concede la norma son el grado, el minuto y el segundo de ángulo plano (°, ′, ″), ante los cuales no se deja espacio alguno. Por eso 30,2 °C y 22,20° pueden convivir en el mismo párrafo: el Celsius conserva su espacio, el ángulo no. Un documento contiene así los dos casos, «espacio antes de °» y «sin espacio antes de °», y mantener esa distinción a mano en varios centenares de apariciones no es, sinceramente, realista.
La tercera es que la pareja no debe romperse. Puesto que una cantidad es el producto de un número por una unidad, 9,81 no puede quedarse al final de una línea con m/s² abriendo la siguiente. siunitx prohíbe ese corte por defecto; solo se habilita a propósito con allow-quantity-breaks. Así que si una columna estrecha avisa de una underfull hbox, ese aviso no es un percance sino la regla haciendo su trabajo. Las tres cuestiones se resuelven con una línea en el preámbulo, \usepackage{siunitx}, con el beneficio añadido de que después basta cambiar un ajuste para cambiar el aspecto en todo el documento.
\usepackage{siunitx}
% by hand: three separate things to remember, every time
$9.81\,\mathrm{m}\,\mathrm{s}^{-2}$
% with siunitx: one command, and the standard is applied for you
\qty{9.81}{\metre\per\second\squared}
\qty{100}{\degreeCelsius} % 100 °C - space kept before the degree
\qty{10}{\percent} % 10 % - space here too
\ang{22.20} % 22.20° - but no space for a plane angle\num: qué le pasa a un número desnudo
\num{…} recibe un número por sí solo y resuelve la agrupación, los exponentes, los signos y el cero inicial conforme a la norma. \num{12345} da 12 345, \num{1.234e5} da 1,234 × 10⁵ y \num{.5} da 0,5. Este último detalle importa en silencio: el Folleto del SI exige que, si el número está entre +1 y −1, el separador decimal vaya siempre precedido de un cero, de modo que 0,234 es correcto y ,234 no. Escribir .5 en la fuente y obtener 0,5 en la salida ahorra más pulsaciones de las que parece.
Agrupar las cifras con un espacio y no con una coma no es gusto del autor del paquete. Lo fijó la resolución 7 de la 9.ª Conferencia General de Pesas y Medidas, en 1948: los números pueden dividirse en grupos de tres para facilitar la lectura, y «nunca se insertan puntos ni comas en los espacios entre grupos». La misma resolución describe el separador decimal como «la coma (uso francés) o el punto (uso británico)», una redacción que hoy se lee con cierta ternura. Conforme: 43 279,168 29; no conforme: 43.279,168.29. El valor por defecto de group-separator en siunitx es justamente ese espacio fino, \,.
La entrada, en cambio, es indulgente. El valor por defecto de input-decimal-markers es el par .,, de modo que \num{0,1234} y \num{0.1234} dan el mismo resultado. El de input-exponent-markers son las cuatro letras dDeE, así que hasta el 3.45d-4 de aire Fortran se lee como 3,45 × 10⁻⁴. En la práctica, esto significa que los números pegados directamente desde un CSV o desde el registro de un instrumento pueden usarse sin normalizar antes su formato. Lo único que \num no hace es multiplicar: en v3, los productos de números pasan por el comando dedicado \numproduct{1.2 x 3.4} (elementos separados por x). Ese reparto también sigue la norma, que prescribe usar solo el signo × al multiplicar números.
\num{12345} % 12 345 - grouped with a thin space, never a comma
\num{43279.16829} % 43 279.168 29
\num{1.234e5} % 1.234 x 10^5
\num{3.45d-4} % 3.45 x 10^-4 - Fortran-style d also works
\num{0,1234} % 0.1234 - comma accepted on input
\num{.5} % 0.5 - leading zero supplied
\num{-15673} % -15 673
\numproduct{1.2 x 3.4} % 1.2 x 3.4 - products need their own command¿Punto o coma decimal? locale y output-decimal-marker
Ambos son correctos: esa es la respuesta de la norma. La resolución 10 de la 22.ª Conferencia General de Pesas y Medidas, en 2003, estableció que el separador decimal «será el punto sobre la línea o la coma sobre la línea», y que el elegido «debe ser el que resulte habitual en la lengua y el contexto de que se trate». Componer 9,81 m/s² en un documento español, francés o alemán es por tanto tan correcto como componer 9.81 m/s² en uno inglés. Ninguno es la versión auténtica y el otro un acento. siunitx es honesto en esto por diseño: mantiene separado el formato de entrada del de salida.
Hay dos maneras de cambiar. Para un control fino, se fijan por separado el separador decimal de salida con output-decimal-marker y la agrupación de cifras con group-separator. Para cambiar de golpe toda una convención regional, se usa la opción locale; el paquete incluye configuraciones para UK, US, DE (Alemania), PL (Polonia), FR (Francia), SI (Eslovenia) y ZA (Sudáfrica). Lo esencial es que la fuente no tiene que cambiar: \qty[locale = DE]{6.789}{\metre} conserva el punto en el original e imprime 6,789 m. Eso es lo que hace viable publicar un mismo manuscrito en edición inglesa y en edición alemana.
Para una región que no viene incluida —la hispanohablante o la italianohablante, por ejemplo— locale no ofrece nada, así que se escribe a mano: \sisetup{output-decimal-marker = {,}}. Y ahí acecha una trampa fácil: pasar el separador decimal a coma y poner además la coma como separador de grupos. Con group-separator = {,} y output-decimal-marker = {,} a la vez, \num{12345.678} imprime 12,345,678, y ningún lector puede saber cuál de las comas es la decimal. Ese es el momento en que se entiende de primera mano por qué la resolución de 1948 se molestó en precisar que nunca se insertan puntos ni comas entre grupos. Dejar el separador de grupos en el espacio fino por defecto es la opción segura.
\qty[locale = DE]{6.789}{\metre} % 6,789 m - source keeps the point
\num[output-decimal-marker = {,}]{1.23} % 1,23
\num[group-separator = {,}]{12345} % 12,345 - US/UK habit, not SI
% document-wide, for a locale siunitx does not ship
\sisetup{output-decimal-marker = {,}} % group-separator stays a thin space
% do NOT do this: the output 12,345,678 is unreadable
% \sisetup{output-decimal-marker = {,}, group-separator = {,}}\unit: dos formas de escribir una unidad y qué hace \per
\unit{…} compone una unidad sola, y el argumento se escribe de dos maneras. El estilo literal teclea los símbolos directamente, como en \unit{kg.m/s^2}, donde el punto . es un producto entre unidades, / un cociente y ^ un superíndice. El estilo macro construye la unidad palabra a palabra con prefijos, unidades y potencias —\unit{\kilo\gram\metre\per\second\squared}—, casi como se leería la unidad en voz alta en inglés. El reparto práctico es claro: literal para una unidad puntual escrita con prisa, y macro cuando quizá más adelante quieras cambiar de golpe el aspecto de todas las unidades. Las opciones solo tienen agarre sobre la forma macro.
| Macro | Significado | Imprime |
|---|---|---|
\gram | Macro de unidad base; igual \metre \second \ampere \kelvin \mole \candela | g |
\kilo | Un prefijo; nunca válido solo, debe seguirle una unidad | k |
\kilogram | Unidad con prefijo en una sola palabra; mismo resultado que \kilo\gram | kg |
\per | Envía la unidad siguiente al denominador: \joule\per\mole | J mol⁻¹ |
\squared | Eleva al cuadrado la unidad anterior (posfijo); \cubed para el cubo | m² |
\square | Eleva al cuadrado la unidad siguiente (prefijo); \cubic para el cubo | m² |
\degreeCelsius | Grado Celsius; se mantiene un espacio delante, como exige la norma | °C |
\percent | Por ciento; reconocido para su uso con el SI y también precedido de espacio | % |
El aspecto de \per lo decide la opción per-mode, y ahí es donde más se equivocan los tutoriales antiguos: el valor por defecto es la potencia negativa. \unit{\metre\per\second\squared} imprime m s⁻², no m/s², y \unit{\kilo\gram\per\cubic\metre} imprime kg m⁻³, no kg/m³. Para una barra, per-mode = symbol; para una fracción apilada, per-mode = fraction. Basta escribir una vez \sisetup{per-mode = symbol} en el preámbulo y todas las unidades del documento siguen esa política.
Cuando se elige la barra, siunitx añade los paréntesis en silencio. La sección 5.4.6 del Folleto exige que, al dividir con barra, se usen paréntesis para evitar ambigüedad: (a/b)/c vale, a/b/c no. Por eso \unit[per-mode = symbol]{\joule\per\mole\per\kelvin} imprime J/(mol K) y no J/mol/K. Una regla que a mano se reduce a «acordarse de vigilar la segunda barra» queda aquí garantizada estructuralmente. El manual añade que en los casos complicados son preferibles los exponentes negativos, que es justamente por lo que per-mode = power es el valor por defecto.
\unit{kg.m/s^2} % kg m/s^2 - literal input, slash kept
\unit{\kilo\gram\metre\per\second\squared} % kg m s^-2 - default per-mode = power
\unit[per-mode = symbol]{\kilo\gram\per\cubic\metre} % kg/m^3
\unit{\joule\per\mole\per\kelvin} % J mol^-1 K^-1
\unit[per-mode = symbol]{\joule\per\mole\per\kelvin} % J/(mol K) - brackets added
\sisetup{per-mode = symbol} % one policy for the whole document\qty une número y unidad: rangos, listas y ángulos
\qty{número}{unidad} entrega su primer argumento a \num y el segundo a \unit, y coloca entre ambos el espacio que exige la norma. No hay notación nueva que aprender: lo que se podía escribir para \num y lo que se podía escribir para \unit sencillamente se ponen uno al lado del otro. La parte de unidad puede ir en forma macro (\metre\per\second\squared) o literal (m/s). \qty es la idea del comienzo de esta página —una cantidad es el producto de un número por una unidad— traducida directamente a un comando.
Los rangos y las listas tienen sus propios comandos, y la salida de \qtyrange{10}{20}{\metre} es la más llamativa: imprime 10 m to 20 m y no 10–20 m. También esto viene de la norma. El Folleto advierte de que las cantidades físicas unidas por un guion pueden leerse como valores negativos, de que escribir los valores con raya y una sola unidad es igualmente incorrecto porque una cantidad es una única entidad matemática, y de que se recomienda encarecidamente emplear la palabra «to». Las ganas de escribir 10–20 m en un encabezado de tabla son fuertes, y van contra la norma. \qtylist{10;20;30}{\metre} compone 10 m, 20 m and 30 m.
Los ángulos son el único caso que atiende \ang y no \qty. Como se señaló arriba, \ang{45} imprime 45° sin espacio, y pasando grados, minutos y segundos separados por punto y coma, \ang{45;30;15} da 45° 30′ 15″. La primera forma es la que conviene por defecto: el Folleto indica que, para los ángulos planos, en general es preferible dividir el grado decimalmente, de modo que 22,20° se prefiere a 22° 12′, salvo en campos como la navegación, la cartografía, la astronomía y la medida de ángulos muy pequeños. Los minutos y segundos son una herramienta para las disciplinas que los necesitan.
\qty{9.81}{\metre\per\second\squared} % 9.81 m s^-2
\qty{1.234e5}{\kilo\gram\per\cubic\metre} % 1.234 x 10^5 kg m^-3
\qty{2.998e8}{m/s} % literal units work here too
\qtyrange{10}{20}{\metre} % 10 m to 20 m - the word "to", not a dash
\qtylist{10;20;30}{\metre} % 10 m, 20 m and 30 m
\ang{22.20} % 22.20° - decimal degrees are preferred
\ang{45;30;15} % 45° 30' 15" - degrees; minutes; secondsLa incertidumbre entre paréntesis: \num{1.234(5)}
Un valor medido viene con su incertidumbre. siunitx lee los paréntesis de la entrada justamente así, de modo que \num{1.234(5)} compone 1,234(5). Esa notación entre paréntesis no es un invento de siunitx: es la forma que da el Folleto del SI en la sección 5.4.5, donde la masa del neutrón se escribe mₙ = 1,674 927 471(21) × 10⁻²⁷ kg y la cifra entre paréntesis es la incertidumbre típica referida a las últimas cifras del valor citado. Pasarle (…) a \num es, por tanto, escribir la entrada tal como la norma ya da por supuesto.
La presentación se elige con uncertainty-mode. El valor por defecto, compact, imprime la cifra entre paréntesis como dígitos del lugar menos significativo (\num{123.45(120)} → 123,45(120)), mientras que full imprime la incertidumbre como valor completo (→ 123,45(1,20)). Activar separate-uncertainty da la forma con \pm, 1,234 ± 0,005. Lo que merece atención ahí es a qué se aplica la unidad: escrito como 12,3 ± 0,4 kg, el ±0,4 parece no llevar ninguna. siunitx lo sabe, y \qty[separate-uncertainty]{12.3(4)}{\kilogram} pone los paréntesis por su cuenta e imprime (12,3 ± 0,4) kg.
\num{1.234(5)} % 1.234(5)
\num{123.45(120)} % 123.45(120) - compact, the default
\num[uncertainty-mode = full]{123.45(120)} % 123.45(1.20)
\num[separate-uncertainty]{1.234(5)} % 1.234 +- 0.005
\qty{12.3(4)}{\kilogram} % 12.3(4) kg
\qty[separate-uncertainty]{12.3(4)}{\kilogram} % (12.3 +- 0.4) kg - brackets addedAlinear una tabla por el separador decimal: la columna S y table-format
Escribe S en la especificación de columna en lugar de c, l o r, y los números de esa columna se alinean por el separador decimal. El contenido de las celdas lo lee el mismo analizador que \num, de modo que 1.2e3 pasa a 1,2 × 10³ y un 975,31 escrito con coma pasa a 975,31: una columna volcada desde un CSV se ordena sola. Esto también responde a una exigencia de la norma: el Folleto del SI le dedica una frase breve pero inequívoca — para los números de una tabla, el formato empleado no debe variar dentro de una misma columna.
El primer tropiezo es casi siempre el encabezado de columna. Si pones texto en una celda de una columna S, siunitx intentará leerlo como parte de un número, así que los encabezados van entre llaves, {Mass}; olvidarlo hace que se venga abajo la alineación de esa fila. Lo mismo vale para encabezados con unidades o llamadas de nota: protege el conjunto, {Mass / \unit{\gram}}. Para estabilizar el ancho de la columna, declara «dígitos enteros.dígitos decimales» con table-format. S[table-format = 4.1] reserva de antemano sitio para cuatro dígitos enteros y un decimal, de modo que añadir filas después no desplaza la columna. Con incertidumbres: S[table-format = 2.2(1), separate-uncertainty]; con exponentes: S[table-format = 1.3e2].
\begin{tabular}{@{}cS[table-format = 4.1]@{}}
\toprule
Entry & {Mass / \unit{\gram}} \\ % braces protect the heading text
\midrule
1 & 1234.5 \\
2 & 12.0 \\
3 & 6.7 \\
\bottomrule
\end{tabular}
% uncertainties and exponents get their own formats
% S[table-format = 2.2(1), separate-uncertainty] -> 12.34 +- 0.05
% S[table-format = 1.3e2]También hay una convención asentada para poner la unidad en el encabezado: no Length [m] sino Length / m, es decir, dividiendo por la unidad. El motivo es un choque de notaciones: en matemáticas [x] significa «la dimensión de x». Usar los corchetes como recipiente de unidades deja [a] ambiguo entre «dimensión de la aceleración» y «la unidad es m/s²». Dividir por la unidad deja en el cuerpo de la tabla solo números adimensionales, lo que encaja limpiamente con el trabajo de la columna S. Y cuando se quiere la misma alineación dentro de \multicolumn o \multirow, se usa \tablenum[table-format = …]{…}, la versión macro de la columna S.
La diferencia entre \SI y \qty: pasar de la v2 a la v3
Son el nombre antiguo y el nuevo de comandos que hacen el mismo trabajo: \SI es de la v2, \qty de la v3. El autor de siunitx, Joseph Wright, reescribió el paquete por dentro para la v3.0.0, publicada el 17 de mayo de 2021, y revisó los nombres de los comandos de documento para hacerlos «más descriptivos». El manual señala que \SI, \si, \SIrange y \SIlist siguen disponibles pero no se recomiendan para documentos nuevos; en su lugar debe usarse la familia \qty…. Solo \num y \ang conservaron su nombre a través del cambio.
| v2 (nombre antiguo) | v3 (actual) | Función |
|---|---|---|
\SI | \qty{9.81}{\metre\per\second\squared} | Número y unidad |
\si | \unit{\kilo\gram} | Solo la unidad |
\SIrange | \qtyrange{10}{20}{\metre} | Un rango (10 m to 20 m) |
\SIlist | \qtylist{10;20;30}{\metre} | Una lista (10 m, 20 m and 30 m) |
\num | \num{1.234e5} (nombre sin cambios) | Solo el número |
\ang | \ang{22.20} (nombre sin cambios) | Un ángulo plano |
La v3 también apretó la entrada. El caso llamativo son los prefijos: un prefijo sin unidad ya no se admite, y \unit{\kilo} se detiene con ! Package siunitx Error: Found prefix part with no unit. No es pedantería, sino alineamiento con la norma: la sección 5.2 del Folleto del SI lleva mucho diciendo que un prefijo nunca se usa aisladamente y que nunca se usan prefijos compuestos. Al menos una parte de lo que parece un cambio rompedor en la v3 es en realidad el paquete poniéndose al día con las reglas. Con el mismo criterio, los productos de números pasaron a \numproduct, los de cantidades a \qtyproduct, y los valores complejos al comando dedicado \complexnum.
Cuando un documento antiguo se niega en redondo a compilar bajo la v3, el comportamiento heredado puede invocarse en la carga: \usepackage{siunitx}[=v2]. Conviene verlo, eso sí, como soporte vital. La v3 asigna internamente muchos nombres antiguos de opciones a los nuevos y deja cada vez un aviso en el log. Un documento cuyo log está lleno de avisos de siunitx está diciendo que ha llegado la hora de renombrar. Para empezar algo nuevo bastan tres comandos: \num, \unit y \qty —el número solo, la unidad sola y ambos juntos—. Todos los detalles de la norma repasados en esta página se resuelven dentro de esos tres.
% v2 names: still work, no longer recommended for new documents
\SI{9.81}{\metre\per\second\squared}
\si{\kilo\gram}
% v3 names: use these
\qty{9.81}{\metre\per\second\squared}
\unit{\kilo\gram}
% a prefix on its own is now an error:
% ! Package siunitx Error: Found prefix part with no unit.
\unit{\kilo}
% last resort for a document that will not build with v3
\usepackage{siunitx}[=v2]