diff options
author | Karl Berry <karl@freefriends.org> | 2021-03-03 22:46:47 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2021-03-03 22:46:47 +0000 |
commit | 1db9d5c0247981d09f23c8ff1142c7e2ab987b55 (patch) | |
tree | 015d38c092303b44f65eb9d769f112d2959f7144 /Master | |
parent | 5e3b6ab1e8550d779ab486c5d3d6c617e9f9d684 (diff) |
luatexko (3mar21) (branch)
git-svn-id: svn://tug.org/texlive/branches/branch2020.0@58088 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master')
-rw-r--r-- | Master/texmf-dist/doc/luatex/luatexko/ChangeLog | 14 | ||||
-rw-r--r-- | Master/texmf-dist/doc/luatex/luatexko/README | 2 | ||||
-rw-r--r-- | Master/texmf-dist/doc/luatex/luatexko/luatexko-doc.pdf | bin | 325482 -> 328095 bytes | |||
-rw-r--r-- | Master/texmf-dist/doc/luatex/luatexko/luatexko-doc.tex | 61 | ||||
-rw-r--r-- | Master/texmf-dist/tex/luatex/luatexko/luatexko-normalize.lua | 6 | ||||
-rw-r--r-- | Master/texmf-dist/tex/luatex/luatexko/luatexko-uhc2utf8.lua | 6 | ||||
-rw-r--r-- | Master/texmf-dist/tex/luatex/luatexko/luatexko.lua | 390 | ||||
-rw-r--r-- | Master/texmf-dist/tex/luatex/luatexko/luatexko.sty | 147 |
8 files changed, 350 insertions, 276 deletions
diff --git a/Master/texmf-dist/doc/luatex/luatexko/ChangeLog b/Master/texmf-dist/doc/luatex/luatexko/ChangeLog index 993b9d0d014..e0dc310e650 100644 --- a/Master/texmf-dist/doc/luatex/luatexko/ChangeLog +++ b/Master/texmf-dist/doc/luatex/luatexko/ChangeLog @@ -1,3 +1,17 @@ +2021-03-01 Dohyun Kim <nomos at ktug org> + + Version 3.0 + + * luatexko.lua: + do not adjust interword glue after CJK characters + when current font is a monospaced font; + fix a bug wrt dotemph/ruby/sout position in vertical writing. + + * luatexko.sty: + horizontal metrics of default Hangul monospaced font are + matched with those of Latin Modern Mono; + deprecated command \actualtext is now removed. + 2020-07-27 Dohyun Kim <nomos at ktug org> Version 2.9 diff --git a/Master/texmf-dist/doc/luatex/luatexko/README b/Master/texmf-dist/doc/luatex/luatexko/README index 5721c1047a2..204f8183bb0 100644 --- a/Master/texmf-dist/doc/luatex/luatexko/README +++ b/Master/texmf-dist/doc/luatex/luatexko/README @@ -1,4 +1,4 @@ -LuaTeX-ko Package version 2.9 (2020/07/27) +LuaTeX-ko Package version 3.0 (2021/03/01) =========================================== This is a Lua(La)TeX macro package that supports typesetting Korean diff --git a/Master/texmf-dist/doc/luatex/luatexko/luatexko-doc.pdf b/Master/texmf-dist/doc/luatex/luatexko/luatexko-doc.pdf Binary files differindex 10bc1d0a278..a8b7ae9d402 100644 --- a/Master/texmf-dist/doc/luatex/luatexko/luatexko-doc.pdf +++ b/Master/texmf-dist/doc/luatex/luatexko/luatexko-doc.pdf diff --git a/Master/texmf-dist/doc/luatex/luatexko/luatexko-doc.tex b/Master/texmf-dist/doc/luatex/luatexko/luatexko-doc.tex index 0a5691b9ca1..ea7d4fc9389 100644 --- a/Master/texmf-dist/doc/luatex/luatexko/luatexko-doc.tex +++ b/Master/texmf-dist/doc/luatex/luatexko/luatexko-doc.tex @@ -31,7 +31,7 @@ } fonts.protrusions.setups.notoserifcjk = notoserifcjkkr_hb } -\defaultfontfeatures+{Renderer=OpenType} +\defaultfontfeatures+{Renderer=HarfBuzz} \setmainfont{Latin Modern Roman}[Expansion] % for hb tlig \setmainhangulfont{Noto Serif CJK KR}[ Scale=0.98, @@ -85,7 +85,7 @@ RawFeature=vertical, CompressPunctuations, InterCharStretch=1pt, - CharRaise=3.6pt, + CharRaise=1pt, CharacterWidth=Full, ] \newhangulfontface\rubyfont{Noto Serif CJK KR Medium}[ @@ -97,8 +97,9 @@ \def\XeTeX{\hologo{XeTeX}} \usepackage[hidelinks]{hyperref} -\edef\verbatim{\unexpanded\expandafter{\verbatim\linespread{1.1}\selectfont}} -\edef\itemize{\unexpanded\expandafter{\itemize\small}} +\AddToHook{env/itemize/begin}{\small} +\AddToHook{env/verbatim/begin}{\linespread{1.1}} + \catcode`|=13 \protected\def|{\verb|\let\\=\textbackslash} \def\nohyphen{\language\csname l@nohyphenation\endcsname} \protected\def\cs#1{\texttt{\nohyphen \textbackslash\detokenize{#1}}} @@ -123,7 +124,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.9\quad 2020/07/27} +\date{Version 3.0\quad 2021/03/01} \maketitle \begin{quote} @@ -134,7 +135,7 @@ \section{부르기}\label{sec:loading} -\hemph{\texlive\ 2020 이상}{ \small (\luatex\ v1.12 이상)}을 사용해야 한다. +\hemph{\texlive\ 2021 이상}{ \small (\luatex\ v1.12 이상)}을 사용해야 한다. \luatexko\ 부르기: \cs{usepackage{luatexko}} 혹은 \cs{usepackage{kotex}}.% \footnote{% @@ -213,10 +214,10 @@ verbatim 코드를 식자할 때는 이 기능이 작동하지 않으며,% 부연하건대, |\\language=\\l@nohyphenation| 상황에서 작동하지 않는 그밖의 기능은 다음과 같다: 줄바꿈 허용, InterCharacter, InterHangul, InterLatinCJK, CompressPunctuations, RemoveClassicSpaces, - 한글^^b7한자 폰트 문자 다음의 공백 크기 조정 등. } -문장부호가 고정폭 글꼴일 때에도 작동하지 않는다.% -\footnote{% - 또한 플레인텍에서는 영문글꼴을 트루타입/오픈타입으로 지정해야만 작동한다. } + 한글^^b7한자 폰트 문자 다음의 공백 크기 조정 등. 마지막의 + 한글^^b7한자 다음의 공백 크기 조정은 영문자가 고정폭 글꼴일 때에도 + 작동하지 않는다. } +문장부호가 고정폭 글꼴일 때에도 작동하지 않는다. 영향 받는 문장부호들의 기본값은 다음과 같다: \begin{verbatim} [0x21] ! [0x27] ' [0x28] ( [0x29] ) @@ -341,10 +342,10 @@ fontspec의 글꼴 옵션 외에 \luatexko가 따로 제공하는 것들이 있 \begin{verbatim} [CharRaise=2pt] \end{verbatim} - 세로쓰기에서는 모든 글자들을 지정한 값만큼 오른쪽으로 이동시킨다. - 세로쓰기에서 이 옵션 값을 고정길이{\small(가령 |pt| 단위)}로 주면 - 크기가 다른 폰트들간에 중앙정렬이 이루어진다. - 세로쓰기에서 이 옵션을 주지 않으면 |0.5ex|가 기본값으로 동작한다. + 세로쓰기에서는 모든 글자들을 지정한 값만큼 오른쪽으로 이동시킨다.% + \footnote{% + 세로쓰기에서는 이 옵션 값을 고정길이(가령 |pt| 단위)로 주어야 + 크기가 다른 폰트들간에 중앙정렬이 유지된다. } \item[RemoveClassicSpaces] \pkgkwd*{RemoveClassicSpaces}% 고문헌 조판시에 CJK 글자들 사이의 공백을 없애준다.% @@ -353,10 +354,12 @@ fontspec의 글꼴 옵션 외에 \luatexko가 따로 제공하는 것들이 있 \item[CompressPunctuations] \pkgkwd*{CompressPunctuations}% CJK 구두점 {\small (낫표 따위)}의 글자폭을 - 반각으로 만든다. v2.0부터는 사용자가 지시하지 않는 한 자동으로 글자폭을 - 줄여주지 않는다.% + 반각으로 만든다.% \footnote{% - 플레인텍에서는 |+compresspunctuations|. } + 플레인텍에서는 |+compresspunctuations|. + }\,\footnote{% + v2.0부터는 사용자가 지시하지 않는 한 자동으로 글자폭을 줄여주지 않는다. + } 이 옵션은 |CharacterWidth=AlternateHalf| 내지 {\small (세로쓰기의 경우)} |Vertical=HalfMetrics|와 거의 같은 기능을 한다.% \footnote{% @@ -439,16 +442,17 @@ v2.0부터는 고문헌 조판에서 한글^^b7한자와 영문자가 붙어 나 |vmtx| 정보를 가지고 있지 않은 글꼴은 세로쓰기에 적합치 않은 글꼴이다. |otfinfo -t <파일>| 명령으로 글꼴에 들어있는 테이블 정보를 알 수 있다. }\,% \footnote{% - 폰트 옵션 |Renderer=OpenType| 또는 |Renderer=HarfBuzz| 등 + 폰트 옵션 |Renderer=HarfBuzz| 또는 |Renderer=OpenType| 등 (플레인텍에서는 |mode=harf| 옵션)을 주고 컴파일하여 HarfBuzz 모듈을 이용하려는 경우 세로쓰기가 현재로서는 지원되지 않는다. 세로쓰기를 하려면 이 옵션을 빼고 디폴트 값인 - |Renderer=Node| (플레인텍에서는 |mode=node|)를 사용하라.} + |Renderer=Node| (플레인텍에서는 |mode=node|)를 사용하라.}\,% +\footnote{% + 세로쓰기에서는 \cs{typesetclassic}의 아종인 \cs{typesetvertical}이 + 기본으로 셋팅되어 있다. 일종의 고문헌 조판으로 보는 것이다. +} 세로쓰기에서 |CharRaise| 옵션의 효과에 대해서는 제\ref{sec:fontoption}절을 -참조할 것. - -세로쓰기에서는 \cs{typesetclassic}의 아종인 \cs{typesetvertical}이 -기본으로 셋팅되어 있다. 일종의 고문헌 조판으로 보는 것이다. +참조. \begin{figure} \framebox[\linewidth]{ @@ -491,8 +495,7 @@ v2.0부터는 고문헌 조판에서 한글^^b7한자와 영문자가 붙어 나 환경을 이용한다. |<dimen>|은 가로쓰기 박스의 너비를 지시한다.% \footnote{% 플레인텍에서는 \cs{horizontal{<dimen>}} \ldots\ \cs{endhorizontal}. } -가로쓰기 영역의 폰트 설정은 사용자의 몫이다.% -\footnote{폰트 지시는 |horizontal| 환경 안에서 행하는 것을 권장한다.} +가로쓰기 영역의 폰트 설정은 사용자의 몫이다. \begin{figure} \framebox[\linewidth]{ @@ -724,6 +727,14 @@ v2.0부터는 자동으로 수식 한글을 잡아주지 않는다.% \section*{주요 변경 이력} \begin{itemize}\linespread{1.1}\selectfont + \item[v3.0] ------ + \item \hyperref[sec:fontoption]{세로쓰기에서 |CharRaise| 옵션은 + 이제 글자들의 \dotemph{추가적인} 이동 길이를 나타낸다.} + \item 기본 로드되는 고정폭 한글 폰트(UnDotum)의 폭을 + Latin Modern Mono 폰트에 맞추어 조정 + \item \hyperref[sec:fontswitch]{영문자가 고정폭 글꼴일 때 + 한글^^b7한자 다음에 공백 크기 조정을 하지 않음} + \item \cs{actualtext} 명령 제거 \item[v2.6] ------ \item \hyperref[sec:fontswitch]{\cs{hangulbyhangulfont} 및 \cs{hanjabyhanjafont}가 지역적 효력만 가짐} diff --git a/Master/texmf-dist/tex/luatex/luatexko/luatexko-normalize.lua b/Master/texmf-dist/tex/luatex/luatexko/luatexko-normalize.lua index ef8edbd5875..2dec726fb65 100644 --- a/Master/texmf-dist/tex/luatex/luatexko/luatexko-normalize.lua +++ b/Master/texmf-dist/tex/luatex/luatexko/luatexko-normalize.lua @@ -1,6 +1,6 @@ -- luatexko-normalize.lua -- --- Copyright (c) 2013-2020 Dohyun Kim <nomos at ktug org> +-- Copyright (c) 2013-2021 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.9", - date = "2020/07/27", + version = "3.0", + date = "2021/03/01", author = "Dohyun Kim, Soojin Nam", description = "Hangul normalization", license = "LPPL v1.3+", diff --git a/Master/texmf-dist/tex/luatex/luatexko/luatexko-uhc2utf8.lua b/Master/texmf-dist/tex/luatex/luatexko/luatexko-uhc2utf8.lua index 40c5748b6fa..e82bf2cdfe0 100644 --- a/Master/texmf-dist/tex/luatex/luatexko/luatexko-uhc2utf8.lua +++ b/Master/texmf-dist/tex/luatex/luatexko/luatexko-uhc2utf8.lua @@ -1,6 +1,6 @@ -- luatexko-uhc2utf8.lua -- --- Copyright (c) 2013-2020 Dohyun Kim <nomos at ktug org> +-- Copyright (c) 2013-2021 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.9", - date = "2020/07/27", + version = "3.0", + date = "2021/03/01", author = "Dohyun Kim, Soojin Nam", description = "UHC (CP949) input encoding", license = "LPPL v1.3+", diff --git a/Master/texmf-dist/tex/luatex/luatexko/luatexko.lua b/Master/texmf-dist/tex/luatex/luatexko/luatexko.lua index 8b7f15b966a..22fcaf54cf1 100644 --- a/Master/texmf-dist/tex/luatex/luatexko/luatexko.lua +++ b/Master/texmf-dist/tex/luatex/luatexko/luatexko.lua @@ -1,6 +1,6 @@ -- luatexko.lua -- --- Copyright (c) 2013-2020 Dohyun Kim <nomos at ktug org> +-- Copyright (c) 2013-2021 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 = '2020/07/27', - version = '2.9', + date = '2021/03/01', + version = '3.0', description = 'typesetting Korean with LuaTeX', author = 'Dohyun Kim, Soojin Nam', license = 'LPPL v1.3+', @@ -41,6 +41,7 @@ local noderemove = node.remove local nodeslide = node.slide local nodewrite = node.write local rangedimensions = node.rangedimensions +local set_attribute = node.set_attribute local setglue = node.setglue local setproperty = node.setproperty local unset_attribute = node.unset_attribute @@ -69,12 +70,10 @@ local tableunpack = table.unpack local add_to_callback = luatexbase.add_to_callback local attributes = luatexbase.attributes local call_callback = luatexbase.call_callback -local callback_descriptions = luatexbase.callback_descriptions local create_callback = luatexbase.create_callback local module_warning = luatexbase.module_warning local new_user_whatsit = luatexbase.new_user_whatsit local registernumber = luatexbase.registernumber -local remove_from_callback = luatexbase.remove_from_callback local function warning (...) return module_warning("luatexko", stringformat(...)) @@ -141,21 +140,23 @@ 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] + if fontdata.shared then + return fontdata.shared.features[optionname] end end local function font_opt_dim (fd, optname) local dim = option_in_font(fd, optname) if dim then - local params + local params, m, u if type(fd) == "number" then params = getparameters(fd) else params = fd.parameters end - local m, u = dim:match"^(.+)(e[mx])%s*$" + if type(dim) == "string" then + m, u = dim:match"^(.+)(e[mx])%s*$" + end if m and u and params then if u == "em" then dim = m * params.quad @@ -473,20 +474,27 @@ end local function hangul_space_skip (curr, newfont) if curr.lang ~= nohyphen and curr.font ~= newfont then - local n = getnext(curr) - if n and n.id == glueid and n.subtype == spaceskip then - local params = getparameters(curr.font) - local oldwd, oldst, oldsh, oldsto, oldsho = getglue(n) - if params - and oldwd == params.space - and oldst == params.space_stretch - and oldsh == params.space_shrink - and oldsto == 0 - and oldsho == 0 then -- not user's spaceskip - - local newwd = font_options.hangulspaceskip[newfont] - if newwd then - setglue(n, newwd[1], newwd[2], newwd[3]) + -- fontloader's "node" mode sets space_stretch to zero + -- when the font is a monospaced font (fontspec's \setmonofont + -- command does the same thing), which we will bypass here + -- for alignment of CJK and Latin glyphs in verbatim environment. + -- See http://www.ktug.org/xe/index.php?document_srl=249772 + if not font_options.monospaced[curr.font] then + local n = getnext(curr) + if n and n.id == glueid and n.subtype == spaceskip then + local params = getparameters(curr.font) + local oldwd, oldst, oldsh, oldsto, oldsho = getglue(n) + if params + and oldwd == params.space + and oldst == params.space_stretch + and oldsh == params.space_shrink + and oldsto == 0 + and oldsho == 0 then -- not user's spaceskip + + local newwd = font_options.hangulspaceskip[newfont] + if newwd then + setglue(n, newwd[1], newwd[2], newwd[3]) + end end end end @@ -1290,6 +1298,7 @@ function luatexko.get_strike_out_down (box) else down = -0.5*ex end + local raise = font_options.charraise[f] or 0 return down - raise end @@ -1729,12 +1738,21 @@ local function fontdata_warning(activename, ...) end end +local dfltfntsize = get_font_param(fontcurrent(), "quad") or 655360 + local function process_vertical_font (fontdata) + local fullname = fontdata.fullname + + if fontdata.type == "virtual" then + fontdata_warning("vitrual."..fullname, + "Virtual font `%s' cannot be\nused for vertical writing.", fullname) + return + end + local subfont = fontdata.specification and fontdata.specification.sub local tsb_tab = get_tsb_table(fontdata.filename, subfont) if not tsb_tab then - local fullname = fontdata.fullname fontdata_warning("vertical."..fullname, "Vertical metrics table (vmtx) not found in the font\n`%s'", fullname) return @@ -1745,12 +1763,13 @@ local function process_vertical_font (fontdata) local parameters = fontdata.parameters or {} local scale = parameters.factor or 655.36 local quad = parameters.quad or 655360 + local xheight = parameters.x_height or quad/2 local ascender = parameters.ascender or quad*0.8 - local goffset = font_opt_dim(fontdata, "charraise") or - (parameters.x_height or quad/2)/2 + local goffset = xheight/2 * (dfltfntsize / quad) -- TODO? + -- declare shift amount of horizontal box inside vertical env. - fontdata.horizboxmoverightamount = goffset + fontdata.vertcharraise = goffset for i,v in pairs(fontdata.characters) do local voff = goffset - (v.width or 0)/2 @@ -1780,6 +1799,8 @@ local function process_vertical_font (fontdata) parameters.space_stretch = spacechar.width/2 parameters.space_shrink = spacechar.width/2 end + parameters.ascender = quad/2 + goffset + parameters.descender = quad/2 - goffset local res = fontdata.resources or {} local fea = shared.features or {} @@ -1822,8 +1843,9 @@ function luatexko.gethorizboxmoveright () texattribute.luatexkohanjafontattr, texattribute.luatexkofallbackfontattr } do if v and v > 0 then - local amount = get_font_data(v).horizboxmoverightamount + local amount = get_font_data(v).vertcharraise if amount then + amount = amount + (font_options.charraise[v] or 0) set_macro("luatexkohorizboxmoveright", texsp(amount).."sp") break end @@ -1833,19 +1855,25 @@ end -- charraise +local raiseattr = luatexbase.new_attribute"luatexkoraiseattr" + local function process_charraise (head) local curr = head while curr do - if curr.id == glyphid then - local f = curr.font - 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 + local id = curr.id + if id == glyphid then + if not has_attribute(curr,raiseattr) then + local f = curr.font + local raise = font_options.charraise[f] + if raise then curr.yoffset = (curr.yoffset or 0) + raise - props.charraised = true end + set_attribute(curr, raiseattr, 1) end + elseif id == discid then + process_charraise(curr.pre) + process_charraise(curr.post) + process_charraise(curr.replace) end curr = getnext(curr) end @@ -1899,19 +1927,15 @@ local function process_fake_slant_corr (head) -- for font fallback return head end -local function process_fake_slant_font (fontdata) - local fsl = fontdata.slant +local function process_fake_slant_font (fontdata, fsl) if fsl and fsl > 0 then - fsl = fsl/1000 - local hb = is_harf(fontdata) + fontdata.slant = fsl*1000 local params = fontdata.parameters or {} - if not hb then -- hb done by luaotfload - params.slant = (params.slant or 0) + fsl*65536 -- slant per point - end + params.slant = (params.slant or 0) + fsl*65536 -- slant per point + local hb = is_harf(fontdata) local scale = hb and hb.scale or params.factor or 655.36 - local shared = fontdata.shared or {} local descrs = shared.rawdata and shared.rawdata.descriptions or {} @@ -1945,9 +1969,7 @@ end -- wrap up local pass_fun = function(...) return ... end -create_callback("luatexko_hpack_first", "data", pass_fun) create_callback("luatexko_prelinebreak_first", "data", pass_fun) -create_callback("luatexko_hpack_second", "data", pass_fun) create_callback("luatexko_prelinebreak_second", "data", pass_fun) create_callback("luatexko_do_atbegshi", "data", pass_fun) @@ -1957,141 +1979,181 @@ function luatexko.process_atbegshi (box) end end -add_to_callback("hpack_filter", function(h) +add_to_callback("pre_shaping_filter", function(h, gc) + local par = gc == "" + or gc == "vbox" + or gc == "vtop" + or gc == "insert" + or gc == "vcenter" h = process_fonts(h) - h = call_callback("luatexko_hpack_first", h) - h = call_callback("luatexko_hpack_second", h) - return process_linebreak(h) -end, "luatexko.hpack_filter.pre_rendering", 1) + h = call_callback("luatexko_prelinebreak_first", h, par) + h = call_callback("luatexko_prelinebreak_second", h, par) + return process_linebreak(h, par) +end, "luatexko.pre_shaping_filter") -add_to_callback("pre_linebreak_filter", function(h) - h = process_fonts(h) - h = call_callback("luatexko_prelinebreak_first", h, true) - h = call_callback("luatexko_prelinebreak_second", h, true) - return process_linebreak(h, true) -end, "luatexko.pre_linebreak_filter.pre_rendering", 1) - -local font_opt_procs = { - removeclassicspaces = { - luatexko_hpack_first = process_remove_spaces, - luatexko_prelinebreak_first = process_remove_spaces, - }, - interhangul = { - luatexko_hpack_second = process_interhangul, - luatexko_prelinebreak_second = process_interhangul, +local otfregister = fonts.constructors.features.otf.register + +local function activate_process (cbnam, cbfun, name) + if not active_processes[name] then + add_to_callback(cbnam, cbfun, "luatexko."..cbnam.."."..name) + active_processes[name] = true + end +end + +otfregister { + name = "removeclassicspaces", + description = "remove spaces in classic typesetting", + default = false, + manipulators = { + node = function() + activate_process("luatexko_prelinebreak_first", process_remove_spaces, "removeclassicspaces") + end, + plug = function() + activate_process("luatexko_prelinebreak_first", process_remove_spaces, "removeclassicspaces") + end, }, - interlatincjk = { - luatexko_hpack_second = process_interlatincjk, - luatexko_prelinebreak_second = process_interlatincjk, +} + +otfregister { + name = "interhangul", + description = "insert more glue between Hangul chars", + default = false, + manipulators = { + node = function() + activate_process("luatexko_prelinebreak_second", process_interhangul, "interhangul") + end, + plug = function() + activate_process("luatexko_prelinebreak_second", process_interhangul, "interhangul") + end, }, - charraise = { - hpack_filter = process_charraise, - pre_linebreak_filter = process_charraise, +} + +otfregister { + name = "interlatincjk", + description = "insert glue between CJK and Latin", + default = false, + manipulators = { + node = function() + activate_process("luatexko_prelinebreak_second", process_interlatincjk, "interlatincjk") + end, + plug = function() + activate_process("luatexko_prelinebreak_second", process_interlatincjk, "interlatincjk") + end, }, - compresspunctuations = { - hpack_filter = process_glyph_width, - pre_linebreak_filter = process_glyph_width, +} + +otfregister { + name = "charraise", + description = "raise chars", + default = false, + manipulators = { + node = function(fontdata) + activate_process("post_shaping_filter", process_charraise, "charraise") + end, + plug = function(fontdata) + activate_process("post_shaping_filter", process_charraise, "charraise") + end, }, - slant = { - hpack_filter = process_fake_slant_corr, - pre_linebreak_filter = process_fake_slant_corr, +} + +otfregister { + name = "compresspunctuations", + description = "compress width of CJK punctuations", + default = false, + manipulators = { + node = function() + activate_process("post_shaping_filter", process_glyph_width, "compresspunctuations") + end, + plug = function() + activate_process("post_shaping_filter", process_glyph_width, "compresspunctuations") + end, }, } --- luaotfload expansion feature, committed at 2020.06.08 -luatexko.plug_expansion_loaded = false -for _,v in next, fonts.handlers.otf.features.manipulators.plug do - if v.name == "expansion" then - luatexko.plug_expansion_loaded = true - break - end -end +otfregister { + name = "slant", + description = "fake slant fallback fonts", + default = false, + manipulators = { + node = function(fontdata, _, value) + process_fake_slant_font(fontdata, value) + activate_process("post_shaping_filter", process_fake_slant_corr, "slant") + end, + plug = function(fontdata, _, value) + process_fake_slant_font(fontdata, value) + activate_process("post_shaping_filter", process_fake_slant_corr, "slant") + end, + }, +} -local font_opt_procs_single = { - expansion = function(fontdata) - if not luatexko.plug_expansion_loaded and is_harf(fontdata) then - local val = option_in_font(fontdata, "expansion") - local setup = fonts.expansions.setups[val] or {} - fontdata.stretch = fontdata.stretch or (setup.stretch or 2)*10 - fontdata.shrink = fontdata.shrink or (setup.shrink or 2)*10 - fontdata.step = fontdata.step or (setup.step or .5)*10 - end - if tex.adjustspacing == 0 then - texset("global", "adjustspacing", 2) - end - end, - - protrusion = function(fontdata) - if is_harf(fontdata) then -- for now, no support in harf mode - local val = option_in_font(fontdata, "protrusion") - local setup = fonts.protrusions.setups[val] or {} - local quad = fontdata.parameters.quad - for i, v in pairs(setup) do - local chr = fontdata.characters[i] - if chr then - local wdq = chr.width/quad - chr.left_protruding = chr.left_protruding or wdq*v[1]*1000 - chr.right_protruding = chr.right_protruding or wdq*v[2]*1000 - end - end - end - if tex.protrudechars == 0 then - texset("global", "protrudechars", 2) - end - if option_in_font(fontdata, "compresspunctuations") then +otfregister { + name = "vertical", + description = "vertical typesetting", + default = false, + manipulators = { + node = process_vertical_font, + plug = function(fontdata) local fullname = fontdata.fullname - fontdata_warning("protrude."..fullname, - "Both `compresspunctuations' and `protrusion' are\nenabled for `%s'.\n".. - "Beware bad justifications.", fullname) - end - end, - - slant = process_fake_slant_font, - - vertical = function(fontdata) - local fullname = fontdata.fullname - if is_harf(fontdata) then fontdata_warning("vertical."..fullname, "Currently, vertical writing is not supported\nby harf mode.".. "`Renderer=Node' option is needed for\n`%s'", fullname) - elseif fontdata.type == "virtual" then - fontdata_warning("vitrual."..fullname, - "Virtual font `%s' cannot be\nused for vertical writing.", fullname) - else - process_vertical_font(fontdata) - end - end, + end, + }, } -local function process_patch_font (fontdata) - if type(fontdata) ~= "table" or - fontdata.format ~= "opentype" and fontdata.format ~= "truetype" then - return - end -- as we have called patch_font_unsafe for hb fonts - - for name, procs in pairs( font_opt_procs ) do - if not active_processes[name] and option_in_font(fontdata, name) then - if name == "charraise" and option_in_font(fontdata, "vertical") then - else - for cbnam, cbfun in pairs( procs ) do - add_to_callback(cbnam, cbfun, "luatexko."..cbnam.."."..name) - end - active_processes[name] = true +otfregister { + name = "expansion", + description = "glyph expansion", + default = false, + manipulators = { + node = function() + if tex.adjustspacing == 0 then + texset("global", "adjustspacing", 2) end - end - end + end, + plug = function(fontdata, _, value) + local setup = fonts.expansions.setups[value] or {} + fontdata.stretch = fontdata.stretch or (setup.stretch or 2)*10 + fontdata.shrink = fontdata.shrink or (setup.shrink or 2)*10 + fontdata.step = fontdata.step or (setup.step or .5)*10 + if tex.adjustspacing == 0 then + texset("global", "adjustspacing", 2) + end + end, + }, +} - for name, func in pairs( font_opt_procs_single ) do - if option_in_font(fontdata, name) then - func(fontdata) +local function process_protrusion (fontdata, _, value) + local setup = fonts.protrusions.setups[value] or {} + local quad = fontdata.parameters.quad + for i, v in pairs(setup) do + local chr = fontdata.characters[i] + if chr then + local wdq = chr.width/quad + chr.left_protruding = chr.left_protruding or wdq*v[1]*1000 + chr.right_protruding = chr.right_protruding or wdq*v[2]*1000 end end + if tex.protrudechars == 0 then + texset("global", "protrudechars", 2) + end + if option_in_font(fontdata, "compresspunctuations") then + local fullname = fontdata.fullname + fontdata_warning("protrude."..fullname, + "Both `compresspunctuations' and `protrusion' are\nenabled for `%s'.\n".. + "Beware bad justifications.", fullname) + end end -add_to_callback("luaotfload.patch_font", process_patch_font, -"luatexko.patch_font") -add_to_callback("luaotfload.patch_font_unsafe", process_patch_font, -"luatexko.patch_font") +otfregister { + name = "protrusion", + description = "glyph protrusion", + default = false, + manipulators = { + node = process_protrusion, + plug = process_protrusion, + }, +} local auxiliary_procs = { dotemph = { @@ -2105,11 +2167,9 @@ local auxiliary_procs = { luatexko_do_atbegshi = process_ruby_post_linebreak, }, autojosa = { - luatexko_hpack_first = process_josa, luatexko_prelinebreak_first = process_josa, }, reorderTM = { - luatexko_hpack_first = process_reorder_tonemarks, luatexko_prelinebreak_first = process_reorder_tonemarks, }, } @@ -2151,16 +2211,16 @@ end, function luatexko.deactivateall (str) luatexko.deactivated = {} - for _, name in ipairs{ "hpack_filter", + for _, name in ipairs{ "pre_shaping_filter", + "post_shaping_filter", "pre_linebreak_filter", "hyphenate", "luatexko_do_atbegshi", -- might not work properly - "luaotfload.patch_font_unsafe", -- added for harf - "luaotfload.patch_font" } do + } do local t = {} - for i, v in ipairs( callback_descriptions(name) ) do + for i, v in ipairs( luatexbase.callback_descriptions(name) ) do if v:find(str or "^luatexko%.") then - local ff, dd = remove_from_callback(name, v) + local ff, dd = luatexbase.remove_from_callback(name, v) tableinsert(t, { ff, dd, i }) end end diff --git a/Master/texmf-dist/tex/luatex/luatexko/luatexko.sty b/Master/texmf-dist/tex/luatex/luatexko/luatexko.sty index 958407dc819..f1e01791649 100644 --- a/Master/texmf-dist/tex/luatex/luatexko/luatexko.sty +++ b/Master/texmf-dist/tex/luatex/luatexko/luatexko.sty @@ -1,6 +1,6 @@ % luatexko.sty % -% Copyright (c) 2013-2020 Dohyun Kim <nomos at ktug org> +% Copyright (c) 2013-2021 Dohyun Kim <nomos at ktug org> % Soojin Nam <jsunam at gmail com> % % This work may be distributed and/or modified under the @@ -13,11 +13,10 @@ \ifdefined\luatexkohangulfontattr \endinput\fi \ifdefined\selectfont - \NeedsTeXFormat{LaTeX2e}[2020/02/02] - \ProvidesPackage{luatexko}[2020/07/27 v2.9 typesetting Korean with LuaTeX] + \NeedsTeXFormat{LaTeX2e}[2020/10/01] + \ProvidesPackage{luatexko}[2021/03/01 v3.0 typesetting Korean with LuaTeX] \RequirePackage{luatexbase} \RequirePackage{fontspec}[2020/02/03] - \RequirePackage{atbegshi} \else \input luatexbase.sty \input luaotfload.sty @@ -360,11 +359,6 @@ \ifcase\count@ \directlua{ luatexko.uhc2utf8.stopconvert() }% \else \directlua{ luatexko.uhc2utf8.startconvert() }% \fi} -% actualtext not provided -\ifdefined\actualtext\else - \protected\def\actualtext#1#{\luatexkoactualtext} - \def\luatexkoactualtext#1{#1} -\fi % math hangul \def\setmathhangulblock#1#2{% \count@="#1 @@ -432,60 +426,60 @@ \catcode`\@=\luatexkoatcatcode \endinput\fi % latex -\RequirePackage{everysel} -\EverySelectfont{% - \luatexkohangulselectfont - \luatexkohanjaselectfont - \luatexkofallbackselectfont +\IfHookExistsTF{selectfont}{ + \AddToHook{selectfont}{% + \luatexkohangulselectfont + \luatexkohanjaselectfont + \luatexkofallbackselectfont } +}{ + \RequirePackage{everysel} + \EverySelectfont{% + \luatexkohangulselectfont + \luatexkohanjaselectfont + \luatexkofallbackselectfont } } -\edef\@rmfamilyhook{\unexpanded\expandafter{\@rmfamilyhook +\AddToHook{rmfamily}{% \let\luatexkohangulfont \luatexkomainhangulfont \let\luatexkohanjafont \luatexkomainhanjafont \let\luatexkofallbackfont\luatexkomainfallbackfont -}} -\edef\@sffamilyhook{\unexpanded\expandafter{\@sffamilyhook +} +\AddToHook{sffamily}{% \let\luatexkohangulfont \luatexkosanshangulfont \let\luatexkohanjafont \luatexkosanshanjafont \let\luatexkofallbackfont\luatexkosansfallbackfont -}} -\edef\@ttfamilyhook{\unexpanded\expandafter{\@ttfamilyhook +} +\AddToHook{ttfamily}{% \let\luatexkohangulfont \luatexkomonohangulfont \let\luatexkohanjafont \luatexkomonohanjafont \let\luatexkofallbackfont\luatexkomonofallbackfont -}} -\edef\@defaultfamilyhook{\unexpanded\expandafter{\@defaultfamilyhook +} +\AddToHook{normalfont}{% \let\luatexkohangulfont \luatexkodefaulthangulfont \let\luatexkohanjafont \luatexkodefaulthanjafont \let\luatexkofallbackfont\luatexkodefaultfallbackfont -}} +} % fontspec-like \ExplSyntaxOn -\cs_new_nopar:Npn \l_luatexko_pacify_bfseries { +\cs_new_nopar:Npn \l_luatexko_silent_upshape { \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 } + \cs_if_exist:cT { \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 } + { + \cs_set_eq:cc + { \g_fontspec_encoding_tl/\l_fontspec_family_tl/##1/\updefault } + { \g_fontspec_encoding_tl/\l_fontspec_family_tl/##1/\shapedefault } + } } } } \DeclareDocumentCommand \setmainhangulfont { O{} m O{} } { \fontspec_set_family:Nnn \luatexkomainhangulfamily { Ligatures=TeX, #1, #3 } { #2 } - \l_luatexko_pacify_bfseries + \l_luatexko_silent_upshape \cs_set_protected_nopar:Npn \luatexkomainhangulfont { \fontencoding \g_fontspec_encoding_tl @@ -502,7 +496,7 @@ \DeclareDocumentCommand \setsanshangulfont { O{} m O{} } { \fontspec_set_family:Nnn \luatexkosanshangulfamily { Ligatures=TeX, #1, #3 } { #2 } - \l_luatexko_pacify_bfseries + \l_luatexko_silent_upshape \cs_set_protected_nopar:Npn \luatexkosanshangulfont { \fontencoding \g_fontspec_encoding_tl @@ -519,7 +513,7 @@ \DeclareDocumentCommand \setmonohangulfont { O{} m O{} } { \fontspec_set_family:Nnn \luatexkomonohangulfamily { #1, #3 } { #2 } - \l_luatexko_pacify_bfseries + \l_luatexko_silent_upshape \cs_set_protected_nopar:Npn \luatexkomonohangulfont { \fontencoding \g_fontspec_encoding_tl @@ -536,7 +530,7 @@ \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 + \l_luatexko_silent_upshape \cs_set_protected_nopar:Npn #1 { \cs_set_nopar:Npn \luatexkohangulfont @@ -555,7 +549,7 @@ \DeclareDocumentCommand \hangulfontspec { O{} m O{} } { \fontspec_set_family:Nnn \luatexkohangulfontfamily { #1, #3 } { #2 } - \l_luatexko_pacify_bfseries + \l_luatexko_silent_upshape \cs_set_nopar:Npn \luatexkohangulfont { \fontencoding \g_fontspec_encoding_tl @@ -567,7 +561,7 @@ \DeclareDocumentCommand \setmainhanjafont { O{} m O{} } { \fontspec_set_family:Nnn \luatexkomainhanjafamily { Ligatures=TeX, #1, #3 } { #2 } - \l_luatexko_pacify_bfseries + \l_luatexko_silent_upshape \cs_set_protected_nopar:Npn \luatexkomainhanjafont { \fontencoding \g_fontspec_encoding_tl @@ -584,7 +578,7 @@ \DeclareDocumentCommand \setsanshanjafont { O{} m O{} } { \fontspec_set_family:Nnn \luatexkosanshanjafamily { Ligatures=TeX, #1, #3 } { #2 } - \l_luatexko_pacify_bfseries + \l_luatexko_silent_upshape \cs_set_protected_nopar:Npn \luatexkosanshanjafont { \fontencoding \g_fontspec_encoding_tl @@ -601,7 +595,7 @@ \DeclareDocumentCommand \setmonohanjafont { O{} m O{} } { \fontspec_set_family:Nnn \luatexkomonohanjafamily { #1, #3 } { #2 } - \l_luatexko_pacify_bfseries + \l_luatexko_silent_upshape \cs_set_protected_nopar:Npn \luatexkomonohanjafont { \fontencoding \g_fontspec_encoding_tl @@ -618,7 +612,7 @@ \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 + \l_luatexko_silent_upshape \cs_set_protected_nopar:Npn #1 { \cs_set_nopar:Npn \luatexkohanjafont @@ -637,7 +631,7 @@ \DeclareDocumentCommand \hanjafontspec { O{} m O{} } { \fontspec_set_family:Nnn \luatexkohanjafontfamily { #1, #3 } { #2 } - \l_luatexko_pacify_bfseries + \l_luatexko_silent_upshape \cs_set_nopar:Npn \luatexkohanjafont { \fontencoding \g_fontspec_encoding_tl @@ -650,7 +644,7 @@ \DeclareDocumentCommand \setmainfallbackfont { O{} m O{} } { \fontspec_set_family:Nnn \luatexkomainfallbackfamily { Ligatures=TeX, #1, #3 } { #2 } - \l_luatexko_pacify_bfseries + \l_luatexko_silent_upshape \cs_set_protected_nopar:Npn \luatexkomainfallbackfont { \fontencoding \g_fontspec_encoding_tl @@ -667,7 +661,7 @@ \DeclareDocumentCommand \setsansfallbackfont { O{} m O{} } { \fontspec_set_family:Nnn \luatexkosansfallbackfamily { Ligatures=TeX, #1, #3 } { #2 } - \l_luatexko_pacify_bfseries + \l_luatexko_silent_upshape \cs_set_protected_nopar:Npn \luatexkosansfallbackfont { \fontencoding \g_fontspec_encoding_tl @@ -684,7 +678,7 @@ \DeclareDocumentCommand \setmonofallbackfont { O{} m O{} } { \fontspec_set_family:Nnn \luatexkomonofallbackfamily { #1, #3 } { #2 } - \l_luatexko_pacify_bfseries + \l_luatexko_silent_upshape \cs_set_protected_nopar:Npn \luatexkomonofallbackfont { \fontencoding \g_fontspec_encoding_tl @@ -701,7 +695,7 @@ \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 + \l_luatexko_silent_upshape \cs_set_protected_nopar:Npn #1 { \cs_set_nopar:Npn \luatexkofallbackfont @@ -720,7 +714,7 @@ \DeclareDocumentCommand \fallbackfontspec { O{} m O{} } { \fontspec_set_family:Nnn \luatexkofallbackfontfamily { #1, #3 } { #2 } - \l_luatexko_pacify_bfseries + \l_luatexko_silent_upshape \cs_set_nopar:Npn \luatexkofallbackfont { \fontencoding \g_fontspec_encoding_tl @@ -732,7 +726,7 @@ \DeclareDocumentCommand \setmathhangulfont { O{} m O{} } { \fontspec_set_family:Nnn \luatexkomathhangulfamily { #1, #3 } { #2 } - \l_luatexko_pacify_bfseries + \l_luatexko_silent_upshape \DeclareSymbolFont { mathhangul } \g_fontspec_encoding_tl \luatexkomathhangulfamily \mddefault \updefault \int_compare:nNnF { \Umathcharfam"AC00 } = { \symmathhangul } @@ -746,20 +740,14 @@ \let\adhochanjafont\hanjafontspec \let\adhocfallbackfont\fallbackfontspec % interhangul, interlatincjk, charraise -\def\luatexkopacifybfseries{% +\def\luatexkosilentupshape{% \@tfor \@tempa := \mddefault \bfdefault \do {% \ifcsname \f@encoding/\f@family/\@tempa/\updefault\endcsname \else + \ifcsname \f@encoding/\f@family/\@tempa/\shapedefault\endcsname \global \expandafter\let \csname \f@encoding/\f@family/\@tempa/\updefault \expandafter\endcsname \csname \f@encoding/\f@family/\@tempa/\shapedefault\endcsname - \fi - }% - \@tfor \@tempa := \shapedefault \updefault \itdefault \sldefault \do {% - \ifcsname \f@encoding/\f@family/bx/\@tempa\endcsname \else - \global \expandafter\let - \csname \f@encoding/\f@family/bx/\@tempa \expandafter\endcsname - \csname \f@encoding/\f@family/\bfdefault/\@tempa\endcsname - \fi + \fi\fi }% } \protected\def\addhangulfontfeature#1{% @@ -767,7 +755,7 @@ \ifdefined\luatexkohangulfont \fontseries\mddefault\fontshape\shapedefault \luatexkohangulfont \fi \addfontfeature{#1}% - \luatexkopacifybfseries + \luatexkosilentupshape \edef\x{\endgroup \def\noexpand\luatexkohangulfont{% \noexpand\fontencoding{\UTFencname}% @@ -780,7 +768,7 @@ \ifdefined\luatexkohanjafont \fontseries\mddefault\fontshape\shapedefault \luatexkohanjafont \fi \addfontfeature{#1}% - \luatexkopacifybfseries + \luatexkosilentupshape \edef\x{\endgroup \def\noexpand\luatexkohanjafont{% \noexpand\fontencoding{\UTFencname}% @@ -793,7 +781,7 @@ \ifdefined\luatexkofallbackfont \fontseries\mddefault\fontshape\shapedefault \luatexkofallbackfont \fi \addfontfeature{#1}% - \luatexkopacifybfseries + \luatexkosilentupshape \edef\x{\endgroup \def\noexpand\luatexkofallbackfont{% \noexpand\fontencoding{\UTFencname}% @@ -806,21 +794,7 @@ \newfontfeature{CharRaise}{charraise=#1} \newfontfeature{RemoveClassicSpaces}{+removeclassicspaces} \newfontfeature{CompressPunctuations}{+compresspunctuations} -% luaotfload expansion feature, committed at 2020.06.08 -\count@=\z@ -\directlua{ if luatexko.plug_expansion_loaded then tex.setcount(255,1) end } -\ifnum\count@=\z@ - \newfontfeature{Expansion}{expansion=\ifx\empty#1\empty default\else #1\fi } -\else - \newfontfeature{Expansion}{expansion=\directlua{ - if "#1" == "" or "#1" == "default" then - tex.sprint "20 20 5" - else - tex.sprint "#1" - end - }% - } -\fi +\newfontfeature{Expansion}{expansion=\ifx\empty#1\empty default\else #1\fi } \newfontfeature{Protrusion}{protrusion=\ifx\empty#1\empty default\else #1\fi } \newfontfeature{InterCharacter}{intercharacter=#1} \newfontfeature{InterCharStretch}{intercharstretch=#1} @@ -854,7 +828,22 @@ \begingroup\ttfamily \directlua{ luatexko.currenthashangulchars(255) }\expandafter\endgroup \ifnum\count@=\z@ - \let\luatexkomonohangulfont\luatexkosanshangulfont + \def\@tempa{lmtt}\def\@tempb{LatinModernMono(0)} + \ifnum 0\ifx\ttdefault\@tempa 1\else\ifx\ttdefault\@tempb 1\fi\fi >\z@ + \IfFontExistsTF{UnDotum.ttf} + {\setmonohangulfont{UnDotum}[ + UprightFeatures={SizeFeatures={ + {Size={-8.5}, FakeStretch=1.062}, + {Size={8.5-11}, FakeStretch=1.05 }, + {Size={11-}, FakeStretch=1.03 }}}, + BoldFeatures={SizeFeatures={ + {Size={-}, FakeStretch=1.05}}}, + WordSpace={1.66667,0,0}] + } + {\let\luatexkomonohangulfont\luatexkosanshangulfont } + \else + \let\luatexkomonohangulfont\luatexkosanshangulfont + \fi \fi \fi % just in case, reset luatexkodefault...font |