我现在正尝试定义一些类似于的“修饰运算符” 通过多种方式,我想找到我对装饰运算符的偏好。
一种简单的“准备”方法是使用\sideset
amsmath 命令,尽管限制样式下标的位置可能取决于个人喜好。几个月前,我的朋友告诉我一个\sideset
与括号的冲突,例如代码
\[
\left|\sideset{}{^{\smash{\sharp}}}\sum_{x<n\le x+y}\chi(n)a(n)\right|
\]
给出
因此极限式下标x<n\le x+y
和模数符号\left|
互相冲突。
我认为这是因为\sideset
将数学运算符转换为普通数学原子。因此,我尝试使用\mathop
如下方法:
\[
\left|\mathop{\sideset{}{^{\smash{\sharp}}}\sum}
_{x<n\le x+y}\chi(n)a(n)\right|
\quad
\left|\mathop{\sideset{}{^{\smash{\sharp}}}\sum
_{x<n\le x+y}}\chi(n)a(n)\right|
\]
我仍然想知道为什么\sideset
在某些括号中表现不佳,以及为什么上述两个应用程序会\mathop
产生如此不同的结果。对于我(作为 LaTeX 的初学者)来说,我的后一个\mathop
应用程序似乎更有可能避免冲突,但事实却相反......
因此我想问一下:
- 上述
\sideset
和 括号冲突的原因是什么?我的 用法是否\sideset
错误?或者这是 的一个“错误”\sideset
? - 如果这是的一个错误
\sideset
,那么有什么好方法可以避免它? - 为什么上述两次应用
\mathop
会产生不同的结果?
注意:根据 egreg 的回答,我发现\sideset
如果限制样式的下标太长,则会发生上述冲突,因为移位数学运算符“太多”。现在我们让成为由于 egreg 而\egregsideset
更正的版本。然后\sideset
\[
\fbox{$\displaystyle%
\sideset{}{^\text{quite very very very long}}\sum$%
}
\fbox{$\displaystyle%
\egregsideset{}{^\text{quite very very very long}}\sum$%
}
\]
给出
虽然我不确定哪一个更好,但我猜原文\sideset
在这方面更自然。因此,我添加了一个新问题
- 我们该如何修改
\egregsideset
以避免上述的差异\sideset
?
答案1
这是 的一个错误\sideset
。如果我尝试
\[
\left|\sideset{}{}\sum\right|\showlists
\]
我明白了
\mathinner
.\left"26A30C
.\mathord
..\hbox(0.0+0.0)x0.0
.\mathop
..\kern 0.0
..\mathord
...\hbox(10.50006+5.50006)x0.0
....\mathon
....\vbox(10.50006+5.50006)x0.0
....\mathoff
..\mathord
...\hbox(10.50006+5.50006)x14.44447
....\mathon
....\hbox(1.0+15.00012)x14.44447, shifted -9.50006
.....\OMX/cmex/m/n/10 X
....\mathoff
.\right"26A30C
本质上打开 奥德 操作 关闭. 这与\left|\sum\right|
那件事相反
\mathinner
.\left"26A30C
.\mathop
..\fam3 P
.\right"26A30C
所以打开 操作 关闭. 视觉对比
显示的问题与您的问题完全不同:右边的总和太多。
\sideset
但是,如果我将的定义改为
\makeatletter
\renewcommand{\sideset}[3]{%
\@mathmeasure\z@\displaystyle{#3}%
\global\setbox\@ne\vbox to\ht\z@{}\dp\@ne\dp\z@
\setbox\tw@\box\@ne
\@mathmeasure4\displaystyle{\copy\tw@#1}%
\@mathmeasure6\displaystyle{#3\nolimits#2}%
\dimen@-\wd6 \advance\dimen@\wd4 \advance\dimen@\wd\z@
\mathop{\hbox to\dimen@{}}\!% <--- was only \hbox to\dimen@{}
\mathop{\kern-\dimen@\box4\box6}%
}
\makeatother
因此 TeX 将\mathop
在执行任何操作之前看到一个,并且两个连续的操作原子被取消\!
,我得到了预期的结果:
\documentclass{article}
\usepackage{amsmath}
\makeatletter
\renewcommand{\sideset}[3]{%
\@mathmeasure\z@\displaystyle{#3}%
\global\setbox\@ne\vbox to\ht\z@{}\dp\@ne\dp\z@
\setbox\tw@\box\@ne
\@mathmeasure4\displaystyle{\copy\tw@#1}%
\@mathmeasure6\displaystyle{#3\nolimits#2}%
\dimen@-\wd6 \advance\dimen@\wd4 \advance\dimen@\wd\z@
\mathop{\hbox to\dimen@{}}\!%
\mathop{\kern-\dimen@\box4\box6}%
}
\makeatother
\begin{document}
\begin{gather*}
\left|\sideset{}{}\sum\right|%\showlists
\\
\left|\sum\right|
\\
\left|\sideset{}{^{\smash{\sharp}}}\sum_{x<n\le x+y}\chi(n)a(n)\right|
\\
\left|\sum_{x<n\le x+y}\chi(n)a(n)\right|
\end{gather*}
\end{document}
我不太确定这个问题是否可以修复,因为它可能会改变现有的文档。
但是,的实现\sideset
从一开始就存在错误,您可以使用它进行测试
\documentclass{article}
\usepackage{amsmath}
\begin{document}
\[
\left|\sideset{}{^\text{quite very very very long}}\sum_{aaaaaaaaaaaaaaaaaa}\right|
\]
\end{document}
(原来的\sideset
)。
我可以提供一个不同的实施方案:
\documentclass{article}
\usepackage{amsmath}
\usepackage{xparse}
\makeatletter
\NewDocumentCommand{\xsideset}{mmme{_^}}{%
\mathop{%
% half width of #3
\settowidth{\dimen0}{$\m@th\displaystyle#3$}%
\dimen0=.5\dimen0
% half width of #3 with subscripts or superscripts,
% half width of #3 removed
\settowidth{\dimen2}{$%
\m@th\displaystyle#3%
\IfValueT{#4}{_{#4}}%
\IfValueT{#5}{^{#5}}%
$}%
\dimen2=.5\dimen2
\advance\dimen2 -\dimen0
% prescripts
\sbox6{\scriptspace\z@$\displaystyle{\vphantom{#3}}#1$}
% postscripts
\sbox8{\scriptspace\z@$\displaystyle{\vphantom{#3}}#2$}
% typeset the thing
\ifdim\wd6>\dimen2 \kern\dimexpr\wd6-\dimen2\relax\fi
{%
\mathop{\llap{\copy6}{\displaystyle#3}\rlap{\copy8}}\limits
\IfValueT{#4}{_{#4}}%
\IfValueT{#5}{^{#5}}%
}%
\ifdim\wd8>\dimen2 \kern\dimexpr\wd8-\dimen2\relax\fi
}%
}
\makeatother
\begin{document}
\begin{gather*}
\left|\sum\right|\\
\left|\xsideset{}{}\sum\right|\\
\left|\xsideset{}{^{\smash{\sharp}}}\sum_{x<n\le x+y}\chi(n)a(n)\right|\\
\left|\xsideset{}{^\text{quite very very very long}}\sum\right|\\
\left|\xsideset{^{\text{quite very very very long}}}{}\sum_{\text{not quite so long}}\right|\\
\end{gather*}
\end{document}