![数学运算符始终以文本样式显示](https://linux22.com/image/298739/%E6%95%B0%E5%AD%A6%E8%BF%90%E7%AE%97%E7%AC%A6%E5%A7%8B%E7%BB%88%E4%BB%A5%E6%96%87%E6%9C%AC%E6%A0%B7%E5%BC%8F%E6%98%BE%E7%A4%BA.png)
我想定义一个宏,即使在显示环境中使用,它也会扩展为相同的符号,\sum
但使用内联样式( )。\textstyle
以下是我得到的结果:
\newcommand{\Alt}{\@ifstar{\sum}{{\textstyle\sum}}}
带星号的版本允许我在特殊情况下选择性地启用 displaystyle。但这并不是强制要求。
如果我没有将其包装在宏中,我会通过执行以下操作来实现这一点
bla {\textstyle \sum_a^b bla} bla
我对在宏定义中包装一个组感到有点不舒服\sum
,仅仅是为了限制范围\textstyle
。
我的问题是:是否存在周围额外的组可以打破间距的情况\sum
?
答案1
根据评论讨论,我提出了与以下答案类似的建议:大运营商是如何定义的?,形式为\DeclareMathOperator*{\barr}{\textstyle\sum}
。但是,这种方法仍然将 displaystyle 限制置于总和的上方和下方(例如 1)。尽管如此,我们知道 textstyle 中提供的间距\barr
(例如 2)是 OP 寻求的正确间距。
我能够使用不同的方法在例 3-5 中重新创建间距和下标/上标位置。例 3 通过使用 a\mathord
而不是 a 来欺骗 displaystyle 中的结果\mathop
,但当然,前后间距需要调整以匹配正确的(例 2)间距。
例 4 和例 5 是原帖作者所提方法的变种。在例 4 中,我在他的括号内添加了前后材料。但是,根据材料的性质,这种方法可能无法使用。
例 5 是 OP 的方法,只是添加了细空格,因为括号消除了总和的\mathop
范围延伸到括号之外的能力。
这实际上回答了 OP 的问题“是否存在间距可以被周围的额外组打破的情况\sum
?”,因为如果没有例 5 中的细间距,OP 方法的间距将不正确。
\documentclass{article}
\usepackage{amsmath}
\DeclareMathOperator*{\barr}{\textstyle\sum}
\begin{document}
\centering
\verb|\barr| in \verb|\displaystyle|:
\[
A\barr_{i=3}^{6}B
\]
\verb|\barr| in \verb|\textstyle|:
\medskip inline: \(A A\barr_{i=3}^{6}B B\)
\verb|\mathord| with thin spaces added
\[
A A\,\mathord{\textstyle\sum}_{i=3}^6\, B B
\]
OP's original approach \textit{if} pre- and post- content embraced
\[
A {A \textstyle \sum_{i=3}^6 B} B
\]
OP's original approach, with no embraced pre- and post- content, but thin spaces added
\[
A A {\,\textstyle \sum_{i=3}^6\,} B B
\]
\end{document}
答案2
您可能希望对此采取一种抽象的方法;我们可以利用这样一个事实,即通过在名称末尾amsmath
添加表示符号的方式,以统一的方式改变所有采用极限的运算符名称。@
\documentclass{article}
\usepackage{amsmath,etoolbox}
\makeatletter
\newtoggle{reducedop}
\newcommand{\reduceoperatorsize}[1]{%
\csletcs{#1saved}{#1}%
\csletcs{#1@saved}{#1@}%
\@namedef{#1}{%
\@ifstar
{\togglefalse{reducedop}\@nameuse{#1saved}}%
{\toggletrue{reducedop}\@nameuse{#1saved}}%
}
\@namedef{#1@}{%
\iftoggle{reducedop}
{\reduced@operator{#1}}
{\@nameuse{#1@saved}}
}%
}
\newcommand{\reduced@operator}[1]{%
\mathop{\mathpalette\reduced@operator@i{#1}\relax}%
}
\newcommand\reduced@operator@i[2]{%
\ifx#1\displaystyle\textstyle\else#1\fi
\csname #2@saved\endcsname
}
\makeatother
\reduceoperatorsize{sum}
\begin{document}
$\sum*_{k=1}^n$\quad$\sum_{k=1}^n$\quad$\sum\limits_{k=1}^n$
\[
\sum*_{k=1}^n\quad\sum_{k=1}^{n} k^2=\frac{n(n+1)(2n+1)}{6}
\]
\end{document}
第一句是为了表示尊重惯常行为。
该amsmath
包重新定义\sum
了
\let\sum@\sum
\def\sum{\DOTSB\sum@\slimits@}
并对\coprod
、\bigvee
、\bigwedge
、\biguplus
、\bigcap
、\bigcup
、\prod
、和执行相同操作。这使得符号“点感知”并尊重或选项\bigotimes
,因为\bigoplus
\bigodot
\bigsqcup
sumlimits
nosumlimits
\DeclareOption{sumlimits}{\let\slimits@\displaylimits}
\DeclareOption{nosumlimits}{\let\slimits@\nolimits}
基于此,我重新定义\sum
为
\togglefalse{reducedop}\sumsaved
如果\sum*
发现并且
\toggletrue{reducedop}\sumsaved
否则。这里与 中的定义\sumsaved
相同。然后我重新定义如果切换设置为 false 则执行,其中 和原来的 相同。如果切换设置为 true ,则改为执行 。在其中我检查样式:如果是,则使用,否则使用当前样式和排版。周围的内容与之前一样。\sum
amsmath
\sum@
\sum@saved
\sum@saved
\sum@
\mathop{\mathpalette\reduced@operator@i{sum}}
\mathpalette
\displaystyle
\textstyle
\sum@saved
\mathop
\slimits@
答案3
我知道这是一篇旧帖子,但我今天读到了它。我使用的是这个:
\newcommand{\sumt}[2][]{
\ifthenelse{\isempty{#1}}
{\textstyle \sum_{#2} \displaystyle}
{\textstyle \sum_{#2}^{#1} \displaystyle}
}
请注意,它需要\usepackage{xifthen}
。
然后,例如,我调用\sumt[n-1]{i=1} k_i
来获取与我从 中获得的相同的结果\sum_{i=1}^{n-1} k_i
。请注意,这确实强制要求之后的所有内容都处于显示模式,这可能会或可能不会没有帮助。一旦 用\int
和做类似的事情\prod
。请注意,与通常的相比,这是倒写的。
理想情况下,我会将两个参数都设为可选参数,并且顺序为\sum[lower][upper]
。 (我不确定空白^{}
会产生什么影响。)不过,需要有人比我更擅长 tex 才能做到这一点!
例如,极简代码
\begin{align*}
a &+ \sumt[n-1]{i=1} i = 3\\
a &+ \textstyle\sum_{i=1}^{n-1} i = 3
\end{align*}
生成下面的图像。