Skip to content

中日韩格式化指南 ​

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. 全角字符转换 ​

将全角字母和数字转换为半角。

格式化前格式化后
12341234
ABCABC

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" tall5'10" tall

弯引号在紧邻中日韩文字时会加空格:他说"hello" 会变成 他说 “hello”。直角引号(「 」、『 』)和句末标点旁不加空格。若要让弯引号紧排,可在 设置 → 语言 → CJK 格式化 中关闭 修复双引号间距 或 修复单引号间距:“ ” 与 ‘ ’ 在中日韩语境中是全角字符,GB/T 15834 和 JLREQ 都把这一空隙视为字形的一部分——这两个开关正是为此而设。

启用角括号选项时:

格式化前格式化后
"中文内容"「中文内容」
「包含'嵌套'」「包含『嵌套』」

7. 省略号规范化 ​

统一省略号格式,并采用周围文字所使用的形式。这里没有唯一的正确答案:中文(GB/T 15834)和日文(JIS X 4051)使用六点省略号 ……,其后不加空格;韩文使用 …;只有拉丁文本使用 ... 并在其后加一个空格。

格式化前格式化后
等等. . .等等……
然后...继续然后……继续
そして...続くそして……続く
그리고...계속그리고…계속
wait...okwait... 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 的拉丁文段落扫描器会自动检测并保护技术性结构,防止标点转换:

类型示例保护
URLhttps://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 使用复杂的基于栈的算法进行引号配对:

  1. 分词:识别文本中的所有引号字符
  2. 分类:根据上下文判断每个引号是开引号还是闭引号
  3. 撇号检测:识别缩略形式(don't、it's)并保留
  4. 英尺英寸符号检测:识别测量符号(5'10")并保留
  5. 中日韩语境检测:检查被引用内容是否包含中日韩字符
  6. 孤立引号处理:优雅地处理不匹配的引号;段落结尾仍未闭合的引号保持不配对,因此引号绝不会跨越空行配对

示例 ​

格式化前格式化后(弯引号)
"hello""hello"
'world''world'
it'sit's
don'tdon'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 进行格式化:

text
最近我在学习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 中的 -- 会保持为双连字符。破折号转换要求连字符紧挨着中日韩字符或字母数字,而 * 两者都不是。如果改为在强调标记旁也触发,就会把中文文档里每个纯英文列表项中的 -- 都转换掉,这比保留这三处不动更糟。