SGR 73 / 74 / 75 —— 上标 / 下标 / 取消
Mintty 的上标 / 下标 SGR 对,现已被 Kitty 0.32+、WezTerm、foot 与 iTerm2 实现。是终端输出能不靠特殊字符排出数学、脚注与化学式的第一组 SGR。
字节形式
涵盖所有常见的字符串字面量写法,方便正反查找。
\x1b[73m superscript \x1b[74m subscript \x1b[75m neither\033[73m / \033[74m / \033[75m\e[73m / \e[74m / \e[75mESC [ 73 m / ESC [ 74 m / ESC [ 75 m1b 5b 37 33 6d / 1b 5b 37 34 6d / 1b 5b 37 35 6d说明
三个超出历史 ECMA-48 词汇(止于 SGR 65)的 SGR 码,由 **mintty** 在 2017 年前后引入,**Kitty 0.32+**、**WezTerm 20240128+**、**foot 1.16+**、**iTerm2 3.5+** 后续跟进。它们是 Unicode 上标 / 下标块(U+2070–U+209F)的*属性*对偶 —— 不替换字模,而让终端把*当前*字模以更小尺寸、抬升 / 下沉的基线渲染。 **编码** - `\x1b[73m` —— **上标**。后续字符以约 75% 尺寸、基线大致抬至 cap-height 行渲染。 - `\x1b[74m` —— **下标**。后续字符以约 75% 尺寸、基线下沉渲染。 - `\x1b[75m` —— **取消**。同时关闭上下标。与 `\x1b[0m`(同时清掉所有其他属性)不同。 **为何要紧** - *数学输出* —— `H₂O` 写作 `H\x1b[74m2\x1b[75mO`,而不是 `H\u2082O`(后者只在输出字体含下标码点时奏效,许多等宽字体没有)。 - *脚注* —— `text¹` 用 `text\x1b[73m1\x1b[75m` 渲染,且作为普通数字仍可搜索 / 复制粘贴。 - *化学 / 单位* —— `m²`、`m³`、`kg·m·s⁻¹` 都能在等宽下渲染而无需字形替换。 - *Diff 输出* —— `git --color-words` 等工具可用上下标标记插入 / 删除位置,不扰动源行。 **约束** - 属性按规范**互斥**:在下标激活时发 `\x1b[73m` 应切换到上标而非堆叠。实际模拟器实现正确(最后一个赢)。 - **不可嵌套** —— 没有「上上标」的 SGR。终端回落为单层渲染。 - **复制 / 粘贴保留写入的码点**,不是渲染后的字模 —— 因此 `H\x1b[74m2\x1b[75mO` 往返回到 `H2O`(剪贴板会剥掉转义)。这是平文本往返的正确行为,但意味着不能依赖视觉上的上下标向不识别 SGR 的下游工具传达语义上下标 —— 用 Unicode 做那件事。 - **宽度** —— 上下标字符仍占网格 1 列宽;更小的字模不改列对齐。这对 TUI 布局很要紧:`10²` 这种标注仍是 3 单元宽。 **覆盖度**:**Kitty**(≥ 0.32)+ **WezTerm**(≥ 20240128)+ **foot**(≥ 1.16)+ **iTerm2**(≥ 3.5)+ **mintty**(≥ 3.4)= 完整。**Ghostty** = 完整(自 1.0 起)。**xterm** = 部分(`patch #383+`,仅在 `cjkWidth: true` 时;否则关闭)。**gnome-terminal** + **Konsole** + **Alacritty** + **Windows Terminal** + **cmd / ConPTY** + **macOS Terminal** + **Linux console** = 静默吞掉(SGR 被解析,但渲染器仍以正常尺寸基线绘制)。Reset(`\x1b[0m`)在任何地方都关闭这两个属性。
规范出处: mintty / Kitty terminal-graphics-protocol superscript-extension / xterm-ctlseqs patch #383
参数
| 73 | 上标开。 |
| 74 | 下标开。 |
| 75 | 取消上下标(不动其他 SGR 属性)。 |
示例
# Write 'H2O' with the 2 as subscript.\nprintf 'H\\033[74m2\\033[75mO\\n'\n# Cite 'foo^1' with footnote marker.\nprintf 'see foo\\033[73m1\\033[75m for context.\\n'import sys\nsys.stdout.write('Area: 10\\x1b[73m2\\x1b[75m m\\x1b[73m2\\x1b[75m\\n') # 10² m²// Render a sequence: x¹, x², x³ in monospace via SGR rather than Unicode.\nfor _, n := range []int{1, 2, 3} {\n fmt.Printf(\"x\\x1b[73m%d\\x1b[75m \", n)\n}\nfmt.Println()// Footnote marker that copy-pastes as plain digit.\nprocess.stdout.write('see ref' + '\\x1b[73m' + idx + '\\x1b[75m\\n');/* Chemical formula with subscripts. */\nprintf(\"C\\x1b[74m6\\x1b[75mH\\x1b[74m12\\x1b[75mO\\x1b[74m6\\x1b[75m\\n\");终端支持
- xterm
- 部分
- Linux console (fbcon)
- 不支持
- macOS Terminal.app
- 不支持
- iTerm2
- 支持
- Windows Terminal
- 不支持
- cmd.exe / ConPTY
- 不支持
- kitty
- 支持
- alacritty
- 不支持
- WezTerm
- 支持
- Ghostty
- 支持
- GNOME Terminal
- 不支持
- Konsole
- 不支持
- tmux
- 不支持
- GNU screen
- 不支持
| xterm | Linux console (fbcon) | macOS Terminal.app | iTerm2 | Windows Terminal | cmd.exe / ConPTY | kitty | alacritty | WezTerm | Ghostty | GNOME Terminal | Konsole | tmux | GNU screen |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 部分 | 不支持 | 不支持 | 支持 | 不支持 | 不支持 | 支持 | 不支持 | 支持 | 支持 | 不支持 | 不支持 | 不支持 | 不支持 |