`\left` `\right` 与 `\mathchoice` 无法正常工作

`\left` `\right` 与 `\mathchoice` 无法正常工作

我尝试定义在显示数学中\norm给出的内容,而在内联数学中给出的内容。然后我用来实现这一点,但最后的命令不能正常工作:上标/下标的位置是错误的。我该如何解决这个问题?\left\|#1\right\|\|#1\|\mathchoice

在此处输入图片描述

平均能量损失

\documentclass{report}
\def\mychoice#1#2{\mathchoice{#1}{#2}{#2}{#2}}
\newcommand{\normm}[1]{\mychoice{\left\|#1\right\|}{\|#1\|}}
\begin{document}
    \[
        \normm{\frac{1}{2}}^2_R\quad\textrm{but I meant}\quad\left\|\frac{1}{2}\right\|^2_R
    \]
\end{document}

答案1

如果\mathchoice{...}{...}{...}{...} 扩展将其添加到其中一个备选方案中,事情就会按照您的预期进行。但它的作用有所不同:它将一个“选择项”(包含四个备选方案)附加到当前数学列表中。

基本上,用 定义的上标和下标^2_R适用于具有空核的数学原子,而您希望它们适用于 的替代方案之一。如果将 括在一对括号内(这将创建一个子公式),\mathchoice您将获得所需的结果:\mathchoice

\def\mychoice#1#2{{\mathchoice{#1}{#2}{#2}{#2}}}

或更好:

\newcommand*{\mychoice}[2]{{\mathchoice{#1}{#2}{#2}{#2}}}

现在,让我们\showlists看看在没有额外括号的情况下会发生什么:

\documentclass{report}
\newcommand*{\mychoice}[2]{\mathchoice{#1}{#2}{#2}{#2}}
\newcommand{\normm}[1]{\mychoice{\left\|#1\right\|}{\|#1\|}}

\begin{document}

\tracingonline=1
\showboxbreadth=\maxdimen \showboxdepth=\maxdimen
\[ \normm{\frac{1}{2}}^2_R \showlists \]

\end{document}

打印结果为:

### display math mode entered at line 9
\mathchoice
D\mathinner
D.\left"26B30D
D.\mathord
D..\fraction, thickness = default
D..\\mathord
D..\.\fam0 1
D../\mathord
D../.\fam0 2
D.\right"26B30D
T\mathord
T.\fam2 k
T\mathord
T.\fraction, thickness = default
T.\\mathord
T.\.\fam0 1
T./\mathord
T./.\fam0 2
T\mathord
T.\fam2 k
S\mathord
S.\fam2 k
S\mathord
S.\fraction, thickness = default
S.\\mathord
S.\.\fam0 1
S./\mathord
S./.\fam0 2
S\mathord
S.\fam2 k
s\mathord
s.\fam2 k
s\mathord
s.\fraction, thickness = default
s.\\mathord
s.\.\fam0 1
s./\mathord
s./.\fam0 2
s\mathord
s.\fam2 k
\mathord
^\fam0 2
_\fam1 R

最后三行显示了一个\mathord具有空核、上标和下标的原子。据我所知,生成的 PDF 输出与以下方法获得的输出相同:

\[ \normm{\frac{1}{2}} {}^2_R \]

在此处输入图片描述

如果在项目周围加上额外的括号\mathchoice,则输出将\showlists是:

\mathord
.\mathchoice
.D\mathinner
.D.\left"26B30D
.D.\mathord
.D..\fraction, thickness = default
.D..\\mathord
.D..\.\fam0 1
.D../\mathord
.D../.\fam0 2
.D.\right"26B30D
.T\mathord
.T.\fam2 k
.T\mathord
.T.\fraction, thickness = default
.T.\\mathord
.T.\.\fam0 1
.T./\mathord
.T./.\fam0 2
.T\mathord
.T.\fam2 k
.S\mathord
.S.\fam2 k
.S\mathord
.S.\fraction, thickness = default
.S.\\mathord
.S.\.\fam0 1
.S./\mathord
.S./.\fam0 2
.S\mathord
.S.\fam2 k
.s\mathord
.s.\fam2 k
.s\mathord
.s.\fraction, thickness = default
.s.\\mathord
.s.\.\fam0 1
.s./\mathord
.s./.\fam0 2
.s\mathord
.s.\fam2 k
^\fam0 2
_\fam1 R

在这种情况下,上标和下标适用于在其原子核中\mathord包含整体的原子。\mathchoice

在此处输入图片描述

答案2

不要那样做,即使戴着牙套\mathchoice

比较结果,特别是\hat{X}部分。

\documentclass{report}
\usepackage{mathtools}

\newcommand*{\mychoice}[2]{{\mathchoice{#1}{#2}{#2}{#2}}}
\newcommand{\normm}[1]{\mychoice{\left\|#1\right\|}{\|#1\|}}

\DeclarePairedDelimiter{\norm}{\|}{\|}

\begin{document}

\[
\normm{\frac{1}{2}X}_R^2 \quad \normm{\hat{X}}_R^2 \quad \normm{X}_R^2
\]

\[
\norm*{\frac{1}{2}X}_R^2 \quad 
\norm{\hat{X}}_R^2 \quad 
\norm[\big]{\hat{X}}_R^2 \quad \norm{X}_R^2
\]

\end{document}

如您所见,\normm{\hat{X}}会产生非常大的分隔符。使用此\DeclarePairedDelimiter策略,您可以进行更精细的控制。

在此处输入图片描述

相关内容