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 文字系統(script)屬於漢字、平假名、片假名或注音符號的字元。這包括較罕見的漢字區塊(擴充 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”。直角引號(「 」、『 』)和句末標點旁不加空格。若要讓彎引號緊排,可在 設定 → 語言 → 中日韓格式化 中關閉 修正雙引號間距 或 修正單引號間距:“ ” 與 ‘ ’ 在中日韓語境中是全形字元,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%。只會移除空格與 Tab:一行或一個段落結尾的數字,永遠不會與下一行的單位或貨幣接合,而你在數字與單位之間輸入的不換行空格會被保留

受保護的內容 ​

以下內容不受格式化影響:

  • 程式碼區塊(```)——包括未閉合的圍欄,依照 CommonMark 規範,它會占據文件的其餘部分
  • 行內程式碼(`)
  • 連結 URL
  • 圖片路徑
  • HTML 標籤
  • 前置資料——包括 YAML(---)與 TOML(+++)
  • 行內數學公式($…$),比對規則與 VMark 渲染器相同,因此像 价格是 $100 和 $200 元 這樣的貨幣數字組合不會被誤認為數學公式
  • 區塊數學公式($$…$$)
  • 縮排程式碼區塊
  • Wiki 連結([[target]]、[[target|display]])
  • 註腳標記——如 [^1] 的引用,以及定義中的 [^1]: 標籤(定義本身的文字仍會被格式化)
  • HTML 字元參照(&、其)
  • 分隔線(---、***)
  • 反斜線跳脫的標點(例如 \, 保持為 ,)

技術結構 ​

VMark 的拉丁文 Span 掃描器會自動偵測並保護技術結構,防止標點轉換:

類型範例保護
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。

設定 ​

中日韓文格式化選項可在設定 → 語言中設定:

  • 啟用/停用特定規則
  • 設定標點重複次數上限
  • 選擇引號樣式(標準或角括號)

情境式引號 ​

啟用情境引號時(預設):

  • 包圍中日韓文內容的引號 → 彎引號 ""
  • 包圍純拉丁文內容的引號 → 直引號 ""

這樣既能保留英文文字的自然外觀,又能正確格式化中日韓文內容。

中日韓文角括號 (預設關閉) ​

啟用中日韓書名號時,包圍中日韓文內容的彎引號會被轉換為角括號(主要層級為 「」,巢狀層級為 『』)——此為直排中日韓文排版上傳統的引號形式。無論此設定為何,拉丁文內容皆保留標準彎引號。

參考章節跳過 ​

在設定 → 語言 → 章節處理中啟用略過參考章節時(預設關閉),中日韓文格式化器會偵測「References」/「Further Reading」/「参考文献」/「参考资料」/「Bibliography」等標題,並跳過這些章節中的格式化處理——引用格式的文字常依賴特定標點,而中日韓文規則原本會將其標準化。撰寫學術文件時請開啟此選項;若要格式化整個檔案,則保持關閉。

完整性驗證 ​

每次中日韓文格式化之後,格式化器會比對文件前後的內容骨架:去掉空白與標點、並統一字元寬度之後的文字。所有格式化規則改動的只有空白、標點或英數字的寬度,因此這個骨架必須原樣返回——而且它是一個序列而非計數,所以內容被重新排序也會被發現。字母、數字、漢字、假名、諺文和表情符號都計入其中。

若檢查失敗,文件完全不會被修改,並會跳出通知告知。拒絕執行絕不會默默發生,也絕不會與「本來就沒有需要修改的地方」混為一談。


中日韓文字距 ​

VMark 包含專用的中日韓文字距功能,透過在字元之間加入細微間距來提升可讀性。

設定 ​

在設定 → 編輯器 → 字型排版 → 中日韓字距中設定:

選項值說明
關閉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

在設定 → 語言 → 中日韓格式化 → 引號切換行為中,可在簡易模式和完整循環模式之間切換。

設定 ​

在設定 → 語言 → 中日韓格式化中啟用智慧引號轉換。你也可以從下拉選單中選擇偏好的引號樣式。


中日韓文角括號轉換 ​

啟用中日韓書名號時,包圍中日韓文內容的彎引號會自動轉換為角括號。

支援的字元 ​

當引號內的內容——或緊鄰其旁的文字——屬於漢字、平假名、片假名或注音符號時,就會觸發角括號轉換:

內容類型範例是否轉換?
中文"中文"✓ 「中文」
含漢字的日文"日本語"✓ 「日本語」
純平假名"ひらがな"✓ 「ひらがな」
純片假名"カタカナ"✓ 「カタカナ」
韓文"한글"✗ 保持為 "한글"
英文"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 中的 -- 會保持為雙連字號。破折號轉換需要破折號旁緊鄰中日韓文字或英數字,而 * 兩者都不是。若改為在強調標記旁也觸發,就會把中文文件裡每個純英文清單項目中的 -- 都轉換掉,這比放著這三個不動還糟。