texlive[53824] Master/texmf-dist: luatexko (17feb20)

commits+karl at tug.org commits+karl at tug.org
Mon Feb 17 23:18:08 CET 2020


Revision: 53824
          http://tug.org/svn/texlive?view=revision&revision=53824
Author:   karl
Date:     2020-02-17 23:18:08 +0100 (Mon, 17 Feb 2020)
Log Message:
-----------
luatexko (17feb20)

Modified Paths:
--------------
    trunk/Master/texmf-dist/doc/luatex/luatexko/ChangeLog
    trunk/Master/texmf-dist/doc/luatex/luatexko/README
    trunk/Master/texmf-dist/doc/luatex/luatexko/luatexko-doc.pdf
    trunk/Master/texmf-dist/doc/luatex/luatexko/luatexko-doc.tex
    trunk/Master/texmf-dist/tex/luatex/luatexko/luatexko-normalize.lua
    trunk/Master/texmf-dist/tex/luatex/luatexko/luatexko-uhc2utf8.lua
    trunk/Master/texmf-dist/tex/luatex/luatexko/luatexko.lua
    trunk/Master/texmf-dist/tex/luatex/luatexko/luatexko.sty

Modified: trunk/Master/texmf-dist/doc/luatex/luatexko/ChangeLog
===================================================================
--- trunk/Master/texmf-dist/doc/luatex/luatexko/ChangeLog	2020-02-17 22:17:48 UTC (rev 53823)
+++ trunk/Master/texmf-dist/doc/luatex/luatexko/ChangeLog	2020-02-17 22:18:08 UTC (rev 53824)
@@ -1,3 +1,14 @@
+2020-02-17	Dohyun Kim <nomos at ktug org>
+
+	Version 2.6
+
+	* luatexko.lua:
+	discourage font substitution of monospaced ascii punctuations
+
+	* luatexko.sty:
+	use latex's newly introduced \@{rm|sf|tt|default}familyhook;
+	suppress bx-font-not-found warnings and make \bfseries work again
+
 2019-12-01	Dohyun Kim <nomos at ktug org>
 
 	Version 2.5

Modified: trunk/Master/texmf-dist/doc/luatex/luatexko/README
===================================================================
--- trunk/Master/texmf-dist/doc/luatex/luatexko/README	2020-02-17 22:17:48 UTC (rev 53823)
+++ trunk/Master/texmf-dist/doc/luatex/luatexko/README	2020-02-17 22:18:08 UTC (rev 53824)
@@ -1,4 +1,4 @@
-LuaTeX-ko Package version 2.5 (2019/12/01)
+LuaTeX-ko Package version 2.6 (2020/02/17)
 ===========================================
 
 This is a Lua(La)TeX macro package that supports typesetting Korean

Modified: trunk/Master/texmf-dist/doc/luatex/luatexko/luatexko-doc.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/luatex/luatexko/luatexko-doc.tex
===================================================================
--- trunk/Master/texmf-dist/doc/luatex/luatexko/luatexko-doc.tex	2020-02-17 22:17:48 UTC (rev 53823)
+++ trunk/Master/texmf-dist/doc/luatex/luatexko/luatexko-doc.tex	2020-02-17 22:18:08 UTC (rev 53824)
@@ -79,7 +79,7 @@
 \usepackage{hologo}
 \def\luatex{\hologo{LuaTeX}}
 \def\XeTeX{\hologo{XeTeX}}
-\usepackage[pdfencoding=auto,bookmarksnumbered,hidelinks]{hyperref}
+\usepackage[hidelinks]{hyperref}
 
 \edef\verbatim{\unexpanded\expandafter{\verbatim\linespread{1.1}\selectfont}}
 \edef\itemize{\unexpanded\expandafter{\itemize\small}}
@@ -104,7 +104,7 @@
 \author{Dohyun Kim \normalsize |<nomos at ktug org>| \and
         Soojin Nam \normalsize |<jsunam at gmail com>| \and
   \normalsize <\url{http://github.com/dohyunkim/luatexko}>}
-\date{Version 2.5\quad 2019/12/01}
+\date{Version 2.6\quad 2020/02/17}
 \maketitle
 
 \begin{quote}\small
@@ -111,12 +111,14 @@
   For a summary introduction in English, please see |README| file.
 
   \begin{itemize}\linespread{1.1}\selectfont
+    \item[v2.6] ------
+    \item \hyperref[sec:fontswitch]{\cs{hangulbyhangulfont} 및
+      \cs{hanjabyhanjafont}가 지역적 효력만 가짐}
     \item[v2.5] ------
-    \item LuaHB\TeX\ 지원
+    \item LuaHB\TeX\ 지원 (세로쓰기 제외)
     \item[v2.2] ------
     \item \hyperref[sec:fontoption]{글꼴옵션 |InterCharStretch| 제공}
     \item[v2.0] ------
-    \item \hyperref[sec:fontoption]{글꼴옵션 |PunctRaise|, |NoEmbeding| 제거}
     \item \hyperref[sec:mathhangul]{수식 한글 글꼴을 자동으로 잡아주지 않음}
     \item \cs{actualtext} 명령 작동 않음. 대신, 옛한글 텍스트 추출 자동 지원%
       \footnote{%
@@ -133,7 +135,7 @@
 
 \section{부르기}\label{sec:loading}
 
-\hemph{\texlive\ 2019 이상}{ \small (\luatex\ v1.10 이상)}을 사용해야 한다.
+\hemph{\texlive\ 2020 이상}{ \small (\luatex\ v1.12 이상)}을 사용해야 한다.
 
 \luatexko\ 부르기: \cs{usepackage{luatexko}} 혹은 \cs{usepackage{kotex}}.%
 \footnote{%
@@ -155,10 +157,17 @@
 
 \section{글꼴명령}\label{sec:fontcmds}
 
-\luatexko를 로드하면 fontspec 패키지를 자동으로 불러온다. 글꼴 설정은
-fontspec 문서를 참조.
+\luatexko를 부르면 fontspec 패키지도 자동 불러온다. 글꼴 설정은
+fontspec 문서 참조.
 
-한국어 글꼴을 위해 새로 마련한 명령은 다음과 같다.
+한국어 글꼴을 위해 새로 마련한 명령은 다음과 같다.%
+\pkgkwd*{\setmainhangulfont}%
+\pkgkwd*{\setsanshangulfont}%
+\pkgkwd*{\setmonohangulfont}%
+\pkgkwd*{\newhangulfontfamily}%
+\pkgkwd*{\newhangulfontface}%
+\pkgkwd*{\addhangulfontfeature}%
+\pkgkwd*{\hangulfontspec}
 첫 두 줄, 즉 main/sans 글꼴들에는 |Ligatures=TeX| 옵션이 자동으로 주어진다.%
 \footnote{%
   \cs{adhochangulfont} \cs{adhochanjafont} \cs{addhocfallbackfont}는
@@ -169,13 +178,6 @@
   \cs{hangulfont=UnDotum\relax}\\
   \cs{hanjafont=UnDotum at 14pt}\\
   \cs{fallbackfont=HanaMinB at 12pt} }
-\pkgkwd*{\setmainhangulfont}%
-\pkgkwd*{\setsanshangulfont}%
-\pkgkwd*{\setmonohangulfont}%
-\pkgkwd*{\newhangulfontfamily}%
-\pkgkwd*{\newhangulfontface}%
-\pkgkwd*{\addhangulfontfeature}%
-\pkgkwd*{\hangulfontspec}%
 \begin{verbatim}
   \setmainhangulfont     \setmainhanjafont    \setmainfallbackfont
   \setsanshangulfont     \setsanshanjafont    \setsansfallbackfont
@@ -199,13 +201,13 @@
 하지만 \pkgkwd{\hangulbyhangulfont}|=1|을 선언하면 한글은 우선 한글폰트로
 식자한다. 또한 \pkgkwd{\hanjabyhanjafont}|=1|을 선언하면 한자는 우선 한자폰트로
 식자한다. 두 경우 모두 |0|을 선언하면 원래 방식으로 되돌아간다.
-문단 중간에서 사용해도 동작한다. 그러나 루아코드가 실행되므로
-텍의 그룹에 의해 영향받지 않는 전역적 효과를 가진다.
+문단 중간에서 사용해도 동작한다. \sout{그러나 루아코드가 실행되므로
+텍의 그룹에 의해 영향받지 않는 전역적 효과를 가진다.}
 
 일정한 영문 문장부호들은 한글 폰트로 식자된다.
 즉, \pkgkwd{\hangulpunctuations}|=1|이 기본으로 작동하고,
 |0|을 지시해야 이 기능이 비로소 꺼진다.
-verbatim 코드를 식자할 때는 이 기능이 작동하지 않는다.%
+verbatim 코드를 식자할 때는 이 기능이 작동하지 않으며,%
 \footnote{%
   정확히 말하자면 |\\language=\\l at nohyphenation|, 즉 하이프네이션이
   허용 안 되는  상황에서는 작동하지 않는다.
@@ -212,7 +214,8 @@
   부연하건대, |\\language=\\l at nohyphenation| 상황에서 작동하지 않는
   그밖의 기능은 다음과 같다: 줄바꿈 허용, InterCharacter, InterHangul,
   InterLatinCJK, CompressPunctuations, RemoveClassicSpaces,
-  한글^^b7한자 폰트 문자 다음의 공백 크기 조정 등. }\,%
+  한글^^b7한자 폰트 문자 다음의 공백 크기 조정 등. }
+문장부호가 고정폭 글꼴일 때에도 작동하지 않는다.%
 \footnote{%
   또한 플레인텍에서는 영문글꼴을 트루타입/오픈타입으로 지정해야만 작동한다. }
 영향 받는 문장부호들의 기본값은 다음과 같다:
@@ -223,16 +226,15 @@
   [0x2015]  ―   [0x2018]  ‘   [0x2019]  ’   [0x201C]  “
   [0x201D]  ”    [0x2026]  …   [0x203B]  ※
 \end{verbatim}
-
-다음과 같은 명령으로 이 목록에 문자를 추가하거나 제거할 수 있다.
-인자는 콤마로 분리된 숫자 형식으로서 유니코드 코드포인트를 뜻한다.
-이들 명령은 문단 중간에서도 쓸 수 있지만, 전역적 효과를 가진다.%
+다음과 같은 명령으로 이 목록에 문자를 추가하거나 제거할 수 있다.%
 \pkgkwd*{\registerpunctuations}%
 \pkgkwd*{\unregisterpunctuations}
+인자는 콤마로 분리된 숫자 형식으로서 유니코드 코드포인트를 뜻한다.
 \begin{verbatim}
   \registerpunctuations{45, "2D, `-}
   \unregisterpunctuations{"2D, "2015}
 \end{verbatim}
+이상 문장부호 관련 명령들은 문단 중간에서도 쓸 수 있지만, 전역적 효과를 가진다.
 
 \section{줄바꿈 허용}\label{sec:break}
 
@@ -239,6 +241,7 @@
 어떤 글자 앞이나 뒤에서 줄바꿈을 허용하고 싶을 때 아래와 같이 명령을 준다.%
 \pkgkwd*{\registerbreakableafter}%
 \pkgkwd*{\registerbreakablebefore}
+이들 명령을 문단 중간에서 사용하면 문단의 처음부터 전역적 효력을 가진다.
 \begin{verbatim}
 \registerbreakableafter{"2460, "2461}
 \registerbreakablebefore{"2460, "2461}
@@ -362,7 +365,7 @@
     않다. 가령 U+3002 (\char"3002) 처리의 경우.}
 
 \item[Protrusion] \pkgkwd*{Protrusion}%
-  특정 글자가 행 끌에 왔을 때 판면 바깥으로 끌어내는
+  특정 글자가 행 끝에 왔을 때 판면 바깥으로 끌어내는
   기능이다. Lua\TeX은 기본값으로 온점 반점 등을 완전 글자내밀기 한다.
   |Protrusion|은 |Protrusion=default|와 같은 뜻이다.%
   \footnote{%

Modified: trunk/Master/texmf-dist/tex/luatex/luatexko/luatexko-normalize.lua
===================================================================
--- trunk/Master/texmf-dist/tex/luatex/luatexko/luatexko-normalize.lua	2020-02-17 22:17:48 UTC (rev 53823)
+++ trunk/Master/texmf-dist/tex/luatex/luatexko/luatexko-normalize.lua	2020-02-17 22:18:08 UTC (rev 53824)
@@ -1,6 +1,6 @@
 -- luatexko-normalize.lua
 --
--- Copyright (c) 2013-2019  Dohyun Kim  <nomos at ktug org>
+-- Copyright (c) 2013-2020  Dohyun Kim  <nomos at ktug org>
 --                          Soojin Nam  <jsunam at gmail com>
 --
 -- This work may be distributed and/or modified under the
@@ -13,8 +13,8 @@
 
 luatexbase.provides_module({
   name        = "luatexko-normalize",
-  version     = "2.5",
-  date        = "2019/12/01",
+  version     = "2.6",
+  date        = "2020/02/17",
   author      = "Dohyun Kim, Soojin Nam",
   description = "Hangul normalization",
   license     = "LPPL v1.3+",

Modified: trunk/Master/texmf-dist/tex/luatex/luatexko/luatexko-uhc2utf8.lua
===================================================================
--- trunk/Master/texmf-dist/tex/luatex/luatexko/luatexko-uhc2utf8.lua	2020-02-17 22:17:48 UTC (rev 53823)
+++ trunk/Master/texmf-dist/tex/luatex/luatexko/luatexko-uhc2utf8.lua	2020-02-17 22:18:08 UTC (rev 53824)
@@ -1,6 +1,6 @@
 -- luatexko-uhc2utf8.lua
 --
--- Copyright (c) 2013-2019  Dohyun Kim  <nomos at ktug org>
+-- Copyright (c) 2013-2020  Dohyun Kim  <nomos at ktug org>
 --                          Soojin Nam  <jsunam at gmail com>
 --
 -- This work may be distributed and/or modified under the
@@ -13,8 +13,8 @@
 
 luatexbase.provides_module({
   name        = "luatexko-uhc2utf8",
-  version     = "2.5",
-  date        = "2019/12/01",
+  version     = "2.6",
+  date        = "2020/02/17",
   author      = "Dohyun Kim, Soojin Nam",
   description = "UHC (CP949) input encoding",
   license     = "LPPL v1.3+",

Modified: trunk/Master/texmf-dist/tex/luatex/luatexko/luatexko.lua
===================================================================
--- trunk/Master/texmf-dist/tex/luatex/luatexko/luatexko.lua	2020-02-17 22:17:48 UTC (rev 53823)
+++ trunk/Master/texmf-dist/tex/luatex/luatexko/luatexko.lua	2020-02-17 22:18:08 UTC (rev 53824)
@@ -1,6 +1,6 @@
 -- luatexko.lua
 --
--- Copyright (c) 2013-2019 Dohyun Kim <nomos at ktug org>
+-- Copyright (c) 2013-2020 Dohyun Kim <nomos at ktug org>
 --                         Soojin Nam <jsunam at gmail com>
 --
 -- This work may be distributed and/or modified under the
@@ -13,8 +13,8 @@
 
 luatexbase.provides_module {
   name        = 'luatexko',
-  date        = '2019/12/01',
-  version     = '2.5',
+  date        = '2020/02/17',
+  version     = '2.6',
   description = 'typesetting Korean with LuaTeX',
   author      = 'Dohyun Kim, Soojin Nam',
   license     = 'LPPL v1.3+',
@@ -113,10 +113,255 @@
 local classicattr      = attributes.luatexkoclassicattr
 local dotemphattr      = attributes.luatexkodotemphattr
 local rubyattr         = attributes.luatexkorubyattr
+local hangulbyhangulattr = attributes.luatexkohangulbyhangulattr
+local hanjabyhanjaattr   = attributes.luatexkohanjabyhanjaattr
 
 local vert_classic = 1
 local SC_classic   = 2
 
+local stretch_f = 5/100 -- should be consistent for ruby
+
+local function get_font_data (fontid)
+  return fontgetfont(fontid) or fontfonts[fontid] or {}
+end
+
+local function get_font_param (f, key)
+  local t
+  if type(f) == "number" then
+    t = getparameters(f)
+    if t and t[key] then
+      return t[key]
+    end
+    f = get_font_data(f)
+  end
+  if type(f) == "table" then
+    t = f.parameters
+    return t and t[key]
+  end
+end
+
+local function option_in_font (fontdata, optionname)
+  if type(fontdata) == "number" then
+    fontdata = get_font_data(fontdata)
+  end
+  if fontdata.specification then
+    return fontdata.specification.features.normal[optionname]
+  end
+end
+
+local function font_opt_dim (fd, optname)
+  local dim = option_in_font(fd, optname)
+  if dim then
+    local params
+    if type(fd) == "number" then
+      params = getparameters(fd)
+    else
+      params = fd.parameters
+    end
+    local m, u = dim:match"^(.+)(e[mx])%s*$"
+    if m and u and params then
+      if u == "em" then
+        dim = m * params.quad
+      else
+        dim = m * params.x_height
+      end
+    else
+      dim = texsp(dim)
+    end
+    return dim
+  end
+end
+
+local function is_harf (f)
+  if type(f) == "number" then
+    f = get_font_data(f)
+  end
+  return f.hb
+end
+
+local function is_not_harf (f)
+  if option_in_font(f, "mode") == "harf" then -- mode=harf with non-luahbtex
+    return false
+  end
+  return not is_harf(f)
+end
+
+local function harf_reordered_tonemark (curr)
+  if is_harf(curr.font) then
+    local props = getproperty(curr) or {}
+    local actualtext = props.luaotfload_startactualtext or ""
+    return actualtext:find"302[EF]$"
+  end
+end
+
+local os2tag = luaotfload.harfbuzz and luaotfload.harfbuzz.Tag.new"OS/2"
+
+local font_options = {
+  charraise = setmetatable( {}, { __index = function(t, fid)
+    if fid then
+      local dim = font_opt_dim(fid, "charraise") or false
+      t[fid] = dim
+      return dim
+    end
+  end }),
+
+  intercharacter = setmetatable( {}, { __index = function(t, fid)
+    if fid then
+      local dim = font_opt_dim(fid, "intercharacter") or false
+      t[fid] = dim
+      return dim
+    end
+  end }),
+
+  intercharstretch = setmetatable( {}, { __index = function(t, fid)
+    if fid then
+      local dim = font_opt_dim(fid, "intercharstretch") or false
+      t[fid] = dim
+      return dim
+    end
+  end }),
+
+  interhangul = setmetatable( {}, { __index = function(t, fid)
+    if fid then
+      local dim = font_opt_dim(fid, "interhangul") or false
+      t[fid] = dim
+      return dim
+    end
+  end }),
+
+  interlatincjk = setmetatable( {}, { __index = function(t, fid)
+    if fid then
+      local dim = font_opt_dim(fid, "interlatincjk") or false
+      t[fid] = dim
+      return dim
+    end
+  end }),
+
+  en_size = setmetatable( {}, { __index = function(t, fid)
+    if fid then
+      val = (get_font_param(fid, "quad") or 655360)/2
+      t[fid] = val
+      return val
+    end
+    return 327680
+  end } ),
+
+  hangulspaceskip = setmetatable( {}, { __index = function(t, fid)
+    if fid then
+      local newwd
+      if is_harf(fid) then
+        newwd = getparameters(fid) or false
+        if newwd then
+          newwd = { newwd.space, newwd.space_stretch, newwd.space_shrink }
+        end
+      else
+        local newsp = nodenew(glyphid)
+        newsp.char, newsp.font = 32, fid
+        newsp = nodes.simple_font_handler(newsp)
+        newwd = newsp and newsp.width or false
+        if newwd then
+          newwd = { texsp(newwd), texsp(newwd/2), texsp(newwd/3) }
+        end
+        if newsp then nodefree(newsp) end
+      end
+      t[fid] = newwd
+      return newwd
+    end
+  end } ),
+
+  monospaced = setmetatable( {}, { __index = function(t, fid)
+    if fid then
+      -- space_stretch has been set to zero by fontloader
+      if get_font_param(fid, "space_stretch") == 0 then
+        t[fid] = true; return true
+      end
+      -- but not in harf mode; so we simply test widths of some glyphs
+      if is_harf(fid) then
+        local chars = get_font_data(fid).characters or {}
+        local i, M = chars[0x69], chars[0x4D]
+        if i and M and i.width == M.width then
+          t[fid] = true; return true
+        end
+      end
+      t[fid] = false; return false
+    end
+  end } ),
+
+  tonemarkwidth = setmetatable( {}, { __index = function(t, fid)
+    if fid then
+      local hwidth
+      -- check horizontal width; vertical width is mostly non-zero
+      local fontdata     = get_font_data(fid)
+      local shared       = fontdata.shared      or {}
+      local rawdata      = shared.rawdata       or {}
+      local descriptions = rawdata.descriptions or {}
+      local description  = descriptions[0x302E] or {}
+      hwidth = description.width or 0
+      t[fid] = hwidth
+      return hwidth
+    end
+    return 0
+  end } ),
+
+  asc_desc = setmetatable( {}, { __index = function(t, fid)
+    if fid then
+      local asc, desc
+      -- luaharfbuzz's Font:get_h_extents() gets ascender value from hhea table;
+      -- Node mode's parameters.ascender is gotten from OS/2 table.
+      -- TypoAscender in OS/2 table seems to be more suitable for our purpose.
+      local hb = is_harf(fid)
+      if hb and os2tag then
+        local hbface = hb.shared.face
+        local tags = hbface:get_table_tags()
+        local hasos2 = false
+        for _,v in ipairs(tags) do
+          if v == os2tag then
+            hasos2 = true
+            break
+          end
+        end
+        if hasos2 then
+          local os2 = hbface:get_table(os2tag)
+          local length = os2:get_length()
+          if length > 69 then -- sTypoAscender (int16)
+            local data = os2:get_data()
+            local typoascender  = stringunpack(">h", data, 69)
+            local typodescender = stringunpack(">h", data, 71)
+            asc  =  typoascender  * hb.scale
+            desc = -typodescender * hb.scale
+          end
+        end
+      end
+      asc  = asc  or get_font_param(fid, "ascender")  or false
+      desc = desc or get_font_param(fid, "descender") or false
+      t[fid] = { asc, desc }
+      return { asc, desc }
+    end
+    return { }
+  end } ),
+}
+
+local function char_in_font(fontdata, char)
+  if type(fontdata) == "number" then
+    fontdata = get_font_data(fontdata)
+  end
+  if fontdata.characters then
+    return fontdata.characters[char]
+  end
+end
+
+local function my_node_props (n)
+  local t = getproperty(n)
+  if not t then
+    t = {}
+    setproperty(n, t)
+  end
+  t.luatexko = t.luatexko or {}
+  return t.luatexko
+end
+
+local active_processes = {}
+
 local function is_hanja (c)
   return c >= 0x3400 and c <= 0xA4C6
   or     c >= 0xF900 and c <= 0xFAD9
@@ -195,82 +440,6 @@
   or     is_jongsong(c)
 end
 
-local stretch_f = 5/100 -- should be consistent for ruby
-
-local function get_font_data (fontid)
-  return fontgetfont(fontid) or fontfonts[fontid] or {}
-end
-
-local function get_font_param (f, key)
-  local t
-  if type(f) == "number" then
-    t = getparameters(f)
-    if t and t[key] then
-      return t[key]
-    end
-    f = get_font_data(f)
-  end
-  if type(f) == "table" then
-    t = f.parameters
-    return t and t[key]
-  end
-end
-
-local function get_en_size (f)
-  local quad = get_font_param(f, "quad")
-  return quad and quad/2 or 327680
-end
-
-local function char_in_font(fontdata, char)
-  if type(fontdata) == "number" then
-    fontdata = get_font_data(fontdata)
-  end
-  if fontdata.characters then
-    return fontdata.characters[char]
-  end
-end
-
-local function option_in_font (fontdata, optionname)
-  if type(fontdata) == "number" then
-    fontdata = get_font_data(fontdata)
-  end
-  if fontdata.specification then
-    return fontdata.specification.features.normal[optionname]
-  end
-end
-
-local function my_node_props (n)
-  local t = getproperty(n)
-  if not t then
-    t = {}
-    setproperty(n, t)
-  end
-  t.luatexko = t.luatexko or {}
-  return t.luatexko
-end
-
-local function is_harf (f)
-  if type(f) == "number" then
-    f = get_font_data(f)
-  end
-  return f.hb
-end
-
-local function is_not_harf (f)
-  if option_in_font(f, "mode") == "harf" then -- mode=harf with non-luahbtex
-    return false
-  end
-  return not is_harf(f)
-end
-
-local function harf_reordered_tonemark (curr)
-  if is_harf(curr.font) then
-    local props = getproperty(curr) or {}
-    local actualtext = props.luaotfload_startactualtext or ""
-    return actualtext:find"302[EF]$"
-  end
-end
-
 -- font fallback
 
 local force_hangul = {
@@ -306,19 +475,6 @@
 end
 luatexko.updateforcehangul = update_force_hangul
 
-local active_processes = {}
-
-local char_font_options = {
-  ascender         = {},
-  charraise        = {},
-  hangulspaceskip  = {},
-  intercharacter   = {},
-  intercharstretch = {},
-  interhangul      = {},
-  interlatincjk    = {},
-  tonemarkwidth    = {},
-}
-
 local function hangul_space_skip (curr, newfont)
   if curr.lang ~= nohyphen and curr.font ~= newfont then
     local n = getnext(curr)
@@ -332,27 +488,7 @@
         and oldsto == 0
         and oldsho == 0 then -- not user's spaceskip
 
-        local newwd = char_font_options.hangulspaceskip[newfont]
-        if newwd == nil then
-          if is_harf(newfont) then
-            newwd = getparameters(newfont) or false
-            if newwd then
-              newwd = { newwd.space, newwd.space_stretch, newwd.space_shrink }
-            end
-          else
-            local newsp = nodecopy(curr)
-            newsp.char, newsp.font = 32, newfont
-            newsp = nodes.simple_font_handler(newsp)
-            newwd = newsp and newsp.width or false
-            if newwd then
-              newwd = { texsp(newwd), texsp(newwd/2), texsp(newwd/3) }
-            end
-            if newsp then
-              nodefree(newsp)
-            end
-          end
-          char_font_options.hangulspaceskip[newfont] = newwd
-        end
+        local newwd = font_options.hangulspaceskip[newfont]
         if newwd then
           setglue(n, newwd[1], newwd[2], newwd[3])
         end
@@ -393,12 +529,13 @@
           local format   = fontdata.format
           local encode   = fontdata.encodingbytes
           local widefont = encode == 2 or format == "opentype" or format == "truetype"
-          if hf and widefont and force_hangul[c] and curr.lang ~= nohyphen then
+
+          if hf and widefont and force_hangul[c] and curr.lang ~= nohyphen and not font_options.monospaced[curr.font] then
             curr.font = hf
-          elseif hf and luatexko.hangulbyhangulfont and is_hangul_jamo(c) then
+          elseif hf and has_attribute(curr, hangulbyhangulattr) and is_hangul_jamo(c) then
             hangul_space_skip(curr, hf)
             curr.font = hf
-          elseif hjf and luatexko.hanjabyhanjafont and is_hanja(c) then
+          elseif hjf and has_attribute(curr, hanjabyhanjaattr) and is_hanja(c) then
             hangul_space_skip(curr, hjf)
             curr.font = hjf
           elseif not char_in_font(fontdata, c) then
@@ -512,7 +649,7 @@
   [0xFE58] = true, [0xFE5A] = true, [0xFE5C] = true, [0xFE5E] = true,
   [0xFF1E] = true, [0xFF5E] = true, [0xFF70] = true,
 },{ __index = function (_,c)
-  return is_hangul_jamo(c) and not is_chosong(c)
+  return is_hangul_jamo(c) -- chosong also is breakable_after
   or     is_noncjk_char(c)
   or     is_hanja(c)
   or     is_cjk_combining(c)
@@ -566,19 +703,9 @@
   return allowbreak_false_nodes[id] or id == kernid and subtype == userkern
 end
 
-local function ruby_char_font (rb)
-  local n = has_glyph(rb.list)
-  if n then
-    local c, f = my_node_props(n).unicode or n.char, n.font
-    if is_chosong(c) or hangul_tonemark[c] then
-      c = 0xAC00
-    end
-    return c, f
-  end
-end
-
-local function hbox_ini_char_font (box)
-  local curr = box.list
+local function hbox_char_font (box, init, glyfonly)
+  local mynext = init and getnext  or getprev
+  local curr   = init and box.list or nodeslide(box.list)
   while curr do
     local id = curr.id
     if id == glyphid then
@@ -587,32 +714,14 @@
         return c, curr.font
       end
     elseif id == hlistid and curr.list then
-      return hbox_ini_char_font(curr)
-    elseif is_blocking_node(curr) then
+      return hbox_char_font(curr, init, glyfonly)
+    elseif not glyfonly and is_blocking_node(curr) then
       return
     end
-    curr = getnext(curr)
+    curr = mynext(curr)
   end
 end
 
-local function hbox_fin_char_font (box)
-  local curr = nodeslide(box.list)
-  while curr do
-    local id = curr.id
-    if id == glyphid then
-      local c = my_node_props(curr).unicode or curr.char
-      if c and not is_cjk_combining(c) then
-        return c, curr.font
-      end
-    elseif id == hlistid and curr.list then
-      return hbox_fin_char_font(curr)
-    elseif is_blocking_node(curr) then
-      return
-    end
-    curr = getprev(curr)
-  end
-end
-
 local function get_actualtext (curr)
   local actual = my_node_props(curr).startactualtext
   if type(actual) == "table" then
@@ -633,34 +742,6 @@
   return curr
 end
 
-local function fontdata_opt_dim (fd, optname)
-  local dim = option_in_font(fd, optname)
-  if dim then
-    local m, u = dim:match"^(.+)(e[mx])%s*$"
-    if m and u then
-      if u == "em" then
-        dim = m * fd.parameters.quad
-      else
-        dim = m * fd.parameters.x_height
-      end
-    else
-      dim = texsp(dim)
-    end
-    return dim
-  end
-end
-
-local function get_font_opt_dimen (fontid, optionname)
-  local t = char_font_options[optionname]
-  local dim = t and t[fontid]
-  if dim == nil then
-    local fd = get_font_data(fontid)
-    dim = fontdata_opt_dim(fd, optionname)
-    t[fontid] = dim or false -- cache
-  end
-  return dim
-end
-
 local function insert_glue_before (head, curr, par, br, brb, classic, ict, dim, fid)
   local pn = nodenew(penaltyid)
   if not br then
@@ -675,12 +756,12 @@
 
   dim = dim or 0
   local gl = nodenew(glueid)
-  local en = get_en_size(fid)
+  local en = font_options.en_size[fid]
   if ict then
     en = classic and en or en/4
     setglue(gl, en * ict[1] + dim, nil, en * ict[2])
   else
-    local str = get_font_opt_dimen(fid, "intercharstretch") or stretch_f*en
+    local str = font_options.intercharstretch[fid] or stretch_f*en
     setglue(gl, dim, str, str*0.6)
   end
 
@@ -694,7 +775,7 @@
     local ict = intercharclass[pcl][ccl]
     local brb = breakable_before[cc]
     local br  = brb and breakable_after[pc]
-    local dim = get_font_opt_dimen(fid, "intercharacter")
+    local dim = font_options.intercharacter[fid]
     if ict or br or dim and (pcl >= 1 or ccl >= 1) then
       head = insert_glue_before(head, curr, par, br, brb, old, ict, dim, fid)
     end
@@ -715,21 +796,12 @@
 
     elseif id == hlistid and curr.list then
       local old = has_attribute(curr, classicattr)
-      if has_attribute(curr, rubyattr) then
-        local c, f = ruby_char_font(curr) -- rubybase
-        if c and f then
-          head, pc, pcl = maybe_linebreak(head, curr, pc, pcl, c, old, f, par)
-        else
-          pc, pcl = false, 0
-        end
-      else
-        local c, f = hbox_ini_char_font(curr)
-        if c and f then
-          head = maybe_linebreak(head, curr, pc, pcl, c, old, f, par)
-        end
-        pc = hbox_fin_char_font(curr)
-        pcl = pc and get_char_class(pc, old) or 0
+      local c, f = hbox_char_font(curr, true)
+      if c and f then
+        head = maybe_linebreak(head, curr, pc, pcl, c, old, f, par)
       end
+      pc = hbox_char_font(curr)
+      pcl = pc and get_char_class(pc, old) or 0
 
     elseif id == whatsitid and curr.mode == directmode then
       local glyf, c, fin = get_actualtext(curr)
@@ -772,7 +844,7 @@
           gpos = gpos and gpos.id == kernid and gpos.subtype == fontkern
 
           if not gpos then
-            local wd = get_en_size(curr.font) - curr.width
+            local wd = font_options.en_size[curr.font] - curr.width
             if wd ~= 0 then
               local k = nodenew(kernid) -- fontkern (subtype 0) is default
               k.kern = class == 3 and wd/2 or wd
@@ -813,7 +885,7 @@
   local cc = (is_hangul(c) or is_compat_jamo(c) or is_chosong(c)) and 1 or 0
 
   if cc*pc == 1 and curr.lang ~= nohyphen then
-    local dim = get_font_opt_dimen(fontid, "interhangul")
+    local dim = font_options.interhangul[fontid]
     if dim then
       head = insert_glue_before(head, curr, par, true, true, false, false, dim, fontid)
     end
@@ -839,21 +911,12 @@
       end
 
     elseif id == hlistid and curr.list then
-      if has_attribute(curr, rubyattr) then
-        local c, f = ruby_char_font(curr)
-        if c and f then
-          head, pc = do_interhangul_option(head, curr, pc, c, f, par)
-        else
-          pc = 0
-        end
-      else
-        local c, f = hbox_ini_char_font(curr)
-        if c and f then
-          head = do_interhangul_option(head, curr, pc, c, f, par)
-        end
-        c = hbox_fin_char_font(curr)
-        pc = c and is_hangul_jamo(c) and 1 or 0
+      local c, f = hbox_char_font(curr, true)
+      if c and f then
+        head = do_interhangul_option(head, curr, pc, c, f, par)
       end
+      c = hbox_char_font(curr)
+      pc = c and is_hangul_jamo(c) and 1 or 0
 
     elseif id == whatsitid and curr.mode == directmode then
       local glyf, c = get_actualtext(curr)
@@ -881,11 +944,11 @@
     local brb = cc == 2 or breakable_before[c] -- numletter != br_before
     if brb then
       local f = cc == 1 and cf or pf
-      local dim = get_font_opt_dimen(f, "interlatincjk")
+      local dim = font_options.interlatincjk[f]
       if dim then
         local ict = old and intercharclass[pcl][ccl] -- under classic env. only
         if ict then
-          dim = get_font_opt_dimen(f, "intercharacter") or 0
+          dim = font_options.intercharacter[f] or 0
         end
         head = insert_glue_before(head, curr, par, true, brb, old, ict, dim, f)
       end
@@ -907,27 +970,18 @@
       end
 
     elseif id == hlistid and curr.list then
-      if has_attribute(curr, rubyattr) then
-        local c, f = ruby_char_font(curr)
-        if c and f then
-          head, pc, pf, pcl = do_interlatincjk_option(head, curr, pc, pf, pcl, c, f, par)
-        else
-          pc, pf, pcl = 0, 0, 0
-        end
+      local c, f = hbox_char_font(curr, true)
+      if c and f then
+        head = do_interlatincjk_option(head, curr, pc, pf, pcl, c, f, par)
+      end
+      c, f = hbox_char_font(curr)
+      if c and breakable_after[c] then
+        pc = is_cjk_char(c) and 1 or is_noncjk_char(c) and 2 or 0
       else
-        local c, f = hbox_ini_char_font(curr)
-        if c and f then
-          head = do_interlatincjk_option(head, curr, pc, pf, pcl, c, f, par)
-        end
-        c, f = hbox_fin_char_font(curr)
-        if c and breakable_after[c] then
-          pc = is_cjk_char(c) and 1 or is_noncjk_char(c) and 2 or 0
-        else
-          pc = 0
-        end
-        pcl = c and get_char_class(c, has_attribute(curr, classicattr)) or 0
-        pf  = f or 0
+        pc = 0
       end
+      pcl = c and get_char_class(c, has_attribute(curr, classicattr)) or 0
+      pf  = f or 0
 
     elseif id == whatsitid and curr.mode == directmode then
       local glyf, c = get_actualtext(curr)
@@ -935,6 +989,7 @@
         head, pc, pf, pcl = do_interlatincjk_option(head, curr, pc, pf, pcl, c, glyf.font, par)
         curr = goto_end_actualtext(curr)
       end
+
     elseif id == mathid then
       if pc == 1 then
         head = do_interlatincjk_option(head, curr, pc, pf, pcl, 0x30, pf, par)
@@ -980,13 +1035,7 @@
                 end
                 vchar, vfont = my_node_props(v).unicode or v.char, v.font
               elseif id == hlistid and v.list then
-                if has_attribute(v, rubyattr) then
-                  vchar, vfont = ruby_char_font(v)
-                elseif k == "p" then
-                  vchar, vfont = hbox_fin_char_font(v)
-                else
-                  vchar, vfont = hbox_ini_char_font(v)
-                end
+                vchar, vfont = hbox_char_font(v, k == "n")
               end
               if vchar and vfont and option_in_font(vfont, opt_name) then
                 ok = is_cjk_char(vchar)
@@ -1186,7 +1235,7 @@
           end
 
           local currwd = curr.width
-          if currwd >= get_en_size(curr.font) then
+          if currwd >= font_options.en_size[curr.font] then
             local box = nodecopy(dotemphbox[dotattr])
             local shift = (currwd - box.width)/2
             if shift ~= 0 then
@@ -1222,6 +1271,28 @@
 
 -- uline
 
+local function get_strike_out_down (box)
+  local c, f = hbox_char_font(box, true, true) -- ignore blocking nodes
+  if c and f then
+    local down
+    local ex = get_font_param(f, "x_height") or texsp"1ex"
+    if is_cjk_char(c) then
+      local ascender, descender = tableunpack(font_options.asc_desc[f])
+      if ascender and descender then
+        down = descender - (ascender + descender)/2
+      else
+        down = -0.667*ex
+      end
+    else
+      down = -0.5*ex
+    end
+    local raise = font_options.charraise[f] or 0
+    return down - raise
+  end
+  return -texsp"0.5ex"
+end
+luatexko.get_strike_out_down = get_strike_out_down
+
 local uline_f, uline_id = new_user_whatsit("uline","luatexko")
 local no_uline_id = new_user_whatsit_id("no_uline","luatexko")
 
@@ -1325,10 +1396,10 @@
 luatexko.rubybox = rubybox
 
 local function getrubystretchfactor (box)
-  local _, fid = ruby_char_font(box)
-  local str = get_font_opt_dimen(fid, "intercharstretch")
+  local _, fid = hbox_char_font(box, true, true)
+  local str = font_options.intercharstretch[fid]
   if str then
-    local em = get_en_size(fid) * 2
+    local em = font_options.en_size[fid] * 2
     set_macro("luatexkostretchfactor", stringformat("%.4f", str/em/2))
   end
 end
@@ -1365,42 +1436,6 @@
   return head
 end
 
-local os2tag = luaotfload.harfbuzz and luaotfload.harfbuzz.Tag.new"OS/2"
-
--- luaharfbuzz's Font:get_h_extents() gets ascender value from hhea table;
--- Node mode's parameters.ascender is gotten from OS/2 table.
--- TypoAscender in OS/2 table seems to be more suitable for our purpose.
-local function get_font_ascender (f)
-  local ascender = char_font_options.ascender
-  local ascend = ascender[f]
-  if ascend == nil then
-    local hb = is_harf(f)
-    if hb and os2tag then
-      local hbface = hb.shared.face
-      local tags = hbface:get_table_tags()
-      local hasos2 = false
-      for _,v in ipairs(tags) do
-        if v == os2tag then
-          hasos2 = true
-          break
-        end
-      end
-      if hasos2 then
-        local os2 = hbface:get_table(os2tag)
-        local length = os2:get_length()
-        if length > 69 then -- sTypoAscender (int16)
-          local data = os2:get_data()
-          local typoascender = stringunpack(">h", data, 69)
-          ascend = typoascender * hb.scale
-        end
-      end
-    end
-    ascend = ascend or get_font_param(f, "ascender") or false
-    ascender[f] = ascend
-  end
-  return ascend
-end
-
 local function process_ruby_post_linebreak (head)
   local curr = head
   while curr do
@@ -1422,8 +1457,8 @@
           -- consider charraise
           local shift = shift_put_top(curr, ruby)
 
-          local _, f = ruby_char_font(curr)
-          local ascender = get_font_ascender(f) or curr.height
+          local _, f = hbox_char_font(curr, true, true)
+          local ascender = tableunpack(font_options.asc_desc[f]) or curr.height
           ruby.shift = shift - ascender - ruby.depth - ruby_t[2] -- rubysep
           head = insert_before(head, curr, ruby)
         end
@@ -1476,22 +1511,6 @@
   return what
 end
 
-local function get_tonemark_width (curr, uni)
-  local fontid = curr.font
-  local hwidth = char_font_options.tonemarkwidth[fontid]
-  if not hwidth then
-    -- check horizontal width; vertical width is mostly non-zero
-    local fontdata     = get_font_data(fontid)
-    local shared       = fontdata.shared      or {}
-    local rawdata      = shared.rawdata       or {}
-    local descriptions = rawdata.descriptions or {}
-    local description  = descriptions[uni]    or {}
-    hwidth = description.width or 0
-    char_font_options.tonemarkwidth[fontid] = hwidth
-  end
-  return hwidth
-end
-
 local function process_reorder_tonemarks (head)
   local curr, init = head
   while curr do
@@ -1517,7 +1536,7 @@
             n = getnext(n)
           end
 
-          if #syllable > 1 and get_tonemark_width(curr, uni) ~= 0 then
+          if #syllable > 1 and font_options.tonemarkwidth[curr.font] ~= 0 then
             local TM = curr
 
             local actual    = pdfliteral_direct_actual(syllable)
@@ -1533,7 +1552,7 @@
         elseif char_in_font(fontdata, 0x25CC) then -- isolated tone mark
           local dotcircle = nodecopy(curr)
           dotcircle.char = 0x25CC
-          if get_tonemark_width(curr, uni) ~= 0 then
+          if font_options.tonemarkwidth[curr.font] ~= 0 then
             local actual    = pdfliteral_direct_actual{ init = curr, uni }
             local endactual = pdfliteral_direct_actual()
             head = insert_before(head, curr, actual)
@@ -1714,7 +1733,7 @@
   local quad     = parameters.quad or 655360
   local ascender = parameters.ascender or quad*0.8
 
-  local goffset = fontdata_opt_dim(fontdata, "charraise") or
+  local goffset = font_opt_dim(fontdata, "charraise") or
                   (parameters.x_height or quad/2)/2
   -- declare shift amount of horizontal box inside vertical env.
   fontdata.horizboxmoveleftamount = quad/2-goffset
@@ -1806,7 +1825,7 @@
   while curr do
     if curr.id == glyphid then
       local f = curr.font
-      local raise = get_font_opt_dimen(f, "charraise")
+      local raise = font_options.charraise[f]
       if raise and not option_in_font(f, "vertical") then
         local props = my_node_props(curr)
         if not props.charraised then
@@ -1958,16 +1977,14 @@
 
 local font_opt_procs_single = {
   expansion = function()
-    if not active_processes.expansion then
+    if tex.adjustspacing == 0 then
       texset("global", "adjustspacing", 2)
-      active_processes.expansion = true
     end
   end,
 
   protrusion = function(fontdata)
-    if not active_processes.protrusion then
+    if tex.protrudechars == 0 then
       texset("global", "protrudechars", 2)
-      active_processes.protrusion = true
     end
     if option_in_font(fontdata, "compresspunctuations") then
       local fullname = fontdata.fullname

Modified: trunk/Master/texmf-dist/tex/luatex/luatexko/luatexko.sty
===================================================================
--- trunk/Master/texmf-dist/tex/luatex/luatexko/luatexko.sty	2020-02-17 22:17:48 UTC (rev 53823)
+++ trunk/Master/texmf-dist/tex/luatex/luatexko/luatexko.sty	2020-02-17 22:18:08 UTC (rev 53824)
@@ -1,6 +1,6 @@
 % luatexko.sty
 %
-% Copyright (c) 2013-2019 Dohyun Kim <nomos at ktug org>
+% Copyright (c) 2013-2020 Dohyun Kim <nomos at ktug org>
 %                         Soojin Nam <jsunam at gmail com>
 %
 % This work may be distributed and/or modified under the
@@ -13,9 +13,10 @@
 
 \ifdefined\luatexkohangulfontattr \endinput\fi
 \ifdefined\selectfont
-  \ProvidesPackage{luatexko}[2019/12/01 v2.5 typesetting Korean with LuaTeX]
+  \NeedsTeXFormat{LaTeX2e}[2020/02/02]
+  \ProvidesPackage{luatexko}[2020/02/17 v2.6 typesetting Korean with LuaTeX]
   \RequirePackage{luatexbase}
-  \RequirePackage{fontspec}
+  \RequirePackage{fontspec}[2020/02/03]
 \else
   \input luatexbase.sty
   \input luaotfload.sty
@@ -31,6 +32,8 @@
 \newattribute\luatexkoclassicattr
 \newattribute\luatexkodotemphattr
 \newattribute\luatexkorubyattr \chardef\luatexkorubyalloc\allocationnumber
+\newattribute\luatexkohangulbyhangulattr
+\newattribute\luatexkohanjabyhanjaattr
 \directlua{ require"luatexko" }
 % classic
 \protected\def\typesetclassic{\luatexkoclassicattr\z@\parindent1em }
@@ -97,22 +100,28 @@
 \def\luatexkohangulpunctuations{\luatexkodoluacode{
   local t = luatexko.forcehangulchars
   for i in pairs(t) do t[i]=\ifcase\count@ false \else true \fi end }}
+% breakable before/after (affects entire paragraph and all after)
 \protected\def\registerbreakableafter#1{%
-  \toks@{}\luatexkotoks at appendchars#1,*,\luatexkodoluacode{
+  \toks@{}\luatexkotoks at appendchars#1,*,\directlua{
     local t = luatexko.breakableafter
     for _,v in ipairs{\the\toks@} do t[v]=true end }}
 \protected\def\registerbreakablebefore#1{%
-  \toks@{}\luatexkotoks at appendchars#1,*,\luatexkodoluacode{
+  \toks@{}\luatexkotoks at appendchars#1,*,\directlua{
     local t = luatexko.breakablebefore
     for _,v in ipairs{\the\toks@} do t[v]=true end }}
+% hangulbyhangul/hanjabyhanja font
 \protected\def\hangulbyhangulfont{%
   \afterassignment\luatexkohangulbyhangulfont\count@ }
-\def\luatexkohangulbyhangulfont{\luatexkodoluacode{
-  luatexko.hangulbyhangulfont=\ifcase\count@ false \else true \fi }}
+\def\luatexkohangulbyhangulfont{%
+  \ifcase\count@ \unsetattribute\luatexkohangulbyhangulattr
+  \else \luatexkohangulbyhangulattr\count@
+  \fi }
 \protected\def\hanjabyhanjafont{%
   \afterassignment\luatexkohanjabyhanjafont\count@ }
-\def\luatexkohanjabyhanjafont{\luatexkodoluacode{
-  luatexko.hanjabyhanjafont=\ifcase\count@ false \else true \fi }}
+\def\luatexkohanjabyhanjafont{%
+  \ifcase\count@ \unsetattribute\luatexkohanjabyhanjaattr
+  \else \luatexkohanjabyhanjaattr\count@
+  \fi }
 % dotemph
 \newcount\luatexkodotemphcount
 \def\dotemphraise{1ex }
@@ -160,10 +169,13 @@
     \vrule width.3em height-\ulinedown depth\dimexpr\ulinedown+\ulinewidth\relax
     \kern.125em }}}
 \protected\def\dotuline{\markoverwith*{%
-  \lower\dimexpr\ulinedown+.1ex\relax\hbox{\kern.07em .\kern.07em }}}
+  \lower\dimexpr\ulinedown+.2ex\relax\hbox{\kern.07em .\kern.07em }}}
 \protected\def\uuline#1{\uline{\uline{#1}}}
 \protected\def\sout#1{\begingroup
-  \def\ulinedown{-.5\dimexpr\ulinewidth+1ex\relax}%
+  \setbox\z@\hbox{#1}%
+  \edef\ulinedown{\the\dimexpr
+    \directlua{ tex.sprint(luatexko.get_strike_out_down(tex.box[0])) }sp
+    -.5\dimexpr\ulinewidth\relax \relax }%
   \uline{#1}\endgroup}
 \protected\def\xout{\markoverwith{\hbox to.4em{\hss/\hss}}}
 \protected\def\uwave{\font\luatexkofontsixly=lasy6\relax
@@ -383,39 +395,66 @@
 % latex
 \RequirePackage{everysel}
 \EverySelectfont{%
-  \ifx\f at encoding\UTFencname
-    \luatexkohangulselectfont
-    \luatexkohanjaselectfont
-    \luatexkofallbackselectfont
-  \fi }
-\protected\def\fontfamily#1{\edef\f at family{#1}% redefine \fontfamily
-  \ifx\f at encoding\UTFencname
-  \ifluatexkoselectfontrunning \else
-    \ifx\f at family\rmdefault
-      \let\luatexkohangulfont\luatexkomainhangulfont
-      \let\luatexkohanjafont\luatexkomainhanjafont
-      \let\luatexkofallbackfont\luatexkomainfallbackfont
-    \else\ifx\f at family\sfdefault
-      \let\luatexkohangulfont\luatexkosanshangulfont
-      \let\luatexkohanjafont\luatexkosanshanjafont
-      \let\luatexkofallbackfont\luatexkosansfallbackfont
-    \else\ifx\f at family\ttdefault
-      \let\luatexkohangulfont\luatexkomonohangulfont
-      \let\luatexkohanjafont\luatexkomonohanjafont
-      \let\luatexkofallbackfont\luatexkomonofallbackfont
-    \fi\fi\fi
-  \fi\fi }
+  \luatexkohangulselectfont
+  \luatexkohanjaselectfont
+  \luatexkofallbackselectfont
+}
+\edef\@rmfamilyhook{\unexpanded\expandafter{\@rmfamilyhook
+  \let\luatexkohangulfont  \luatexkomainhangulfont
+  \let\luatexkohanjafont   \luatexkomainhanjafont
+  \let\luatexkofallbackfont\luatexkomainfallbackfont
+}}
+\edef\@sffamilyhook{\unexpanded\expandafter{\@sffamilyhook
+  \let\luatexkohangulfont  \luatexkosanshangulfont
+  \let\luatexkohanjafont   \luatexkosanshanjafont
+  \let\luatexkofallbackfont\luatexkosansfallbackfont
+}}
+\edef\@ttfamilyhook{\unexpanded\expandafter{\@ttfamilyhook
+  \let\luatexkohangulfont  \luatexkomonohangulfont
+  \let\luatexkohanjafont   \luatexkomonohanjafont
+  \let\luatexkofallbackfont\luatexkomonofallbackfont
+}}
+\edef\@defaultfamilyhook{\unexpanded\expandafter{\@defaultfamilyhook
+  \let\luatexkohangulfont  \luatexkodefaulthangulfont
+  \let\luatexkohanjafont   \luatexkodefaulthanjafont
+  \let\luatexkofallbackfont\luatexkodefaultfallbackfont
+}}
 % fontspec-like
 \ExplSyntaxOn
+\cs_new_nopar:Npn \l_luatexko_pacify_bfseries {
+  \tl_map_inline:nn { \mddefault \bfdefault }
+  {
+    \cs_if_exist:cF
+    { \g_fontspec_encoding_tl/\l_fontspec_family_tl/##1/\updefault }
+    {
+      \cs_set_eq:cc
+      { \g_fontspec_encoding_tl/\l_fontspec_family_tl/##1/\updefault }
+      { \g_fontspec_encoding_tl/\l_fontspec_family_tl/##1/\shapedefault }
+    }
+  }
+  \tl_map_inline:nn { \shapedefault \updefault \itdefault \sldefault }
+  {
+    \cs_if_exist:cF
+    { \g_fontspec_encoding_tl/\l_fontspec_family_tl/bx/##1 }
+    {
+      \cs_set_eq:cc
+      { \g_fontspec_encoding_tl/\l_fontspec_family_tl/bx/##1 }
+      { \g_fontspec_encoding_tl/\l_fontspec_family_tl/\bfdefault/##1 }
+    }
+  }
+}
 \DeclareDocumentCommand \setmainhangulfont { O{} m O{} }
 {
   \fontspec_set_family:Nnn \luatexkomainhangulfamily { Ligatures=TeX, #1, #3 } { #2 }
+  \l_luatexko_pacify_bfseries
   \cs_set_protected_nopar:Npn \luatexkomainhangulfont
   {
+    \fontencoding \g_fontspec_encoding_tl
     \fontfamily \luatexkomainhangulfamily \selectfont
   }
   \str_if_eq:eeT \familydefault \rmdefault
   {
+    \cs_set_eq:NN \luatexkodefaulthangulfont \luatexkomainhangulfont
     \cs_set_eq:NN \luatexkohangulfont \luatexkomainhangulfont
     \luatexkohangulselectfont
   }
@@ -424,12 +463,15 @@
 \DeclareDocumentCommand \setsanshangulfont { O{} m O{} }
 {
   \fontspec_set_family:Nnn \luatexkosanshangulfamily { Ligatures=TeX, #1, #3 } { #2 }
+  \l_luatexko_pacify_bfseries
   \cs_set_protected_nopar:Npn \luatexkosanshangulfont
   {
+    \fontencoding \g_fontspec_encoding_tl
     \fontfamily \luatexkosanshangulfamily \selectfont
   }
   \str_if_eq:eeT \familydefault \sfdefault
   {
+    \cs_set_eq:NN \luatexkodefaulthangulfont \luatexkosanshangulfont
     \cs_set_eq:NN \luatexkohangulfont \luatexkosanshangulfont
     \luatexkohangulselectfont
   }
@@ -438,12 +480,15 @@
 \DeclareDocumentCommand \setmonohangulfont { O{} m O{} }
 {
   \fontspec_set_family:Nnn \luatexkomonohangulfamily { #1, #3 } { #2 }
+  \l_luatexko_pacify_bfseries
   \cs_set_protected_nopar:Npn \luatexkomonohangulfont
   {
+    \fontencoding \g_fontspec_encoding_tl
     \fontfamily \luatexkomonohangulfamily \selectfont
   }
   \str_if_eq:eeT \familydefault \ttdefault
   {
+    \cs_set_eq:NN \luatexkodefaulthangulfont \luatexkomonohangulfont
     \cs_set_eq:NN \luatexkohangulfont \luatexkomonohangulfont
     \luatexkohangulselectfont
   }
@@ -452,10 +497,12 @@
 \DeclareDocumentCommand \newhangulfontfamily { m O{} m O{} }
 {
   \fontspec_set_family:cnn { luatexko_user_family_ \cs_to_str:N #1 } { #2, #4 } { #3 }
+  \l_luatexko_pacify_bfseries
   \cs_set_protected_nopar:Npn #1
   {
     \cs_set_nopar:Npn \luatexkohangulfont
     {
+      \fontencoding \g_fontspec_encoding_tl
       \exp_args:Nc \fontfamily { luatexko_user_family_ \cs_to_str:N #1 } \selectfont
     }
     \luatexkohangulselectfont
@@ -469,8 +516,10 @@
 \DeclareDocumentCommand \hangulfontspec { O{} m O{} }
 {
   \fontspec_set_family:Nnn \luatexkohangulfontfamily { #1, #3 } { #2 }
+  \l_luatexko_pacify_bfseries
   \cs_set_nopar:Npn \luatexkohangulfont
   {
+    \fontencoding \g_fontspec_encoding_tl
     \fontfamily \luatexkohangulfontfamily \selectfont
   }
   \luatexkohangulselectfont
@@ -479,12 +528,15 @@
 \DeclareDocumentCommand \setmainhanjafont { O{} m O{} }
 {
   \fontspec_set_family:Nnn \luatexkomainhanjafamily { Ligatures=TeX, #1, #3 } { #2 }
+  \l_luatexko_pacify_bfseries
   \cs_set_protected_nopar:Npn \luatexkomainhanjafont
   {
+    \fontencoding \g_fontspec_encoding_tl
     \fontfamily \luatexkomainhanjafamily \selectfont
   }
   \str_if_eq:eeT \familydefault \rmdefault
   {
+    \cs_set_eq:NN \luatexkodefaulthanjafont \luatexkomainhanjafont
     \cs_set_eq:NN \luatexkohanjafont \luatexkomainhanjafont
     \luatexkohanjaselectfont
   }
@@ -493,12 +545,15 @@
 \DeclareDocumentCommand \setsanshanjafont { O{} m O{} }
 {
   \fontspec_set_family:Nnn \luatexkosanshanjafamily { Ligatures=TeX, #1, #3 } { #2 }
+  \l_luatexko_pacify_bfseries
   \cs_set_protected_nopar:Npn \luatexkosanshanjafont
   {
+    \fontencoding \g_fontspec_encoding_tl
     \fontfamily \luatexkosanshanjafamily \selectfont
   }
   \str_if_eq:eeT \familydefault \sfdefault
   {
+    \cs_set_eq:NN \luatexkodefaulthanjafont \luatexkosanshanjafont
     \cs_set_eq:NN \luatexkohanjafont \luatexkosanshanjafont
     \luatexkohanjaselectfont
   }
@@ -507,12 +562,15 @@
 \DeclareDocumentCommand \setmonohanjafont { O{} m O{} }
 {
   \fontspec_set_family:Nnn \luatexkomonohanjafamily { #1, #3 } { #2 }
+  \l_luatexko_pacify_bfseries
   \cs_set_protected_nopar:Npn \luatexkomonohanjafont
   {
+    \fontencoding \g_fontspec_encoding_tl
     \fontfamily \luatexkomonohanjafamily \selectfont
   }
   \str_if_eq:eeT \familydefault \ttdefault
   {
+    \cs_set_eq:NN \luatexkodefaulthanjafont \luatexkomonohanjafont
     \cs_set_eq:NN \luatexkohanjafont \luatexkomonohanjafont
     \luatexkohanjaselectfont
   }
@@ -521,10 +579,12 @@
 \DeclareDocumentCommand \newhanjafontfamily { m O{} m O{} }
 {
   \fontspec_set_family:cnn { luatexko_user_family_ \cs_to_str:N #1 } { #2, #4 } { #3 }
+  \l_luatexko_pacify_bfseries
   \cs_set_protected_nopar:Npn #1
   {
     \cs_set_nopar:Npn \luatexkohanjafont
     {
+      \fontencoding \g_fontspec_encoding_tl
       \exp_args:Nc \fontfamily { luatexko_user_family_ \cs_to_str:N #1 } \selectfont
     }
     \luatexkohanjaselectfont
@@ -538,8 +598,10 @@
 \DeclareDocumentCommand \hanjafontspec { O{} m O{} }
 {
   \fontspec_set_family:Nnn \luatexkohanjafontfamily { #1, #3 } { #2 }
+  \l_luatexko_pacify_bfseries
   \cs_set_nopar:Npn \luatexkohanjafont
   {
+    \fontencoding \g_fontspec_encoding_tl
     \fontfamily \luatexkohanjafontfamily \selectfont
   }
   \luatexkohanjaselectfont
@@ -549,12 +611,15 @@
 \DeclareDocumentCommand \setmainfallbackfont { O{} m O{} }
 {
   \fontspec_set_family:Nnn \luatexkomainfallbackfamily { Ligatures=TeX, #1, #3 } { #2 }
+  \l_luatexko_pacify_bfseries
   \cs_set_protected_nopar:Npn \luatexkomainfallbackfont
   {
+    \fontencoding \g_fontspec_encoding_tl
     \fontfamily \luatexkomainfallbackfamily \selectfont
   }
   \str_if_eq:eeT \familydefault \rmdefault
   {
+    \cs_set_eq:NN \luatexkodefaultfallbackfont \luatexkomainfallbackfont
     \cs_set_eq:NN \luatexkofallbackfont \luatexkomainfallbackfont
     \luatexkofallbackselectfont
   }
@@ -563,12 +628,15 @@
 \DeclareDocumentCommand \setsansfallbackfont { O{} m O{} }
 {
   \fontspec_set_family:Nnn \luatexkosansfallbackfamily { Ligatures=TeX, #1, #3 } { #2 }
+  \l_luatexko_pacify_bfseries
   \cs_set_protected_nopar:Npn \luatexkosansfallbackfont
   {
+    \fontencoding \g_fontspec_encoding_tl
     \fontfamily \luatexkosansfallbackfamily \selectfont
   }
   \str_if_eq:eeT \familydefault \sfdefault
   {
+    \cs_set_eq:NN \luatexkodefaultfallbackfont \luatexkosansfallbackfont
     \cs_set_eq:NN \luatexkofallbackfont \luatexkosansfallbackfont
     \luatexkofallbackselectfont
   }
@@ -577,12 +645,15 @@
 \DeclareDocumentCommand \setmonofallbackfont { O{} m O{} }
 {
   \fontspec_set_family:Nnn \luatexkomonofallbackfamily { #1, #3 } { #2 }
+  \l_luatexko_pacify_bfseries
   \cs_set_protected_nopar:Npn \luatexkomonofallbackfont
   {
+    \fontencoding \g_fontspec_encoding_tl
     \fontfamily \luatexkomonofallbackfamily \selectfont
   }
   \str_if_eq:eeT \familydefault \ttdefault
   {
+    \cs_set_eq:NN \luatexkodefaultfallbackfont \luatexkomonofallbackfont
     \cs_set_eq:NN \luatexkofallbackfont \luatexkomonofallbackfont
     \luatexkofallbackselectfont
   }
@@ -591,10 +662,12 @@
 \DeclareDocumentCommand \newfallbackfontfamily { m O{} m O{} }
 {
   \fontspec_set_family:cnn { luatexko_user_family_ \cs_to_str:N #1 } { #2, #4 } { #3 }
+  \l_luatexko_pacify_bfseries
   \cs_set_protected_nopar:Npn #1
   {
     \cs_set_nopar:Npn \luatexkofallbackfont
     {
+      \fontencoding \g_fontspec_encoding_tl
       \exp_args:Nc \fontfamily { luatexko_user_family_ \cs_to_str:N #1 } \selectfont
     }
     \luatexkofallbackselectfont
@@ -608,8 +681,10 @@
 \DeclareDocumentCommand \fallbackfontspec { O{} m O{} }
 {
   \fontspec_set_family:Nnn \luatexkofallbackfontfamily { #1, #3 } { #2 }
+  \l_luatexko_pacify_bfseries
   \cs_set_nopar:Npn \luatexkofallbackfont
   {
+    \fontencoding \g_fontspec_encoding_tl
     \fontfamily \luatexkofallbackfontfamily \selectfont
   }
   \luatexkofallbackselectfont
@@ -618,6 +693,7 @@
 \DeclareDocumentCommand \setmathhangulfont { O{} m O{} }
 {
   \fontspec_set_family:Nnn \luatexkomathhangulfamily { #1, #3 } { #2 }
+  \l_luatexko_pacify_bfseries
   \DeclareSymbolFont { mathhangul }
     \g_fontspec_encoding_tl \luatexkomathhangulfamily \mddefault \updefault
   \int_compare:nNnF { \Umathcharfam"AC00 } = { \symmathhangul }
@@ -631,12 +707,31 @@
 \let\adhochanjafont\hanjafontspec
 \let\adhocfallbackfont\fallbackfontspec
 % interhangul, interlatincjk, charraise
+\def\luatexkopacifybfseries{%
+  \@tfor \@tempa := \mddefault \bfdefault \do {%
+    \ifcsname \f at encoding/\f at family/\@tempa/\updefault\endcsname \else
+      \global \expandafter\let
+        \csname \f at encoding/\f at family/\@tempa/\updefault \expandafter\endcsname
+        \csname \f at encoding/\f at family/\@tempa/\shapedefault\endcsname
+    \fi
+  }%
+  \@tfor \@tempa := \shapedefault \updefault \itdefault \sldefault \do {%
+    \ifcsname \f at encoding/\f at family/bx/\@tempa\endcsname \else
+      \global \expandafter\let
+        \csname \f at encoding/\f at family/bx/\@tempa \expandafter\endcsname
+        \csname \f at encoding/\f at family/\bfdefault/\@tempa\endcsname
+    \fi
+  }%
+}
 \protected\def\addhangulfontfeature#1{%
   \begingroup
-  \ifdefined\luatexkohangulfont \luatexkohangulfont \fi
+  \ifdefined\luatexkohangulfont
+    \fontseries\mddefault\fontshape\shapedefault \luatexkohangulfont \fi
   \addfontfeature{#1}%
+  \luatexkopacifybfseries
   \edef\x{\endgroup
     \def\noexpand\luatexkohangulfont{%
+      \noexpand\fontencoding{\UTFencname}%
       \noexpand\fontfamily{\f at family}\noexpand\selectfont}}\x
   \luatexkohangulselectfont
   \ignorespaces}
@@ -643,10 +738,13 @@
 \let\addhangulfontfeatures\addhangulfontfeature
 \protected\def\addhanjafontfeature#1{%
   \begingroup
-  \ifdefined\luatexkohanjafont \luatexkohanjafont \fi
+  \ifdefined\luatexkohanjafont
+    \fontseries\mddefault\fontshape\shapedefault \luatexkohanjafont \fi
   \addfontfeature{#1}%
+  \luatexkopacifybfseries
   \edef\x{\endgroup
     \def\noexpand\luatexkohanjafont{%
+      \noexpand\fontencoding{\UTFencname}%
       \noexpand\fontfamily{\f at family}\noexpand\selectfont}}\x
   \luatexkohanjaselectfont
   \ignorespaces}
@@ -653,10 +751,13 @@
 \let\addhanjafontfeatures\addhanjafontfeature
 \protected\def\addfallbackfontfeature#1{%
   \begingroup
-  \ifdefined\luatexkofallbackfont \luatexkofallbackfont \fi
+  \ifdefined\luatexkofallbackfont
+    \fontseries\mddefault\fontshape\shapedefault \luatexkofallbackfont \fi
   \addfontfeature{#1}%
+  \luatexkopacifybfseries
   \edef\x{\endgroup
     \def\noexpand\luatexkofallbackfont{%
+      \noexpand\fontencoding{\UTFencname}%
       \noexpand\fontfamily{\f at family}\noexpand\selectfont}}\x
   \luatexkofallbackselectfont
   \ignorespaces}
@@ -678,42 +779,77 @@
 \DeclareOption{hangul}{\@hangultrue}
 \DeclareOption{hanja}{\@hangultrue\@hanjatrue}
 \ProcessOptions\relax
-% default hangul font
 \AtBeginDocument{
+  % default hangul fonts
   \ifdefined\luatexkomainhangulfont\else
     \begingroup\rmfamily
     \directlua{ luatexko.currenthashangulchars(255) }\expandafter\endgroup
     \ifnum\count@=\z@
-      \setmainhangulfont{UnBatang}[Script=Hangul,Language=Korean]\fi\fi
+      \IfFontExistsTF{UnBatang.ttf}
+        {\setmainhangulfont{UnBatang}[Script=Hangul,Language=Korean]}
+        {}
+    \fi
+  \fi
   \ifdefined\luatexkosanshangulfont\else
     \begingroup\sffamily
     \directlua{ luatexko.currenthashangulchars(255) }\expandafter\endgroup
     \ifnum\count@=\z@
-      \setsanshangulfont{UnDotum}\fi\fi
+      \IfFontExistsTF{UnDotum.ttf}{\setsanshangulfont{UnDotum}}{}
+    \fi
+  \fi
   \ifdefined\luatexkomonohangulfont\else
     \begingroup\ttfamily
     \directlua{ luatexko.currenthashangulchars(255) }\expandafter\endgroup
     \ifnum\count@=\z@
-      \let\luatexkomonohangulfont\luatexkosanshangulfont\fi\fi
+      \let\luatexkomonohangulfont\luatexkosanshangulfont
+    \fi
+  \fi
+  % just in case, reset luatexkodefault...font
+  \edef\famdef at ult{\familydefault}
+  \ifx\famdef at ult\sfdefault
+    \let\luatexkodefaulthangulfont  \luatexkosanshangulfont
+    \let\luatexkodefaulthanjafont   \luatexkosanshanjafont
+    \let\luatexkodefaultfallbackfont\luatexkosansfallbackfont
+  \else\ifx\famdef at ult\ttdefault
+    \let\luatexkodefaulthangulfont  \luatexkomonohangulfont
+    \let\luatexkodefaulthanjafont   \luatexkomonohanjafont
+    \let\luatexkodefaultfallbackfont\luatexkomonofallbackfont
+  \else
+    \let\luatexkodefaulthangulfont  \luatexkomainhangulfont
+    \let\luatexkodefaulthanjafont   \luatexkomainhanjafont
+    \let\luatexkodefaultfallbackfont\luatexkomainfallbackfont
+  \fi\fi
+  % hyperref
   \@ifpackageloaded{hyperref}{\pdfstringdefDisableCommands{%
-    \let\ruby\@firstoftwo \let\xxruby\@firstoftwo
+    \let\ruby\@firstoftwo
+    \let\xxruby\@firstoftwo
     \let\dotemph\@firstofone
     \let\markoverwith\@secondoftwo
-    \let\uline\@firstofone \let\sout\@firstofone
-    \let\uuline\@firstofone \let\xout\@firstofone
-    \let\uwave\@firstofone \let\dashuline\@firstofone
+    \let\uline\@firstofone
+    \let\sout\@firstofone
+    \let\uuline\@firstofone
+    \let\xout\@firstofone
+    \let\uwave\@firstofone
+    \let\dashuline\@firstofone
     \let\dotuline\@firstofone
-    \let\typesetclassic\empty \let\typesetmodern\empty
+    \let\typesetclassic\empty
+    \let\typesetmodern\empty
     \let\inhibitglue\empty
     \let\hangulpunctuations\count@
-    \let\registerpunctuations\@gobble \let\unregisterpunctuations\@gobble
+    \let\registerpunctuations\@gobble
+    \let\unregisterpunctuations\@gobble
     \let\registerhangulpunctuations\@gobble
     \let\unregisterhangulpunctuations\@gobble
-    \let\registerbreakableafter\@gobble \let\registerbreakablebefore\@gobble
-    \let\hangulbyhangulfont\count@ \let\hanjabyhanjafont\count@
-    \let\addhangulfontfeature\@gobble \let\addhangulfontfeatures\@gobble
-    \let\addhanjafontfeature\@gobble \let\addhanjafontfeatures\@gobble
-    \let\addfallbackfontfeature\@gobble \let\addfallbackfontfeatures\@gobble
+    \let\registerbreakableafter\@gobble
+    \let\registerbreakablebefore\@gobble
+    \let\hangulbyhangulfont\count@
+    \let\hanjabyhanjafont\count@
+    \let\addhangulfontfeature\@gobble
+    \let\addhangulfontfeatures\@gobble
+    \let\addhanjafontfeature\@gobble
+    \let\addhanjafontfeatures\@gobble
+    \let\addfallbackfontfeature\@gobble
+    \let\addfallbackfontfeatures\@gobble
     \def\는{는}\def\은{은}\def\을{을}\def\를{를}\def\와{와}\def\과{과}%
     \def\가{가}\def\이{이}\def\라{라}\def\으{으}\def\로{로}%
     \def\hellipsis{...}}}{}



More information about the tex-live-commits mailing list.