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這種行為似乎還可以防止使用\mathrlapfrommathtools吞噬該*情況下的下標。

答案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. \norm\big{x}打字相比\norm[\big]{x}à la 的優勢在哪裡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}

相關內容