
Ich bin ein intensiver Benutzer des Physikpakets. Leider \norm
scheint 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
\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 \mathrlap
von from mathtools
den Index in diesem Fall verschluckt *
.
Antwort1
Analyse
Mal sehen, was das physics.sty
bedeutet. Zunächst die Definition von \norm
:
\DeclareDocumentCommand\norm{ l m }{\braces#1{\lVert}{\rVert}{#2}} % Norm
Das l
Argument 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.
Aus meiner Aussage „kein Grund“ wird jetzt „es ist falsch“.
Wo ist das Problem, wenn man sagt,
#6#8#7
statt zu verwenden\left
, und\right
wessen letzte Aufgabe es ist, nur hinzuzufügenunerwünschthorizontaler Raum?Wo liegt der Vorteil beim Tippen
\norm\big{x}
gegenüber\norm[\big]{x}
à lamathtools
?
Mögliche Lösungen in der Reihenfolge der persönlichen Präferenz
- Vermeiden
physics.sty
. - Bitten Sie den Autor,
physics.sty
den Paketcode zu bereinigen. 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 physics
Paket 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, \mathrlap
den 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 physics
Pakets geben. Mithilfe des mathtools
Pakets (das Sie bereits laden) ist es jedoch problemlos möglich, eine Ersatzdefinition zu finden, \norm
die \norm*
Ihren Formatierungszielen entspricht.
\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}