physics / braket / tensor

physics dürfte das am eifrigsten empfohlene und zugleich am lautesten kritisierte Paket in LaTeX sein. \dv{f}{x} für eine Ableitung, \qty(...) für selbstskalierende Klammern, \ket{\psi} für einen Ket – es schreibt sich wirklich angenehm. Doch das Paket schreibt stillschweigend Befehle um, die im Dokument bereits verwendet werden. \div ist nicht länger das Divisionszeichen ÷, sondern eine Divergenz; \Re ist nicht länger das frakturartige ℜ, sondern ein aufrechtes „Re“. Diese Seite behandelt physics, die Neuentwicklung physics2, den auf Dirac-Notation spezialisierten braket und tensor für ausgerichtete Indizes und beantwortet die Frage „Womit fängt man heute an?“ anhand tatsächlich kompilierter und gemessener Ergebnisse.

Was \usepackage{physics} tatsächlich liefert

Eine Zeile, und die in der Physik wiederkehrenden Formen werden zu kurzen Befehlen. physics von Sergio C. de la Barrera benötigt intern xparse und amsmath und lädt amsmath selbst, sodass es nicht eigens genannt werden muss. Das Angebot gliedert sich in fünf Gruppen: selbstskalierende Begrenzer (\qty, \abs, \norm, \eval, \order); Vektoranalysis (\grad, \div, \curl, \laplacian, das Skalarprodukt \vdot, das Kreuzprodukt \cross); Ableitungen (\dv, \pdv, \fdv, \dd); Dirac-Notation (\bra, \ket, \braket, \ketbra, \dyad, \expectationvalue, \matrixelement); sowie Kurzformen für Matrizen und Klammern (\mqty, \smqty, \pqty, \bqty, \Bqty, \vqty, der Kommutator \comm, der Antikommutator \acomm, die Poisson-Klammer \pb und die fetten Vektoren \vb, \va, \vu).

latex
\usepackage{physics}

\[
  \dv{f}{x}, \qquad \dv[2]{f}{x}, \qquad \pdv{f}{x}{y},
  \qquad \int_0^1 f(x) \dd{x}
\]
\[
  \abs{\frac{a}{b}}, \qquad \norm{\vb{v}}, \qquad
  \eval{x^2}_0^\infty, \qquad \qty( \frac{1}{2} )
\]

Die Ableitungen sind das Aushängeschild. \dv ändert seine Gestalt mit der Zahl der Argumente: \dv{x} setzt den Operator d/dx, \dv{f}{x} setzt df/dx. Die Ordnung steht im optionalen Argument – \dv[2]{f}{x} ergibt d²f/dx², \dv[n]{f}{x} ergibt dⁿf/dxⁿ. Das d wird standardmäßig aufrecht gesetzt; \usepackage[italicdiff]{physics} schaltet auf ein kursives d um. Das gesternte \dv*{f}{x} liefert die schräg gesetzte \flatfrac-Form. Die partielle Ableitung \pdv folgt derselben Systematik, nur die gemischte nimmt drei Argumente: \pdv{f}{x}{y} ergibt ∂²f/∂x∂y. Das Differentialelement selbst ist \dd: \dd{x} setzt dx mit geordnetem Abstand, \dd[3]{x} setzt d³x. Bei den Begrenzern liefern \qty(...), \qty[...] und \qty{...} runde, eckige und geschweifte Klammern, die jeweils auf die Höhe ihres Inhalts wachsen.

Was physics stillschweigend umdefiniert: \div, \Re, \sin

Keine Warnung, kein Fehler. Nur die Ausgabe ändert sich. Ein Blick auf \meaning unter TeX Live 2024 bestätigt es: Vor dem Laden von physics ist \div gleich \mathchar"2204 – das Divisionszeichen ÷. Danach ist \div eine Divergenz, und das ursprüngliche ÷ wurde unter dem Namen \divisionsymbol beiseitegelegt. Setzt man beides im selben Dokument und liest den Text aus dem PDF, ergibt $a \div b$ „a∇ · b“, $a \divisionsymbol b$ dagegen „a ÷ b“. Auch die Breiten unterscheiden sich: 26,79959 pt gegenüber 21,79968 pt. Ein \usepackage{physics} in einem bestehenden Dokument, das \div für die Division verwendete, ändert also stillschweigend die Bedeutung seiner Formeln.

\Re und \Im ändern sich sichtbar. Die betreffende Zeile in physics.sty lautet \let\real\Re \DeclareDocumentCommand\Re{g}{…\operatorname{Re}…} – das frakturartige ℜ wird also durch einen aufrechten Operator „Re“ ersetzt. Setzt man beides im selben Dokument, ergibt $\Re z$ „Re z“, das beiseitegelegte $\real z$ dagegen „ℜz“. Genauso ergeht es den benannten Funktionen: \sin, \cos, \tan, \log, \ln, \exp und \det werden durch Fassungen ersetzt, die ihr Argument automatisch einklammern, und die Originale bleiben unter längeren Namen erhalten – \sine, \cosine, \tangent, \logarithm, \naturallogarithm, \exponential, \determinant. Nur der trigonometrische Austausch lässt sich abschalten, mit \usepackage[notrig]{physics}.

BefehlOhne physicsMit physics (wohin das Original ging)
\div÷, das DivisionszeichenDivergenz ∇·; das alte ÷ wandert zu \divisionsymbol
\Reℜ, Frakturdas aufrechte \operatorname{Re}; das Original wandert zu \real
\Imℑ, Frakturdas aufrechte \operatorname{Im}; das Original wandert zu \imaginary
\sinsin, Klammern selbst setzenklammert das Argument automatisch; Original unter \sine; mit notrig abschaltbar
\detdetebenfalls automatisch geklammert; Original unter \determinant

Schreibt man \dv{f}{x}(g), verschwindet das (g)

Ein Teil der Formel verschwindet aus der Ausgabe – ohne Fehler und ohne Warnung. Das wiegt weit schwerer als „es sieht falsch aus“, daher hier die Messung. Unter TeX Live 2024 misst \sbox0{$\dv{f}{x}$} 11,50076 pt Breite, und \sbox0{$\dv{f}{x}(g)$} misst ebenfalls 11,50076 ptexakt dasselbe. Liest man den Text aus dem PDF, liefern beide nur „df/dx“; das (g) fehlt.

Die Ursache liegt in der Argumentdeklaration. \derivative in physics.sty ist mit der Signatur { s o m g d() } deklariert, und dieses abschließende d() schluckt eine folgende geklammerte Gruppe als Argument. Es existiert für die „Langform“ \dv{x}(\Psi), bei der d/dx auf den Klammerinhalt wirkt. Doch in dem Zweig, der greift, wenn g (hier x) angegeben wurde, verweist der Makrorumpf überhaupt nicht auf das d()-Argument. Das (g) wird also gelesen und dann verworfen. Zwei Auswege: eine leere Gruppe {} dazwischensetzen oder einen ausdrücklichen Zwischenraum. Gemessen ergibt $\dv{f}{x}{}(g)$ 24,40703 pt und $\dv{f}{x}\,(g)$ 26,07365 pt, und in beiden überlebt das (g) in der Ausgabe. Dasselbe d() hängt an \grad, \div, \curl, \laplacian, \dd, \pdv und \fdv; eine folgende Klammer verlangt daher überall Aufmerksamkeit.

latex
% the (g) is read as the trailing d() argument and then thrown away:
% this prints df/dx and nothing else
$\dv{f}{x}(g)$

% either of these keeps the (g)
$\dv{f}{x}{}(g)$
$\dv{f}{x}\,(g)$

Dieses Verhalten kommt auf tex.stackexchange immer wieder zur Sprache, bis hin zu einem Paket namens physics-patch, das es korrigiert. Dass ein solcher Patch so lange nötig ist, wiegt bei der Auswahl selbst schon etwas.

Der \qty-Konflikt mit siunitx – die Ladereihenfolge hilft nicht

Das Ergebnis ist in beiden Reihenfolgen identisch, und physics gewinnt. siunitx, der Standard für den Satz von Einheiten, führte in neueren Versionen \qty als Befehl für Größen ein und kollidiert damit namentlich mit dem \qty von physics. Lädt man beide und übersetzt, meldet siunitx: Package siunitx Warning: Detected the "physics" package: omitting definition of \qty. Es liefert sogar den Ausweg gleich mit und rät, \AtBeginDocument{\RenewCommandCopy\qty\SI} in die Präambel zu setzen. In diesem Zustand wird eine Einheit \qty{2}{\metre} stattdessen vom \qty aus physics aufgegriffen und scheitert mit ! Missing $ inserted. Ob \usepackage{physics} davor oder danach steht, machte keinen Unterschied: Warnung und Fehler fielen Wort für Wort gleich aus.

Eine Einzelheit lässt sich hier kaum überlesen. Im Inneren von siunitx.sty steht die Zeile \@ifpackageloaded{physics}siunitx nennt physics beim Paketnamen und tritt zur Seite. Dass ein mehrere tausend Zeilen umfassendes Hauptpaket ein namentlich fest verdrahtetes Zugeständnis an ein anderes Paket enthält, ist im LaTeX-Ökosystem ein ungewöhnlicher Anblick und sagt einiges darüber, wie oft dieser Konflikt getroffen wurde.

\abs in physics und mathtools – der Stern bedeutet das Gegenteil

Lädt man beide, wird \abs das aus physics – und der Stern kehrt seine Bedeutung um. Ein \DeclarePairedDelimiter\abs{\lvert}{\rvert} mit mathtools, gefolgt von \usepackage{physics}, erzeugte keinen einzigen Fehler: physics überschreibt es stillschweigend. Das Verhalten ist jedoch genau vertauscht. Gemessen: In der mathtools-Fassung ist \abs{\frac ab} 7,5 pt hoch (fest) und \abs*{\frac ab} 8,50006 pt (automatisch gedehnt). In der physics-Fassung ist \abs{\frac ab} 8,50006 pt (automatisch gedehnt) und \abs*{\frac ab} 7,5 pt (fest). Anders gesagt: mathtools dehnt mit dem Stern, physics hört mit dem Stern auf zu dehnen.

Auch die Schreibweise für die Größenwahl unterscheidet sich. mathtools nimmt sie in eckigen Klammern, \abs[\big]{x}; physics direkt danach, \abs\big{x}. Verwendet man die mathtools-Schreibweise bei geladenem physics, erscheint ! Missing delimiter (. inserted). und auf der Seite bleibt die kaputte Ausgabe „[] ||x“ zurück. Wer beide mischen will, kommt an dieser Unverträglichkeit nicht vorbei. Praktisch lautet die Antwort: sich für eines entscheiden.

physics2 – die Neuentwicklung, die nichts überschreibt

Führt man dieselbe Prüfung mit physics2 durch, wurde kein einziger Standardbefehl umgeschrieben. Lädt man physics2 von Zhang Tingxuan und liest \meaning aus, ist \div weiterhin \mathchar"2204 (÷), \Re ist \mathchar"23C und \Im ist \mathchar"23D (weiterhin Fraktur), \sin behält seine Standarddefinition, und \qty ist undefiniert. Im Satz ergibt $a\div b$ „a ÷ b“, $\Re z$ ergibt „ℜz“ und $\sin(x)$ ergibt „sin(x)“ – identisch mit reinem LaTeX. Zusammen mit siunitx gab es null Warnungen und null Fehler, und \qty{2}{\metre} wurde korrekt als „2 m“ gesetzt. In TeX Live 2024 liegt v1.0.1 vom 10.01.2024 bei.

Der Entwurfsunterschied zeigt sich beim Laden. Während physics alles auf einmal hereinholt, lässt physics2 Module einzeln aktivieren. Nach \usepackage{physics2} schreibt man etwa \usephysicsmodule{ab,braket} und holt nur, was gebraucht wird. In TeX Live 2024 liegen die Module ab (selbstskalierende Begrenzer), ab.braket, braket, diagmat (Diagonalmatrizen), xmat (allgemeine Matrizen) und doubleprod bei, dazu ab.legacy, bm-um.legacy, nabla.legacy, op.legacy und qtext.legacy für Umsteigende von physics. Der Preis dafür, den Namensraum nicht zu verschmutzen, sind weniger knappe Namen als bei physics: Begrenzer heißen \ab(...), \ab[...], \ab\{...\}, \ab|...|, \ab<...>; eine Diagonalmatrix ist \pdiagmat{1,2,3}; eine Matrix ist \pxmat{a}{2}{2}.

latex
\usepackage{physics2}
\usephysicsmodule{ab,braket,diagmat,xmat}

\[
  \ab(\frac{a}{b}), \quad \ab[\frac{a}{b}], \quad \ab|\frac{a}{b}|
\]
\[
  \bra{\phi}, \quad \ket{\psi}, \quad \braket{a}{b}, \quad \ketbra{a}{b}
\]
\[
  \pdiagmat{1,2,3}, \qquad \pxmat{a}{2}{2}
\]

Ein praktischer Hinweis: Die Module ab.braket und braket lassen sich nicht gemeinsam laden. Führt man beide in \usephysicsmodule auf, erscheint Package physics2 Warning: You cannot load 'ab.braket' and 'braket' modules together., und nur eines bleibt aktiv. Beide bieten Dirac-Notation: ab.braket setzt auf der Skalierungsmechanik von ab auf, braket steht für sich. Als praktisches Fazit: Für ein Dokument, das jetzt beginnt, ist physics2 die sichere Wahl; bei einem bestehenden physics-Dokument sind die Kosten des Umschreibens gegen die Nebenwirkungen auf \div, \Re und \qty abzuwägen. Geht es allein um Ableitungen, behandelt das Paket derivative hohe Ordnungen und mehrere Variablen sauber, und fixdif ordnet den Satz von Differentialoperatoren.

Das Paket braket – Großbuchstaben dehnen sich, Kleinbuchstaben nicht

Wenn nur Dirac-Notation gebraucht wird, ist braket von Donald Arseneau die minimale Antwort. Eine Zeile, \usepackage{braket}, und es gibt nur zwei Befehlsfamilien: die fest großen Kleinbuchstabenformen \bra{ }, \ket{ }, \braket{ }, \set{ } und die automatisch dehnbaren Großbuchstabenformen \Bra{ }, \Ket{ }, \Braket{ }, \Set{ }. Der Vorzug der Großformen: Ein senkrechter Strich |, der direkt im Argument steht, dehnt sich mit den äußeren Begrenzern. In \Braket wächst jeder innere | auf die Höhe der Argumente, in \Set der erste |. Für einen Doppelstrich dient \| oder der lokale Alias ||.

latex
% braket: one argument, the bars written inside it
\Braket{ \phi | \frac{\partial^2}{\partial t^2} | \psi }

\Set{ x \in \mathbf{R}^2 | 0 < {|x|} < 5 }

Zu beachten ist, dass die Argumente anders gezählt werden als bei physics. Das \braket{a}{b} von physics nimmt zwei Argumente, das \braket{a|b} von braket nimmt eines, und den Trennstrich schreibt man selbst. Im Beispiel oben setzt das erste das Matrixelement ⟨φ| ∂²/∂t² |ψ⟩, wobei die äußeren spitzen Klammern und beide inneren Striche auf die Höhe des Operators gedehnt werden. Das zweite setzt die Menge { x ∈ R² | 0 < |x| < 5 }; die äußeren geschweiften Klammern und der Trennstrich dehnen sich, während das innere |x|, als {|x|} gekapselt, fest bleibt. Ferner definiert braket kein \ketbra für das äußere Produkt – der Autor empfiehlt stattdessen \ket{ }\bra{ }.

Das Paket tensor – obere und untere Indizes in der richtigen Reihenfolge

Bei Tensoren ist die waagerechte Position eines Index selbst bedeutungstragend. In Γ^μ_{νρ} oder R^μ_ν{}^ρ_σ müssen obere und untere Indizes von links in der richtigen Reihenfolge stehen. Schreibt man ^ und _ jedoch naiv hintereinander, stapeln sie sich an derselben Stelle, und es ist nicht mehr erkennbar, welcher Index zuerst kommt. Gelöst wird das vom tensor von Philip G. Ratcliffe (eine vollständige Überarbeitung des Originals von Mike Piff, v2.2). Es verlangt keine Fremdpakete; \usepackage{tensor} genügt.

latex
\[
  M\indices{^a_b^{cd}_e}, \qquad
  \tensor{M}{^a_b^{cd}_e}, \qquad
  \tensor[^a_b^c_d]{M}{^e_f^g_h}
\]

% works in text mode as well as math mode
\nuclide[14][6]{C}

Es gibt zwei zentrale Befehle. Das leichtgewichtige \indices steht direkt hinter dem Tensorkörper und nimmt nur die Indexzeichenkette: M\indices{^a_b^{cd}_e} ergibt M, gefolgt von einem oberen a, unteren b, oberen cd und unteren e, jeweils an der richtigen waagerechten Position. In der Zeichenkette verwendet man ^ und _ direkt und fasst mehrzeichige Indizes mit Klammern zusammen, etwa ^{cd} (\sp und \sb leisten dasselbe). Der andere Befehl, \tensor, ist rückwärtskompatibel zum Original von Mike Piff und nimmt Körper und Indexzeichenkette als getrennte Argumente. \tensor{M}{^a_b^{cd}_e} liefert dieselbe Ausgabe wie das \indices-Beispiel, doch die Stärke von \tensor ist, dass es auch Indizes vor dem Körper setzen kann, indem eine Vorindex-Zeichenkette im optionalen ersten Argument übergeben wird. Beide besitzen die Sternformen \indices* und \tensor*, die den Abstand zwischen den Indizes auf ein üblicheres Maß zusammenziehen. Zusätzlich richtet ein * am Anfang der Indexzeichenkette aufeinanderfolgende Ober-/Unterpaare links aus.

Als Zugabe ist \nuclide definiert, und es funktioniert sowohl im Text- als auch im Mathematikmodus. \nuclide[14][6]{C} setzt ¹⁴₆C und platziert die Massenzahl 14 links oben und die Ordnungszahl 6 links unten am Elementsymbol C (beide Zahlen sind optional). Zu beachten: In der Indexzeichenkette muss ein mehrteiliger Index stets in Klammern gefasst werden, und Konstrukte wie \mathrm sind ebenfalls vollständig einzuschließen – man schreibt \indices{_{\mathrm{H}}^x}.

Welches Paket also nehmen?

Die Messungen führen zu dem Schluss: Ein neues Dokument nicht auf physics aufbauen. Ein stillschweigend verworfenes Argument, \div und \Re mit geänderter Bedeutung, ein Konflikt mit siunitx, den die Ladereihenfolge nicht löst – alle drei treten ohne Warnung auf. Gleichwohl ist physics weiterhin weit verbreitet, und ein von Mitautorinnen übergebenes Manuskript kann sehr wohl damit geschrieben sein. Dann ist der realistische Weg, es nicht umzuschreiben, sondern damit zu arbeiten – im Wissen, dass \divisionsymbol, \real und \imaginary existieren und die (g)-Falle lauert. Die folgende Tabelle ordnet die Wahl nach Einsatzzweck.

PaketWozuSchreibt es Standardbefehle um?
physicsAbleitungen, Begrenzer, Vektoranalysis und Bra-Ket auf einmalja: \div, \Re, \Im, \sin, \det und weitere
physics2dasselbe Gebiet, modulweise über \usephysicsmodulenein – gemessen blieben \div, \Re und \sin unberührt
braketnur Dirac-Notation und Mengenschreibweisenein; Kleinbuchstaben fest, Großbuchstaben dehnbar
tensorhält die waagerechte Position oberer und unterer Indizes korrektnein; es ergänzt nur \indices, \tensor und \nuclide
mathtoolseigenes \abs und \norm per \DeclarePairedDelimiternein; die Namen wählt man selbst, es kollidiert nichts