CJK 서식 가이드
VMark에는 중국어, 일본어, 한국어 텍스트를 위한 포괄적인 서식 규칙이 포함되어 있습니다. 이 도구들은 CJK와 라틴 문자를 혼용할 때 일관된 타이포그래피를 유지하는 데 도움이 됩니다.
한국어는 의도적으로 건드리지 않습니다
한국어는 고유한 띄어쓰기를 사용하며, 조사는 앞 단어에 바로 붙습니다 — VMark에는이지 VMark 에는이 아닙니다. 그 자리에 공백을 넣는 것은 타이포그래피 취향의 문제가 아니라 문법 오류이므로, 한글은 모든 간격 규칙과 전각 구두점 변환에서 제외됩니다. 한국어 텍스트는 그대로 통과하며, 그 안에 있는 한자만 서식화됩니다.
빠른 시작
서식 → CJK → 전체 파일 서식 지정을 사용하거나 Alt + Mod + Shift + F를 눌러 전체 문서를 서식화합니다.
서식 → CJK → 선택 영역 서식 지정(Mod + Shift + F)은 선택 영역이 걸쳐 있는 블록 전체를 정리합니다 — 커서나 선택 영역이 닿은 문단, 목록, 표 전체이며 선택한 글자만이 아닙니다. CJK 자간은 인접한 두 글자 사이의 경계에 속하는 성질이고, 단어의 일부만 선택하면 그런 경계가 포함되지 않습니다. 그래서 이 명령은 다시 쓸 문자열이 아니라 고칠 영역을 지정합니다. 선택 영역이 없으면 커서가 있는 블록을 정리합니다.
두 명령이 보호하는 대상은 동일하므로(보호되는 내용 참조), 전체 선택 후 Mod + Shift + F를 눌러도 안전합니다.
서식 규칙
1. CJK-라틴 간격
CJK와 라틴 문자/숫자 사이에 자동으로 공백을 추가합니다. 부호가 붙은 숫자(음수, 양수, 플러스마이너스)와 통화 기호가 앞에 붙은 숫자도 포함됩니다.
| 이전 | 이후 |
|---|---|
| 学习Python编程 | 学习 Python 编程 |
| 共100个 | 共 100 个 |
| 使用macOS系统 | 使用 macOS 系统 |
| 我有-1个 | 我有 -1 个 |
| 我有+1个 | 我有 +1 个 |
| 误差±5%范围 | 误差 ±5% 范围 |
| 中文-$100元 | 中文 -$100 元 |
| 范围-100到-200 | 范围 -100 到 -200 |
인식되는 부호 문자는 ASCII - +, 전각 - +, 유니코드 마이너스 −, 플러스마이너스 ±입니다. 부호는 뒤에 숫자(또는 통화 기호 다음에 숫자)가 올 때만 숫자에 붙으므로, CJK-라틴 하이픈 식별자(예: 中文-Web)와 CJK-CJK 하이픈 구문(예: 中文-我)은 그대로 유지되고, 5-10 같은 범위도 보존됩니다.
무엇이 CJK이고 무엇이 라틴 문자인가. CJK 문자는 유니코드 스크립트 기준으로 한자, 히라가나, 가타카나 또는 주음부호 문자입니다. 여기에는 드문 한자 블록(확장 A, 보조 평면 확장, 호환용 한자), 반복 부호 々, 한자 영 〇, 반각 가타카나, 장음 부호 ー가 포함됩니다. 라틴 문자는 악센트가 있는 글자를 포함한 모든 라틴 스크립트 글자이므로, 단어의 양쪽 모두에 공백이 들어갑니다.
| 이전 | 이후 |
|---|---|
| 中文café中文 | 中文 café 中文 |
| 中文𠀀abc | 中文𠀀 abc |
| カタカナabc | カタカナ abc |
| 日本・東京 | 日本・東京 |
전각 라틴 문자(A)는 자체 간격을 가지므로 공백이 추가되지 않습니다. 가타카나 가운뎃점 ・는 글자가 아니라 구두점이므로 그 옆에도 공백이 추가되지 않습니다.
링크. 링크의 닫는 괄호와 뒤따르는 CJK 텍스트 사이에는 링크의 보이는 텍스트가 라틴 문자나 숫자로 끝날 때만 공백이 들어갑니다 — 독자가 보는 틈이 바로 그것이기 때문입니다. 参见[link](https://x.com)中文은 参见[link](https://x.com) 中文이 되고, 参见[中文](https://x.com)中文은 바뀌지 않습니다.
2. 전각 구두점
CJK 맥락에서 반각 구두점을 전각으로 변환합니다.
| 이전 | 이후 |
|---|---|
| 你好,世界 | 你好,世界 |
| 什么? | 什么? |
| 注意:重要 | 注意:重要 |
3. 전각 문자 변환
전각 문자와 숫자를 반각으로 변환합니다.
| 이전 | 이후 |
|---|---|
| 1234 | 1234 |
| ABC | ABC |
4. 괄호 변환
CJK 내용을 감싸는 반각 괄호를 전각으로 변환합니다. 두 괄호가 같은 문단에 있어야 합니다. 빈 줄을 사이에 두면 입력한 그대로 남습니다.
| 이전 | 이후 |
|---|---|
| (注意) | (注意) |
| [重点] | 【重点】 |
| (English) | (English) |
5. 대시 변환
이중 하이픈을 올바른 CJK 대시로 변환합니다.
| 이전 | 이후 |
|---|---|
| 原因--结果 | 原因 —— 结果 |
| 说明--这是 | 说明 —— 这是 |
6. 스마트 따옴표 변환
VMark는 다음을 올바르게 처리하는 스택 기반 따옴표 쌍 알고리즘 을 사용합니다:
- 어포스트로피:
don't,it's,l'amour와 같은 축약형은 보존됩니다 - 소유격:
Xiaolai's는 그대로 유지됩니다 - 프라임:
5'10"(피트/인치)와 같은 측정값은 보존됩니다 - 연대:
'90s와 같은 약어는 인식됩니다 - CJK 맥락 감지: CJK 내용을 둘러싼 따옴표는 곡선/코너 따옴표로 변환됩니다
| 이전 | 이후 |
|---|---|
| 他说"hello" | 他说 “hello” |
| "don't worry" | “don't worry” |
| 5'10" tall | 5'10" tall |
곱은따옴표는 CJK 텍스트 옆에서 공백을 둡니다: 他说"hello"는 他说 “hello”가 됩니다. 홑화살괄호(「 」, 『 』)와 종결 문장 부호 옆에는 공백이 없습니다. 곱은따옴표를 붙여 쓰려면 설정 → 언어 → CJK 서식에서 큰따옴표 간격 수정 또는 작은따옴표 간격 수정을 끄세요. “ ”와 ‘ ’는 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 元같은 금액 쌍은 수식으로 오인되지 않음 - 디스플레이 수식 (
$$…$$) - 들여쓰기 코드 블록
- 위키 링크 (
[[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 서식을 적용할 수 있습니다:
"cjk-format"— 전체 CJK 정규화 (간격 + 구두점 + 스마트 따옴표). 메뉴 명령이 실행하는 것과 같은 서식기이며, 설정 → 언어의 설정을 따릅니다"cjk-spacing"— CJK 문자가 라틴 문자나 숫자와 만나는 곳마다 공백 하나를 삽입하며, 그 외에는 아무것도 하지 않습니다"cjk-punctuation"— CJK 문자 옆에 있는 반각,.!?;:()를 전각으로 변환합니다. 전각을 반각으로 되돌리는 변환은 하지 않습니다
서식 설정을 읽는 것은 cjk-format뿐입니다. cjk-spacing과 cjk-punctuation은 설정을 무시하는 고정 규칙이며, 서식기와 달리 한국어 한글도 CJK로 취급합니다. 세 가지 모두 문서의 마크다운 소스에 대해 작동하며 보호되는 내용은 건드리지 않습니다.
전체 요청 형태는 MCP 도구 참조를 확인하세요 — document.transform은 tabId, kind, 그리고 낙관적 동시성을 위한 expected_revision을 받습니다.
설정
CJK 서식 옵션은 설정 → 언어에서 구성할 수 있습니다:
- 특정 규칙 활성화/비활성화
- 구두점 반복 한도 설정
- 따옴표 스타일 선택 (표준 또는 코너 괄호)
컨텍스트 따옴표
컨텍스트 따옴표 가 활성화된 경우 (기본값):
- CJK 내용을 둘러싼 따옴표 → 곡선 따옴표
"" - 순수 라틴 내용을 둘러싼 따옴표 → 직선 따옴표
""
이는 CJK 내용을 올바르게 서식화하면서 영어 텍스트의 자연스러운 모양을 보존합니다.
CJK 코너 괄호 (기본값 비활성화)
CJK 코너 따옴표 가 활성화되면 CJK 내용 주변의 곡선 따옴표가 코너 괄호 (기본 「」, 중첩 『』)로 변환됩니다 — 세로 CJK 조판의 전통적인 인용 형식입니다. 이 설정과 관계없이 라틴 내용은 표준 곡선 따옴표를 유지합니다.
참고문헌 섹션 건너뛰기
설정 → 언어 → 섹션 처리에서 참고 문헌 섹션 건너뛰기를 켜면(기본값 꺼짐), CJK 서식기는 "References" / "Further Reading" / "参考文献" / "参考资料" / "Bibliography" 제목을 감지하고 해당 섹션의 재서식화를 건너뜁니다 — 인용 형식의 텍스트는 CJK 규칙이 정규화해 버릴 특정 구두점에 의존하는 경우가 많습니다. 학술 문서에서는 켜고, 파일 전체를 서식화하려면 꺼 두세요.
무결성 검증
CJK 서식을 적용할 때마다 서식기는 문서의 콘텐츠 골격을 전후로 비교합니다. 공백과 구두점을 제거하고 문자 너비를 정규화한 텍스트입니다. 모든 서식 규칙이 바꾸는 것은 공백, 구두점, 또는 영숫자의 너비뿐이므로 이 골격은 반드시 그대로 돌아와야 합니다. 게다가 개수가 아니라 순서이므로 내용이 뒤바뀐 경우도 잡아냅니다. 글자, 숫자, 한자, 가나, 한글, 이모지가 모두 포함됩니다.
검사에 실패하면 문서는 전혀 변경되지 않으며, 그 사실이 알림으로 표시됩니다. 거부는 결코 조용히 일어나지 않고, 「바꿀 것이 없었다」와 혼동되지도 않습니다.
CJK 자간
VMark에는 CJK 텍스트 전용 자간 기능이 포함되어 있어 문자 사이에 미묘한 간격을 추가하여 가독성을 향상시킵니다.
설정
설정 → 에디터 → 타이포그래피 → CJK 자간 에서 구성합니다:
| 옵션 | 값 | 설명 |
|---|---|---|
| 끄기 | 0 | 자간 없음 (기본값) |
| 미묘 | 0.02em | 거의 눈에 띄지 않는 간격 |
| 가벼운 | 0.03em | 가벼운 간격 |
| 보통 | 0.05em | 대부분의 사용 사례에 권장 |
| 넓은 | 0.08em | 더 뚜렷한 간격 |
| 더 넓은 | 0.10em | 더 넓은 간격, 큰 화면 크기용 |
| 최대 | 0.12em | 가장 넓은 설정 |
작동 방식
- CJK 문자 구간에 letter-spacing CSS 적용
- 코드 블록 및 인라인 코드 제외
- WYSIWYG와 내보낸 HTML 모두에서 작동
- 라틴 텍스트나 숫자에는 영향 없음
예시
자간 없음:
这是一段中文文字,没有任何字间距。
0.05em 자간 있음:
这 是 一 段 中 文 文 字 , 有 轻 微 的 字 间 距 。
차이는 미묘하지만 특히 긴 단락에서 가독성을 향상시킵니다.
스마트 따옴표 스타일
VMark는 직선 따옴표를 타이포그래피적으로 올바른 스마트 따옴표로 자동 변환할 수 있습니다. 이 기능은 CJK 서식화 중에 작동하며 여러 따옴표 스타일을 지원합니다.
따옴표 스타일
| 스타일 | 큰따옴표 | 작은따옴표 |
|---|---|---|
| 곡선 | "text" | 'text' |
| 코너 괄호 | 「text」 | 『text』 |
| 기요메 | «text» | ‹text› |
스택 기반 쌍 알고리즘
VMark는 따옴표 쌍을 위해 정교한 스택 기반 알고리즘을 사용합니다:
- 토큰화: 텍스트의 모든 따옴표 문자를 식별
- 분류: 컨텍스트를 기반으로 각 따옴표가 열기인지 닫기인지 결정
- 어포스트로피 감지: 축약형 (don't, it's)을 인식하고 보존
- 프라임 감지: 측정값 (5'10")을 인식하고 보존
- CJK 컨텍스트 감지: 인용된 내용이 CJK 문자를 포함하는지 확인
- 고아 정리: 일치하지 않는 따옴표를 적절히 처리. 문단 끝에서 열린 채로 남은 따옴표는 짝을 이루지 않으므로, 빈 줄을 사이에 두고 따옴표가 짝을 이루는 일은 없습니다
예시
| 이전 | 이후 (곡선) |
|---|---|
| "hello" | "hello" |
| 'world' | 'world' |
| it's | it's |
| don't | don't |
| 5'10" | 5'10" |
| '90s | '90s |
축약형 (예: "it's" 또는 "don't")의 어포스트로피는 올바르게 보존됩니다.
커서에서 따옴표 스타일 토글
전체 문서를 다시 서식화하지 않고 기존 따옴표의 스타일을 빠르게 토글할 수 있습니다. 커서를 따옴표 쌍 안에 놓고 Shift + Mod + '를 눌러 토글합니다. 이 기능은 WYSIWYG 모드에서만 작동하며, 소스 모드에는 따옴표 토글이 없습니다.
단순 모드 (기본값): 직선 따옴표와 선호 스타일 사이를 토글합니다.
| 이전 | 이후 | 다시 이후 |
|---|---|---|
| "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 코너 괄호 변환
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。虽然价格不便宜,但非常值得。
적용된 변경 사항:
- CJK-라틴 간격 추가 (学习 TypeScript)
- 전각 구두점 변환 (,。!)
- 전각 숫자 정규화 (3→3, 1000→1000, 200→200)
- 이중 하이픈을 em 대시로 변환 (是--状态 → 是 —— 状态)
- 줄임표를 중국어 형태로 정규화하고 뒤에 공백을 두지 않음 (. . . → ……)
- CJK 텍스트 옆에 공백을 두고 스마트 따옴표 적용, 어포스트로피 보존 (don't)
- 기술 구문 보호 (https://example.com/docs, v2.0.0, $99.99, 12:30)
그리고 바뀌지 않는 것: **Frontend**--React의 --는 이중 하이픈으로 남습니다. 대시 변환에는 대시 바로 옆에 CJK 문자나 영숫자가 있어야 하는데 *는 둘 다 아닙니다. 대신 강조 표시에서도 변환이 일어나게 하면 중국어 문서의 순수 영어 목록 항목마다 --가 변환될 것이고, 이는 이 세 개를 그대로 두는 것보다 나쁩니다.