LaTeX 分段函数怎么写?cases、条件对齐与公式编号
LaTeX 分段函数可以用 amsmath 宏包的 cases 环境编写:每行先写函数值,用 & 分隔条件,用 \\ 开始下一分支。把整个定义放进 equation,就能为它加上一个公式编号。
先复制这份完整示例
保存为 main.tex,用 pdfLaTeX 编译。这个 article 文档只需 amsmath;不需要为了写分段函数再加载同名的 cases 宏包。
\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,包括零点。
\[s(x)=\begin{cases} 1, & \text{if } x > 0, \\ 0, & \text{otherwise}.\end{cases}\]条件中的数学符号继续写在数学模式里。不要把 if x >= 0 当作一串数学字母,也不要把整条条件写成没有数学模式的普通文字。若改用后文的 dcases*,右列的规则会不同。
论文示例:Huber 损失与条件边界
设 r 为实数残差,阈值 δ > 0。Huber 损失在残差较小时使用二次项,较大时使用关于绝对残差的线性项:
\[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 的文档正文,即可比较同一函数的两种排法:
\[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* 将右列设为普通文字,数学条件须放进 $...$:
\[g(x)=\begin{dcases*} \frac{1}{1+x^2}, & if $x \ge 0$, \\ 0, & otherwise.\end{dcases*}\]两种形式都由 mathtools 提供。切换环境名时,也要一起修改右列的写法。
整体编号与各分支编号
| 需求 | 写法 | 依赖与注意事项 |
|---|---|---|
| 不显示编号 | \[...\] 内放 cases | amsmath |
| 整个分段定义一个编号 | equation 内放 cases | 使用 \label 与 \eqref |
| 各分支分别编号 | numcases | 另加载 cases 宏包;自身就是独立公式环境 |
| 各分支编号为同组字母后缀 | subnumcases | cases 宏包,例如 (1a)、(1b) |
大多数函数定义用一个编号就够了。如果正文必须分别引用某一分支,可以在导言区加载 \usepackage{amsmath} 和 \usepackage{cases},再将以下片段放入正文:
\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 所在目录运行两次:
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。
更多基础语法见上下标、分数、括号与矩阵;长公式的处理见公式换行教程,编译问题可参考编译错误排查。
参考资料
- amsmath 用户指南:数学环境、
cases、\text与文本样式。 - mathtools 官方文档:
dcases与星号变体。 - cases 宏包文档:
numcases、subnumcases与条件列规则。