Peculiaridades en \norm* de física.sty

Peculiaridades en \norm* de física.sty

Soy un gran usuario del paquete de física. Desafortunadamente, el \normcomando parece tener algunas peculiaridades asociadas. Según la documentación, la versión destacada debe dar como resultado una norma cuyo tamaño es fijo. Sin embargo, considere el siguiente MWE

ingrese la descripción de la imagen aquí

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

donde podemos ver que se agrega espacio adicional entre el ||y el subíndice 2cuando se usa la versión destacada. Este comportamiento también parece evitar que uno que use \mathrlapse mathtoolstrague el subíndice del *caso.

Respuesta1

Análisis

Veamos qué physics.styhace. Primero, la definición de \norm:

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

El ltipo de argumento recopila todo hasta (y excluyendo) el primero {. Ahora veamos \braces:

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

No veo ninguna razón para esto \ifnum; de todos modos, significa que debemos mirar \@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}
}

¡Guau! Una de las definiciones macro más feas que he visto jamás. De todos modos, esto muestra lo que sucede cuando llamas \norm*{A^k}_{2}: se traduce en

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

lo cual es simplemente una tontería. Algunas notas, ahora.

  1. Lo que dije sobre “no hay motivo” ahora se convierte en “está mal”.

  2. ¿Dónde está el problema en decir #6#8#7en lugar de usar \lefty \rightcuyo trabajo final es simplemente agregar?no deseadoespacio horizontal?

  3. ¿Dónde está la ventaja de escribir \norm\big{x}en lugar de \norm[\big]{x}à la mathtools?

Posibles soluciones en orden de preferencia personal.

  1. Evitar physics.sty.
  2. Pídale al autor de physics.styque limpie el código del paquete.
  3. Agregar

    \usepackage{mleftright}
    \mleftright
    

    a su preámbulo.

Comentarios

recomiendoNOusando el tamaño automático a menos que sepa exactamente que está bien. Lo cual, como se muestra en el resultado de \norm{A^k}_2, no es este caso. Tenga en cuenta el “no” en negrita, cursiva y mayúscula.

El physicspaquete es un excelente ejemplo de cómo abusar xparse. Hasta donde puedo ver, es una colección de macros que se pueden definir fácilmente en el preámbulo del documento según sea necesario, tal vez con la ayuda de mathtools(no con el tamaño automático predeterminado, por supuesto).

Finalmente: su idea de \mathrlaphacer ping al subíndice no es tan buena. Pero usted es el juez final al respecto.

Respuesta2

No puedo ofrecer ninguna idea particular sobre los cómo y los porqués de las definiciones macro del physicspaquete. Sin embargo, al utilizar el mathtoolspaquete (que ya está cargando), es sencillo encontrar una definición de reemplazo \normque \norm*cumpla con sus objetivos de formato.

ingrese la descripción de la imagen aquí

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

información relacionada