Einheiten (siunitx)

Der Abstand zwischen Zahl und Einheit in „9.81 m/s²“ ist keine Frage der Optik. Die SI-Broschüre der Generalkonferenz für Maß und Gewicht hält fest, dass dieser Abstand ein Multiplikationszeichen ist – eine Größe bildet deshalb eine einzige Einheit, die am Zeilenende nicht getrennt werden darf –, und siunitx ist das LaTeX-Paket, das dieses ganze Regelwerk übernimmt. Diese Seite folgt den drei Säulen der aktuellen Version 3, \num, \unit und \qty, und beantwortet unterwegs, warum Einheiten aufrecht gesetzt werden, warum Ziffern durch einen Abstand statt durch ein Komma gruppiert werden, wie die Spalte S eine Tabelle am Dezimaltrennzeichen ausrichtet und wie sich \SI und \si aus älteren Beiträgen übersetzen lassen.

Warum \mathrm{kg} von Hand nicht genügt

Von Hand scheitert es, weil hier nicht Geschmack, sondern eine internationale Norm gilt und gleich drei ihrer Regeln zugleich greifen. Die erste betrifft die Schrift. Die SI-Broschüre bestimmt, dass Einheitensymbole „unabhängig von der Schrift des umgebenden Textes aufrecht gesetzt werden“, denn m, kg und s sind keine Variablen. Buchstaben im LaTeX-Mathematikmodus sind jedoch standardmäßig geneigt, sodass ein nacktes $9.81 kg$ die Einheit wie das Produkt eines kursiven k und g aussehen lässt. \mathrm{kg} behebt diese eine Stelle – und in einer Arbeit gibt es einige Dutzend solcher Stellen.

Die zweite Regel ist der Abstand. Abschnitt 5.4.3 der Broschüre hält fest, dass der Zahlenwert stets vor der Einheit steht und stets ein Abstand beide trennt – und erklärt dann, dass dieser Abstand als Multiplikationszeichen gilt. Weder 9.81kg noch 9.81 kg ist also korrekt. Die einzige Ausnahme, die die Norm zulässt, sind Grad, Minute und Sekunde des ebenen Winkels (°, , ), vor denen gar kein Abstand steht. Deshalb können 30.2 °C und 22.20° im selben Absatz stehen: Celsius behält den Abstand, der Winkel nicht. Ein Dokument enthält somit beides – „Abstand vor °“ und „kein Abstand vor °“ –, und diese Unterscheidung über einige hundert Stellen hinweg von Hand sauber zu halten, ist schlicht unrealistisch.

Die dritte Regel: Das Paar darf nicht auseinanderfallen. Da eine Größe das Produkt aus Zahl und Einheit ist, darf 9.81 nie am Zeilenende stehen bleiben, während m/s² die nächste Zeile beginnt. siunitx verbietet diesen Umbruch standardmäßig; erlaubt wird er nur bewusst über allow-quantity-breaks. Meldet eine schmale Spalte also eine underfull hbox, ist diese Warnung kein Malheur, sondern die Regel bei der Arbeit. Alle drei Punkte erledigt eine einzige Zeile in der Präambel, \usepackage{siunitx} – mit dem Nebeneffekt, dass später eine einzige geänderte Einstellung das Erscheinungsbild im ganzen Dokument umstellt.

latex
\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: was mit einer nackten Zahl geschieht

\num{…} nimmt eine Zahl für sich und ordnet Gruppierung, Exponenten, Vorzeichen und die führende Null nach der Norm. \num{12345} ergibt 12 345, \num{1.234e5} ergibt 1.234 × 10⁵ und \num{.5} ergibt 0.5. Das Letzte ist stiller, aber wichtig: Die SI-Broschüre verlangt, dass dem Dezimaltrennzeichen bei Zahlen zwischen +1 und −1 immer eine Null vorangeht – also 0.234 und nicht .234. Im Quelltext .5 zu tippen und in der Ausgabe 0.5 zu bekommen, spart mehr Tastendrücke als es zunächst scheint.

Dass Ziffern durch einen Abstand und nicht durch ein Komma gruppiert werden, ist keine Vorliebe des Paketautors. Festgelegt wurde es 1948 in Resolution 7 der 9. Generalkonferenz für Maß und Gewicht: Zahlen dürfen zur besseren Lesbarkeit in Dreiergruppen geteilt werden, und „in die Zwischenräume zwischen den Gruppen werden niemals Punkte oder Kommata eingefügt“. Dieselbe Resolution beschreibt das Dezimaltrennzeichen als „das Komma (französische Praxis) oder den Punkt (britische Praxis)“ – eine heute recht liebenswerte Formulierung. Normgerecht ist also 43 279.168 29, normwidrig 43,279.168,29. Der Standardwert von group-separator in siunitx ist genau dieser schmale Abstand \,.

Die Eingabeseite ist dagegen nachsichtig. Der Standardwert von input-decimal-markers ist das Paar .,, sodass \num{0,1234} und \num{0.1234} dasselbe ergeben. Der Standardwert von input-exponent-markers sind die vier Buchstaben dDeE, sodass auch das Fortran-typische 3.45d-4 als 3.45 × 10⁻⁴ gelesen wird. Praktisch heißt das: Zahlen, die direkt aus einer CSV-Datei oder einem Messgeräteprotokoll kopiert wurden, können ohne vorheriges Vereinheitlichen eingesetzt werden. Nur multiplizieren tut \num nicht: In v3 laufen Produkte von Zahlen über den eigenen Befehl \numproduct{1.2 x 3.4} (Einträge durch x getrennt). Auch diese Aufteilung folgt der Norm, nach der beim Multiplizieren von Zahlen ausschließlich das Malzeichen × zu verwenden ist.

latex
\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

Dezimalpunkt oder Dezimalkomma? locale und output-decimal-marker

Beides ist richtig – so lautet die Antwort der Norm. Resolution 10 der 22. Generalkonferenz für Maß und Gewicht bestimmte 2003, das Dezimaltrennzeichen „soll entweder der Punkt auf der Linie oder das Komma auf der Linie sein“, und das gewählte Zeichen „soll dasjenige sein, das in der betreffenden Sprache und im betreffenden Kontext üblich ist“. 9,81 m/s² in einem deutschen, französischen oder spanischen Dokument zu setzen, ist damit genau so richtig wie 9.81 m/s² in einem englischen. Keines ist die echte Fassung und das andere ein Akzent. siunitx bleibt in seinem Aufbau dabei ehrlich und trennt das Eingabe- vom Ausgabeformat.

Umgestellt wird auf zwei Wegen. Für feine Kontrolle lassen sich das Dezimaltrennzeichen der Ausgabe über output-decimal-marker und die Zifferngruppierung über group-separator getrennt setzen. Um eine ganze regionale Konvention auf einmal zu wechseln, dient die Option locale; mitgeliefert werden Konfigurationen für UK, US, DE (Deutschland), PL (Polen), FR (Frankreich), SI (Slowenien) und ZA (Südafrika). Entscheidend ist, dass die Quelle unverändert bleibt: \qty[locale = DE]{6.789}{\metre} behält den Punkt im Quelltext und druckt 6,789 m. Genau das macht es praktikabel, ein Manuskript in einer englischen und einer deutschen Fassung herauszugeben.

Für eine nicht mitgelieferte Region – etwa den spanisch- oder italienischsprachigen Raum – bietet locale nichts, also wird es selbst geschrieben: \sisetup{output-decimal-marker = {,}}. Dabei lauert eine leicht übersehene Falle: das Dezimaltrennzeichen auf Komma zu stellen und dann auch noch den Gruppentrenner auf Komma zu setzen. Gelten group-separator = {,} und output-decimal-marker = {,} zugleich, druckt \num{12345.678} den Wert 12,345,678, und niemand kann erkennen, welches Komma das Dezimaltrennzeichen ist. In diesem Moment wird handgreiflich klar, warum die Resolution von 1948 eigens festhielt, dass zwischen den Gruppen niemals Punkte oder Kommata eingefügt werden. Den Gruppentrenner beim voreingestellten schmalen Abstand zu belassen, ist die sichere Wahl.

latex
\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: zwei Schreibweisen für Einheiten und was \per bewirkt

\unit{…} setzt eine Einheit für sich, und das Argument lässt sich auf zwei Arten schreiben. Der literale Stil tippt die Symbole direkt, etwa \unit{kg.m/s^2}, wobei der Punkt . ein Produkt zwischen Einheiten ist, / ein Quotient und ^ eine Hochstellung. Der Makro-Stil baut die Einheit Wort für Wort aus Präfixen, Einheiten und Potenzen auf – \unit{\kilo\gram\metre\per\second\squared} –, ganz so, wie man die Einheit auf Englisch vorlesen würde. Die praktische Trennlinie ist klar: literal für eine einmalige, schnell hingeschriebene Einheit, Makro, wenn später einmal das Aussehen aller Einheiten auf einen Schlag geändert werden soll. Optionen greifen nur bei der Makroform.

MakroBedeutungAusgabe
\gramMakro für eine Basiseinheit; ebenso \metre \second \ampere \kelvin \mole \candelag
\kiloEin Präfix; allein nie gültig, es muss eine Einheit folgenk
\kilogramPräfigierte Einheit als ein Wort; gleiches Ergebnis wie \kilo\gramkg
\perSchickt die folgende Einheit in den Nenner: \joule\per\moleJ mol⁻¹
\squaredQuadriert die vorangehende Einheit (nachgestellt); \cubed für die dritte Potenz
\squareQuadriert die folgende Einheit (vorangestellt); \cubic für die dritte Potenz
\degreeCelsiusGrad Celsius; davor bleibt normgemäß ein Abstand°C
\percentProzent; zur Verwendung mit dem SI anerkannt und ebenfalls mit Abstand davor%

Wie \per aussieht, entscheidet die Option per-mode – und genau hier irren ältere Anleitungen am häufigsten: Standard ist die negative Potenz. \unit{\metre\per\second\squared} druckt m s⁻², nicht m/s², und \unit{\kilo\gram\per\cubic\metre} druckt kg m⁻³, nicht kg/m³. Für einen Schrägstrich dient per-mode = symbol, für einen gestapelten Bruch per-mode = fraction. Ein einmaliges \sisetup{per-mode = symbol} in der Präambel genügt, und jede Einheit im Dokument folgt dieser Vorgabe.

Wird der Schrägstrich gewählt, ergänzt siunitx stillschweigend Klammern. Abschnitt 5.4.6 der Broschüre verlangt, dass beim Dividieren mit Schrägstrich Klammern gesetzt werden, um Mehrdeutigkeit zu vermeiden: (a/b)/c ist zulässig, a/b/c nicht. Deshalb druckt \unit[per-mode = symbol]{\joule\per\mole\per\kelvin} den Ausdruck J/(mol K) und nicht J/mol/K. Eine Regel, die von Hand nur als „auf den zweiten Schrägstrich achten“ existiert, wird so strukturell durchgesetzt. Das Handbuch ergänzt, dass in komplizierten Fällen negative Exponenten vorzuziehen sind – genau deshalb ist per-mode = power die Voreinstellung.

latex
\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 fasst Zahl und Einheit zusammen – Bereiche, Listen und Winkel

\qty{Zahl}{Einheit} reicht das erste Argument an \num und das zweite an \unit weiter und setzt den normgerechten Abstand dazwischen. Es gibt also keine neue Notation zu lernen: Was für \num schreibbar war und was für \unit schreibbar war, steht einfach nebeneinander. Der Einheitenteil darf in Makroform (\metre\per\second\squared) oder literal (m/s) stehen. \qty ist der Gedanke vom Anfang dieser Seite – eine Größe ist das Produkt aus Zahl und Einheit – unmittelbar in einen Befehl übersetzt.

Für Bereiche und Listen gibt es eigene Befehle, und die Ausgabe von \qtyrange{10}{20}{\metre} sticht heraus: Sie lautet 10 m to 20 m und nicht 10–20 m. Auch das kommt aus der Norm. Die Broschüre warnt, dass mit einem Strich verbundene physikalische Größen als negative Werte missverstanden werden können, dass die Werte mit Halbgeviertstrich und nur einer Einheit zu schreiben ebenso falsch ist, da eine Größe eine einzige mathematische Einheit bildet, und dass die Verwendung des Wortes „to“ nachdrücklich empfohlen wird. Der Drang, in einer Tabellenüberschrift 10–20 m zu schreiben, ist groß – und normwidrig. \qtylist{10;20;30}{\metre} setzt 10 m, 20 m and 30 m.

Winkel sind der eine Fall, der von \ang statt von \qty bearbeitet wird. Wie oben erwähnt, druckt \ang{45} ein 45° ohne Abstand, und Grad, Minuten und Sekunden durch Semikolon getrennt ergeben mit \ang{45;30;15} die Form 45° 30′ 15″. Die erste Form ist der Normalfall: Die Broschüre hält fest, dass es bei ebenen Winkeln im Allgemeinen vorzuziehen ist, das Grad dezimal zu unterteilen, sodass 22.20° gegenüber 22° 12′ bevorzugt wird – außer in Bereichen wie Navigation, Kartografie, Astronomie und bei der Messung sehr kleiner Winkel. Minuten und Sekunden sind ein Werkzeug für die Fächer, die es brauchen.

latex
\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; seconds

Unsicherheit in Klammern: \num{1.234(5)}

Messwerte kommen mit einer Unsicherheit. siunitx liest runde Klammern in der Eingabe genau so, sodass \num{1.234(5)} den Ausdruck 1.234(5) setzt. Die Klammerschreibweise ist keine Erfindung von siunitx, sondern die Form, die die SI-Broschüre in Abschnitt 5.4.5 angibt: Dort steht die Masse des Neutrons als mₙ = 1.674 927 471(21) × 10⁻²⁷ kg, und die Zahl in Klammern ist die auf die letzten Stellen des angegebenen Werts bezogene Standardunsicherheit. (…) an \num zu übergeben heißt also, die Eingabe so zu schreiben, wie die Norm es ohnehin voraussetzt.

Die Darstellung wird über uncertainty-mode gewählt. Die Voreinstellung compact druckt die eingeklammerte Zahl als Ziffern der niedrigstwertigen Stelle (\num{123.45(120)}123.45(120)), während full die Unsicherheit als vollständigen Wert druckt (→ 123.45(1.20)). Mit separate-uncertainty entsteht die \pm-Form 1.234 ± 0.005. Beachtung verdient dabei, worauf sich die Einheit bezieht: Geschrieben als 12.3 ± 0.4 kg sieht das ±0.4 aus, als trüge es keine Einheit. siunitx weiß das, und \qty[separate-uncertainty]{12.3(4)}{\kilogram} ergänzt die Klammern selbst und druckt (12.3 ± 0.4) kg.

latex
\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 added

Tabellen am Dezimaltrennzeichen ausrichten: die S-Spalte und table-format

Steht in der Spaltenspezifikation S statt c, l oder r, richten sich die Zahlen dieser Spalte am Dezimaltrennzeichen aus. Der Zellinhalt wird vom selben Parser wie bei \num gelesen, sodass 1.2e3 zu 1.2 × 10³ und ein mit Komma geschriebenes 975,31 zu 975.31 wird – eine aus einer CSV-Datei eingefüllte Spalte ordnet sich also von selbst. Auch das erfüllt eine Forderung der Norm: Die SI-Broschüre widmet ihr einen kurzen, aber unmissverständlichen Satz – bei Zahlen in einer Tabelle soll das verwendete Format innerhalb einer Spalte nicht wechseln.

Der erste Stolperstein ist fast immer die Spaltenüberschrift. Steht Text in einer Zelle einer S-Spalte, versucht siunitx, ihn als Teil einer Zahl zu lesen – Überschriften gehören daher in geschweifte Klammern, {Mass}; wird das vergessen, bricht die Ausrichtung genau dieser Zeile zusammen. Für Überschriften mit Einheiten oder Fußnotenzeichen gilt dasselbe: das Ganze schützen, {Mass / \unit{\gram}}. Um die Spaltenbreite ruhig zu halten, wird mit table-format „Ganzzahlstellen.Dezimalstellen“ deklariert. S[table-format = 4.1] reserviert im Voraus Platz für vier Ganzzahlstellen und eine Dezimalstelle, sodass später hinzugefügte Zeilen die Spalte nicht verschieben. Mit Unsicherheiten: S[table-format = 2.2(1), separate-uncertainty]; mit Exponenten: S[table-format = 1.3e2].

latex
\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]

Auch für die Einheit in der Überschrift gibt es eine feste Konvention: nicht Length [m], sondern Length / m, also die Division durch die Einheit. Der Grund ist ein Notationskonflikt – in der Mathematik bedeutet [x] „die Dimension von x“. Werden eckige Klammern als Behälter für Einheiten zweckentfremdet, ist [a] mehrdeutig zwischen „Dimension der Beschleunigung“ und „Einheit ist m/s²“. Die Division durch die Einheit lässt im Tabellenkörper nur dimensionslose Zahlen übrig, was sich sauber mit der Aufgabe der S-Spalte deckt. Wird dieselbe Ausrichtung innerhalb von \multicolumn oder \multirow gebraucht, dient \tablenum[table-format = …]{…} als Makropendant zur S-Spalte.

Der Unterschied zwischen \SI und \qty: von v2 auf v3 wechseln

Es sind der alte und der neue Name für Befehle mit derselben Aufgabe: \SI gehört zu v2, \qty zu v3. Der Autor von siunitx, Joseph Wright, hat das Paket für v3.0.0, veröffentlicht am 17. Mai 2021, intern neu geschrieben und die Dokumentbefehle „aussagekräftiger“ benannt. Das Handbuch hält fest, dass \SI, \si, \SIrange und \SIlist weiterhin verfügbar, für neue Dokumente aber nicht empfohlen sind; stattdessen gehört die \qty…-Familie verwendet. Nur \num und \ang haben ihre Namen über den Wechsel hinweg behalten.

v2 (alter Name)v3 (aktuell)Aufgabe
\SI\qty{9.81}{\metre\per\second\squared}Zahl und Einheit
\si\unit{\kilo\gram}Nur die Einheit
\SIrange\qtyrange{10}{20}{\metre}Ein Bereich (10 m to 20 m)
\SIlist\qtylist{10;20;30}{\metre}Eine Liste (10 m, 20 m and 30 m)
\num\num{1.234e5} (Name unverändert)Nur die Zahl
\ang\ang{22.20} (Name unverändert)Ein ebener Winkel

v3 hat die Eingabe außerdem etwas verschärft. Auffällig sind die Präfixe: Ein Präfix ohne Einheit ist nicht mehr zulässig, und \unit{\kilo} bricht mit ! Package siunitx Error: Found prefix part with no unit. ab. Das ist keine Schikane, sondern eine Angleichung an die Norm – Abschnitt 5.2 der SI-Broschüre hält seit Langem fest, dass ein Präfix nie allein und dass zusammengesetzte Präfixe nie verwendet werden. Zumindest ein Teil dessen, was in v3 wie ein Bruch aussieht, ist in Wahrheit das Paket, das die Regeln einholt. Im selben Sinn wanderten Produkte von Zahlen zu \numproduct, Produkte von Größen zu \qtyproduct und komplexe Werte zum eigenen \complexnum.

Lässt sich ein altes Dokument unter v3 partout nicht übersetzen, kann das alte Verhalten beim Laden angefordert werden: \usepackage{siunitx}[=v2]. Das ist allerdings als lebensverlängernde Maßnahme zu verstehen. v3 bildet viele alte Optionsnamen intern auf neue ab und hinterlässt dabei jedes Mal eine Warnung im Log. Ein Dokument, dessen Log voller siunitx-Warnungen steht, signalisiert, dass es Zeit zum Umbenennen ist. Wer neu anfängt, muss nur drei Befehle lernen: \num, \unit und \qty – die Zahl allein, die Einheit allein und beides zusammen. Jedes auf dieser Seite behandelte Detail der Norm wird innerhalb dieser drei erledigt.

latex
% 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]