记录LaTeX中文文档有关古谚文的显示问题。
介绍
古谚文(旧谚文,老朝鲜语,Old Hangul Jamo)指1933年前使用的谚文,也是拿谚文字母拼成,只是一部分今天韩语已经不使用了。
谚文涉及的Unicode区段:
- 谚文字母(Hangeul Jamo,1100-11FF)
- 谚文兼容字母(Hangul Compatibility Jamo,3130-318F) 不可拼合成字
- 谚文字母扩展A(Hangul Jamo Extended-A,A960-A97F)
- 谚文音节(Hangul Syllables,AC00-D7AF)
- 谚文字母扩展-B( Hangul Jamo Extended-B,D7B0-D7FF)
- 【私用区】汉阳PUA (E0B0-F8FF)
- 谚文半角及全角字符(FFA0-FFDC)
谚文字母区块中少部分为现代韩语使用,一般的CJK字体可以自动拼成音节,而其余字母皆用于古文,拼合需要引擎和字体的支持。
谚文字母扩展A、B还对古谚文字母做了扩充:
现代韩语使用的字母拼成音节,另独立编码在“谚文音节”区段。现在韩语不使用的谚文即可称作旧谚文,部分曾用来拼明代汉语。见谚文字母区段的日文页面,有逐个解释。私用区有旧谚文音节的独立编码,即汉阳PUA编码,不过需要特殊字体,有些中文字体用私用区显示汉字。一般CJK字体显示旧谚文音节仍需谚文字母拼合(这被称为初中终编码),这需要排版引擎和字体的支持。
参见:
- 谚文字母解释:ハングル字母 (Unicodeのブロック) - Wikipedia
- 旧谚文介绍:Old Hangul/Jamo - NamuWiki、古谚文 - Wikipedia
- 旧谚文显示测试页面:Pre-1933 Korean Text testing Page (i18nl10n.com)
- 汉阳PUA字表:한양 PUA | 문자 집합 위키 | Fandom、字表:hanyang-pua - GlyphWiki、Appendix:Unicode/Private Use Area/Hanyang - Wiktionary
- 兼容区/谚文字母/汉阳PUA区对应字表:List of Hangul jamo - Wikipedia
字体
Linux可以用Noto Serif CJK KR
、Noto Sans CJK KR
,Debian系包含在下包内,配合Script=Hangul
参数,可以使谚文正确组合。
sudo apt install fonts-noto-cjk
Windows自带Malgun Gothic
字体是一款非衬线字体,是谚文的默认字体,对古谚文支持非常好。 天珩字库的TH-Joeng-H
、TH-Tshyn-P0
能够组合谚文,不过部分字在会在Word下组合失败。Gulim Old Hangul Jamo
也能组合谚文,不过太老了,很多字母都支持不全。
pmhanguljamo
宏包文档里还给出了Hamchorom、KoPub World、Nanum Yet Hangul、Un Batang字体,不妨一用。
应用方面:
Word中TH-Tshyn-P0
、TH-Joeng-H
、Gulim-Old-Hangul-Jamo.ttf
均有部分谚文无法正确组合(缺字);思源Source Han Serif K
和Noto Serif CJK KR
完全不能正确组合谚文;微软雅黑fallback到的Malgun Gothic
能完全正确的组合谚文。Gulim-Old-Hangul-Jamo
缺字严重。
Linux下Typora中(应该用的是Noto Serif
)能正确组合谚文
TeX中Noto Serif CJK KR
配合Script=Hangul
参数,可以使谚文正确组合。
LaTeX显示
fonts - Old Korean han'gŭl in XeLaTeX? - TeX - LaTeX Stack Exchange
NotoCJK字体:notofonts/noto-cjk: Noto CJK fonts (github.com);思源宋体:adobe-fonts/source-han-serif: Source Han Serif | 思源宋体 | 思源宋體 | 思源宋體 香港 | 源ノ明朝 | 본명조 (github.com)
汉阳PUA编码字为半弃用状态,这里仅介绍使用初中终编码的旧谚文显示方案。
显示示例,以下皆用此例
% 正文测试部分,下皆同 {\oldjamo F28 ᅎᆑ ᅎᆑᆫ ᅎᅳ ᅎᅳᆫ ᅎᅳᆺ ᅎᅳᇫ ᅎᅵ ᅎᅵᆫ ᅎᅵᆷ ᅎᅵᇢ ᅎᅵᇫ ᅏᅡ ᅏᅡᆫ ᅏᅡᆷ ᅏᅡᇢ ᅏᅡᇰ \par F29 ᅏᅢ ᅏᅣ ᅏᅣᆷ ᅏᅣᇰ ᅏᅥ ᅏᅥᆫ ᅏᅧ ᅏᅧᆫ ᅏᅨ ᅏᅮ ᅏᅱ ᅏᅲ ᅏᅲᇰ ᅏᆑ ᅏᆑᆫ ᅏᅳ \par F2A ᅏᅳᇫ ᅏᅳᇰ ᅏᅵ ᅏᅵᆫ ᅏᆞ ᅏᆡ ᅐᅡ ᅐᅡᆫ ᅐᅡᆮ ᅐᅡᆷ ᅐᅡᇢ ᅐᅡᆸ ᅐᅢ ᅐᅣ ᅐᅣᆷ ᅐᅣᇢ \par F2B ᅐᅣᇰ ᅐᅧ ᅐᅧᆫ ᅐᅩ ᅐᅪ ᅐᅪᆼ ᅐᅮ ᅐᅮᆼ ᅐᅮᇹ ᅐᅲ ᅐᅲᆨ ᅐᅲᆫ ᅐᅲᇰ ᅐᆑ ᅐᆑᆫ ᅐᅳ \par F2C ᅐᅳᆷ ᅐᅳᇫ ᅐᅵ ᅐᅵᆫ ᅐᅵᇫ ᅐᅵᇰ ᅑᅡ ᅑᅡᆫ ᅑᅡᇂ ᅑᅢ ᅑᅣ ᅑᅣᆷ ᅑᅣᇢ ᅑᅣᆸ ᅑᅣᇰ ᅑᅧ \par F2D ᅑᅧᆫ ᅑᅮ ᅑᅱ ᅑᅲ ᅑᅲᇰ ᅑᆑ ᅑᆑᆫ ᅑᅳ ᅑᅳᆷ ᅑᅳᇢ ᅑᅵ ᅑᅵᆫ ᅑᅵᆷ ᅑᅵᇫ ᅑᅵᇰ 차ᇙ \par F2E 차ᇢ 차ᇦ 차ᇰ 차ᇹ ᄎᅶ 챠ᇙ 챠ᇦ 챠ᇰ 챠ᇱ ᄎᅸ ᄎᅸᆯ ᄎᆤ 처ᇫ 처ᇰ ᄎᅼ ᄎᅼᆫ \par F2F 쳐ퟍ 쳐ퟎ 쳐ퟏ 쳐ᇙ 쳐ᇢ 쳐ᇰ 쳐ᇱ 쳐ᇹ ᄎᅽ ᄎᅾ 초ᇙ 초ᇢ 초ퟨ 초ᇫ 초ᇰ 촤ᇙ \par F30 촤ᇰ ᄎᆂ 쵸ᇢ 쵸ᇰ ᄎᆇ ᄎᆈ ᄎᆈᆫ 추ᇙ 추ᇠ 추ᇢ 추ᇰ 추ᇹ ᄎᆉ ᄎᆉᆫ ᄎᆉᆼ ᄎᆊ \par F31 춰ᇹ ᄎힵ ᄎᆌ 취ᇙ 취ᇹ 츄ᇙ 츄ᇢ 츄ᇰ 츄ᇹ ᄎᆎ ᄎᆎᆫ ᄎᆏ ᄎᆏᆷ ᄎᆐ ᄎᆑ ᄎᆑᆫ \par F32 ᄎᆑᆯ ᄎᆑᇙ ᄎᆑᆷ ᄎᆒ ᄎᆒᆼ ᄎᆔ ᄎᆔᆫ ᄎᆔᆯ ᄎᆔᆼ 츠ퟛ 츠ᇙ 츠ퟝ 츠ᇢ 츠ᇫ 츠ᇰ ᄎᆕ \par} %含扩展B谚文字母 ᅎᆑ % 古谚文 初中终编码 십년 % 有独立码位的现代韩语音节 {\oldjamo 國 귁〮 之 징 語 ᅌᅥᆼ〯 音 ᅙᅳᆷ이〮 \par 異 잉〮乎 ᅘᅩᆼ 中 듀ᇰ 國 귁〮ᄒᆞ〮야〮}
谚文采用初中终编码输入,即把谚文字母按照初声-中声(-终声)(-傍点) 的顺序的排列,字体引擎会拼成一个方块字显示。
XeLaTeX
XeTeX下直接使用
fontspec
可正常显示\usepackage{fontspec} \newfontfamily\oldjamo{Noto Serif CJK KR}[Script=Hangul] %旧谚文
使用ctex后,xeCJK会把谚文归为CJK字符,定义CJK字体即可显示
\usepackage{fontspec} \usepackage{ctex} \newCJKfontfamily\oldjamo{Noto Serif CJK KR}[Script=Hangul] %旧谚文 \setCJKmainfont{Source Han Serif SC}
这时有
\oldjamo
的地方谚文正常显示,其余处谚文无法拼合。默认ctex会抹掉空格,汉谚混写(迫真)中的空格无法呈现。
LuaLaTeX
LuaTeX下的问题比较棘手,首先:
原生使用下,仅使用
fontspec
定义字体。在TeX Live 2023和TeX Live 2024发行版中,如果一个谚文的初、中声刚好能拼成现代韩语音节(谚文音节区段,Hangul Syllables,"AC00-"D7AF
),则该音节会抢先显示,把终声甩在后头,从而使古谚文无法正确拼合。\usepackage{fontspec} \newfontfamily\oldjamo{Noto Serif CJK KR}[Script=Hangul]%
而TeXLive 2022版就无此问题,Debian12源里的TeXLive即为2022,Overleaf可以选择TeX Live版本。
版本信息:
# texlive2022 LuaHBTeX Version 1.15.0 (TeX Live 2022) LaTeX2e <2022-06-01> patch level 5 fontspec 2022/01/15 v2.8a # texlive2024 LuaHBTeX Version 1.18.0 (TeX Live 2024) LaTeX2e <2024-06-01> patch level 2 L3 programming layer <2024-08-16> fontspec 2024/05/11 v2.9e
(我没试验单个宏包降级,如果成功,也可降级使用。)
不过两版TeXLive的LuaLaTeX均不能正常显示声调傍点:
解决texlive2023以上的上述问题,可以使用
polyglossia
包仅调用
polyglossia
包,不用设置mainlanguage
otherlanguage
,此时TeXLive 2023及以上的古谚文即能正常拼合,声调傍点也显示正常\usepackage{polyglossia} \usepackage{fontspec} \newfontfamily\oldjamo{Noto Serif CJK KR}[Script=Hangul]%
或者设置了语言,谚文直接放在
korean
环境中也可以\usepackage{polyglossia} %放在ctex前,使古谚文能被拼合 \setmainlanguage{english} \setotherlanguage{korean} \usepackage{fontspec} \newfontfamily\hangulfont{Noto Serif CJK KR}[Script=Hangul]% % 以下正文 \begin{korean} 國 귁〮 之 징 語 ᅌᅥᆼ〯 音 ᅙᅳᆷ이〮 \par 異 잉〮乎 ᅘᅩᆼ 中 듀ᇰ 國 귁〮ᄒᆞ〮야〮 \end{korean}
此时设置了(西文)字体的谚文正常显示,其余地方若(西文)主字体不支持将无法显示。
配合ctex使用中文字体会直接无法拼合,只有现代韩语音节的部分能够拼合
\usepackage{ctex,fontspec} \newCJKfontfamily\oldCJKjamo{Noto Serif CJK KR}[Script=Hangul]%
用luatex-ja的
\ltjdefcharrange
换成ALchar后,使用西文字体,和第一种情况的原生使用一样,TeXLive 2023以上还会古谚文拼合失败。\usepackage{ctex,fontspec} \ltjdefcharrange{3}{ "1100-"11FF,"3130-"318F,"A960-"A97F,"D7B0-"D7FF,"302E-"302F %谚文字母 兼容 扩展A 扩展B 傍点(CJK标点区) } \newfontfamily\oldjamo{Noto Serif CJK KR}[Script=Hangul]%
当然也可以借用
polyglossia
包修复,不过无论是否使用polyglossia
包,polyglossia
是否设置otherlanguage
,谚文的声调加点不会提到前面:注意,与ctex同时使用时,
polyglossia
要放在ctex
前只用ctex,傍点无法提前
ctex+polyglossia
\usepackage{polyglossia} %放在ctex前,使古谚文能被拼合 \usepackage{ctex,fontspec} \ltjdefcharrange{3}{ "1100-"11FF,"3130-"318F,"A960-"A97F,"D7B0-"D7FF,"302E-"302F %谚文字母 兼容 扩展A 扩展B 傍点(CJK标点区) } \newfontfamily\oldjamo{Noto Serif CJK KR}[Script=Hangul]%
或者polyglossia定义了语言,把谚文放在
korean
环境中,傍点也会无法显示,应该是被luatex-ja抢走了\usepackage{polyglossia} %放在ctex前,使古谚文能被拼合 \setmainlanguage{english} \setotherlanguage{korean} \usepackage{ctex,fontspec} \ltjdefcharrange{3}{ "1100-"11FF,"3130-"318F,"A960-"A97F,"D7B0-"D7FF,"302E-"302F %谚文字母 兼容 扩展A 扩展B 傍点(CJK标点区) } \newfontfamily\oldjamo{Noto Serif CJK KR}[Script=Hangul]% % 以下正文 \begin{korean} 國 귁〮 之 징 語 ᅌᅥᆼ〯 音 ᅙᅳᆷ이〮 \par 異 잉〮乎 ᅘᅩᆼ 中 듀ᇰ 國 귁〮ᄒᆞ〮야〮 \end{korean}
也是设置了(西文)字体的谚文正常显示,其余地方若(西文)主字体不支持将无法显示。谚文音节区段的字符按中文字体正常。傍点无法显示。
解决傍点无法显示的问题,可以把现代韩语音节也归为ALchar,这样所有谚文皆可附点。缺点是正文中的现代韩语无法直接用CJK字体显示。
\ltjdefcharrange{3}{ "AC00-"D7AF % 现代韩语音节 }
TeX Live 2022中还可以尝试用
luatexko
宏包,配合ctex用中文字体显示谚文。注意要把luatexko
包放在ctex后面\usepackage{fontspec} \usepackage{ctex} \newfontfamily\oldjamo{Noto Serif CJK KR}[Script=Hangul]% \ctexset{ declarecharrange ={ {jamo} {"1100->"11FF,"3130->"318F,"A960->"A97F,"D7B0->"D7FF} %谚文字母 谚文兼容字母 扩展A 扩展B }} \setCJKmainfont{Source Han Serif SC}[ Script=CJK, AlternateFont={{jamo} {Noto Serif CJK KR} {Script=Hangul}}% ] % 也可注释掉上句的AlternateFont,使用下句 % \setCJKmainfont{Noto Serif CJK KR}[CharRange={jamo},Script=Hangul] \usepackage{luatexko} %LuaTeX下利用luatexko宏包正确显示谚文(要放在ctex之后,否则会冲突,无必要先别开。会有代价吗?已知行距会增大。)
此时谚文统一交给CJK字体显示,即能将文中的所有谚文自动组合显示。
那么代价是什么呢?ctex本身使用
luatex-ja
并在其上魔改,与luatexko
本身有部分是冲突的。luatexko
放在ctex后能使得中文交给CJK字体,但一些ctex已经定义的部分会被luatexko
重新定义,如标CJK标点的宽度会增大,你也可以再改回来。所以中文为主的文档,要使用ctex就尽量规避
luatexko
;韩文为主的文档请直接使用luatexko
而非ctex
在TeXLive 2024中
luatexko
包会与ctex
(luatexja
)直接冲突,汉字不会交由CJK字体处理,故此方法不可用。(存疑)
polyglossia
会覆盖ctex
的scheme,比如ctex默认设置的图表前缀为「图」「表」,会被改成「Figure」「Table」。可以使用polyglossia
的参数改成中文
\setmainlanguage{english}
\gappto\captionsenglish{\def\figurename{图}}
\gappto\captionsenglish{\def\tablename{表}}
不过这些参数需要设置mainlanguage
后才生效。(此时谚文用西文环境也可正常显示,不必放设置otherlanguage
再放在korean
的环境中)
或者不设置polyglossia
的语言环境,使用caption
等宏包重新定义
\usepackage{caption}
\captionsetup[figure]{name=图}
\captionsetup[table]{name=表}
不过caption
会与ccaption
包冲突。
pmhanguljamo
包
声调傍点〮
("302E
)和〯
("302F
),定义在CJK标点区,XeTeX下可正确使用。LuaTeX下,上面我们用luatex-ja
把他俩挪到了西文,但是无法正常显示。
因此输入古谚文也可以用pmhanguljamo
宏包(Poor man’s Hangul Jamo input method),使用命令输入谚文,方便无输入法支持时的谚文录入与显示。
宏包提供了jamoword
命令和jamotext
环境,提供了三种转字法,默认的pm,以及rrk(Revised Romanization of Korean)和frkim(Fukui Rei’s kTEX input method)。
默认转义方案如下:
- 用
/
表示不加点平声,;
表示单点去声,:
表示双点上声 - 轻唇音ㅸ(非) ㆄ
(敷)ㅹ(奉)ㅱ(微)可用bq pq bbq mq
表示 齿头音、正齿音区别:
l
表示左边长,lr
表示右边长精 清 從 心 邪 照 穿 牀 審 禪 谚文 ᅎ ᅔ ᅏ ᄼ ᄽ ᅐ ᅕ ᅑ ᄾ ᄿ pm方案 jl cl jjl sl ssl jlr clr jjlr slr sslr
更多介绍详见宏包文档。
此包在1.0
版本后更改了默认方案中三个字母的表记,因此在TeX Live 2022和TeX Live 2024中部分谚文会显示不同。若在新版本中使用旧表记,可使用[compat=0.5]
参数。
v1.0之后 | v0.6以前 | |
---|---|---|
x | ㆆ | ㅇ |
q | ㅇ | ㆁ |
f | ㆁ | ㆆ |
- XeTeX
XeTeX下原生可以正常使用。但使用ctex后谚文会被xeCJK抢走,从而显示异常。
\documentclass{article}
\usepackage{ctex,fontspec}
\newCJKfontfamily\oldjamo{Noto Serif CJK KR}[Script=Hangul]%
\usepackage[pmfont={Noto Serif CJK KR}]{pmhanguljamo} %pmfont会自动加上[Script=Hangul]
\begin{document}
{\oldjamo
\begin{jamotext}
na/ras;mar:ss@/mi;
中dyuf/國guig;ei; dar/a;
文mun/字jj@q;oa;ro; se/rv/ s@/m@s/di; a/ni;h@r/ss@i;
i;ren jyen/c@;ro; e/rin; 百b@ig;姓syef;i;
ni/rv/go;jye; horx; bai; i/sye;do;
m@/c@m;nai: jei bdv;dvr; si/re; pye/di; mod:h@rx no;mi; ha/ni;ra
\end{jamotext}}
\end{document}
你可以使用polyglossia
分别设置语言,不过和上面提到的一样,polyglossia
会覆盖ctex
的scheme,请重定义图、表中文前缀。
\documentclass{article}
\usepackage{polyglossia}
\setmainlanguage{english}
\setotherlanguage{korean}
\newfontfamily\hangulfont{Noto Serif CJK KR}[Script=Hangul]
\usepackage[pmfont={Noto Serif CJK KR}]{pmhanguljamo} %pmfont会自动加上[Script=Hangul]
\gappto\captionsenglish{\def\figurename{图}}%
\gappto\captionsenglish{\def\tablename{表}}%
\usepackage{ctex,fontspec}
\begin{document}
\begin{korean}
\begin{jamotext}
na/ras;mar:ss@/mi;
中dyuf/國guig;ei; dar/a;
文mun/字jj@q;oa;ro; se/rv/ s@/m@s/di; a/ni;h@r/ss@i;
i;ren jyen/c@;ro; e/rin; 百b@ig;姓syef;i;
ni/rv/go;jye; horx; bai; i/sye;do;
m@/c@m;nai: jei bdv;dvr; si/re; pye/di; mod:h@rx no;mi; ha/ni;ra
\end{jamotext}
\end{korean}
\end{document}
- LuaTeX
LuaTeX下默认可以正常使用,使用ctex后也会被抢走,改到用西文能正常显示。以下是LuaTeX下的示例
\usepackage{fontspec}
\usepackage[pmfont={Noto Serif CJK KR}]{pmhanguljamo}
当使用了ctex后,需将谚文字母、声调改为西文
\usepackage{ctex,fontspec}
\ltjdefcharrange{3}{
"1100-"11FF,"3130-"318F,"A960-"A97F,"D7B0-"D7FF,"302E-"302F
}
\newfontfamily\oldjamo{Noto Serif CJK KR}[Script=Hangul]%
\newCJKfontfamily\oldCJKjamo{Noto Serif CJK KR}[Script=Hangul]%
\usepackage[pmfont={Noto Serif CJK KR}]{pmhanguljamo}
{\oldCJKjamo
\begin{jamotext}
na/ras;mar:ss@/mi;
中dyuf/國guig;ei; dar/a;
文mun/字jj@q;oa;ro; se/rv/ s@/m@s/di; a/ni;h@r/ss@i;
i;ren jyen/c@;ro; e/rin; 百b@ig;姓syef;i;
ni/rv/go;jye; horx; bai; i/sye;do;
m@/c@m;nai: jei bdv;dvr; si/re; pye/di; mod:h@rx no;mi; ha/ni;ra
\end{jamotext}}
此处为何还要再定义个CJK字体\oldCJKjamo
呢?这是因为luatex-ja会把汉字抢过去,需设置CJK字体以使用韩标汉字而非简体中文汉字。
- 《洪武正韻譯訓》示例
古谚文拼汉语可见《洪武正韵译训》声母表 - 知乎 (zhihu.com)、《洪武正韵》音系(声韵调) - 知乎 (zhihu.com)、朝鲜汉字音 - Wikipedia,洪武正韻譯訓轉寫規則 - 韻典網。此套拼法知照合流,保留全浊声母(实际已清化),保留m韵尾(实际可能并入n),保留-p -t -k韵尾(实际可能为-ʔ)
示例:
幫바ᇰ 滂파ᇰ 並 삐ᇰ 明미ᇰ,非ᄫᅵ (敷) 奉ᄬᅳᇰ 微ᄝᅵ,端둰 透트ᇢ 定띠ᇰ 泥니
精ᅎᅵᇰ 清ᅔᅵᇰ 從ᅏᅮᇰ 心ᄼᅵᆷ 邪ᄽᅧ,照ᅐᅣᇢ 穿ᅕᆑᆫ 牀ᅑᅪᇰ 審ᄾᅵᆷ 禪ᄿᅧᆫ
見견 溪키 羣뀬 疑ᅌᅵ,影ᅙᅵᇰ 曉햐ᇢ 匣ᅘᅣᇹ 喻유,來래 日ᅀᅵᇹ
使用pmhanguljamo
宏包显示:
(上面表里没有的字母组合:遮撮 ᆑ yuye
、先撮 ᅟᆑᆫ yuyen
)
\begin{jamotext}
幫baf/ 滂paf/ 並bbif/ 明mif/ \par
非bqi/ (敷) 奉bbqvf/ 微mqi/ \par
端duen/ 透tvmq/ 定ddif/ 泥ni/ \par
精jlif/ 清clif/ 從jjluf/ 心slim/ 邪sslye/ \par
照jlryamq/ 穿clryuyen/ 牀jjlroaf/ 審slrim/ 禪sslryen/ \par
見gyen/ 溪ki/ 羣ggyun/ 疑fi/ \par
影xif/ 曉hyamq/ 匣hhyax/ 喻qyu/ \par
來rai/ 日zix/
\end{jamotext}