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(물론 기본적으로 자동 크기 조정은 아님).

마지막으로, 아래 첨자를 핑하는 아이디어 \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}

관련 정보