我尝试定义在显示数学中\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
策略,您可以进行更精细的控制。