Besonderheiten in \norm* von physics.sty

Besonderheiten in \norm* von physics.sty

Ich bin ein intensiver Benutzer des Physikpakets. Leider \normscheint der Befehl einige Macken zu haben. Laut der Dokumentation soll die mit Sternchen versehene Version eine Norm mit fester Größe ergeben. Beachten Sie jedoch die folgenden MWE

Bildbeschreibung hier eingeben

\documentclass[11pt]{article}

\usepackage{lmodern}
\usepackage{amsmath}
\usepackage{physics}
\usepackage{mathtools}

\begin{document}
\[
 \norm{A^k}_2 \quad \norm*{A^k}_2 \quad
 \frac{1}{\norm{A^k}_{\mathrlap{2}}} \quad \frac{1}{\norm*{A^k}_{\mathrlap{2}}}
\]
\end{document}

wo wir sehen können, dass zwischen dem ||und dem Index ein zusätzlicher Abstand eingefügt wird 2, wenn die mit Sternchen versehene Version verwendet wird. Dieses Verhalten scheint auch zu verhindern, dass die Verwendung \mathrlapvon from mathtoolsden Index in diesem Fall verschluckt *.

Antwort1

Analyse

Mal sehen, was das physics.stybedeutet. Zunächst die Definition von \norm:

\DeclareDocumentCommand\norm{ l m }{\braces#1{\lVert}{\rVert}{#2}} % Norm

Das lArgument type erfasst alles bis zum ersten (und ausschließlich davon) {. Sehen wir uns nun Folgendes an \braces:

\DeclareDocumentCommand\braces{}{{\ifnum\z@=`}\fi\@braces}

Ich sehe dafür keinen Grund \ifnum. Jedenfalls bedeutet es, dass wir uns Folgendes ansehen müssen \@braces:

\DeclareDocumentCommand\@braces{ s t\big t\Big t\bigg t\Bigg m m m }
{ % General braces with automatic and manual sizing
        \IfBooleanTF{#1}
        {\left#6\smash{#8}\right#7\vphantom{#8}}
        {
                \IfBooleanTF{#2}{\bigl#6{#8}\bigr#7}{
                        \IfBooleanTF{#3}{\Bigl#6{#8}\Bigr#7}{
                                \IfBooleanTF{#4}{\biggl#6{#8}\biggr#7}{
                                        \IfBooleanTF{#5}{\Biggl#6{#8}\Biggr#7}{\left#6{#8}\right#7}
                                }
                        }
                }
        }
        \ifnum\z@=`{\fi}
}

Wow! Eine der hässlichsten Makrodefinitionen, die ich je gesehen habe. Wie dem auch sei, dies zeigt, was passiert, wenn Sie aufrufen \norm*{A^k}_{2}: es wird übersetzt in

{% <-- from the \ifnum in \braces
 \left\lVert\smash{A^k}\right\rVert\vphantom{A^k}
}% <-- from the \ifnum in \@braces

das ist einfach albern. Nun ein paar Anmerkungen.

  1. Aus meiner Aussage „kein Grund“ wird jetzt „es ist falsch“.

  2. Wo ist das Problem, wenn man sagt, #6#8#7statt zu verwenden \left, und \rightwessen letzte Aufgabe es ist, nur hinzuzufügenunerwünschthorizontaler Raum?

  3. Wo liegt der Vorteil beim Tippen \norm\big{x}gegenüber \norm[\big]{x}à la mathtools?

Mögliche Lösungen in der Reihenfolge der persönlichen Präferenz

  1. Vermeiden physics.sty.
  2. Bitten Sie den Autor, physics.styden Paketcode zu bereinigen.
  3. Hinzufügen

    \usepackage{mleftright}
    \mleftright
    

    zu Ihrer Präambel.

Kommentare

Ich empfehleNICHTVerwenden Sie die automatische Größenanpassung, es sei denn, Sie wissen genau, dass dies in Ordnung ist. Was, wie die Ausgabe von zeigt \norm{A^k}_2, in diesem Fall nicht der Fall ist. Bitte beachten Sie das „nicht“ in fettgedruckter, kursiver Großschreibung.

Das physicsPaket ist ein Paradebeispiel für den Missbrauch von xparse. Soweit ich das sehe, handelt es sich um eine Sammlung von Makros, die bei Bedarf problemlos in der Dokumentpräambel definiert werden können, möglicherweise mithilfe von mathtools(natürlich nicht mit automatischer Größenanpassung als Standard).

Abschließend: Ihre Idee, \mathrlapden Index anzupingen, ist nicht so gut. Aber Sie sind der letzte Richter darüber.

Antwort2

Ich kann keine besonderen Einblicke in das Wie und Warum der Makrodefinitionen des physicsPakets geben. Mithilfe des mathtoolsPakets (das Sie bereits laden) ist es jedoch problemlos möglich, eine Ersatzdefinition zu finden, \normdie \norm*Ihren Formatierungszielen entspricht.

Bildbeschreibung hier eingeben

\documentclass[11pt]{article}

\usepackage{lmodern}
%\usepackage{amsmath} % is loaded automatically by 'mathtools'
\usepackage{physics}
\usepackage{mathtools} % for '\mathrlap' and '\DeclarePairedDelimiter' macros

\makeatletter  
%% Switch meanings of starred and unstarred macros
%% (see https://tex.stackexchange.com/a/278398/5001)
\newcommand{\XDeclarePairedDelimiter}[3]{%  "X" for "exchange"
  \expandafter\DeclarePairedDelimiter\csname RIGHT\string#1\endcsname{#2}{#3}%
  \newcommand#1{%
    \@ifstar{\csname RIGHT\string#1\endcsname}
            {\@ifnextchar[{\csname RIGHT\string#1\endcsname}
                          {\csname RIGHT\string#1\endcsname*}%
}}}
\makeatother
\let\norm\relax % undefine existing "\norm" macro
\XDeclarePairedDelimiter{\norm}{\lVert}{\rVert}

\begin{document}
\[
 \norm{A^k}_2    \quad 
 \norm*{A^k}_2   \quad
 \frac{1}{\norm{A^k}_{\mathrlap{2}}} \quad 
 \frac{1}{\norm*{A^k}_{\mathrlap{2}}}
\]
\end{document}

verwandte Informationen