记录LaTeX中文文档有关古谚文的显示问题。

介绍

古谚文(旧谚文,老朝鲜语,Old Hangul Jamo)指1933年前使用的谚文,也是拿谚文字母拼成,只是一部分今天韩语已经不使用了。

谚文涉及的Unicode区段:

谚文字母区块中少部分为现代韩语使用,一般的CJK字体可以自动拼成音节,而其余字母皆用于古文,拼合需要引擎和字体的支持。

谚文字母(Unicode区段)

谚文字母扩展A、B还对古谚文字母做了扩充:

谚文扩展字母区段

现代韩语使用的字母拼成音节,另独立编码在“谚文音节”区段。现在韩语不使用的谚文即可称作旧谚文,部分曾用来拼明代汉语。见谚文字母区段的日文页面,有逐个解释。私用区有旧谚文音节的独立编码,即汉阳PUA编码,不过需要特殊字体,有些中文字体用私用区显示汉字。一般CJK字体显示旧谚文音节仍需谚文字母拼合(这被称为初中终编码),这需要排版引擎和字体的支持。

参见:

字体

Linux可以用Noto Serif CJK KRNoto Sans CJK KR,Debian系包含在下包内,配合Script=Hangul参数,可以使谚文正确组合。

sudo apt install fonts-noto-cjk

Windows自带Malgun Gothic字体是一款非衬线字体,是谚文的默认字体,对古谚文支持非常好。 天珩字库TH-Joeng-HTH-Tshyn-P0能够组合谚文,不过部分字在会在Word下组合失败。Gulim Old Hangul Jamo也能组合谚文,不过太老了,很多字母都支持不全。

pmhanguljamo宏包文档里还给出了Hamchorom、KoPub World、Nanum Yet Hangul、Un Batang字体,不妨一用。

应用方面:

Word中TH-Tshyn-P0TH-Joeng-HGulim-Old-Hangul-Jamo.ttf均有部分谚文无法正确组合(缺字);思源Source Han Serif KNoto 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

  1. XeTeX下直接使用fontspec可正常显示

    \usepackage{fontspec}
    \newfontfamily\oldjamo{Noto Serif CJK KR}[Script=Hangul] %旧谚文

    XeTeX 西文显示谚文正常

    XeTeX 西文谚文傍点正常

  2. 使用ctex后,xeCJK会把谚文归为CJK字符,定义CJK字体即可显示

    \usepackage{fontspec}
    \usepackage{ctex}
    \newCJKfontfamily\oldjamo{Noto Serif CJK KR}[Script=Hangul] %旧谚文
    \setCJKmainfont{Source Han Serif SC}

    这时有\oldjamo的地方谚文正常显示,其余处谚文无法拼合。默认ctex会抹掉空格,汉谚混写(迫真)中的空格无法呈现。

    XeTeX ctex用CJK显示谚文正常

    XeTeX 傍点正常

LuaLaTeX

LuaTeX下的问题比较棘手,首先:

  1. 原生使用下,仅使用fontspec定义字体。在TeX Live 2023和TeX Live 2024发行版中,如果一个谚文的初、中声刚好能拼成现代韩语音节(谚文音节区段Hangul Syllables"AC00-"D7AF),则该音节会抢先显示,把终声甩在后头,从而使古谚文无法正确拼合。

    \usepackage{fontspec}
    \newfontfamily\oldjamo{Noto Serif CJK KR}[Script=Hangul]%

    TeXLive 2024 luatex

    而TeXLive 2022版就无此问题,Debian12源里的TeXLive即为2022,Overleaf可以选择TeX Live版本。

    TeXLive 2022 luatex

    版本信息:

    # 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均不能正常显示声调傍点:

    luatex下傍点无法提前

  2. 解决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}

    此时设置了(西文)字体的谚文正常显示,其余地方若(西文)主字体不支持将无法显示。

    polyglossia 西文显示谚文正常

    polyglossia 傍点正常

  1. 配合ctex使用中文字体会直接无法拼合,只有现代韩语音节的部分能够拼合

    \usepackage{ctex,fontspec}
    \newCJKfontfamily\oldCJKjamo{Noto Serif CJK KR}[Script=Hangul]%

    原生ctex 谚文用CJK字体无法拼合

    用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]%

    image-20240908003233338

    当然也可以借用polyglossia包修复,不过无论是否使用polyglossia包,polyglossia是否设置otherlanguage,谚文的声调加点不会提到前面:

    注意,与ctex同时使用时,polyglossia要放在ctex

    只用ctex,傍点无法提前

    单用ctex 谚文设为ALchar

    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}

    也是设置了(西文)字体的谚文正常显示,其余地方若(西文)主字体不支持将无法显示。谚文音节区段的字符按中文字体正常。傍点无法显示。

    ctex+polyglossia

    ctex+polyglossia无法显示声调

    解决傍点无法显示的问题,可以把现代韩语音节也归为ALchar,这样所有谚文皆可附点。缺点是正文中的现代韩语无法直接用CJK字体显示。

    \ltjdefcharrange{3}{
      "AC00-"D7AF % 现代韩语音节
    }

    ctex+polyglossia 所有谚文归ALchar 可显示声调

  2. 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

    texlive2022 ctex+luatexko显示谚文

    在TeXLive 2024中luatexko包会与ctexluatexja)直接冲突,汉字不会交由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)。

默认转义方案如下:

辅音

元音

声调傍点

  1. /表示不加点平声,;表示单点去声,:表示双点上声
  2. 轻唇音ㅸ(非) ㆄ(敷)ㅹ(奉)ㅱ(微)可用bq pq bbq mq表示
  3. 齿头音、正齿音区别:l表示左边长,lr表示右边长

    穿
    谚文
    pm方案jlcljjlslssljlrclrjjlrslrsslr

更多介绍详见宏包文档。

此包在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}

XeTeX下pm宏包谚文无法显示

你可以使用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}

用polyglossia配置korean环境后

  • 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}}

LuaTeX下pm宏包用西文显示

此处为何还要再定义个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}

洪武正韻譯訓声母字音