
저는 물리 패키지를 많이 사용하는 사용자입니다. 불행하게도 이 \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
방지하는 것으로 보입니다 .\mathrlap
mathtools
*
답변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
그건 정말 어리석은 일이에요. 이제 몇 가지 메모를 해보세요.
내가 “이유가 없다”고 했던 말이 이제는 “틀렸어요”로 바뀌었습니다.
사용 하는
#6#8#7
대신 최종 작업을 추가하는 것이 문제인 곳은 어디입니까?\left
\right
불필요한수평 공간?à la
\norm\big{x}
보다 타이핑하면 어떤 이점이 있나요 ?\norm[\big]{x}
mathtools
개인 선호도에 따른 가능한 해결 방법
- 피하다
physics.sty
. - 작성자에게
physics.sty
패키지 코드 정리를 요청하세요. 추가하다
\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}