中日韩格式化指南
VMark 内置了一套全面的中文、日文和韩文排版规则。这些工具有助于在混合中日韩与拉丁字符时保持一致的排版风格。
韩文被有意排除在外
韩文使用其固有的词间空格,助词直接附着在前一个词上——写作 VMark에는,而绝不是 VMark 에는。在那里插入空格是语法错误,而不是排版偏好,因此谚文不参与任何间距规则,也不参与全角标点转换。韩文文本会原样通过;只有其中的汉字会被格式化。
快速开始
使用格式 → 中日韩文字 → 格式化整个文件,或按 Alt + Mod + Shift + F 格式化整个文档。
格式 → 中日韩文字 → 格式化选中内容(Mod + Shift + F)格式化选区所跨越的块——光标或选区触及的整个段落、列表或表格,而不是选中的那几个字符。中日韩间距是相邻两个字符之间边界的属性,半个词的选区不包含这样的边界,因此该命令指定的是要修正的区域,而不是要重写的文本。没有选区时,它格式化光标所在的块。
两个命令保护的内容完全相同(见受保护的内容),因此先全选再按 Mod + Shift + F 是安全的。
格式化规则
1. 中日韩与拉丁字符间距
自动在中日韩字符与拉丁字符/数字之间添加空格,包括带符号的数字(负号、正号、正负号)以及带货币前缀的数字。
| 格式化前 | 格式化后 |
|---|---|
| 学习Python编程 | 学习 Python 编程 |
| 共100个 | 共 100 个 |
| 使用macOS系统 | 使用 macOS 系统 |
| 我有-1个 | 我有 -1 个 |
| 我有+1个 | 我有 +1 个 |
| 误差±5%范围 | 误差 ±5% 范围 |
| 中文-$100元 | 中文 -$100 元 |
| 范围-100到-200 | 范围 -100 到 -200 |
可识别的符号字符包括 ASCII 的 - +、全角的 - +、Unicode 减号 − 以及正负号 ±。只有当符号后面紧跟数字(或紧跟“货币符号 + 数字”)时,它才会附着到数字上,因此中日韩与拉丁字符之间用连字符连接的标识符(例如 中文-Web)和中日韩字符之间用连字符连接的短语(例如 中文-我)都会保持原样,5-10 这样的范围也会被保留。
什么算中日韩字符,什么算拉丁字符。中日韩字符是指 Unicode 文字类别为汉字、平假名、片假名或注音符号的字符。其中包括较少见的汉字区块(扩展 A 区、补充平面上的各扩展区以及兼容表意文字)、叠字符号 々、表意数字零 〇、半角片假名以及长音符号 ー。拉丁字符是指任何拉丁文字的字母,包括带变音符号的字母,因此一个单词的两侧都会加上空格:
| 格式化前 | 格式化后 |
|---|---|
| 中文café中文 | 中文 café 中文 |
| 中文𠀀abc | 中文𠀀 abc |
| カタカナabc | カタカナ abc |
| 日本・東京 | 日本・東京 |
全角拉丁字母(A)自带间距,因此永远不会再加空格。片假名中点 ・ 是标点而不是字母,因此不会在它旁边添加空格。
链接。只有当链接的可见文本以拉丁字母或数字结尾时,链接的右括号与其后的中日韩文本之间才会加空格——那正是读者看到的间隙。参见[link](https://x.com)中文 会变成 参见[link](https://x.com) 中文;参见[中文](https://x.com)中文 则保持不变。
2. 全角标点
在中日韩语境中将半角标点转换为全角。
| 格式化前 | 格式化后 |
|---|---|
| 你好,世界 | 你好,世界 |
| 什么? | 什么? |
| 注意:重要 | 注意:重要 |
3. 全角字符转换
将全角字母和数字转换为半角。
| 格式化前 | 格式化后 |
|---|---|
| 1234 | 1234 |
| ABC | ABC |
4. 括号转换
将半角括号在包围中日韩内容时转换为全角。两个括号必须位于同一段落中:中间隔着空行时,保持输入时的样子。
| 格式化前 | 格式化后 |
|---|---|
| (注意) | (注意) |
| [重点] | 【重点】 |
| (English) | (English) |
5. 破折号转换
将双连字符转换为正确的中文破折号。
| 格式化前 | 格式化后 |
|---|---|
| 原因--结果 | 原因 —— 结果 |
| 说明--这是 | 说明 —— 这是 |
6. 智能引号转换
VMark 使用基于栈的引号配对算法,能正确处理:
- 撇号:
don't、it's、l'amour等缩略形式保持不变 - 所有格:
Xiaolai's保持原样 - 英尺英寸符号:
5'10"(英尺/英寸)等测量符号保持不变 - 年代缩写:
'90s等年代简写被正确识别 - 中日韩语境检测:包围中日韩内容的引号使用弯引号或角括号
| 格式化前 | 格式化后 |
|---|---|
| 他说"hello" | 他说 “hello” |
| "don't worry" | “don't worry” |
| 5'10" tall | 5'10" tall |
弯引号在紧邻中日韩文字时会加空格:他说"hello" 会变成 他说 “hello”。直角引号(「 」、『 』)和句末标点旁不加空格。若要让弯引号紧排,可在 设置 → 语言 → CJK 格式化 中关闭 修复双引号间距 或 修复单引号间距:“ ” 与 ‘ ’ 在中日韩语境中是全角字符,GB/T 15834 和 JLREQ 都把这一空隙视为字形的一部分——这两个开关正是为此而设。
启用角括号选项时:
| 格式化前 | 格式化后 |
|---|---|
| "中文内容" | 「中文内容」 |
| 「包含'嵌套'」 | 「包含『嵌套』」 |
7. 省略号规范化
统一省略号格式,并采用周围文字所使用的形式。这里没有唯一的正确答案:中文(GB/T 15834)和日文(JIS X 4051)使用六点省略号 ……,其后不加空格;韩文使用 …;只有拉丁文本使用 ... 并在其后加一个空格。
| 格式化前 | 格式化后 |
|---|---|
| 等等. . . | 等等…… |
| 然后...继续 | 然后……继续 |
| そして...続く | そして……続く |
| 그리고...계속 | 그리고…계속 |
| wait...ok | wait... ok |
使用哪种文字的形式,由紧挨着这些点的字符决定,而不是由整个文档决定,因此中文文件里英文引文中的 ... 会保持其拉丁形式。
8. 重复标点
限制连续标点符号的数量(可配置上限)。
| 格式化前 | 格式化后(上限=1) |
|---|---|
| 太棒了!!! | 太棒了! |
| 真的吗??? | 真的吗? |
9. 其他清理
- 多余空格压缩:
多个 空格→多个 空格 - 移除行尾空格
- 斜杠间距:
A / B→A/B - 货币与单位绑定:
$ 100→$100,100 %→100%。只会移除空格和制表符:位于一行或一个段落末尾的数字,永远不会与下一行的单位或货币符号连在一起;你在数字和单位之间输入的不换行空格也会被保留
受保护的内容
以下内容不受格式化影响:
- 代码块(```)——包括未闭合的围栏,按照 CommonMark 规范,它会占据文档的其余部分
- 内联代码(`)
- 链接 URL
- 图片路径
- HTML 标签
- 前置内容——包括 YAML(
---)和 TOML(+++) - 行内数学公式(
$…$),采用与 VMark 渲染器相同的规则匹配,因此像价格是 $100 和 $200 元这样的一对货币符号不会被误认为数学公式 - 块级数学公式(
$$…$$) - 缩进代码块
- Wiki 链接(
[[target]]、[[target|display]]) - 脚注标记——像
[^1]这样的引用,以及定义中的[^1]:标签(定义本身的文字会被格式化) - HTML 字符引用(
&、其) - 分隔线(
---、***) - 反斜杠转义的标点(例如
\,保持为,)
技术性结构
VMark 的拉丁文段落扫描器会自动检测并保护技术性结构,防止标点转换:
| 类型 | 示例 | 保护 |
|---|---|---|
| URL | https://example.com | 所有标点保持不变 |
| 邮件地址 | user@example.com | @ 和 . 保持不变 |
| 版本号 | v1.2.3、1.2.3.4 | 点号保持不变 |
| 小数 | 3.14、0.5 | 点号保持不变 |
| 时间 | 12:30、1:30:00 | 冒号保持不变 |
| 千位数 | 1,000、1,000,000 | 逗号保持不变 |
| 域名 | example.com | 点号保持不变 |
示例:
| 格式化前 | 格式化后 |
|---|---|
| 版本v1.2.3发布 | 版本 v1.2.3 发布 |
| 访问https://example.com获取 | 访问 https://example.com 获取 |
| 温度是3.14度 | 温度是 3.14 度 |
反斜杠转义
在任何标点前加 \ 可防止转换:
| 输入 | 输出 |
|---|---|
价格\,很贵 | 价格,很贵(逗号保持半角) |
测试\.内容 | 测试.内容(点号保持半角) |
AI 辅助格式化
当 MCP 服务器已连接时,AI 助手可以通过 document.transform 工具以编程方式应用中日韩格式化,使用以下三种 kind 值之一:
"cjk-format"——完整的中日韩规范化(间距 + 标点 + 智能引号),与菜单命令运行的是同一个格式化器,遵循你在设置 → 语言中的设置"cjk-spacing"——在中日韩字符与拉丁字母或数字相邻处插入一个空格,除此之外什么也不做"cjk-punctuation"——将紧邻中日韩字符的半角,.!?;:()转换为对应的全角形式;它从不把全角转换回半角
只有 cjk-format 会读取你的格式化设置。cjk-spacing 和 cjk-punctuation 是固定规则,会忽略这些设置,而且与格式化器不同,它们还会把韩文谚文视为中日韩字符。三者都作用于文档的 Markdown 源码,并且不会改动受保护的内容。
完整请求结构请参阅 MCP 工具参考——document.transform 接受 tabId、kind 和用于乐观并发控制的 expected_revision。
配置
中日韩格式化选项可在设置 → 语言中配置:
- 启用/禁用特定规则
- 设置标点重复上限
- 选择引号样式(标准弯引号或角括号)
上下文引号
启用上下文感知引号(默认)时:
- 包围中日韩内容的引号 → 弯引号
"" - 包围纯拉丁内容的引号 → 直引号
""
这样可以在正确格式化中日韩内容的同时,保留英文文本的自然外观。
中日韩角括号 (默认关闭)
启用 CJK 角引号时,包围中日韩内容的弯引号会被转换为角括号(主引号 「」,嵌套引号 『』)——这是垂直中日韩排版中传统的引号形式。无论该设置如何,拉丁内容始终保留标准弯引号。
跳过参考文献章节
在设置 → 语言 → 章节处理中启用跳过参考章节(默认关闭)时,中日韩格式化器会检测 “References” / “Further Reading” / “参考文献” / “参考资料” / “Bibliography” 等标题,并在这些章节中跳过重新格式化——引文格式的文本通常依赖于特定的标点形式,而中日韩规则会将其规范化掉。学术文档请开启它;如需格式化整个文件,则保持关闭。
完整性校验
每次中日韩格式化之后,格式化器会比对文档前后的内容骨架:去掉空白与标点、并统一字符宽度之后的文本。所有格式化规则改动的只有空白、标点或字母数字的宽度,因此这个骨架必须原样返回——而且它是一个序列而非计数,所以内容被重新排序也会被发现。字母、数字、汉字、假名、谚文和表情符号都计入其中。
如果检查失败,文档完全不会被修改,并会弹出提示告知。拒绝执行绝不会静默发生,也绝不会与“本来就没有需要修改的地方”混为一谈。
中日韩字符间距
VMark 内置了专用的中日韩文字间距功能,通过在字符间添加细微间距来提高可读性。
设置
在设置 → 编辑器 → 排版 → CJK 字母间距中配置:
| 选项 | 值 | 描述 |
|---|---|---|
| 关闭 | 0 | 无字符间距(默认) |
| 细微 | 0.02em | 几乎不明显的间距 |
| 轻微 | 0.03em | 轻微间距 |
| 正常 | 0.05em | 适合大多数场景的推荐值 |
| 宽松 | 0.08em | 较明显的间距 |
| 更宽 | 0.10em | 更宽,适合大号显示 |
| 特宽 | 0.12em | 最宽的设置 |
工作原理
- 对中日韩字符片段应用 letter-spacing CSS
- 排除代码块和内联代码
- 在所见即所得模式和导出的 HTML 中均有效
- 对拉丁文和数字无影响
示例
无字符间距:
这是一段中文文字,没有任何字间距。
0.05em 字符间距:
这 是 一 段 中 文 文 字 , 有 轻 微 的 字 间 距 。
差异细微,但能提高可读性,尤其是较长的段落。
智能引号样式
VMark 可以自动将直引号转换为排版正确的智能引号。此功能在中日韩格式化时生效,并支持多种引号样式。
引号样式
| 样式 | 双引号 | 单引号 |
|---|---|---|
| 弯引号 | "text" | 'text' |
| 角括号 | 「text」 | 『text』 |
| 法式引号 | «text» | ‹text› |
基于栈的配对算法
VMark 使用复杂的基于栈的算法进行引号配对:
- 分词:识别文本中的所有引号字符
- 分类:根据上下文判断每个引号是开引号还是闭引号
- 撇号检测:识别缩略形式(don't、it's)并保留
- 英尺英寸符号检测:识别测量符号(5'10")并保留
- 中日韩语境检测:检查被引用内容是否包含中日韩字符
- 孤立引号处理:优雅地处理不匹配的引号;段落结尾仍未闭合的引号保持不配对,因此引号绝不会跨越空行配对
示例
| 格式化前 | 格式化后(弯引号) |
|---|---|
| "hello" | "hello" |
| 'world' | 'world' |
| it's | it's |
| don't | don't |
| 5'10" | 5'10" |
| '90s | '90s |
缩略语中的撇号(如 “it's” 或 “don't”)会被正确保留。
切换光标处的引号样式
无需重新格式化整个文档,即可快速切换已有引号的样式。将光标放在任意引号对内,按 Shift + Mod + ' 切换。此功能仅在所见即所得模式下可用;源码模式没有引号切换。
简单模式(默认):在直引号和首选样式之间切换。
| 切换前 | 切换后 | 再次切换后 |
|---|---|---|
| "hello" | "hello" | "hello" |
| 'world' | 'world' | 'world' |
完整循环模式:循环遍历所有四种样式。
| 步骤 | 双引号 | 单引号 |
|---|---|---|
| 1 | "text" | 'text' |
| 2 | "text" | 'text' |
| 3 | 「text」 | 『text』 |
| 4 | «text» | ‹text› |
| 5 | "text"(回到开始) | 'text' |
嵌套引号:当引号嵌套时,该命令切换包含光标的最内层引号对。
智能检测:撇号(don't)、英尺英寸符号(5'10")和年代缩写('90s)不会被视为引号对。
TIP
在设置 → 语言 → CJK 格式化 → 引号切换行为中切换简单模式和完整循环模式。
配置
在设置 → 语言 → CJK 格式化中启用智能引号转换(转换直引号),还可从下拉菜单中选择首选引号样式。
中日韩角括号转换
启用 CJK 角引号时,包围中日韩内容的弯引号会自动转换为角括号。
支持的字符
当被引用的内容——或紧挨着它的文本——是汉字、平假名、片假名或注音符号时,会触发角括号转换:
| 内容类型 | 示例 | 是否转换? |
|---|---|---|
| 中文 | "中文" | ✓ 「中文」 |
| 含汉字的日文 | "日本語" | ✓ 「日本語」 |
| 仅平假名 | "ひらがな" | ✓ 「ひらがな」 |
| 仅片假名 | "カタカナ" | ✓ 「カタカナ」 |
| 韩文 | "한글" | ✗ 保持为 "한글" |
| 英文 | "hello" | ✗ 保持为 "hello" |
韩文被排除在外的原因与间距规则相同:韩文使用 “ ”,而不是角括号。
测试段落
将以下未格式化的文本复制到 VMark 中,然后按 Alt + Mod + Shift + F 进行格式化:
最近我在学习TypeScript和React,感觉收获很大.作为一个developer,掌握这些modern前端技术是必须的.
目前已经完成了3个projects,代码量超过1000行.其中最复杂的是一个dashboard应用,包含了数据可视化,用户认证,还有API集成等功能.
学习过程中遇到的最大挑战是--状态管理.Redux的概念. . .说实话有点难理解.后来换成了Zustand,简单多了!
老师说"don't give up"然后继续讲"写代码要注重可读性",我觉得很有道理.
访问https://example.com/docs获取v2.0.0版本文档,价格$99.99,时间12:30开始.
项目使用的技术栈如下:
- **Frontend**--React + TypeScript
- **Backend**--Node.js + Express
- **Database**--PostgreSQL
总共花费大约$200美元购买了学习资源,包括书籍和online courses.虽然价格不便宜,但非常值得.预期结果
格式化后,文本如下所示:
最近我在学习 TypeScript 和 React,感觉收获很大。作为一个 developer,掌握这些 modern 前端技术是必须的。
目前已经完成了 3 个 projects,代码量超过 1000 行。其中最复杂的是一个 dashboard 应用,包含了数据可视化,用户认证,还有 API 集成等功能。
学习过程中遇到的最大挑战是 —— 状态管理。Redux 的概念……说实话有点难理解。后来换成了 Zustand,简单多了!
老师说 “don't give up” 然后继续讲 “写代码要注重可读性”,我觉得很有道理。
访问 https://example.com/docs 获取 v2.0.0 版本文档,价格 $99.99,时间 12:30 开始。
项目使用的技术栈如下:
- Frontend--React + TypeScript
- Backend--Node.js + Express
- Database--PostgreSQL
总共花费大约 $200 美元购买了学习资源,包括书籍和 online courses。虽然价格不便宜,但非常值得。
已应用的更改:
- 添加了中日韩与拉丁字符间距(学习 TypeScript)
- 转换了全角标点(,。!)
- 规范化了全角数字(3→3,1000→1000,200→200)
- 将双连字符转换为破折号(是--状态 → 是 —— 状态)
- 将省略号规范化为中文形式,其后不加空格(. . . → ……)
- 应用了智能引号,中日韩文字旁加空格,并保留了撇号(don't)
- 保护了技术性结构(https://example.com/docs,v2.0.0,$99.99,12:30)
以及不会改变的内容:**Frontend**--React 中的 -- 会保持为双连字符。破折号转换要求连字符紧挨着中日韩字符或字母数字,而 * 两者都不是。如果改为在强调标记旁也触发,就会把中文文档里每个纯英文列表项中的 -- 都转换掉,这比保留这三处不动更糟。