Zahlen und Einheiten

example of the month

Das Beispiel im September zeigt, wie man mit dem Paket siunitx Zahlen und Einheiten bequem eingeben und im ganzen Dokument einheitlich darstellen kann. Dabei betrachten wir die vom Paket zur Verfügung gestellten Befehle und einige der vielen Optionen, um die Darstellung zu verändern.

Einleitung

Bevor wir uns mit dem Paket beschäftigen, fragen wir uns, wozu es überhaupt notwenig ist, ein solches Paket zu benutzen und seine Befehle zu lernen. Schließlich kann man noch auch einfach $42,2 km$ schreiben. Kann man das? – Mitnichten! Denn die dazugehörige Ausgabe weißt gleich mehrere Fehler auf:

Schlechtes Beispiel – So sollen Zahlen und Einheiten nicht aussehen
  • Nach dem Dezimalkomma hat einen kleinen Abstand eingefügt, da es – von englischer Typografie ausgehend – annimmt, es handle sich dabei um eine Werte-Liste wie $n_1, n_2, n_3$.
  • Ein Abstand zwischen Wert und Einheit fehlt dagegen.
  • Außerdem sind die Einheitenzeichen kursiv, was den Konventionen widerspricht: Man schreibt Einheiten recto (normal) und Variablen kursiv.

Streng genommen entspricht $42,2 km$ also einer Liste mit den Elementen „Zweiundvierzig“ und „Zwei mal k mal m“.

Die zu einem typografisch und inhaltlich korrektem Ergebnis wie im folgenden Bild gezeigte Eingabe müsste $42{,}2\,\mathrm{km}$ lauten.

Korrigiertes Beispiel – So soll es aussehen

Die Ausgabe ist nun korrekt, die Eingabe aber wenig übersichtlich und spätestens, wenn Zehnerpotenzen und kompliziertere Einheiten benötigt werden, auch ziemlich umständlich. Da wäre es doch schön, wenn es ein Paket gäbe, das die Formatierung der Ausgabe übernimmt und die Eingabe vereinfacht. Und genau hier betritt siunitx die Bühne.

Datei zahlen_und_einheiten.tex

Für das Beispiel legen wir die Datei zahlen_und_einheiten.tex an und speichern diese ab.

Basics

Wir beginnen das Dokument mit dem Laden von ein paar Paketen.

Die Datei beginnt wie üblich mit der Angabe der Dokumentklasse (FAQ 2), der wir zwei Optionen übergeben: ngerman für deutsche Textvariablen und Silbentrennung und parskip, um einen Absatzabstand statt -einzug einzustellen. Dann laden wir ein paar Standardpakete (FAQ 3 und FAQ 4). Dabei müssen wir bei inputenc die zur Datei passende Kodierung angeben. Außerdem laden wir das Paket babel, dem wir über die Klassenoption ngerman die gewünschte Sprache bereits mitgeteilt haben (FAQ 5).

\documentclass[ngerman,parskip]{scrartcl}
 
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{babel}

Das Paket booktabs laden wir, um die Beispieltabelle schöner gestalten zu können.

\usepackage{booktabs}

siunitx laden

Nun laden wir das zentrale Paket dieses Beispiels und setzen einige Optionen.

\usepackage{siunitx}

Für das Setzen der Optionen verwenden wir den Befehl \sisetup, dessen Argument eine kommagetrennte Liste von Optionen ist.

\sisetup{

Mit der ersten Option stellen wir das Paket auf deutsche typografische Konventionen ein. Dadurch wird beispielsweise das Komma als Dezimaltrenner aktiviert.

   locale = DE,

Als nächstes stellen wir ein, dass gebrochene Einheiten als Bruch dargestellt werden. Die Darstellung kann u. a. auch auf negative Exponenten (reciprocal) oder einen Schrägstrich (symbol) geändert werden.

   per-mode = fraction,% | reciprocal | symbol | 

Der Fehler eines Wertes soll als ±-Angabe dargestellt werden, was wir durch diese Option erreichen.

   separate-uncertainty,

Mithilfe dieser Option aktivieren wir, dass eine Zehnerpotenz automatisch in einen Einheitenpräfix umgewandelt bzw. sogar auf einen eventuell vorhandenen angerechnet wird.

   exponent-to-prefix,

Durch Angabe dieser Option verlangen wir, dass Einheitenpräfixe als zusammengefasste Zehnerpotenz ausgegeben werden.

   prefixes-as-symbols = false,

Bezieht sich eine Einheit auf mehrere Werte, kann diese entweder wiederholt (repeat) werden oder die Werte werden geklammert (brackets). Mathematisch nicht ganz korrekt kann die Einheit auch nur hinter dem letzen Wert stehen (single).
Mit list-units stellen wir Wertelisten und mit range-units -bereiche ein. Für Werte mit Fehlerangabe verwenden wir multi-part-units.

   list-units = brackets,% | single | repeat
   range-units = brackets,% | single | repeat
   multi-part-units = brackets,% | single | repeat

Mithilfe der letzen Optionen richten wir Einheiten (ohne Wertangabe) in Tabellen linksbündig aus.

   table-unit-alignment = left,

Ende von \sisetup

}

Nach dieser Vorarbeit können wir ausprobieren, wie man Zahlen und Einheiten eingeben muss und wie sich die gemachten Einstellungen auf die Ausgabe auswirken. Dazu können wir einzelne Optionen auskommentieren.

\begin{document}

Zahlen ohne Einheit

Zunächst betrachten wir einheitenfreie Zahlen, die mit dem Befehl \num eingegeben werden. Außerdem probieren wir \ang für Winkel aus.

\section{Zahlen ohne Einheit}

Komma und Punkte werden als Dezimal­trenner akzeptiert und in der Ausgabe je nach Sprache einheitlich dargestellt.

\num{12345,67} oder \num{12345.67}

Eine führende Null können wir weglassen.

\num{,1234567}

Die Makros funktionieren übrigens sowohl im Text- als auch im Mathe-Modus.

$a$ ist \num{1,2} oder $a = \num{1,2}$

Wertebereiche werden mit \numrange und -listen mit \numlist angegeben, wobei die Elemente einer Liste mit Semikola getrennt werden.

\numrange{1,234}{5,678} und \numlist{1,2;3,45;6,7}

Die Zehnerpotenz kann einfach nach einem e angegeben werden. Alternativ könnten wir auch E, d oder D benutzen. Ein + wird in der Voreinstellung ignoriert.

\num{-1,23e45} und \num{+1,23e45}

+- beziehungsweise -+ werden in ± respektive ∓ umgewandelt.

\num{+-1,2e-3} oder \num{-+1,2e-3}

Auch Multiplikationen oder Divisionen können innerhalb von \num angeben werden, allerdings keine Addition oder Subtraktion!

\num{1,2 x 3,4 x 5,6} und \num{1,2 / 3,4}

Ein Fehler kann entweder mit Klammer oder +- angegeben werden. Wie beim Dezimaltrenner wird die Ausgabe vereinheitlicht. Zum Vergleich können wir die Option separate-uncertainty (de)aktivieren.

\num{1,23(4)} oder \num{1,23+-0,04}

Der Befehl \num hat ein optionales Argument, mit dem wird alle Einstellungen auf eine Zahl beschränken können. Dies ist sinnvoll, wenn wir eine Zahl automatisch runden lassen wollen. Dabei müssen wir sowohl die Genauigkeit als aus den Modus angeben.

\num[round-precision = 3, round-mode = places]{1,23456}

Bei Winkeln mit Minuten- und/oder Sekundenangaben, werden diese durch ein Semikolon getrennt, wobei die Angabe immer zwei Semikola enthalten muss. Alternativ kann ein Winkel auch dezimal angegeben werden.

\ang{12} genauer \ang{12;3;} noch genauer \ang{12;3;4}
oder \ang{12,05}

Einheiten ohne Wert

Als nächstes experimentieren wir mit „wertlosen“ Einheiten.

Die Einheiten können wir unmittelbar als Buchstaben oder über Makros eingeben, wobei es für gängige Einheiten Abkürzungen gibt. Allerdings funktionieren viele Optionen nur, wenn man eine der beiden letzten Methoden benutzt.

\si{km} oder \si{\km} oder \si{\kilo\meter}

Auch komplexere Einheiten können wir direkt eingeben, wobei wir die einzelnen Einheiten mit einem Punkt voneinander trennen müssen, um einen kleinen Abstand dazwischen zu erhalten. Grundsätzlich sollte aber die Eingabe über Macros bevorzugt werden!

\si{kg.m^2/mA.s^3}

Für Einheiten mit den Potenzen 2 und 3 gibt es die Befehle \square/\squared und \cubic/\cubed, die entweder vor oder nach der betreffenden Einheit benutzt werden können. Beide Formen werden äquivalent ausgewertet.
Das Präfix „Milli“ im Divisor können wir mit prefixes-as-symbols = false automatisch in eine Zehnerpotenz umwandeln lassen. Das „Kilo“ in „Kilogramm“ bleibt davon unberührt, weil „kg“ die Basiseinheit ist.

\si{\kg\m\squared\per\milli\A\per\s\cubed} oder
\si{\kilogram\meter\squared\per\milli\ampere\per\second\cubed} oder
\si{\kg\square\m\per\milli\A\per\cubic\s} oder
\si{\kilogram\square\meter\per\milli\ampere\per\cubic\second}

Für höhere Potenzen stehen uns \tothe bzw. \raiseto zur Verfügung.

\si{\per\meter\tothe{5}} oder \si{\per\raiseto{5}\meter}

Allen Einheiten unter dem Bruchstrich muss ein \per vorangestellt werden, sofern nicht die Option sticky-per gesetzt ist. In diesem Fall bezieht sich \per auf alle folgenden Einheiten.
Zu Demonstrationszwecken setzen wir die Option hier lokal über das optionale Argument von \si.

\si{\kg\m\squared\per\milli\A\s\cubed} ungleich
\si[sticky-per]{\kg\m\squared\per\milli\A\s\cubed}

Werte mit Einheit

Nun kommen wir zur wichtigsten Funktion, nämlich der Formatierung von Werten mit Einheiten. Dazu verwenden wir den Befehl \SI, der die Funktionen von \num und \si kombiniert.

\section{Zahlen mit Einheiten}

Im ersten Argument können wir alles eingeben, was wir bei \num kennengelernt haben, und das zweite Argument funktioniert analog zu dem von \si. Auch hier können wir die Auswirkung von separate-uncertainty probieren.

\SI{1,234(5)}{\celsius}

Mit der Option exponent-to-prefix wird die Zehnerpotenz korrekt auf das Präfix „Mega“ angerechnet und „Terra“ ausgegeben

\SI{1,23e6}{\mega\watt}

Auch \SI hat ein optionales Argument, das wir für lokale Einstellungen benutzen können. Wenn wir beim Runden keine Genauigkeit angeben, wird die Voreinstellung (zwei Stellen) benutzt.

\SI[round-mode = places]{12,34567}{\kJ}

Bereiche und Listen können wir mit \SIrange bzw. \SIlist angeben, wobei wir die Auswirkungen der Optionen range-units bzw. list-units beobachten können.

\SIrange{1,234}{2,456}{\mega\volt} oder
\SIlist{1,2;3,456;7,89}{\micro\angstrom}

Zahlen und Einheiten in Tabellen

Zuletzt wollen wir noch die Funktion betrachten, die es erlaubt, Zahlen (am Dezimaltrenner ausgerichtet) und Einheiten in Tabellen zu schreiben. Dafür stellt siunitx zwei neue Spaltentype S und s zur Verfügung.

\section{Zahlen und Einheiten in Tabellen}

Wir setzen die Tabelle in eine Gleitumgebung und zentrieren sie darin.

\begin{table}[hb]
   \centering

Die Tabelle soll drei Spalten haben: eine linksausgerichtet Textspalte (l), eine für Zahlen (S), wobei wir das Runden der Zahlen einstellen, und eine für Einheiten (s), in der gebrochene Einheiten mit einem Schrägstrich dargestellt werden sollen.

   \begin{tabular}{
      l
      S[round-mode=places]
      s[per-mode=symbol]
   }

Mit \toprule aus dem Paket booktabs erzeugen wir eine dicke Linie am Anfang der Tabelle. Auf vertikale Linien verzichten wir aus Gründen der besseren Lesbarkeit.

      \toprule

In der Kopfzeile müssen wir „Wert“ durch Klammern vor der Auswertung durch siuntix verbergen.

         Name & {Wert} & Einheit \\

Auf die Kopfzeile lassen wir eine dünnere Linie folgen.

      \midrule

Nun können wir exemplarisch drei Naturkonstanten eingeben …

         Lichtgeschwindigkeit $c$ & 2,99792458e8 & \m\per\s \\
         Gravitationskonstante $\gamma$ & 6,67428e-11 &
            \N\m\squared\per\kg\squared \\
         Elementarladung $e$ & 1,602176487e-19 & \coulomb \\

Und die Tabelle dann mit einer dickeren Linie abschließen.

      \bottomrule
   \end{tabular}

Mit \caption fügen wir der Tabelle noch eine Beschriftung hinzu.

   \caption{Naturkonstanten}
   % Werte aus Demtröder: Experimentalphysik 1, Berlin 2008.
\end{table}

Ende der Datei

\end{document}

Schlussbemerkung

Dieses Beispiel sollte einen kleinen Einblick in die Möglichkeiten von siunitx geben und dazu einladen, sich mit dem Paket und seinen Funktionen auseinander zu setzen. Die (englische) Anleitung ist sehr gut und leicht verständlich, weswegen im Beispiel nicht auf alle Funktionen im Detail eingegangen wurde. Außerdem wurden die Möglichkeiten, eigene Einheiten- oder Potenz-Makros zu definieren, sowie der Umgang mit Schriftarten nicht weiter berücksichtigt.

Um die Auswirkungen der Optionen unmittelbar vergleichen zu können, hätte man diese auch jeweils über das optionale Argument angeben können, wie das in der Dokumentation der Fall ist, allerdings setzt man in der Praxis die Optionen normalerweise global in der Präambel, weshalb wir das hier auch so gemacht haben.