physics.sty の \norm* の特殊性

physics.sty の \norm* の特殊性

私は物理パッケージのヘビーユーザーです。残念ながら、\normコマンドにはいくつかの癖があるようです。ドキュメントによると、星印のバージョンはサイズが固定されたノルムを生成することを意図しています。ただし、次の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}

||ここで、星印バージョンが使用されている場合、 と下付き文字の間に余分なスペースが追加されていることがわかります。 この動作は、 の使用によって下付き文字が飲み込まれてしまうのを2防ぐようにも思われます。\mathrlapmathtools*

答え1

分析

何が起こっているのか見てみましょうphysics.sty。まず、 の定義\norm:

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

引数lの型は最初の までのすべてを収集します (最初の を除く) {。次に を見てみましょう\braces

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

これには理由は見当たりませんが\ifnum、とにかく、次の点を検討する必要があることを意味します\@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}
}

うわあ!今まで見た中で最も醜いマクロ定義の一つだ。とにかく、これは を呼び出すと何が起こるかを示している\norm*{A^k}_{2}。これは次のように変換される。

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

それはただ馬鹿げたことです。さて、いくつかメモを。

  1. 「理由がない」と言ったことが、「それは間違っている」に変わります。

  2. #6#8#7使用するのではなく言うことに問題はどこにあるのでしょうか?\leftそして\right最終的な仕事は追加することだけです不要水平方向のスペース?

  3. à la\norm\big{x}よりも入力する利点はどこにあるのでしょうか?\norm[\big]{x}mathtools

個人の好みに応じて考えられる解決策

  1. 避けるphysics.sty
  2. の作成者にphysics.styパッケージ コードをクリーンアップするよう依頼します。
  3. 追加

    \usepackage{mleftright}
    \mleftright
    

    あなたの序文に。

コメント

お勧めしますない正確に問題ないことがわかっている場合を除き、自動サイズ設定を使用しないでください。 の出力に示されているように、\norm{A^k}_2これは当てはまりません。太字斜体大文字の「not」に注意してください。

パッケージphysicsは、 を悪用する好例ですxparse。私が見る限り、これは、必要に応じて、おそらく の助けを借りて、ドキュメントのプリアンブルで簡単に定義できるマクロのコレクションですmathtools(もちろん、デフォルトでは自動サイズ設定は使用されません)。

最後に、下付き文字を ping するというあなたのアイデアは\mathrlapあまり良くありません。しかし、最終的な判断はあなた次第です。

答え2

パッケージのマクロ定義の仕組みや理由については、特に説明できませんphysics。ただし、mathtoolsパッケージ (既にロード済み) を使用すると、書式設定の目的を満たす の代替定義を簡単に作成でき\normます\norm*

ここに画像の説明を入力してください

\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}

関連情報