LaTeX 分段函数怎么写?cases、条件对齐与公式编号

博客EasyLaTeX发布于

LaTeX 分段函数可以用 amsmath 宏包的 cases 环境编写:每行先写函数值,用 & 分隔条件,用 \\ 开始下一分支。把整个定义放进 equation,就能为它加上一个公式编号。

先复制这份完整示例

保存为 main.tex,用 pdfLaTeX 编译。这个 article 文档只需 amsmath;不需要为了写分段函数再加载同名的 cases 宏包。

LaTeX
\documentclass[a4paper,11pt]{article}\usepackage{amsmath}​\begin{document}\begin{equation}\label{eq:absolute}  |x| =  \begin{cases}    x,  & \text{if } x \ge 0, \\    -x, & \text{if } x < 0.  \end{cases}\end{equation}See equation~\eqref{eq:absolute}.\end{document}

PDF 中应出现一个左大括号、两行函数值与条件,以及整个定义共用的一个编号。交叉引用解析后,正文中的编号应与公式一致。这里 x = 0 属于第一分支,负数属于第二分支,实数范围内没有遗漏或重叠。

分段函数结构示意:左列给出函数值,右列给出适用条件。边界点 0 分配给第一行。

&、\\ 与条件文字分别怎么写?

  • & 把每行分成两列。两列各自左对齐;源码里用于缩进的空格不会形成 PDF 中的列对齐。
  • \\ 表示下一分支,最后一行通常不写。源码中的普通回车不会让公式换行。
  • \text{if } 把英文说明排成正常文字,花括号内保留一个空格以隔开后面的数学条件。\text{otherwise} 表示“其他情况”。
  • cases 自带左大括号,无须再加 \left\{。它必须处于数学模式,例如 \[...\] 或 equation 内。多行分段定义通常更适合独立展示。

例如,下面定义的是一个阶跃函数;在实数定义域中,otherwise 覆盖 x <= 0,包括零点。

LaTeX
\[s(x)=\begin{cases}  1, & \text{if } x > 0, \\  0, & \text{otherwise}.\end{cases}\]

条件中的数学符号继续写在数学模式里。不要把 if x >= 0 当作一串数学字母,也不要把整条条件写成没有数学模式的普通文字。若改用后文的 dcases*,右列的规则会不同。

论文示例:Huber 损失与条件边界

设 r 为实数残差,阈值 δ > 0。Huber 损失在残差较小时使用二次项,较大时使用关于绝对残差的线性项:

LaTeX
\[L_{\delta}(r) =\begin{cases}  \frac{1}{2}r^2, & \text{if } |r| \le \delta, \\  \delta\left(|r|-\frac{1}{2}\delta\right),    & \text{if } |r| > \delta.\end{cases}\]

这里第一分支包含 |r| = δ,第二分支只处理 |r| > δ。在边界处,两条表达式都等于 δ²/2;条件仍只把边界分配给第一分支。以 δ = 1 为例,r = 0、1、2 时,损失分别为 0、0.5、1.5。

修改示例时,先列出定义域,再检查每个边界。把两行都写成严格不等式可能漏掉边界;把两行都写成包含等号的不等式则会重叠。编译成功无法验证这些数学条件。

分数太小:选择 cases 还是 dcases?

普通 cases 使用文本样式(\textstyle),即使外层是独立公式,内部 \frac 仍然较小。需要更大的分数、求和或积分时,可以将导言区的 \usepackage{amsmath} 换成 \usepackage{mathtools},再使用 dcases。mathtools 会自动加载 amsmath。

把下面片段放进加载了 mathtools 的文档正文,即可比较同一函数的两种排法:

LaTeX
\[g(x)=\begin{cases}  \frac{1}{1+x^2}, & x \ge 0, \\  0, & x < 0.\end{cases}\qquadg(x)=\begin{dcases}  \frac{1}{1+x^2}, & x \ge 0, \\  0, & x < 0.\end{dcases}\]

排版样式对照示意:函数定义与条件相同,dcases 使用展示样式,分数更大,行间也更宽。实际效果以你的模板编译结果为准。

若只有一个分数需要放大,也可在 cases 中把 \frac 改为 \dfrac。它只改变这个分数的样式;dcases 则为分支采用展示样式。检查行距和版心宽度后再选择,较大的公式未必适合窄栏。

dcases* 的右列是普通文字

dcases 的条件列仍是数学模式,需要 \text{...} 包住英文。dcases* 将右列设为普通文字,数学条件须放进 $...$:

LaTeX
\[g(x)=\begin{dcases*}  \frac{1}{1+x^2}, & if $x \ge 0$, \\  0, & otherwise.\end{dcases*}\]

两种形式都由 mathtools 提供。切换环境名时,也要一起修改右列的写法。

整体编号与各分支编号

需求写法依赖与注意事项
不显示编号\[...\] 内放 casesamsmath
整个分段定义一个编号equation 内放 cases使用 \label 与 \eqref
各分支分别编号numcases另加载 cases 宏包;自身就是独立公式环境
各分支编号为同组字母后缀subnumcasescases 宏包,例如 (1a)、(1b)

大多数函数定义用一个编号就够了。如果正文必须分别引用某一分支,可以在导言区加载 \usepackage{amsmath} 和 \usepackage{cases},再将以下片段放入正文:

LaTeX
\begin{numcases}{h(x)=}  x,  & if $x \ge 0$ \label{eq:positive} \\  -x, & if $x < 0$ \label{eq:negative}\end{numcases}See equations~\eqref{eq:positive} and~\eqref{eq:negative}.

numcases 的参数 {h(x)=} 是大括号左边的内容,右列默认按文字处理,因此数学条件要放在 $...$ 中。不要再把 numcases 包进 equation 或 \[...\]。各行的 \label 对应各自编号;若要字母后缀,可把环境名换成 subnumcases 并重新核对引用。

关于更多引用规则,参见公式编号与交叉引用。

常见问题:从症状找到修改位置

症状先检查什么修改方法
数学模式或对齐相关报错cases 是否位于数学环境内,是否加载 amsmath恢复完整示例的外层环境与宏包
Environment dcases undefined只加载了 amsmath加载 mathtools
条件与函数值挤在一起是否缺少 &每行用一个 & 分隔值与条件
多个分支出现在同一行行间是否缺少 \\在分支之间加双反斜杠
Extra alignment tab 等对齐错误一行是否写了过多 &普通 cases 保持两列
if、otherwise 斜体且空格消失英文是否当作数学字母输入普通 cases 使用 \text{...}
大括号出现两次是否手工加了 \left\{保留 cases 自带的大括号
引用显示 ??标签拼写、编号环境及编译轮次检查 \label,再编译并查看日志

这些现象可能有多种原因;先看日志中的第一处错误和附近源码,避免只根据最后一条提示修改。

在本地或 EasyLaTeX 中验证

本地 TeX Live / MiKTeX 用户可在 main.tex 所在目录运行两次:

Shell
pdflatex -interaction=nonstopmode -halt-on-error main.texpdflatex -interaction=nonstopmode -halt-on-error main.tex

查看 main.log 是否有错误、未解析引用或 Overfull \hbox,再打开本次生成的 main.pdf,检查大括号、条件列、分数大小和编号。把 δ = 1 的三个残差代入 Huber 示例,也能检查抄写时是否改错系数。

在 EasyLaTeX 中,将示例放入项目的主文件,确认主文件选择正确,并为这份英文 article 示例选用 pdfLaTeX。等待编译完成;遇到问题时在 Bug 面板查看提示及 Original Log。需要辅助定位时,可向 Agent 提供相关源码和日志,逐项审阅修改后重新编译。已有中文或期刊模板应保留适用的编译器与模板设置。

本文完整最小文档及其余五组代码片段已用 TeXLive.net 的 pdfLaTeX 编译,核对日志与 PDF;没有在产品编译器或具体期刊模板中实测。合并进现有论文时,仍需检查宏包兼容性和当前 PDF。

更多基础语法见上下标、分数、括号与矩阵;长公式的处理见公式换行教程,编译问题可参考编译错误排查。

参考资料

LaTeX 分段函数:cases、dcases 与公式编号教程 | EasyLaTeX