
Soy un gran usuario del paquete de física. Desafortunadamente, el \norm
comando 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
\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 2
cuando se usa la versión destacada. Este comportamiento también parece evitar que uno que use \mathrlap
se mathtools
trague el subíndice del *
caso.
Respuesta1
Análisis
Veamos qué physics.sty
hace. Primero, la definición de \norm
:
\DeclareDocumentCommand\norm{ l m }{\braces#1{\lVert}{\rVert}{#2}} % Norm
El l
tipo 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.
Lo que dije sobre “no hay motivo” ahora se convierte en “está mal”.
¿Dónde está el problema en decir
#6#8#7
en lugar de usar\left
y\right
cuyo trabajo final es simplemente agregar?no deseadoespacio horizontal?¿Dónde está la ventaja de escribir
\norm\big{x}
en lugar de\norm[\big]{x}
à lamathtools
?
Posibles soluciones en orden de preferencia personal.
- Evitar
physics.sty
. - Pídale al autor de
physics.sty
que limpie el código del paquete. 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 physics
paquete 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 \mathrlap
hacer 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 physics
paquete. Sin embargo, al utilizar el mathtools
paquete (que ya está cargando), es sencillo encontrar una definición de reemplazo \norm
que \norm*
cumpla con sus objetivos de formato.
\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}