求和 Σ、积分 ∫、集合并 ⋃ ——这些是在公式中以较大尺寸排版,并在上下或旁边带有范围(限界)的特殊符号。LaTeX 把这一类称为可变大小运算符(大型运算符),用 \sum、\int、\bigcup 等命令输出。共同机制是:下标 _ 和上标 ^ 会成为运算符的限界;在陈列公式中它们堆在符号上下,而在正文行内则放在符号右侧。本页整理限界如何附着、如何控制位置(\limits、\nolimits)、多行下标,以及如何定义自己的运算符。
什么是可变大小运算符
数学符号大致有两类:固定大小、能放在字高内的符号(+、=、\cup 等),以及会随排版语境改变大小的可变大小运算符。后者的代表是求和 \sum、乘积 \prod、积分 \int 和集合并 \bigcup。它们在陈列样式中排得较大,在文本样式中较紧凑,并且都会把下标和上标作为限界特殊处理。
“限界”指的是表示求和或积分范围的添字。写 \sum_{i=1}^{n} 时,i=1 是下限,n 是上限。它不同于普通下标 / 上标(如 x_i、x^2 那样位于字符右下或右上):附着在可变大小运算符上的添字有时会放在符号正下方和正上方。具体是哪一种,取决于排版样式和符号种类;这就是下一节的主题。
核心成员内置于标准 LaTeX(更准确地说是底层 TeX),不需要额外宏包。多重积分 \iint、\iiint,后面会用到的多行下标 \substack,以及定义运算符的 \DeclareMathOperator 都需要 amsmath 宏包。amsmath 是事实标准,因此认真排数学公式时,建议在导言区写上 \usepackage{amsmath}。
求和、乘积与限界附着方式
求和是 \sum,乘积是 \prod,余积(对偶积)是 \coprod。范围用下标 _ 和上标 ^ 给出。例如在求和 \sum_{k=0}^{n} a_k 中,陈列公式会把求和号 Σ 排得很大,并把 k=0 放在其正下方、n 放在其正上方。同一个公式写在正文行内时,为了不扰乱行高,Σ 会变小,k=0 和 n 会小小地放在符号右侧上下排列。
別行立て:
\[
\sum_{k=0}^{n} a_k = a_0 + a_1 + \dots + a_n,
\qquad \prod_{k=1}^{n} k = n!
\]
本文中: 級数 $\sum_{k=0}^{n} a_k$ は行内に収まる。这种上下 / 侧边的切换是随样式变化的默认行为。求和、乘积、余积这类“sum-class”符号在陈列样式中把限界堆在上下,在文本样式中放在侧边;amsmath 把这种方案称为 displaylimits(只在显示时上下放置)。这是合理的默认设置,可避免周围正文行距无谓变大。
范围只有一部分时,只写一侧添字即可。也可以把条件写在下限中,如 \sum_{i \in S};在陈列公式中,i ∈ S 会放在 Σ 的正下方。添字跨越多个 token 时一定要用 { } 包起来(如 \sum_{k=1} 中的 k=1)。如果忘了这一点写成 \sum_k=1,只有 k 会成为下标,=1 会流到符号右侧。
积分——限界放在侧边
积分号是 \int,其范围(积分区间)同样用下标和上标给出。写 \int_a^b f(x)\,dx 会得到下端 a、上端 b 的定积分。关键是:积分的默认行为与求和不同。像 \int 这样的“integral-class”符号,即使在陈列公式中,也会把限界放在符号右侧。这符合数学排版习惯,因为 \int 的定义内部带有 \nolimits(侧边放置)。
\[
\int_{0}^{\infty} e^{-x}\,dx = 1,
\qquad \oint_{C} \mathbf{F}\cdot d\mathbf{r}
\]即使在陈列公式中,这个例子也会把 0 放在 ∫ 的右下,把 ∞ 放在右上(如果是求和,则会堆在上下)。被积函数与 dx 之间的 \,(细空白)是数学排版中惯常加入的小间距。围道积分(沿闭曲线的积分)用 \oint,它是在 ∫ 上叠加一个小圆。
多重积分也可以通过重复符号写成 \int\int,但符号之间的间距往往显得笨拙。载入 amsmath 后,可以使用专门命令,间距会被最佳压紧:二重积分 \iint、三重积分 \iiint、四重积分 \iiiint,以及点列连接的多重积分 \idotsint(在两个积分号之间放点,如 ∫⋯∫)。这些命令在行内和陈列公式中都会调整间距。
\[
\iint_{D} f(x,y)\,dx\,dy,
\qquad \iiint_{V} f\,dV,
\qquad \idotsint_{A} f\,dV
\]如果需要物理中常见的闭合积分号,例如曲面和体积上的二重、三重围道积分,esint 宏包提供 \oiint、\oiiint 等命令。标准 LaTeX 只提供 \oint。
改变限界位置(\limits / \nolimits)
可以用两个命令覆盖默认位置。把 \limits 放在运算符紧后面,会强制限界放在上下;放 \nolimits 则强制放在侧边。例如,想让正文行内的求和范围放到上下,可写 \sum\limits_{k=1}^{n};反过来,想让陈列公式中的积分限界上下堆叠,可写 \int\limits_0^1。
本文中で上下に: $\sum\limits_{k=1}^{n} k$
別行立ての積分を上下に:
\[
\int\limits_{0}^{1} x^2\,dx = \frac{1}{3}
\]这里关键是放置位置。\limits 和 \nolimits 必须放在所作用的运算符紧后面(写添字之前)。像 \sum_{k=1}\limits 这样放在添字之后会出错。如果连续出现多个 \limits、\nolimits、\displaylimits,则最后一个优先。
如果想恢复与陈列 / 行内样式联动的默认行为(sum-class 的 displaylimits),可使用 \displaylimits。下表总结了各类符号的默认行为以及覆盖命令的效果。
| 符号 / 命令 | 陈列样式 | 行内样式 |
|---|---|---|
\sum, \prod, \bigcup … | 上下堆叠 | 放在右侧 |
\int, \oint, \iint … | 放在右侧 | 放在右侧 |
\limits(作用素の直後) | 上下堆叠(强制) | 上下堆叠(强制) |
\nolimits(作用素の直後) | 放在侧边(强制) | 放在侧边(强制) |
\displaylimits | 上下堆叠 | 放在右侧 |
极限与上下极限(\lim 系列)
\lim(极限)、\limsup(上极限)、\liminf(下极限)是像函数名一样以直立体(roman)排版的运算符,但添字处理方式与可变大小运算符中的 sum-class 相同:在陈列公式中,下标位于正下方;在行内则位于右下方。\limsup 和 \liminf 分别排成“lim sup”和“lim inf”两个词,词间会有适当空白。
\[
\lim_{n \to \infty} \frac{1}{n} = 0,
\qquad \limsup_{n \to \infty} a_n \ge \liminf_{n \to \infty} a_n
\]因为这是陈列公式,n→∞ 会排在 lim 的正下方。同一个公式写在行内时,n→∞ 会小小地放在 lim 的右下方。\sup、\inf、\max、\min 也属于同一类,会把下标放在下方(这些也汇总在“数学模式基础”的函数名小节中)。箭头 → 是 \to,无穷大是 \infty。
大型符号(n 元运算符)
集合论、逻辑和代数中使用的 n 元运算符也有像 \sum 一样的可变大小“大”版本。命令形式是在对应二元运算符名称前加 big。例如二元并集 \cup(A ∪ B)的可变大小版本是 \bigcup。这些全都是 sum-class,所以在陈列公式中把限界堆在上下,在行内则放在侧边。
| 命令 | 含义 | 对应二元运算符 |
|---|---|---|
\bigcup | 并集(n 元) | \cup(∪) |
\bigcap | 交集(n 元) | \cap(∩) |
\bigsqcup | 不交并(方形并) | \sqcup(⊔) |
\biguplus | 多重集合并 | \uplus(⊎) |
\bigvee | 逻辑或 / join(n 元) | \vee(∨) |
\bigwedge | 逻辑与 / meet(n 元) | \wedge(∧) |
\bigoplus | 直和(带圈 +) | \oplus(⊕) |
\bigotimes | 张量积(带圈 ×) | \otimes(⊗) |
\bigodot | 带圈点(n 元) | \odot(⊙) |
\[
\bigcup_{i=1}^{n} A_i, \qquad
\bigcap_{i \in I} A_i, \qquad
V = \bigoplus_{k} V_k
\]因为这是陈列公式,\bigcup_{i=1}^{n} 会把 i=1 堆在大 ⋃ 的正下方,把 n 放在正上方。\bigoplus_{k} 会把 k 放在放大的 ⊕ 下方,用一个符号表示直和 V = V₁ ⊕ V₂ ⊕ …。若写在行内,这些限界都会小小地放在符号右侧。
多行下标(\substack 与 subarray)
在求和或大型运算符下面,常常需要把条件写成多行(例如“0 ≤ i ≤ m 且 0 < j < n”)。使用 amsmath 的 \substack{…} 时,用 \\ 分隔的每一行会成为居中堆叠的下标。注意要把整个 \substack{…} 放在下标位置。
\[
\sum_{\substack{0 \le i \le m \\ 0 < j < n}} P(i,j)
\]在陈列公式中,这会把“0 ≤ i ≤ m”和“0 < j < n”两行堆在求和号 Σ 的正下方,并且每行居中。\substack 中的 \\ 是换行分隔符,最后一行后面不要加。
如果想让各行左对齐,可使用更通用的 subarray 环境。\begin{subarray}{l} … \end{subarray} 中的 {l} 指定左对齐({c} 则为居中),内容和 \substack 一样用 \\ 换行。当你希望条件式开头对齐时,这样更易读。
\[
\sum_{\begin{subarray}{l} i \in \Lambda \\ 0 < j < n \end{subarray}} P(i,j)
\]定义自己的运算符(\DeclareMathOperator*)
当你需要列表中没有的运算符名,并希望它以直立体排版、且下标位于正下方时——例如 argmax、argmin、esssup——可使用 amsmath 的 \DeclareMathOperator。在导言区声明一次后,就能在正文中作为短命令调用。若要把限界放在正下方(与 \lim 相同的 sum-class 行为),关键是使用带星号的 \DeclareMathOperator*。没有星号时,下标会放在函数名右下方。
% プリアンブルで:
\usepackage{amsmath}
\DeclareMathOperator*{\argmax}{arg\,max}
\DeclareMathOperator{\rank}{rank}
% 本文で:
\[
\hat{\theta} = \argmax_{\theta} L(\theta),
\qquad \rank A \le n
\]在这个例子中,\argmax 是带星号定义的,所以陈列公式会把 θ 放在 arg max 的正下方(行内则在右下)。名称文本中的 \, 是词间细空白,用来适当地分开“arg max”两个词。相对地,\rank 没有星号,所以 \rank A 会以直立体和合适间距排成 rank A,若加下标则位于右下。只用一次时,也可以不声明,直接写 \operatorname{rank}(若要把限界放下方,则写 \operatorname*{…})。
名称文本内部有特殊约定:连字符 - 会按正文中的普通连字符排版(不是减号),星号 * 会按上抬的文本星号排版(不是居中的二元星号)。函数名应使用 \DeclareMathOperator 或 \mathrm,而不是 \text{…};这样前后间距会自动调整,即使放在定理环境等斜体语境中也会保持直立。
一个相关技巧:如果想给 sum-class 符号的四个角加添字(例如给求和号加“prime(′)”),amsmath 提供 \sideset。写 \sideset{}{'}\sum_{n} a_n 可以在 Σ 的右上角加 prime,同时仍把限界放在下方。\sideset 只适用于 sum-class 符号;第一个参数指定左侧四角,第二个参数指定右侧四角。在每个参数中,可用 _{lo}^{hi} 的形式分别写下角和上角,因此 \sideset{_a^b}{_c^d}\sum 会在四个角分别放上不同添字(普通的 _、^ 限界仍照常附着)。