physics / braket / tensor

physics est peut-être le package le plus chaudement recommandé et le plus vivement déconseillé de LaTeX. \dv{f}{x} pour une dérivée, \qty(...) pour des parenthèses à taille automatique, \ket{\psi} pour un ket — l'écriture est effectivement agréable. Mais ce package réécrit en silence des commandes que le document utilise déjà. \div cesse d'être le signe de division ÷ pour devenir une divergence ; \Re cesse d'être le ℜ gothique pour devenir un « Re » droit. Cette page traite de physics, de sa refonte physics2, de braket spécialisé dans la notation de Dirac, et de tensor pour aligner les indices, et répond à la question « par quoi commencer aujourd'hui ? » à partir de résultats réellement compilés et mesurés.

Ce que \usepackage{physics} apporte vraiment

Une ligne, et les formes qui reviennent en physique deviennent des commandes courtes. physics, de Sergio C. de la Barrera, requiert en interne xparse et amsmath, et charge amsmath de lui-même : inutile de le nommer. L'offre se répartit en cinq groupes : délimiteurs à taille automatique (\qty, \abs, \norm, \eval, \order) ; analyse vectorielle (\grad, \div, \curl, \laplacian, le produit scalaire \vdot, le produit vectoriel \cross) ; dérivées (\dv, \pdv, \fdv, \dd) ; notation de Dirac (\bra, \ket, \braket, \ketbra, \dyad, \expectationvalue, \matrixelement) ; enfin abréviations pour matrices et parenthèses (\mqty, \smqty, \pqty, \bqty, \Bqty, \vqty, le commutateur \comm, l'anticommutateur \acomm, le crochet de Poisson \pb, et les vecteurs gras \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} )
\]

Les dérivées sont l'enseigne. \dv change de forme selon le nombre d'arguments : \dv{x} compose l'opérateur d/dx, \dv{f}{x} compose df/dx. L'ordre se met en argument optionnel : \dv[2]{f}{x} donne d²f/dx², \dv[n]{f}{x} donne dⁿf/dxⁿ. Le d est droit (romain) par défaut ; \usepackage[italicdiff]{physics} le passe en italique. Le \dv*{f}{x} étoilé produit la fraction oblique \flatfrac. La dérivée partielle \pdv suit la même logique, la partielle mixte prenant trois arguments : \pdv{f}{x}{y} donne ∂²f/∂x∂y. L'élément différentiel lui-même est \dd : \dd{x} compose dx avec l'espacement ajusté, \dd[3]{x} compose d³x. Côté délimiteurs, \qty(...), \qty[...] et \qty{...} donnent parenthèses, crochets et accolades, chacun grandissant à la hauteur de son contenu.

Ce que physics redéfinit en silence : \div, \Re, \sin

Ni avertissement, ni erreur. Seule la sortie change. Relire \meaning sous TeX Live 2024 le confirme : avant le chargement de physics, \div vaut \mathchar"2204, le signe de division ÷. Après, \div est une divergence, et le ÷ d'origine a été mis de côté sous le nom \divisionsymbol. Composez les deux dans le même document et extrayez le texte du PDF : $a \div b$ donne « a∇ · b » tandis que $a \divisionsymbol b$ donne « a ÷ b ». Les largeurs diffèrent aussi : 26,79959 pt contre 21,79968 pt. Ajouter \usepackage{physics} à un document existant qui employait \div pour la division change donc en silence le sens de ses formules.

\Re et \Im changent de façon visible. La ligne concernée de physics.sty est \let\real\Re \DeclareDocumentCommand\Re{g}{…\operatorname{Re}…} : le ℜ gothique est donc remplacé par un opérateur droit « Re ». Composez les deux dans le même document : $\Re z$ donne « Re z » tandis que le $\real z$ mis de côté donne « ℜz ». Les fonctions nommées subissent le même sort : \sin, \cos, \tan, \log, \ln, \exp et \det sont remplacées par des versions qui parenthèsent automatiquement leur argument, et les définitions d'origine survivent sous des noms plus longs — \sine, \cosine, \tangent, \logarithm, \naturallogarithm, \exponential, \determinant. Seul le remplacement trigonométrique peut être désactivé, par \usepackage[notrig]{physics}.

CommandeSans physicsAvec physics (où est passé l'original)
\div÷, le signe de divisiondivergence ∇· ; l'ancien ÷ passe à \divisionsymbol
\Reℜ, gothiquele \operatorname{Re} droit ; l'original passe à \real
\Imℑ, gothiquele \operatorname{Im} droit ; l'original passe à \imaginary
\sinsin, parenthèses à votre chargeparenthèse son argument automatiquement ; original sous \sine ; désactivable par notrig
\detdetégalement parenthésé automatiquement ; original sous \determinant

Écrivez \dv{f}{x}(g) et le (g) disparaît

Une partie de la formule disparaît de la sortie, sans erreur ni avertissement. C'est bien plus grave qu'un « ça rend mal », d'où la mesure. Sous TeX Live 2024, \sbox0{$\dv{f}{x}$} mesure 11,50076 pt de large, et \sbox0{$\dv{f}{x}(g)$} mesure aussi 11,50076 ptexactement la même chose. En extrayant le texte du PDF, les deux ne donnent que « df/dx » ; le (g) n'est nulle part.

La cause est dans la déclaration des arguments. \derivative dans physics.sty est déclaré avec la signature { s o m g d() }, et ce d() final avale comme argument un groupe parenthésé qui suit. Il existe pour la « forme longue » \dv{x}(\Psi), où d/dx agit sur le contenu des parenthèses. Mais dans la branche empruntée quand g (ici x) a été fourni, le corps de la macro ne fait jamais référence à l'argument d(). Le (g) est donc lu, puis jeté. Deux contournements : intercaler un groupe vide {}, ou une espace explicite. Mesuré, $\dv{f}{x}{}(g)$ donne 24,40703 pt et $\dv{f}{x}\,(g)$ donne 26,07365 pt, et dans les deux le (g) survit dans la sortie. Le même d() est attaché à \grad, \div, \curl, \laplacian, \dd, \pdv et \fdv : une parenthèse qui suit demande donc partout de la vigilance.

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)$

Ce comportement revient régulièrement sur tex.stackexchange, au point qu'un package nommé physics-patch existe pour le corriger. Qu'un correctif soit nécessaire depuis si longtemps pèse en soi dans le choix.

Le conflit \qty avec siunitx : l'ordre de chargement n'y change rien

Le résultat est identique dans les deux ordres, et c'est physics qui l'emporte. siunitx, le standard pour composer les unités, a introduit \qty comme commande de grandeur dans ses versions récentes, entrant en collision de nom avec le \qty de physics. Chargez les deux et compilez : siunitx annonce Package siunitx Warning: Detected the "physics" package: omitting definition of \qty. Il fournit même le contournement, en conseillant d'ajouter \AtBeginDocument{\RenewCommandCopy\qty\SI} au préambule. Dans cet état, écrire une unité \qty{2}{\metre} est intercepté par le \qty de physics et échoue sur ! Missing $ inserted. Placer \usepackage{physics} avant ou après ne change rien : l'avertissement et les erreurs sont sortis mot pour mot identiques.

Un détail se laisse mal survoler ici. Ouvrez siunitx.sty et vous y trouvez la ligne \@ifpackageloaded{physics}siunitx nomme physics par son nom de package et lui cède le passage. Qu'un package majeur de plusieurs milliers de lignes contienne une concession codée en dur au nom d'un autre package est un spectacle rare dans l'écosystème LaTeX, et cela en dit long sur l'ampleur de cette collision.

\abs dans physics et dans mathtools : l'étoile signifie l'inverse

Chargez les deux et \abs devient celui de physics — et l'étoile inverse son sens. Déclarer \DeclarePairedDelimiter\abs{\lvert}{\rvert} avec mathtools puis écrire \usepackage{physics} n'a produit aucune erreur : physics l'écrase en silence. Mais le comportement est exactement inversé. Mesuré : la version mathtools donne à \abs{\frac ab} une hauteur de 7,5 pt (fixe) et à \abs*{\frac ab} 8,50006 pt (étirée automatiquement). La version physics donne à \abs{\frac ab} 8,50006 pt (étirée) et à \abs*{\frac ab} 7,5 pt (fixe). Autrement dit, mathtools étire avec l'étoile, physics cesse d'étirer avec l'étoile.

La syntaxe pour choisir une taille diffère également. mathtools la prend entre crochets, \abs[\big]{x} ; physics la prend directement, \abs\big{x}. Employez la syntaxe mathtools alors que physics est chargé et vous obtenez ! Missing delimiter (. inserted)., avec la sortie cassée « [] ||x » sur la page. Si l'on entend mélanger les deux, cette incompatibilité est incontournable. En pratique, la réponse est d'en choisir un seul.

physics2 — la refonte qui n'écrase rien

Menez la même inspection sur physics2 et pas une seule commande standard n'a été réécrite. Chargez physics2, de Zhang Tingxuan, relisez \meaning : \div vaut toujours \mathchar"2204 (÷), \Re vaut \mathchar"23C et \Im vaut \mathchar"23D (toujours gothiques), \sin garde sa définition standard, et \qty est indéfini. À la composition, $a\div b$ donne « a ÷ b », $\Re z$ donne « ℜz », $\sin(x)$ donne « sin(x) » — une sortie identique au LaTeX nu. Employé avec siunitx, il n'a produit aucun avertissement ni aucune erreur, et \qty{2}{\metre} s'est composé correctement en « 2 m ». La version présente dans TeX Live 2024 est la v1.0.1, datée du 10/01/2024.

La différence de conception apparaît au chargement. Là où physics apporte tout d'un coup, physics2 fait activer les modules un par un. Après \usepackage{physics2}, on écrit par exemple \usephysicsmodule{ab,braket} et l'on ne tire que ce qu'on veut. Les modules livrés avec TeX Live 2024 sont ab (délimiteurs à taille automatique), ab.braket, braket, diagmat (matrices diagonales), xmat (matrices générales), doubleprod, plus ab.legacy, bm-um.legacy, nabla.legacy, op.legacy et qtext.legacy pour qui migre depuis physics. Le prix de ne pas polluer l'espace de noms, ce sont des noms moins brefs que ceux de physics : les délimiteurs s'écrivent \ab(...), \ab[...], \ab\{...\}, \ab|...|, \ab<...> ; une matrice diagonale est \pdiagmat{1,2,3} ; une matrice est \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}
\]

Une mise en garde pratique : les modules ab.braket et braket ne peuvent pas être chargés ensemble. Listez les deux dans \usephysicsmodule et vous obtenez Package physics2 Warning: You cannot load 'ab.braket' and 'braket' modules together., un seul restant actif. Les deux fournissent la notation de Dirac : ab.braket s'appuie sur la mécanique d'ajustement d'ab, tandis que braket se suffit à lui-même. Pour résumer le jugement pratique : pour un document qui commence aujourd'hui, physics2 est le choix sûr ; pour un document physics existant, il faut peser le coût de la réécriture contre les effets secondaires sur \div, \Re et \qty. Si seules les dérivées vous intéressent, le package derivative traite proprement les ordres élevés et les variables multiples, et fixdif met de l'ordre dans la composition des opérateurs différentiels.

Le package braket — les majuscules s'étirent, les minuscules non

Si seule la notation de Dirac est nécessaire, le braket de Donald Arseneau est la réponse minimale. Une ligne, \usepackage{braket}, et il n'y a que deux familles de commandes : les formes minuscules de taille fixe \bra{ }, \ket{ }, \braket{ }, \set{ }, et les formes majuscules à étirement automatique \Bra{ }, \Ket{ }, \Braket{ }, \Set{ }. L'avantage des majuscules : une barre verticale | écrite directement dans l'argument s'étire avec les délimiteurs extérieurs. Dans \Braket, chaque | intérieur grandit à la hauteur des arguments ; dans \Set, c'est le premier |. Pour une double barre, employez \| ou son alias local ||.

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 }

Notez que les arguments se comptent autrement que dans physics. Le \braket{a}{b} de physics prend deux arguments, tandis que le \braket{a|b} de braket en prend un, la barre de séparation étant à votre charge. Dans l'exemple ci-dessus, le premier compose l'élément de matrice ⟨φ| ∂²/∂t² |ψ⟩, les chevrons extérieurs et les deux barres intérieures étant étirés à la hauteur de l'opérateur. Le second compose l'ensemble { x ∈ R² | 0 < |x| < 5 }, en étirant les accolades extérieures et la barre séparatrice, tandis que le |x| intérieur, enveloppé en {|x|}, garde une taille fixe. Notez aussi que braket ne définit pas de \ketbra pour le produit extérieur : l'auteur recommande d'écrire \ket{ }\bra{ }.

Le package tensor — indices hauts et bas dans le bon ordre

Dans les tenseurs, la position horizontale d'un indice porte elle-même du sens. Dans Γ^μ_{νρ} ou R^μ_ν{}^ρ_σ, les indices hauts et bas doivent se suivre dans le bon ordre depuis la gauche. Or écrire ^ et _ naïvement à la suite les empile au même endroit, et l'on ne distingue plus quel indice vient en premier. Le package qui résout cela est le tensor de Philip G. Ratcliffe (une refonte complète de l'original de Mike Piff, v2.2). Il ne requiert aucun package externe : \usepackage{tensor} suffit.

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}

Deux commandes sont centrales. Le léger \indices se place juste après le corps du tenseur et ne prend que la chaîne d'indices : M\indices{^a_b^{cd}_e} donne M suivi d'un a haut, d'un b bas, d'un cd haut et d'un e bas, chacun à sa position horizontale correcte. Dans la chaîne, on utilise ^ et _ directement, en groupant les indices de plusieurs caractères par des accolades, comme ^{cd} (\sp et \sb font la même chose). L'autre commande, \tensor, est rétrocompatible avec l'original de Mike Piff et prend le corps et la chaîne d'indices comme arguments distincts. \tensor{M}{^a_b^{cd}_e} produit la même sortie que l'exemple \indices, mais la force de \tensor est de pouvoir aussi placer des indices avant le corps, en passant une chaîne de pré-indices dans le premier argument optionnel. Les deux ont des formes étoilées, \indices* et \tensor*, qui resserrent l'espacement entre indices vers un rendu plus standard. En outre, un * au début de la chaîne d'indices aligne à gauche les paires haut/bas successives.

En bonus, \nuclide est défini et fonctionne aussi bien en mode texte qu'en mode mathématique. \nuclide[14][6]{C} compose ¹⁴₆C, en plaçant le nombre de masse 14 en haut à gauche et le numéro atomique 6 en bas à gauche du symbole C (les deux nombres sont optionnels). À noter : dans la chaîne d'indices, un indice de plusieurs jetons doit toujours être groupé par des accolades, et les constructions comme \mathrm doivent l'être entièrement aussi — écrivez \indices{_{\mathrm{H}}^x}.

Alors, lequel employer ?

La conclusion des mesures est : ne pas démarrer un nouveau document sur physics. Un argument silencieusement jeté, \div et \Re qui changent de sens, un conflit avec siunitx que l'ordre de chargement ne résout pas — les trois surviennent sans avertissement. Cela dit, physics reste très employé, et un manuscrit transmis par un coauteur peut fort bien être écrit avec lui. Dans ce cas, la voie réaliste n'est pas de tout réécrire, mais de composer avec, en sachant que \divisionsymbol, \real et \imaginary existent et que le piège du (g) est là. Le tableau ci-dessous trie le choix selon l'usage.

PackageÀ quoi il sertRéécrit-il des commandes standard ?
physicsdérivées, délimiteurs, analyse vectorielle et bra-ket, d'un coupoui : \div, \Re, \Im, \sin, \det et d'autres
physics2le même terrain, module par module via \usephysicsmodulenon — mesuré, \div, \Re et \sin sont intacts
braketuniquement notation de Dirac et notation d'ensemblesnon ; minuscules à taille fixe, majuscules extensibles
tensormaintient correcte la position horizontale des indices hauts et basnon ; il n'ajoute que \indices, \tensor et \nuclide
mathtoolsdéfinir soi-même \abs et \norm via \DeclarePairedDelimiternon ; on choisit les noms, rien n'entre en collision