diff options
author | Karl Berry <karl@freefriends.org> | 2014-05-13 22:13:08 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2014-05-13 22:13:08 +0000 |
commit | 8ed901e81f474c7cf2946183f99b5836d40ffcd7 (patch) | |
tree | 0022083d26affb19815426f497b91ad443d74ebe /Master/texmf-dist/tex/luatex | |
parent | bd7687e8abb5975905db822498e640ca7e2e1b2c (diff) |
luatexko (11may14)
git-svn-id: svn://tug.org/texlive/trunk@34018 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/luatex')
5 files changed, 808 insertions, 520 deletions
diff --git a/Master/texmf-dist/tex/luatex/luatexko/luatexko-core.sty b/Master/texmf-dist/tex/luatex/luatexko/luatexko-core.sty index 22cf34ffdfa..835f8b14baf 100644 --- a/Master/texmf-dist/tex/luatex/luatexko/luatexko-core.sty +++ b/Master/texmf-dist/tex/luatex/luatexko/luatexko-core.sty @@ -1,6 +1,6 @@ % luatexko-core.sty % -% Copyright (c) 2013 Dohyun Kim <nomos at ktug org> +% Copyright (c) 2013-2014 Dohyun Kim <nomos at ktug org> % % This work may be distributed and/or modified under the % conditions of the LaTeX Project Public License, either version 1.3c @@ -12,20 +12,21 @@ \ifx\ProvidesPackage\undefined \input luaotfload.sty + \ifcsname ifpdf\endcsname\else \input ifpdf.sty \fi \catcode`@ = 11 \else - \ProvidesPackage{luatexko-core}[2014/01/04 v1.4 Typesetting Korean with LuaTeX] + \ProvidesPackage{luatexko-core}[2014/05/11 v1.5 Typesetting Korean with LuaTeX] \RequirePackage{luaotfload}[2013/05/23] \fi %% attributes -\newluatexattribute\finemathattr \finemathattr\@ne % finemath on by default +\newluatexattribute\finemathattr \finemathattr\tw@ % finemath on by default \newluatexattribute\cjtypesetattr \newluatexattribute\dotemphattr \newluatexattribute\autojosaattr \newluatexattribute\luakorubyattr \chardef\luakorubyattrnum\the\allocationnumber -\newluatexattribute\hangfntattr -\newluatexattribute\hanjfntattr +\newluatexattribute\hangulfntattr +\newluatexattribute\hanjafntattr \newluatexattribute\fallbackfntattr \newluatexattribute\hangulpunctsattr @@ -72,13 +73,13 @@ \def\dotemphraise{0.4em } \unless\ifdefined\bfseries\let\bfseries\bf\fi \def\dotemphchar{\bfseries ^^^^02d9} -\newcount\dotemph@cnt \dotemph@cnt\z@ +\newcount\luakodotemphcnt \luakodotemphcnt\z@ \protected\def\dotemph#1{{% - \ifnum\dotemph@cnt > 100 \global\dotemph@cnt\z@ \fi - \global\advance\dotemph@cnt\@ne + \ifnum\luakodotemphcnt > 65535 \luakodotemphcnt\z@ \fi + \global\advance\luakodotemphcnt\@ne \setbox\z@\hbox{\raise\dotemphraise\hbox{\dotemphchar}}\ht\z@\z@\dp\z@\z@ - \directlua{luatexko.dotemphnode[\the\dotemph@cnt] = node.copy_list(tex.box[0])}% - \dotemphattr\dotemph@cnt #1}} + \directlua{luatexko.dotemphnode[\the\luakodotemphcnt] = node.copy_list(tex.box[0])}% + \dotemphattr\luakodotemphcnt #1}} %% ruby : ruby.sty by Lemberg is excellent; but %% it doesn't match well with luatexko, so implemented anew @@ -90,12 +91,12 @@ \let\rubyoverlap\ruby@overlaptrue \let\rubynooverlap\ruby@overlapfalse \rubyoverlap % ruby may protrude over adjacent chars -\newcount\luakorubyattr@cnt\luakorubyattr@cnt\z@ +\newcount\luakorubyattrcnt\luakorubyattrcnt\z@ \protected\def\ruby#1#2{% - \ifnum\luakorubyattr@cnt > 1000 \global\luakorubyattr@cnt\z@ \fi - \global\advance\luakorubyattr@cnt\@ne + \ifnum\luakorubyattrcnt > 65535 \luakorubyattrcnt\z@ \fi + \global\advance\luakorubyattrcnt\@ne \begingroup - \setbox\z@\hbox attr\luakorubyattrnum\luakorubyattr@cnt{% base character + \setbox\z@\hbox attr\luakorubyattrnum\luakorubyattrcnt{% base character \vrule width\z@ height.88em depth\z@\relax #1}% \setbox\tw@\hbox{% ruby \ifdefined\rubyfont \rubyfont \fi @@ -112,10 +113,13 @@ \ifdefined\hanja@font \luatexko@resize@font\hanjafont{}\hanja@font\rubysize \fi + \ifdefined\fallback@font + \luatexko@resize@font\fallbackfont{}\fallback@font\rubysize + \fi \fi \fi #2}\ht\tw@\z@\dp\tw@\z@ \directlua{% - luatexko.rubynode[\the\luakorubyattr@cnt] = { + luatexko.rubynode[\the\luakorubyattrcnt] = { node.copy_list(tex.box[2]), \number\numexpr\dimexpr\rubysep\relax\relax, \ifruby@overlap true\else false\fi}}% @@ -123,20 +127,18 @@ \endgroup} \ifcsname selectfont\endcsname\else - % font resize under plain tex - \def\luatexko@resize@font#1#2#3#4{% - \expandafter\dimen@\pdffontsize#3\relax - \edef\luatexko@tmp@fontname{% - \directlua{ - local f = [===[\fontname#3]===] - f = string.gsub(f," at .+","") - tex.sprint(f) }}% - #1#2=\luatexko@tmp@fontname\space at #4\dimen@ - #2} +% font resize under plain tex +\begingroup\edef\x{\endgroup + \def\noexpand\rem@vesizepart##1\detokenize{ at}##2\noexpand\end{##1}}\x +\def\luatexko@resize@font#1#2#3#4{% + \begingroup + \edef\x@{\noexpand\rem@vesizepart\fontname#3\detokenize{ at}\noexpand\end}% + \edef\y@{\endgroup#1\noexpand#2 \x@\space at#4\dimexpr\pdffontsize#3\relax}% + \y@#2} \fi %% vertical typesetting -%% EXPERIMENTAL code: don't use this +%% EXPERIMENTAL code \def\luatexko@vertical{% \ifnum\cjtypesetattr<\@ne \cjtypesetattr\z@ % korean-vertical @@ -160,8 +162,13 @@ \vbox to\dimen@\bgroup\hbox to\dimen@ii\bgroup\hfil\else \hbox to\dimen@ii\bgroup\vbox to\dimen@\bgroup\fi \wd#1\z@ \ht#1\z@ \dp#1\z@ - \pdfliteral{ q 0 -1 1 0 0 0 cm}\box#1\pdfliteral{ Q}% + \luatexko@rotate@clockwise{\box#1}% \ifnum\count@=\@ne\egroup\vfil\else\vfil\egroup\hfil\fi\egroup} +\def\luatexko@rotate@clockwise#1{% + \ifpdf\pdfliteral{q 0 -1 1 0 0 0 cm}#1\pdfliteral{Q}% + \else\special{pdf:btrans rotate -90}#1\special{pdf:etrans}% + \fi +} % do not veticalize headline/footline \ifdefined\ProvidesPackage % for latex @@ -185,25 +192,25 @@ %% especially linebreak does not occur inside cjk words. \def\ulinewidth{0.04em } \def\ulinedown {0.25em } -\newcount\ulinebox@cnt\ulinebox@cnt\z@ +\newcount\luakoulineboxcnt\luakoulineboxcnt\z@ \protected\def\uline#1{% - \ifnum\ulinebox@cnt > 100 \global\ulinebox@cnt\z@ \fi - \global\advance\ulinebox@cnt\@ne + \ifnum\luakoulineboxcnt > 65535 \luakoulineboxcnt\z@ \fi + \global\advance\luakoulineboxcnt\@ne \dimen@\dimexpr\ulinedown+\ulinewidth\relax \dimen@ii-\dimexpr\ulinedown\relax \setbox\z@\hbox{\vrule width\z@ height\dimen@ii depth\dimen@}% - \directlua{luatexko.ulinebox[\the\ulinebox@cnt]=node.copy_list(tex.box[0].head)}% - \leavevmode\special{luako:ulinebegin=\the\ulinebox@cnt}% + \directlua{luatexko.ulinebox[\the\luakoulineboxcnt]=node.copy_list(tex.box[0].head)}% + \leavevmode\special{luako:ulinebegin=\the\luakoulineboxcnt}% #1\special{luako:ulineend}} % strike-out \protected\def\sout#1{{\def\ulinedown{-0.5ex-\ulinewidth/2}\uline{#1}}} % ulem with arbitray box \protected\def\markoverwidth#1#2{% - \ifnum\ulinebox@cnt > 100 \global\ulinebox@cnt\z@ \fi - \global\advance\ulinebox@cnt\@ne + \ifnum\luakoulineboxcnt > 65535 \luakoulineboxcnt\z@ \fi + \global\advance\luakoulineboxcnt\@ne \setbox\z@\hbox{#1}% - \directlua{luatexko.ulinebox[\the\ulinebox@cnt]=node.copy_list(tex.box[0])}% - \leavevmode\special{luako:ulinebegin=\the\ulinebox@cnt}% + \directlua{luatexko.ulinebox[\the\luakoulineboxcnt]=node.copy_list(tex.box[0])}% + \leavevmode\special{luako:ulinebegin=\the\luakoulineboxcnt}% #2\special{luako:ulineend}} \protected\def\uuline{\dimen@ii-\dimexpr\ulinedown\relax \dimen@\dimexpr\ulinedown+\ulinewidth\relax @@ -219,41 +226,42 @@ %% hangul font -- core \def\luatexko@hangul@selectfont{% + \ifdefined\hangul@font \begingroup \let\luatexko@hangul@selectfont\relax \let\luatexko@hanja@selectfont\relax \let\luatexko@fallback@selectfont\relax - \check@hangul@family - \ifdefined\hangul@font \hangul@font \fi + \hangul@font \expandafter\expandafter\expandafter \endgroup - \expandafter\hangfntattr\luatexfontid\font\relax + \expandafter\hangulfntattr\luatexfontid\font\relax + \fi } \def\luatexko@hanja@selectfont{% + \ifdefined\hanja@font \begingroup \let\luatexko@hangul@selectfont\relax \let\luatexko@hanja@selectfont\relax \let\luatexko@fallback@selectfont\relax - \check@hanja@family - \ifdefined\hanja@font \hanja@font \fi + \hanja@font \expandafter\expandafter\expandafter \endgroup - \expandafter\hanjfntattr\luatexfontid\font\relax + \expandafter\hanjafntattr\luatexfontid\font\relax + \fi } \def\luatexko@fallback@selectfont{% + \ifdefined\fallback@font \begingroup \let\luatexko@hangul@selectfont\relax \let\luatexko@hanja@selectfont\relax \let\luatexko@fallback@selectfont\relax - \check@fallback@family - \ifdefined\fallback@font \fallback@font \fi + \fallback@font \expandafter\expandafter\expandafter \endgroup \expandafter\fallbackfntattr\luatexfontid\font\relax + \fi } -\let\check@hangul@family\relax -\let\check@hanja@family \relax -\let\check@fallback@family\relax + % user interface for plain tex \protected\def\hangulfont {\afterassignment\luatexko@hangul@selectfont\font\hangul@font} @@ -270,12 +278,10 @@ \ifnum\count@<"#2 \advance\count@\@ne \repeat} -\def\setmathhangulfont#1#{\setmathhangul@font@} -\ifdefined\ProvidesPackage - \let\setmathhangul@font@\@gobble -\else +\ifdefined\ProvidesPackage\else % for plain; see luatexko.sty for latex \newfam\symmathhangul + \def\setmathhangulfont#1#{\setmathhangul@font@} \def\setmathhangul@font@#1{% \font\tenhangul = "#1" at 10pt \font\sevenhangul = "#1" at 7pt @@ -356,6 +362,38 @@ \fi\fi } +% Actual Text: beware that #2 should not be divided into separate pages. +% \actualtext* variant inserts space char from phvr8r. see accsupp manual +\protected\def\actualtext#1#{% + \ifx\empty#1\empty + \expandafter\actualtext@\expandafter!% + \else + \expandafter\actualtext@\expandafter*% + \fi +} +\def\actualtext@#1#2{% + \luatexko@pdfspecial{/Span<</ActualText\directlua{ + luatexko.actualtext("\luatexluaescapestring{\detokenize{#2}}") + }>>BDC}% + #2% + \ifx*#1% + \begingroup + \ifdefined\actualtext@spacefont\else + \global\font\actualtext@spacefont=phvr8r\relax + \fi + \setbox\z@\hbox{\actualtext@spacefont\char32}% + \wd\z@\z@\ht\z@\z@\dp\z@\z@ + \leavevmode\copy\z@ + \endgroup + \fi + \luatexko@pdfspecial{EMC}% +} +\def\luatexko@pdfspecial#1{% + \ifpdf\pdfliteral page{#1}% + \else\special{pdf:content #1}% + \fi +} + %% 말줄임표 \def\hellipsis{^^^^2026^^^^2026} diff --git a/Master/texmf-dist/tex/luatex/luatexko/luatexko-normalize.lua b/Master/texmf-dist/tex/luatex/luatexko/luatexko-normalize.lua index 8c6e0bc3d98..4c2fde7fff0 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 Dohyun Kim <nomos at ktug org> +-- Copyright (c) 2013-2014 Dohyun Kim <nomos at ktug org> -- -- This work may be distributed and/or modified under the -- conditions of the LaTeX Project Public License, either version 1.3c @@ -12,8 +12,8 @@ luatexbase.provides_module({ name = "luatexko-normalize", - version = 1.2, - date = "2013/06/10", + version = 1.5, + date = "2014/05/11", author = "Dohyun Kim", description = "Hangul normalization", license = "LPPL v1.3+", @@ -22,9 +22,9 @@ luatexbase.provides_module({ luatexkonormalize = luatexkonormalize or {} local luatexkonormalize = luatexkonormalize -local cho = "[\225\132\128-\225\132\146]" -local jung = "[\225\133\161-\225\133\181]" -local jong = "[\225\134\168-\225\135\130]" +local ncho = "[\225\132\128-\225\132\146]" +local njung = "[\225\133\161-\225\133\181]" +local jong = "[\225\134\168-\225\135\191\237\159\139-\237\159\187]" local ojong = "[\225\135\131-\225\135\191\237\159\139-\237\159\187]" local compathanja = "[\239\164\128-\239\168\139]" local chanjatohanja = { @@ -398,36 +398,39 @@ local jamotocjamo = { } } +require "unicode" local gsub = unicode.utf8.gsub local byte = unicode.utf8.byte local char = unicode.utf8.char +local find = unicode.utf8.find +local concat = table.concat local add_to_callback = luatexbase.add_to_callback local remove_from_callback = luatexbase.remove_from_callback +local priority_in_callback = luatexbase.priority_in_callback local jamo2syllable = function(l,v,t) + if find(t,ojong) then return end l, v = byte(l), byte(v) local s = (l - 0x1100) * 21 s = (s + v - 0x1161) * 28 - if t then - t = byte(t) - s = s + t - 0x11a7 + if t ~= "" then + s = s + byte(t) - 0x11a7 end - s = s + 0xac00 - return char(s) + return char(s + 0xac00) end -local hanguldecompose = function(buffer) - buffer = gsub(buffer, "[가-힣]", function(s) +local syllable2jamo = function(s) s = byte(s) - 0xac00 - local cho = s / (21 * 28) + 0x1100 - local jung = (s % (21 * 28)) / 28 + 0x1161 - local jong = s % 28 + 0x11a7 - if jong > 0x11a7 then - return char(cho)..char(jung)..char(jong) - end - return char(cho)..char(jung) - end) - return buffer + local t = {} + t[1] = char(s / 588 + 0x1100) + t[2] = char(s % 588 / 28 + 0x1161) + local jong = s % 28 + t[3] = jong > 0 and char(jong + 0x11a7) or nil + return concat(t) +end + +local hanguldecompose = function(buffer) + return gsub(buffer, "[가-힣]", syllable2jamo) end local function hanjanormalize(c) @@ -442,48 +445,39 @@ local function jamo2cjamocho(c) return jamo end -local function jamo2cjamojung(c) +local function jamo2cjamojung(c,t) + if t ~= "" then return end local jamo = jamotocjamo.cjung[byte(c)] jamo = jamo and char(jamo) return jamo end local hangulcompose = function(buffer) - buffer = hanguldecompose(buffer) - buffer = gsub(buffer, "("..cho..")("..jung..")("..jong..")", jamo2syllable) - buffer = gsub(buffer, "("..cho..")("..jung..ojong..")", "%1\1%2") - buffer = gsub(buffer, "("..cho..")("..jung..")", jamo2syllable) - buffer = gsub(buffer, "([\225\132\128-\225\133\153])\225\133\160", jamo2cjamocho) - buffer = gsub(buffer, "\225\133\159([\225\133\161-\225\134\161])", jamo2cjamojung) - buffer = gsub(buffer, "\1", "") - buffer = gsub(buffer, "("..compathanja..")", hanjanormalize) + buffer = gsub(buffer, "[가-힣]"..jong, hanguldecompose) + buffer = gsub(buffer, "("..ncho..")("..njung..")("..jong.."?)", jamo2syllable) + buffer = gsub(buffer, + "([\225\132\128-\225\133\153])\225\133\160", jamo2cjamocho) + buffer = gsub(buffer, + "\225\133\159([\225\133\161-\225\134\161])("..jong.."?)", jamo2cjamojung) + buffer = gsub(buffer, compathanja, hanjanormalize) return buffer end -local loaded = false - -local function compose() - if loaded then +local function unload() + if priority_in_callback('process_input_buffer', 'luatexko-hangul-normalize') then remove_from_callback('process_input_buffer', 'luatexko-hangul-normalize') end - loaded = true +end +luatexkonormalize.unload = unload + +local function compose() + unload() add_to_callback('process_input_buffer', hangulcompose, 'luatexko-hangul-normalize') end luatexkonormalize.compose = compose local function decompose() - if loaded then - remove_from_callback('process_input_buffer', 'luatexko-hangul-normalize') - end - loaded = true + unload() add_to_callback('process_input_buffer', hanguldecompose, 'luatexko-hangul-normalize') end luatexkonormalize.decompose = decompose - -local function unload() - if loaded then - remove_from_callback('process_input_buffer', 'luatexko-hangul-normalize') - end - loaded = false -end -luatexkonormalize.unload = unload diff --git a/Master/texmf-dist/tex/luatex/luatexko/luatexko-uhc2utf8.lua b/Master/texmf-dist/tex/luatex/luatexko/luatexko-uhc2utf8.lua index 2afdad38532..3d28a668b1f 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 Dohyun Kim <nomos at ktug org> +-- Copyright (c) 2013-2014 Dohyun Kim <nomos at ktug org> -- -- This work may be distributed and/or modified under the -- conditions of the LaTeX Project Public License, either version 1.3c @@ -12,8 +12,8 @@ luatexbase.provides_module({ name = "luatexko-uhc2utf8", - version = 1.2, - date = "2013/06/10", + version = 1.5, + date = "2014/05/11", author = "Dohyun Kim", description = "UHC (CP949) input encoding", license = "LPPL v1.3+", @@ -22,11 +22,12 @@ luatexbase.provides_module({ luatexkouhc2utf8 = luatexkouhc2utf8 or {} local luatexkouhc2utf8 = luatexkouhc2utf8 -local find = string.find +local match = string.match local gsub = string.gsub local byte = string.byte -local len = string.len local format = string.format +local utfvalues = string.utfvalues +require "unicode" local ugsub = unicode.utf8.gsub local ubyte = unicode.utf8.byte local uchar = unicode.utf8.char @@ -43,7 +44,7 @@ local function get_uhc_uni_table() while true do local line = file:read("*line") if not line then break end - local _,_,ea,eb,uni = find(line,"<(%x+)>%s+<(%x+)>%s+<(%x+)>") + local ea,eb,uni = match(line,"<(%x+)>%s+<(%x+)>%s+<(%x+)>") if ea and eb and uni then ea, eb, uni = tonumber(ea,16),tonumber(eb,16),tonumber(uni,16) for i=ea,eb do @@ -62,16 +63,18 @@ local t_uhc2ucs = t_uhc2ucs or get_uhc_uni_table() local uhc_to_utf8 = function(buffer) if not buffer then return end -- check if buffer is already utf-8; better solution? - local t = gsub(buffer,"[\0-\127]","") - t = gsub(t,"[\194-\223][\128-\191]","") - t = gsub(t,"[\224-\239][\128-\191][\128-\191]","") - t = gsub(t,"[\240-\244][\128-\191][\128-\191][\128-\191]","") - if len(t) == 0 then return buffer end + local isutf = true + for v in utfvalues(buffer) do + if v == 0xFFFD then -- REPLACEMENT CHARACTER + isutf = false + break + end + end + if isutf == true then return buffer end -- now convert to utf8 buffer = gsub(buffer, "([\129-\253])([\65-\254])", function(a, b) - a, b = byte(a), byte(b) - local utf = t_uhc2ucs[a * 256 + b] + local utf = t_uhc2ucs[byte(a) * 256 + byte(b)] if utf then return uchar(utf) end end) return buffer @@ -105,8 +108,9 @@ local function utf8_to_uhc (name) name = ugsub(name, "[\161-\239\191\166]", -- 00A1..FFE6 function(u) local c = t_ucs2uhc[ubyte(u)] - if not c then return u end - return format("%c%c", floor(c/256), c%256) + if c then + return format("%c%c", floor(c/256), c%256) + end end) return name end @@ -115,8 +119,7 @@ local function uhc_find_file (file, ...) local f = kpse_find_file(file, ...) if f then return f end f = utf8_to_uhc(file) - f = f and kpse_find_file(f, ...) - return f + return f and kpse_find_file(f, ...) end local function start_uhc_filename () diff --git a/Master/texmf-dist/tex/luatex/luatexko/luatexko.lua b/Master/texmf-dist/tex/luatex/luatexko/luatexko.lua index 8ef25e1f439..aa14bbc249f 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 Dohyun Kim <nomos at ktug org> +-- Copyright (c) 2013-2014 Dohyun Kim <nomos at ktug org> -- -- This work may be distributed and/or modified under the -- conditions of the LaTeX Project Public License, either version 1.3c @@ -12,8 +12,8 @@ local err,warn,info,log = luatexbase.provides_module({ name = 'luatexko', - date = '2014/01/06', - version = 1.4, + date = '2014/05/11', + version = 1.5, description = 'Korean linebreaking and font-switching', author = 'Dohyun Kim', license = 'LPPL v1.3+', @@ -26,21 +26,21 @@ local dotemphnode,rubynode,ulinebox = {},{},{} luatexko.dotemphnode = dotemphnode luatexko.rubynode = rubynode luatexko.ulinebox = ulinebox -luatexko.hanjafontforhanja = luatexko.hanjafontforhanja or false local stringbyte = string.byte local stringgsub = string.gsub local stringchar = string.char local stringfind = string.find local stringmatch = string.match -local stringgmatch = string.gmatch local stringformat = string.format local string_sub = string.sub local mathfloor = math.floor local tex_round = tex.round local tex_sp = tex.sp +local texcount = tex.count local fontdefine = font.define -local utf8char = unicode.utf8.char + +local kpse_find_file = kpse.find_file local fontdata = fonts.hashes.identifiers @@ -57,14 +57,17 @@ local nodecount = node.count local nodeslide = node.slide local nodedimensions = node.dimensions local nodetail = node.tail +local end_of_math = node.end_of_math +local nodenext = node.next +local nodeprev = node.prev local finemathattr = luatexbase.attributes.finemathattr local cjtypesetattr = luatexbase.attributes.cjtypesetattr local dotemphattr = luatexbase.attributes.dotemphattr local autojosaattr = luatexbase.attributes.autojosaattr local luakorubyattr = luatexbase.attributes.luakorubyattr -local hangfntattr = luatexbase.attributes.hangfntattr -local hanjfntattr = luatexbase.attributes.hanjfntattr +local hangulfntattr = luatexbase.attributes.hangulfntattr +local hanjafntattr = luatexbase.attributes.hanjafntattr local fallbackfntattr = luatexbase.attributes.fallbackfntattr local hangulpunctsattr = luatexbase.attributes.hangulpunctsattr local luakoglueattr = luatexbase.new_attribute("luakoglueattr") @@ -552,7 +555,6 @@ local function get_cjk_class (ch, cjtype) end return c end - return nil end local function get_font_table (fid) @@ -597,8 +599,8 @@ end local function get_unicode_char(curr) local uni = curr.char - if (uni > 0 and uni < 0xE000) or (uni > 0xF8FF and uni < 0xF0000) then - return uni -- no pua + if (uni > 0xFF and uni < 0xE000) or (uni > 0xF8FF and uni < 0xF0000) then + return uni -- no pua. no nanumgtm?? end -- tounicode is now reliable. backend is fixed uni = get_font_char(curr.font, curr.char) @@ -622,7 +624,7 @@ local function get_hlist_class_first (hlist) elseif curr.id == gluenode then if curr.spec and curr.spec.width ~= 0 then return end end - curr = curr.next + curr = nodenext(curr) end end @@ -638,7 +640,7 @@ local function get_hlist_class_last (hlist,prevchar,prevfont) elseif curr.id == gluenode then if curr.spec and curr.spec.width ~= 0 then return end end - curr = curr.prev + curr = nodeprev(curr) end return prevchar, prevfont end @@ -679,7 +681,7 @@ end local function koreanlatinskip (head,curr,currfont,prevfont,was_penalty) local width = 0 -- default: 0em - if has_attribute(curr,finemathattr) == 1 then -- not ttfamily + if (has_attribute(curr,finemathattr) or 0) > 0 then -- not ttfamily local latincjk = get_font_feature(currfont, "interlatincjk") if not latincjk then latincjk = get_font_feature(prevfont, "interlatincjk") @@ -700,8 +702,8 @@ local function cjk_insert_nodes(head,curr,currchar,currfont,prevchar,prevfont) local p = get_cjk_class(prevchar, currentcjtype) local c = get_cjk_class(currchar, currentcjtype) ---[[raise latin puncts - if curr.id == glyphnode and has_attribute(curr,finemathattr) == 1 and c < 10 then -- not ttfamily - local nn, raise = curr.next, nil + if curr.id == glyphnode and (has_attribute(curr,finemathattr) or 0) > 0 and c < 10 then -- not ttfamily + local nn, raise = nodenext(curr), nil while nn do if nn.id == glyphnode and latin_fullstop[nn.char] then if not raise then @@ -709,12 +711,11 @@ local function cjk_insert_nodes(head,curr,currchar,currfont,prevchar,prevfont) raise = raise and tex_sp(raise) end if raise then - nn.yoffset = nn.yoffset or 0 - nn.yoffset = nn.yoffset + raise + nn.yoffset = (nn.yoffset or 0) + raise end - nn = nn.next + nn = nodenext(nn) elseif nn.id == kernnode then - nn = nn.next + nn = nodenext(nn) else break end @@ -796,7 +797,8 @@ end local function cjk_spacing_linebreak (head) local prevchar,prevfont = nil,nil - for curr in traverse(head) do + local curr = head + while curr do if has_attribute(curr,finemathattr) then if curr.id == gluenode then prevchar,prevfont = nil,nil @@ -815,8 +817,8 @@ local function cjk_spacing_linebreak (head) end if curr.subtype == 0 then cjk_insert_nodes(head,curr,currchar,nil,prevchar,prevfont) - prevchar,prevfont = nil,nil - else + curr = end_of_math(curr) + if not curr then break end prevchar,prevfont = currchar,nil end unset_attribute(curr,finemathattr) @@ -831,6 +833,7 @@ local function cjk_spacing_linebreak (head) else prevchar,prevfont = 0,nil -- treat \verb as latin character. end + curr = nodenext(curr) end end @@ -838,55 +841,61 @@ end -- remove japanese/chinese spaceskip ------------------------------------ local function remove_cj_spaceskip (head) - for curr in traverse_id(gluenode,head) do - local cjattr = has_attribute(curr,cjtypesetattr) - local prv, nxt = curr.prev, curr.next - if cjattr and cjattr > 0 and prv and nxt then - local prevclass, prevchar, prevfont, nextclass - if prv.id == hlistnode or prv.id == vlistnode then - prevclass = get_hlist_class_last(prv) - else - -- what is this strange kern before \text?? - if prv.id == kernnode and prv.kern == 0 then - prv = prv.prev + local curr, prevfont = head, nil + while curr do + if curr.id == mathnode and curr.subtype == 0 then + curr = end_of_math(curr) + elseif curr.id == gluenode then + local cjattr = has_attribute(curr,cjtypesetattr) + local prv, nxt = nodeprev(curr), nodenext(curr) + if cjattr and cjattr > 0 and prv and nxt then + local prevclass, prevchar, nextclass + if prv.id == hlistnode or prv.id == vlistnode then + prevclass = get_hlist_class_last(prv) + else + -- what is this strange kern before \text?? + if prv.id == kernnode and prv.kern == 0 then + prv = nodeprev(prv) + end + if prv.id == glyphnode then + prevclass = get_cjk_class(get_unicode_char(prv), cjattr) + prevchar, prevfont = prv.char, prv.font + end end - if prv.id == glyphnode then - prevclass = get_cjk_class(get_unicode_char(prv), cjattr) - prevchar, prevfont = prv.char, prv.font + if nxt.id == glyphnode then + nextclass = get_cjk_class(get_unicode_char(nxt), cjattr) + elseif nxt.id == hlistnode or nxt.id == vlistnode then + nextclass = get_hlist_class_first(nxt) end - end - if nxt.id == glyphnode then - nextclass = get_cjk_class(get_unicode_char(nxt), cjattr) - elseif nxt.id == hlistnode or nxt.id == vlistnode then - nextclass = get_hlist_class_first(nxt) - end - if (prevclass and prevclass < 10) or (nextclass and nextclass < 10) then - local subtype = curr.subtype - if subtype == 13 then -- do not touch on xspaceskip for now - remove_node(head,curr) - else -- before \text?? spaceskip is replaced by glue type 0 - local spec = curr.spec - local csp = spec and spec.width - local cst = spec and spec.stretch - local csh = spec and spec.shrink - local fp = get_font_table(prevfont) - fp = fp and fp.parameters - local sp = fp and fp.space - local st = fp and fp.space_stretch - local sh = fp and fp.space_shrink - sp = sp and tex_round(sp) - st = st and tex_round(st) - sh = sh and tex_round(sh) - if prevchar and prevchar >= 65 and prevchar <= 90 then - st = st and mathfloor(st*(999/1000)) - sh = sh and mathfloor(sh*(1001/1000)) - end - if sp == csp and st == cst and sh == csh then + if (prevclass and prevclass < 10) or (nextclass and nextclass < 10) then + local subtype = curr.subtype + if subtype == 13 then -- do not touch on xspaceskip for now remove_node(head,curr) + else -- before \text?? spaceskip is replaced by glue type 0 + local spec = curr.spec + local csp = spec and spec.width + local cst = spec and spec.stretch + local csh = spec and spec.shrink + local fp = get_font_table(prevfont) + fp = fp and fp.parameters + local sp = fp and fp.space + local st = fp and fp.space_stretch + local sh = fp and fp.space_shrink + sp = sp and tex_round(sp) + st = st and tex_round(st) + sh = sh and tex_round(sh) + if prevchar and prevchar >= 65 and prevchar <= 90 then + st = st and mathfloor(st*(999/1000)) + sh = sh and mathfloor(sh*(1001/1000)) + end + if sp == csp and st == cst and sh == csh then + remove_node(head,curr) + end end end end end + curr = nodenext(curr) end end @@ -906,7 +915,7 @@ local function compress_fullwidth_punctuations (head) local ensize = emsize/2 local oneoften = emsize/10 local bbox = get_char_boundingbox(curr.font, curr.char) - if not bbox then return head end -- + bbox = bbox or {ensize-oneoften, ensize-oneoften, ensize+oneoften, ensize+oneoften} if class == 2 or class == 4 then local wd if get_font_feature(curr.font,'vertical') then @@ -1025,14 +1034,14 @@ local function get_ruby_side_kern (head) if curr.width < rubywidth then local _,fid = get_hlist_class_first(curr) emsize = get_font_emsize(fid) - local leftwidth,leftmargin = get_ruby_side_width(basewidth,rubywidth,curr.prev) + local leftwidth,leftmargin = get_ruby_side_width(basewidth,rubywidth,nodeprev(curr)) if leftwidth > 0 then curr.width = curr.width + leftwidth end if leftmargin > 0 then rubynode[attr].leftmargin = leftmargin end - local rightwidth,rightmargin = get_ruby_side_width(basewidth,rubywidth,curr.next) + local rightwidth,rightmargin = get_ruby_side_width(basewidth,rubywidth,nodenext(curr)) if rightwidth > 0 then curr.width = curr.width + rightwidth end @@ -1079,13 +1088,14 @@ local function no_ruby_at_margin(head) end margin = rubynode[attr].rightmargin if margin then - if curr.next then - if curr.next.id == gluenode then + local nn = nodenext(curr) + if nn then + if nn.id == gluenode then insert_after(head,curr,get_kernnode(-margin)) head = zero_width_rule_with_dir(head,curr) insert_after(head,curr,get_kernnode(margin)) - elseif curr.next.id == penaltynode and curr.next.penalty < 10000 then - insert_after(head,curr.next,get_kernnode(-margin)) + elseif nn.id == penaltynode and nn.penalty < 10000 then + insert_after(head,nn,get_kernnode(-margin)) head = zero_width_rule_with_dir(head,curr) insert_after(head,curr,get_kernnode(margin)) end @@ -1104,14 +1114,15 @@ local function inject_char_widow_penalty (head,curr,uni,cjattr) local class = get_cjk_class(uni, cjattr) if class and class < 9 then local pv = cjattr and 500 or 5000 - if curr.prev and curr.prev.id == rulenode then - curr = curr.prev + local np = nodeprev(curr) + if np and np.id == rulenode then + curr = np; np = nodeprev(curr) end - if curr.prev and curr.prev.id == gluenode then - curr = curr.prev + if np and np.id == gluenode then + curr = np; np = nodeprev(curr) end - if curr.prev and curr.prev.id == penaltynode then - curr = curr.prev + if np and np.id == penaltynode then + curr = np if curr.penalty < pv then curr.penalty = pv end @@ -1141,7 +1152,7 @@ local function discourage_char_widow (head,curr) local cjattr = has_attribute(curr,cjtypesetattr) curr = inject_char_widow_penalty(head,curr,uni,cjattr) end - curr = curr.prev + curr = nodeprev(curr) end end @@ -1228,7 +1239,7 @@ end local function get_hanja_hangul_table (table,file,init) local i = 0 - local file = kpse.find_file(file) + local file = kpse_find_file(file) if not file then return table end file = io.open(file, "r") if not file then return table end @@ -1301,7 +1312,7 @@ local function get_josaprevs(curr,josaprev,ignoreparens,halt) josaprev = get_josaprevs(nodeslide(curr.head),josaprev,ignoreparens,halt) end if #josaprev == 3 then break end - curr = curr.prev + curr = nodeprev(curr) end return josaprev end @@ -1311,13 +1322,12 @@ local function korean_autojosa (head) if has_attribute(curr,autojosaattr) and has_attribute(curr,finemathattr) then local ignoreparens = has_attribute(curr,autojosaattr) > 1 and true or false local josaprev = {} - josaprev = get_josaprevs(curr.prev,josaprev,ignoreparens) + josaprev = get_josaprevs(nodeprev(curr),josaprev,ignoreparens) local josacode = get_josacode(josaprev) local thischar = get_unicode_char(curr) if thischar == 0xC774 then - if curr.next - and curr.next.id == glyphnode - and get_unicode_char(curr.next) == 0xB77C then + local nn = nodenext(curr) + if nn and nn.id == glyphnode and get_unicode_char(nn) == 0xB77C then curr.char = josa_list[0xC774][josacode] else curr.char = josa_list[0xAC00][josacode] @@ -1353,30 +1363,65 @@ local function hangulspaceskip (engfont, hfontid, spec) return tex_round(hsp), tex_round(hst), tex_round(hsh) end +local type1fonts = {} -- due to too verbose log +local function nanumtype1font(curr) + if curr.char > 0xFFFF then return end + local fnt_t = get_font_table(curr.font) + local family = (has_attribute(curr,finemathattr) or 0) > 1 and not is_hanja(curr.char) and "nanummj" or "nanumgt" + local series = fnt_t.shared and fnt_t.shared.rawdata.metadata.pfminfo.weight + if series then + series = series > 500 and "b" or "m" + else + series = stringfind(fnt_t.name,"^cmb") and "b" or "m" + end + local shape = fnt_t.parameters.slant > 0 and "o" or "" + local subfnt = stringformat("%s%s%s%02x",family,series,shape,curr.char/256) + local fsize = fnt_t.size or 655360 + local fspec = stringformat("%s@%d",subfnt,fsize) + local newfnt = type1fonts[fspec] + local newchr = curr.char % 256 + local function ital_corr (curr,chr_t) + if shape ~= "o" then return end + local nxt = nodenext(curr) + if nxt and nxt.id == kernnode and nxt.subtype == 1 and nxt.kern == 0 then + nxt.kern = chr_t.italic or 0 + end + end + if newfnt then + local fntchr = get_font_char(newfnt,newchr) + if fntchr then + curr.font, curr.char = newfnt, newchr + ital_corr(curr,fntchr) + end + else + local ft, id = fonts.constructors.readanddefine(subfnt,fsize) + local fntchr = ft and ft.characters[newchr] + if id and fntchr then + type1fonts[fspec], curr.font, curr.char = id, id, newchr + ital_corr(curr,fntchr) + end + end +end + local function font_substitute(head) - local noinmath = true - for curr in traverse(head) do - if curr.id == mathnode then - if curr.subtype == 0 then - noinmath = false - else - noinmath = true - end - elseif noinmath and curr.id == glyphnode then + local curr = head + while curr do + if curr.id == mathnode and curr.subtype == 0 then + curr = end_of_math(curr) + elseif curr.id == glyphnode then local eng = get_font_table(curr.font) - local engfontchar = nil + local myfontchar = nil if eng and eng.encodingbytes and eng.encodingbytes == 2 -- exclude type1 and hangulpunctuations[curr.char] and has_attribute(curr, hangulpunctsattr) - and has_attribute(curr, finemathattr) == 1 + and (has_attribute(curr, finemathattr) or 0) > 0 -- not ttfamily and not get_font_char(curr.font, 0xAC00) then -- exclude hangul font else - engfontchar = get_font_char(curr.font, curr.char) + myfontchar = get_font_char(curr.font, curr.char) end - if curr.char and not engfontchar then - local korid = false - local hangul = has_attribute(curr, hangfntattr) - local hanja = has_attribute(curr, hanjfntattr) + if curr.char and not myfontchar then + local hangul = has_attribute(curr, hangulfntattr) + local hanja = has_attribute(curr, hanjafntattr) local fallback = has_attribute(curr,fallbackfntattr) local ftable = {hangul, hanja, fallback} if luatexko.hanjafontforhanja then @@ -1384,17 +1429,15 @@ local function font_substitute(head) uni = uni and get_cjk_class(uni) if uni and uni < 7 then ftable = {hanja, hangul, fallback} end end - for i=1,#ftable do + for i = 1,3 do local fid = ftable[i] - if fid then - local c = get_font_char(fid, curr.char) - if c then - korid = true - curr.font = fid + myfontchar = get_font_char(fid, curr.char) + if myfontchar then + curr.font = fid + local nxt = nodenext(curr) + if eng and nxt then -- adjust next glue by hangul font space - local nxt = curr.next - if eng - and nxt and nxt.id == gluenode + if nxt.id == gluenode and nxt.subtype and nxt.subtype == 0 and nxt.spec and nxt.spec.writable and get_font_char(fid,32) then @@ -1404,25 +1447,32 @@ local function font_substitute(head) hg.width, hg.stretch, hg.shrink = sp, st, sh nxt.spec = hg end + -- adjust next italic correction kern + elseif nxt.id == kernnode + and nxt.subtype == 1 and nxt.kern == 0 then + local ksl = get_font_table(fid).parameters.slant + if ksl and ksl > 0 then + nxt.kern = myfontchar.italic or 0 + end end - --- charraise option charraise - local charraise = get_font_feature(fid, "charraise") - if charraise then - charraise = tex_sp(charraise) - curr.yoffset = curr.yoffset and (curr.yoffset + charraise) or charraise - end - --- - break end + --- charraise option charraise + local charraise = get_font_feature(fid, "charraise") + if charraise then + charraise = tex_sp(charraise) + curr.yoffset = charraise + (curr.yoffset or 0) + end + --- + break end end - if not korid and not is_unicode_vs(curr.char) then - warn("!Missing character: %s U+%04X", utf8char(curr.char),curr.char) + if not myfontchar then + nanumtype1font(curr) end end end + curr = nodenext(curr) end - return head end ----------------------------- @@ -1440,19 +1490,25 @@ end ----------------------------- local function reorderTM (head) for curr in traverse_id(glyphnode, head) do - if curr.width > 0 then -- old hangul vertical typesetting is broken? - local uni = get_unicode_char(curr) - if uni and (uni == 0x302E or uni == 0x302F) then - local p = curr.prev + local uni = get_unicode_char(curr) + if uni and (uni == 0x302E or uni == 0x302F) then + local unichar = get_font_char(curr.font, uni) + if unichar.width > 0 then + local p = nodeprev(curr) while p do - if p.id ~= glyphnode then break end - local pc = get_cjk_class(get_unicode_char(p)) - if pc == 7 or pc == 8 then - head = insert_before(head,p,copy_node(curr)) - head = remove_node(head,curr) + if p.id == glyphnode then + local pc = get_cjk_class(get_unicode_char(p)) + if pc == 7 or pc == 8 then + head = insert_before(head,p,copy_node(curr)) + head = remove_node(head,curr) + break + end + elseif unichar.commands and p.id == kernnode then + -- kerns in vertical typesetting mode + else break end - p = p.prev + p = nodeprev(p) end end end @@ -1467,7 +1523,7 @@ local function hanja_vs_support (head) for curr in traverse_id(glyphnode, head) do local cc = curr.char if is_unicode_vs(cc) then - local prev = curr.prev + local prev = nodeprev(curr) if prev and prev.id == glyphnode then local f = get_font_table(prev.font) local ivs = f and f.resources and f.resources.variants @@ -1496,9 +1552,9 @@ add_to_callback('hpack_filter', function(head) end, 'luatexko.hpack_filter_first',1) add_to_callback('hpack_filter', function(head) - get_ruby_side_kern(head) + if texcount["luakorubyattrcnt"]>0 then get_ruby_side_kern(head) end cjk_spacing_linebreak(head) - spread_ruby_base_box(head) + if texcount["luakorubyattrcnt"]>0 then spread_ruby_base_box(head) end head = compress_fullwidth_punctuations(head) -- head = no_ruby_at_margin(head) head = reorderTM(head) @@ -1515,12 +1571,12 @@ add_to_callback('pre_linebreak_filter', function(head) end, 'luatexko.pre_linebreak_filter_first',1) add_to_callback('pre_linebreak_filter', function(head) - get_ruby_side_kern(head) + if texcount["luakorubyattrcnt"]>0 then get_ruby_side_kern(head) end cjk_spacing_linebreak(head) - spread_ruby_base_box(head) + if texcount["luakorubyattrcnt"]>0 then spread_ruby_base_box(head) end head = compress_fullwidth_punctuations(head) discourage_char_widow(head, nodeslide(head)) - head = no_ruby_at_margin(head) + if texcount["luakorubyattrcnt"]>0 then head = no_ruby_at_margin(head) end head = reorderTM(head) return head end, 'luatexko.pre_linebreak_filter') @@ -1540,7 +1596,7 @@ local function after_linebreak_dotemph (head) if cc and (cc == 0 or cc == 7 or cc == 8) then local basewd = curr.width or 0 if cc == 8 then -- check next char for old hangul jung/jongseong - local nn = curr.next + local nn = nodenext(curr) while nn do if nn.id ~= glyphnode then break end local uni = get_unicode_char(nn) @@ -1550,7 +1606,7 @@ local function after_linebreak_dotemph (head) else break end - nn = nn.next + nn = nodenext(nn) end end local d = copy_node(dotemphnode[attr]) @@ -1623,7 +1679,7 @@ end local function after_linebreak_underline(head,glueorder,glueset,gluesign,ulinenum) local ulstart = ulinenum and head or false - if ulstart and ulstart.id == gluenode then ulstart = ulstart.next end + if ulstart and ulstart.id == gluenode then ulstart = nodenext(ulstart) end for curr in traverse(head) do if curr.id == hlistnode then curr.head,ulinenum = after_linebreak_underline(curr.head,curr.glue_order,curr.glue_set,curr.glue_sign,ulinenum) @@ -1652,48 +1708,61 @@ end -- add to callback : post-linebreak ----------------------------------- add_to_callback('vpack_filter', function(head) - head = after_linebreak_dotemph(head) - after_linebreak_ruby(head) - head = after_linebreak_underline(head) + if texcount["luakodotemphcnt"]>0 then head = after_linebreak_dotemph(head) end + if texcount["luakorubyattrcnt"]>0 then after_linebreak_ruby(head) end + if texcount["luakoulineboxcnt"]>0 then head = after_linebreak_underline(head) end return head end, 'luatexko.vpack_filter') add_to_callback("post_linebreak_filter", function(head) - head = after_linebreak_dotemph(head) - after_linebreak_ruby(head) - head = after_linebreak_underline(head) + if texcount["luakodotemphcnt"]>0 then head = after_linebreak_dotemph(head) end + if texcount["luakorubyattrcnt"]>0 then after_linebreak_ruby(head) end + if texcount["luakoulineboxcnt"]>0 then head = after_linebreak_underline(head) end return head end, 'luatexko.post_linebreak_filter') ------------------------------------ --- vertical typesetting: EXPERIMENTAL -- don't use this +-- vertical typesetting: EXPERIMENTAL ------------------------------------ ----[[no vwidth in luaotfload v2 -local tsbtable = {} - -local function read_tsb_table(filename)-- for ttx-generated vmtx table - if tsbtable[filename] then - return tsbtable[filename] +local tsbtable, mytime, currtime, cachedir, lfsattributes, lfstouch + +local function get_vwidth_tsb_table (filename,fontname) + if tsbtable[fontname] then return tsbtable[fontname] end + local cachefile = stringformat("%s/luatexko_vertical_metrics_%s.lua", + cachedir,stringgsub(fontname,"%W","_")) + local cattr = lfs.isfile(cachefile) and lfsattributes(cachefile) + local fonttime = lfsattributes(filename,"modification") + if cattr and cattr.access > mytime and cattr.modification == fonttime then + tsbtable[fontname] = dofile(cachefile) + return tsbtable[fontname] end - local filepath = kpse.find_file(filename) - if not filepath then return end - local file = io.open(filepath, "r") - if not file then return end - local tsbtb = {} - local patt = 'name="(.-)" height="(.-)" tsb="(.-)"' - while true do - local l = file:read("*line") - if not l then break end - for name, height, tsb in stringgmatch(l,patt) do - tsbtb[name] = {} - tsbtb[name].height = height - tsbtb[name].tsb = tsb + local metrics = nil + local font = fontloader.open(filename,fontname) + if font then + metrics = fontloader.to_table(font) + fontloader.close(font) + local glyph_t = {} + if metrics.subfonts then + for _,v in ipairs(metrics.subfonts) do + for ii,vv in pairs(v.glyphs) do + glyph_t[ii] = { ht = vv.vwidth, tsb = vv.tsidebearing } + end + end + else + for i,v in ipairs(metrics.glyphs) do + glyph_t[i] = { ht = v.vwidth, tsb = v.tsidebearing } + end end + if lfstouch then + table.tofile(cachefile,glyph_t,"return") + if not lfstouch(cachefile,currtime,fonttime) then + warn("Writing cache file '%s' failed!",cachefile) + end + end + tsbtable[fontname] = glyph_t + return glyph_t end - file:close() - tsbtable[filename] = tsbtb - return tsbtb end local function cjk_vertical_font (vf) @@ -1702,25 +1771,13 @@ local function cjk_vertical_font (vf) if not vf.shared.features["vertical"] then return end if vf.type == "virtual" then return end - ---[[ for read-ttx - local filename = vf.filename - filename = stringgsub(filename,".*/","") - filename = stringgsub(filename,"[tToO][tT][fF]$","ttx") - local tsbtable = read_tsb_table(filename) - if not tsbtable then - warn("Cannot read %s. Aborting vertical typesetting.",filename) - return - end - --]] + -- load font (again) + local tsbtable = get_vwidth_tsb_table(vf.filename,vf.fontname) + if not tsbtable then return end local tmp = table.copy(vf) -- fastcopy takes time too long. local id = fontdefine(tmp) - local hash = vf.properties and vf.properties.hash and vf.properties.hash..' @ vertical' - hash = hash or (vf.name and vf.size and vf.name..' @ '..vf.size..' @ vertical') - - vf.properties = vf.properties or {} - vf.properties.hash = hash vf.type = 'virtual' vf.fonts = {{ id = id }} local quad = vf.parameters and vf.parameters.quad or 655360 @@ -1728,31 +1785,21 @@ local function cjk_vertical_font (vf) local ascender = vf.parameters and vf.parameters.ascender or quad*0.8 local factor = vf.parameters and vf.parameters.factor or 655.36 local xheight = vf.parameters and vf.parameters.x_height or quad/2 - local halfxht = xheight/2 + local goffset = xheight/2 - quad/2 for i,v in pairs(vf.characters) do local dsc = descriptions[i] - local gname = dsc.name - -- local vw = dsc and dsc.vwidth - ---[[ for read-ttx - local vw = tsbtable and tsbtable[gname] and tsbtable[gname].height - local tsb = tsbtable and tsbtable[gname] and tsbtable[gname].tsb - if not vw and dsc.index then - local cid = stringformat("cid%05d", dsc.index) - vw = tsbtable and tsbtable[cid] and tsbtable[cid].height - tsb = tsbtable and tsbtable[cid] and tsbtable[cid].tsb - end - tsb = tsb and factor and tsb*factor - --]] + local gl = v.index + -- from loaded font + local vw = tsbtable and tsbtable[gl] and tsbtable[gl].ht vw = vw and vw * factor or quad - local hw = v.width or quad - local offset = hw/2 - quad/2 + halfxht - local vh = (hw > 0) and hw/2 or nil + local tsb = tsbtable and tsbtable[gl] and tsbtable[gl].tsb local bb4 = dsc and dsc.boundingbox and dsc.boundingbox[4] - bb4 = bb4 and bb4*factor - local asc = bb4 and tsb and (bb4 + tsb) - asc = asc or ascender + local asc = bb4 and tsb and (bb4+tsb)*factor or ascender + local hw = v.width or quad + local offset = hw/2 + goffset + local vh = hw > 0 and hw/2 or nil v.commands = { - {'right', asc}, -- bbox4 + top_side_bearing! But, tsb not available! + {'right', asc}, -- bbox4 + top_side_bearing {'down', offset}, {'special', 'pdf: q 0 1 -1 0 0 0 cm'}, {'push'}, @@ -1800,6 +1847,15 @@ local function activate_vertical_virtual (tfmdata,value) local loaded = luatexbase.priority_in_callback("luaotfload.patch_font", "luatexko.vertical_virtual_font") if value and not loaded then + require "fontloader" + require "lfs" + lfstouch = lfs.touch + lfsattributes = lfs.attributes + tsbtable = {} + currtime = os.time() + mytime = kpse_find_file("luatexko.lua") + mytime = mytime and lfsattributes(mytime,"modification") + cachedir = caches.getwritablepath("..","luatexko") add_to_callback("luaotfload.patch_font", cjk_vertical_font, "luatexko.vertical_virtual_font") @@ -1814,7 +1870,6 @@ otffeatures.register { node = activate_vertical_virtual, } } ---no vwidth in luaotfload v2]] ------------------------------------ -- italic correction for fake-slant font @@ -1834,7 +1889,62 @@ local function fakeslant_itlc (tfmdata) end end +------------------------------------ +-- tounicode for old hangul +------------------------------------ +local function tounicode_oldhangul (tfmdata) + local script = tfmdata.properties and tfmdata.properties.script + if script ~= "hang" then return end + local desc = tfmdata.shared and tfmdata.shared.rawdata and tfmdata.shared.rawdata.descriptions + local chrs = tfmdata.characters + if not desc or not chrs then return end + if not chrs[0x1100] then return end + local last = 0 + for _,v in ipairs({{0x1100,0x11FF},{0xA960,0xA97C},{0xD7B0,0xD7FB}}) do + for i = v[1],v[2] do + local ds = desc[i] and desc[i].slookups + if ds then + for _,s in pairs(ds) do + if type(s) == "number" and s >= 0xF0000 and chrs[s] and not chrs[s].tounicode then + chrs[s].tounicode = stringformat("%04X",i) + last = s > last and s or last + end + end + end + end + end + if stringfind(tfmdata.fontname,"^HCR.+LVT") then + local touni = "1112119E" + for i = last+1, last+2 do + local dsc,chr = desc[i],chrs[i] + if dsc and chr and dsc.class == "ligature" and not chr.tounicode then + chr.tounicode = touni + end + touni = touni.."11AB" + end + end +end + add_to_callback("luaotfload.patch_font", - fakeslant_itlc, - "luatexko.fakeslant_itlc") + function(tfmdata) + fakeslant_itlc(tfmdata) + tounicode_oldhangul(tfmdata) + end, "luatexko.font_patches") + +------------------------------------ +-- Actual Text +------------------------------------ +local function actualtext (str) + local t = {} + for uni in string.utfvalues(str) do + if uni < 0x10000 then + t[#t+1] = stringformat("%04X",uni) + else -- surrogate + uni = uni - 0x10000 + t[#t+1] = stringformat("%04X%04X", uni/0x400+0xD800, uni%0x400+0xDC00) + end + end + tex.sprint(stringformat("<FEFF%s>", table.concat(t))) +end +luatexko.actualtext = actualtext diff --git a/Master/texmf-dist/tex/luatex/luatexko/luatexko.sty b/Master/texmf-dist/tex/luatex/luatexko/luatexko.sty index 5d6d6d69fa8..a34b53bae9a 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 Dohyun Kim <nomos at ktug org> +% Copyright (c) 2013-2014 Dohyun Kim <nomos at ktug org> % % This work may be distributed and/or modified under the % conditions of the LaTeX Project Public License, either version 1.3c @@ -22,162 +22,282 @@ \expandafter\endinput \fi -\ProvidesPackage{luatexko}[2014/01/15 v1.4 Typesetting Korean with LuaLaTeX] -\RequirePackage{fontspec} -\RequirePackage{luatexko-core} - -%% fontspec Korean options -\ExplSyntaxOn - -\DeclareDocumentCommand \newhangulfontfeature {mmmm} - { - \fontspec_define_font_feature:n {#1} - \keys_define:nn {fontspec} - { - #1 .default:n = {#3} , - #1 / unknown .code:n = { - \fontspec_update_fontid:n {#2:##1} - \fontspec_update_featstr:n {#2=##1}#4 - } - } - } - -\fontspec_define_font_feature:n {YetHangul} -\keys_define:nn {fontspec} - { - YetHangul .default:n = {On} , - YetHangul / On .code:n = { - \fontspec_update_fontid:n {yethangul:on} - \fontspec_update_featstr:n {script=hang;+ccmp;+ljmo;+vjmo;+tjmo} - } , - YetHangul / Off .code:n = { - \fontspec_update_fontid:n {yethangul:off} - \fontspec_update_featstr:n {-ljmo;-vjmo;-tjmo} - } - } - -\ExplSyntaxOff - -\newhangulfontfeature{InterHangul}{interhangul}{0}{} -\newhangulfontfeature{InterLatinCJK}{interlatincjk}{0}{} -\newhangulfontfeature{PunctRaise}{punctraise}{0}{} -\newhangulfontfeature{CharRaise}{charraise}{0}{} -\newhangulfontfeature{Protrusion}{protrusion}{default}{\aftergroup\pdfprotrudechars\aftergroup\tw@} -\newhangulfontfeature{Expansion}{expansion}{default}{\aftergroup\pdfadjustspacing\aftergroup\tw@} - -%% macros for Korean fonts -\protected\def\setmainhangulfont{\newfontfamily\serifhangul@font} -\protected\def\setmainhanjafont {\newfontfamily\serifhanja@font} -\protected\def\setmainfallbackfont{\newfontfamily\seriffallback@font} -\protected\def\setsanshangulfont{\newfontfamily\sanshangul@font} -\protected\def\setsanshanjafont {\newfontfamily\sanshanja@font} -\protected\def\setsansfallbackfont{\newfontfamily\sansfallback@font} -\protected\def\setmonohangulfont{\newfontfamily\monohangul@font} -\protected\def\setmonohanjafont {\newfontfamily\monohanja@font} -\protected\def\setmonofallbackfont{\newfontfamily\monofallback@font} - -\protected\def\newhangulfontfamily#1{% - \protected\def#1{\expandafter\let\expandafter\hangul@font - \csname luatexko@\string#1\endcsname - \luatexko@hangul@selectfont}\expandafter\newfontfamily - \csname luatexko@\string#1\endcsname} -\protected\def\newhanjafontfamily#1{% - \protected\def#1{\expandafter\let\expandafter\hanja@font - \csname luatexko@\string#1\endcsname - \luatexko@hanja@selectfont}\expandafter\newfontfamily - \csname luatexko@\string#1\endcsname} -\protected\def\newfallbackfontfamily#1{% - \protected\def#1{\expandafter\let\expandafter\fallback@font - \csname luatexko@\string#1\endcsname - \luatexko@fallback@selectfont}\expandafter\newfontfamily - \csname luatexko@\string#1\endcsname} +\ProvidesPackage{luatexko}[2014/05/11 v1.5 Typesetting Korean with LuaLaTeX] -\protected\def\newhangulfontface#1{% - \protected\def#1{\expandafter\let\expandafter\hangul@font - \csname luatexko@\string#1\endcsname - \luatexko@hangul@selectfont}\expandafter\newfontface - \csname luatexko@\string#1\endcsname} -\protected\def\newhanjafontface#1{% - \protected\def#1{\expandafter\let\expandafter\hanja@font - \csname luatexko@\string#1\endcsname - \luatexko@hanja@selectfont}\expandafter\newfontface - \csname luatexko@\string#1\endcsname} -\protected\def\newfallbackfontface#1{% - \protected\def#1{\expandafter\let\expandafter\fallback@font - \csname luatexko@\string#1\endcsname - \luatexko@fallback@selectfont}\expandafter\newfontface - \csname luatexko@\string#1\endcsname} +%% package options +\newif\if@hangul +\newif\if@hanja +\newif\if@unfonts +\newif\if@luatexko@loadfontspec\@luatexko@loadfontspectrue +\DeclareOption{hangul}{\@hangultrue} +\DeclareOption{hanja}{\@hangultrue\@hanjatrue} +\DeclareOption{unfonts}{\@unfontstrue} +\DeclareOption{nofontspec}{\@luatexko@loadfontspecfalse} +\ProcessOptions\relax -\protected\def\hangulfontspec#1#{% - \def\luatexko@fontspec@temp{#1}\hangulfontspec@} -\def\hangulfontspec@#1{% - \expandafter\newfontfamily\expandafter\hangul@font\luatexko@fontspec@temp{#1}% - \luatexko@hangul@selectfont\ignorespaces} -\let\adhochangulfont\hangulfontspec -\protected\def\hanjafontspec#1#{% - \def\luatexko@fontspec@temp{#1}\hanjafontspec@} -\def\hanjafontspec@#1{% - \expandafter\newfontfamily\expandafter\hanja@font\luatexko@fontspec@temp{#1}% - \luatexko@hanja@selectfont\ignorespaces} -\let\adhochanjafont\hanjafontspec -\protected\def\fallbackfontspec#1#{% - \def\luatexko@fontspec@temp{#1}\fallbackfontspec@} -\def\fallbackfontspec@#1{% - \expandafter\newfontfamily\expandafter\fallback@font\luatexko@fontspec@temp{#1}% - \luatexko@fallback@selectfont\ignorespaces} -\let\adhocfallbackfont\fallbackfontspec +\if@luatexko@loadfontspec + %% euenc redefines \f@size by \DeclareErrorFont. sigh + \let\luatexko@f@size\f@size + \RequirePackage{fontspec} + \let\f@size\luatexko@f@size +\fi -% add{hangul/hanja}fontfeature -\protected\def\addhangulfontfeature#1{% - \begingroup - \check@hangul@family - \ifdefined\hangul@font\hangul@font\fi\addfontfeature{#1}% - \global\let\luatexko@fontspec@temp\f@family - \endgroup - \def\hangul@font{\fontfamily\luatexko@fontspec@temp\selectfont}% - \luatexko@hangul@selectfont \ignorespaces} -\let\addhangulfontfeatures\addhangulfontfeature -\protected\def\addhanjafontfeature#1{% - \begingroup - \check@hanja@family - \ifdefined\hanja@font\hanja@font\fi\addfontfeature{#1}% - \global\let\luatexko@fontspec@temp\f@family - \endgroup - \def\hanja@font{\fontfamily\luatexko@fontspec@temp\selectfont}% - \luatexko@hanja@selectfont \ignorespaces} -\let\addhanjafontfeatures\addhanjafontfeature -\protected\def\addfallbackfontfeature#1{% - \begingroup - \check@fallback@family - \ifdefined\fallback@font\fallback@font\fi\addfontfeature{#1}% - \global\let\luatexko@fontspec@temp\f@family - \endgroup - \def\fallback@font{\fontfamily\luatexko@fontspec@temp\selectfont}% - \luatexko@fallback@selectfont \ignorespaces} -\let\addfallbackfontfeatures\addfallbackfontfeature +\RequirePackage{luatexko-core} -% check hangul/hanja family -\def\check@hangul@family{% - \unless\ifdefined\hangul@font - \ifx\f@family\sfdefault \let\hangul@font\sanshangul@font - \else\ifx\f@family\ttdefault \let\hangul@font\monohangul@font - \else \let\hangul@font\serifhangul@font - \fi\fi\fi -} -\def\check@hanja@family{% - \unless\ifdefined\hanja@font - \ifx\f@family\sfdefault \let\hanja@font\sanshanja@font - \else\ifx\f@family\ttdefault \let\hanja@font\monohanja@font - \else \let\hanja@font\serifhanja@font - \fi\fi\fi -} -\def\check@fallback@family{% - \unless\ifdefined\fallback@font - \ifx\f@family\sfdefault \let\fallback@font\sansfallback@font - \else\ifx\f@family\ttdefault \let\fallback@font\monofallback@font - \else \let\fallback@font\seriffallback@font - \fi\fi\fi -} +\if@luatexko@loadfontspec + %% fontspec Korean options + \newfontfeature{YetHangul}{script=hang} + \newfontfeature{InterHangul}{interhangul=#1} + \newfontfeature{InterLatinCJK}{interlatincjk=#1} + \newfontfeature{PunctRaise}{punctraise=#1} + \newfontfeature{CharRaise}{charraise=#1} + \ExplSyntaxOn + \DeclareDocumentCommand \newhangulfontfeature {mmmm} + { + \keys_define:nn { fontspec } + { + #1 .code:n = + { + \fontspec_update_featstr:n {#2=##1} + #4 + }, + #1 .default:n = {#3} + } + } + \newhangulfontfeature{Protrusion}{protrusion}{default} + {\aftergroup\pdfprotrudechars\aftergroup\tw@} + \newhangulfontfeature{Expansion}{expansion}{default} + {\aftergroup\pdfadjustspacing\aftergroup\tw@} + %% macros for Korean fonts + \DeclareDocumentCommand \setmainhangulfont { O{} m } + { + \newfontfamily \serifhangul@font [#1] {#2} + \str_if_eq_x:nnT \familydefault \rmdefault + { + \cs_set_eq:NN \hangul@font \serifhangul@font + \luatexko@hangul@selectfont + } + \ignorespaces + } + \DeclareDocumentCommand \setmainhanjafont { O{} m } + { + \newfontfamily \serifhanja@font [#1] {#2} + \str_if_eq_x:nnT \familydefault \rmdefault + { + \cs_set_eq:NN \hanja@font \serifhanja@font + \luatexko@hanja@selectfont + } + \ignorespaces + } + \DeclareDocumentCommand \setmainfallbackfont { O{} m } + { + \newfontfamily \seriffallback@font [#1] {#2} + \str_if_eq_x:nnT \familydefault \rmdefault + { + \cs_set_eq:NN \fallback@font \seriffallback@font + \luatexko@fallback@selectfont + } + \ignorespaces + } + \DeclareDocumentCommand \setsanshangulfont { O{} m } + { + \newfontfamily \sanshangul@font [#1] {#2} + \str_if_eq_x:nnT \familydefault \sfdefault + { + \cs_set_eq:NN \hangul@font \sanshangul@font + \luatexko@hangul@selectfont + } + \ignorespaces + } + \DeclareDocumentCommand \setsanshanjafont { O{} m } + { + \newfontfamily \sanshanja@font [#1] {#2} + \str_if_eq_x:nnT \familydefault \sfdefault + { + \cs_set_eq:NN \hanja@font \sanshanja@font + \luatexko@hanja@selectfont + } + \ignorespaces + } + \DeclareDocumentCommand \setsansfallbackfont { O{} m } + { + \newfontfamily \sansfallback@font [#1] {#2} + \str_if_eq_x:nnT \familydefault \sfdefault + { + \cs_set_eq:NN \fallback@font \sansfallback@font + \luatexko@fallback@selectfont + } + \ignorespaces + } + \DeclareDocumentCommand \setmonohangulfont { O{} m } + { + \newfontfamily \monohangul@font [#1] {#2} + \str_if_eq_x:nnT \familydefault \ttdefault + { + \cs_set_eq:NN \hangul@font \monohangul@font + \luatexko@hangul@selectfont + } + \ignorespaces + } + \DeclareDocumentCommand \setmonohanjafont { O{} m } + { + \newfontfamily \monohanja@font [#1] {#2} + \str_if_eq_x:nnT \familydefault \ttdefault + { + \cs_set_eq:NN \hanja@font \monohanja@font + \luatexko@hanja@selectfont + } + \ignorespaces + } + \DeclareDocumentCommand \setmonofallbackfont { O{} m } + { + \newfontfamily \monofallback@font [#1] {#2} + \str_if_eq_x:nnT \familydefault \ttdefault + { + \cs_set_eq:NN \fallback@font \monofallback@font + \luatexko@fallback@selectfont + } + \ignorespaces + } + \DeclareDocumentCommand \newhangulfontfamily { m O{} m } + { + \exp_after:wN \newfontfamily + \cs:w luatexkofont@ \token_to_str:N #1 \cs_end: [#2] {#3} + \DeclareRobustCommand #1 + { + \cs_set_eq:Nc \hangul@font { luatexkofont@ \token_to_str:N #1 } + \luatexko@hangul@selectfont + } + } + \DeclareDocumentCommand \newhanjafontfamily { m O{} m } + { + \exp_after:wN \newfontfamily + \cs:w luatexkofont@ \token_to_str:N #1 \cs_end: [#2] {#3} + \DeclareRobustCommand #1 + { + \cs_set_eq:Nc \hanja@font { luatexkofont@ \token_to_str:N #1 } + \luatexko@hanja@selectfont + } + } + \DeclareDocumentCommand \newfallbackfontfamily { m O{} m } + { + \exp_after:wN \newfontfamily + \cs:w luatexkofont@ \token_to_str:N #1 \cs_end: [#2] {#3} + \DeclareRobustCommand #1 + { + \cs_set_eq:Nc \fallback@font { luatexkofont@ \token_to_str:N #1 } + \luatexko@fallback@selectfont + } + } + \DeclareDocumentCommand \newhangulfontface { m O{} m } + { + \exp_after:wN \newfontface + \cs:w luatexkofont@ \token_to_str:N #1 \cs_end: [#2] {#3} + \DeclareRobustCommand #1 + { + \cs_set_eq:Nc \hangul@font { luatexkofont@ \token_to_str:N #1 } + \luatexko@hangul@selectfont + } + } + \DeclareDocumentCommand \newhanjafontface { m O{} m } + { + \exp_after:wN \newfontface + \cs:w luatexkofont@ \token_to_str:N #1 \cs_end: [#2] {#3} + \DeclareRobustCommand #1 + { + \cs_set_eq:Nc \hanja@font { luatexkofont@ \token_to_str:N #1 } + \luatexko@hanja@selectfont + } + } + \DeclareDocumentCommand \newfallbackfontface { m O{} m } + { + \exp_after:wN \newfontface + \cs:w luatexkofont@ \token_to_str:N #1 \cs_end: [#2] {#3} + \DeclareRobustCommand #1 + { + \cs_set_eq:Nc \fallback@font { luatexkofont@ \token_to_str:N #1 } + \luatexko@fallback@selectfont + } + } + \DeclareDocumentCommand \hangulfontspec { O{} m } + { + \newfontfamily \hangul@font [#1] {#2} + \luatexko@hangul@selectfont + \ignorespaces + } + \cs_set_eq:NN \adhochangulfont \hangulfontspec + \DeclareDocumentCommand \hanjafontspec { O{} m } + { + \newfontfamily \hanja@font [#1] {#2} + \luatexko@hanja@selectfont + \ignorespaces + } + \cs_set_eq:NN \adhochanjafont \hanjafontspec + \DeclareDocumentCommand \fallbackfontspec { O{} m } + { + \newfontfamily \fallback@font [#1] {#2} + \luatexko@fallback@selectfont + \ignorespaces + } + \cs_set_eq:NN \adhocfallbackfont \fallbackfontspec + \DeclareDocumentCommand \addhangulfontfeature { m } + { + \group_begin: + \cs_if_exist:NT \hangul@font { \hangul@font } + \addfontfeature {#1} + \use:x + { + \group_end: + \exp_not:N \tl_set:Nn \exp_not:N \hangul@font + { + \exp_not:N \fontfamily { \f@family } \exp_not:N \selectfont + } + } + \luatexko@hangul@selectfont + \ignorespaces + } + \cs_set_eq:NN \addhangulfontfeatures \addhangulfontfeature + \DeclareDocumentCommand \addhanjafontfeature { m } + { + \group_begin: + \cs_if_exist:NT \hanja@font { \hanja@font } + \addfontfeature {#1} + \use:x + { + \group_end: + \exp_not:N \tl_set:Nn \exp_not:N \hanja@font + { + \exp_not:N \fontfamily { \f@family } \exp_not:N \selectfont + } + } + \luatexko@hanja@selectfont + \ignorespaces + } + \cs_set_eq:NN \addhanjafontfeatures \addhanjafontfeature + \DeclareDocumentCommand \addfallbackfontfeature { m } + { + \group_begin: + \cs_if_exist:NT \fallback@font { \fallback@font } + \addfontfeature {#1} + \use:x + { + \group_end: + \exp_not:N \tl_set:Nn \exp_not:N \fallback@font + { + \exp_not:N \fontfamily { \f@family } \exp_not:N \selectfont + } + } + \luatexko@fallback@selectfont + \ignorespaces + } + \cs_set_eq:NN \addfallbackfontfeatures \addfallbackfontfeature + % hangul math font command + \DeclareDocumentCommand \setmathhangulfont { O{} m } + { + \fontspec_set_family:Nnn \luatexko@math@hangul@family {#1} {#2} + } + \ExplSyntaxOff +\fi \RequirePackage{everysel} \EverySelectfont{% @@ -186,33 +306,55 @@ \luatexko@fallback@selectfont } -% don't forget to redefine \normalfont -\protected\edef\normalfont{\unexpanded{% - \let\hangul@font\luatexko@undefined - \let\hanja@font\luatexko@undefined - \let\fallback@font\luatexko@undefined - }% - \unexpanded\expandafter{\normalfont}} -\let\reset@font\normalfont - -% normal : finemathattr = 1 +% serif : finemathattr = 2 +% sans : finemathattr = 1 % tt : finemathattr = 0 -% verbatim : finemathattr = off -\protected\edef\ttfamily{\unexpanded\expandafter{\ttfamily - \finemathattr\z@}} +% verbatim : finemathattr = nil +\def\luatexko@serif@fonts{% + \let\hangul@font\serifhangul@font + \let\hanja@font\serifhanja@font + \let\fallback@font\seriffallback@font + \finemathattr\tw@ +} +\def\luatexko@sans@fonts{% + \let\hangul@font\sanshangul@font + \let\hanja@font\sanshanja@font + \let\fallback@font\sansfallback@font + \finemathattr\@ne +} +\def\luatexko@mono@fonts{% + \let\hangul@font\monohangul@font + \let\hanja@font\monohanja@font + \let\fallback@font\monofallback@font + \finemathattr\z@ +} + +\protected\edef\rmfamily{% + \unexpanded{\luatexko@serif@fonts}\unexpanded\expandafter{\rmfamily}} +\protected\edef\sffamily{% + \unexpanded{\luatexko@sans@fonts}\unexpanded\expandafter{\sffamily}} +\protected\edef\ttfamily{% + \unexpanded{\luatexko@mono@fonts}\unexpanded\expandafter{\ttfamily}} \edef\verbatim@font{\unexpanded\expandafter{\verbatim@font \unsetluatexattribute\finemathattr}} -%% package options -\newif\if@hangul -\newif\if@hanja -\newif\if@unfonts -\DeclareOption{hangul}{\@hangultrue} -\DeclareOption{hanja}{\@hangultrue\@hanjatrue} -\DeclareOption{unfonts}{\@unfontstrue} -\ProcessOptions\relax +% don't forget to redefine \normalfont +\expandafter\ifx\familydefault\rmdefault + \protected\edef\normalfont{% + \unexpanded{\luatexko@serif@fonts}\unexpanded\expandafter{\normalfont}} + \finemathattr\tw@ +\else\expandafter\ifx\familydefault\sfdefault + \protected\edef\normalfont{% + \unexpanded{\luatexko@sans@fonts}\unexpanded\expandafter{\normalfont}} + \finemathattr\@ne +\else + \protected\edef\normalfont{% + \unexpanded{\luatexko@mono@fonts}\unexpanded\expandafter{\normalfont}} + \finemathattr\z@ +\fi\fi +\let\reset@font\normalfont -\if@unfonts +\if@unfonts\if@luatexko@loadfontspec \setmainhangulfont[ InterHangul=-0.04em, InterLatinCJK=0.125em, @@ -238,15 +380,15 @@ BoldSlantedFont=*Bold, BoldSlantedFeatures={FakeSlant=0.2}, BoldItalicFont=*Bold, BoldItalicFeatures={FakeSlant=0.2}, ]{UnDotum} -\fi +\fi\fi \AtBeginDocument{ \unless\ifdefined\serifhangul@font\let\serifhangul@font\sanshangul@font\fi \unless\ifdefined\sanshangul@font \let\sanshangul@font\serifhangul@font\fi \unless\ifdefined\monohangul@font \let\monohangul@font\sanshangul@font \fi -\luatexko@hangul@selectfont -\luatexko@hanja@selectfont -\luatexko@fallback@selectfont +\unless\ifdefined\serifhangul@font\unless\ifdefined\sanshangul@font + \hangulpunctuations=0 % nanumtype1 +\fi\fi % for hyperref \@ifpackageloaded{hyperref}{\pdfstringdefDisableCommands{% \let\dotemph\@firstofone @@ -258,6 +400,8 @@ \let\uwave\@firstofone \let\dashuline\@firstofone \let\dotuline\@firstofone + \let\actualtext\@firstofone + \let\inhibitglue\empty \def\는{는}% \def\은{은}% \def\을{을}% @@ -272,25 +416,24 @@ }}{} } -%% hangul in math --- latex -\protected\def\setmathhangulfont{% - \@ifnextchar[{\setmathhangul@font@}{\setmathhangul@font@[]}} -\def\setmathhangul@font@[#1]#2{% - \zf@fontspec{#1}{#2}\xdef\luatexko@math@hangul@family{\zf@family}} -\AtBeginDocument{% - \begingroup - \unless\ifdefined\luatexko@math@hangul@family - \check@hangul@family - \ifdefined\hangul@font \hangul@font \fi - \xdef\luatexko@math@hangul@family{\f@family}% +\if@luatexko@loadfontspec + %% hangul in math --- latex + \AtBeginDocument{ + \begingroup + \unless\ifdefined\luatexko@math@hangul@family + \ifdefined\hangul@font \hangul@font \fi + \xdef\luatexko@math@hangul@family{\f@family}% + \fi + \endgroup + \DeclareSymbolFont{mathhangul}% + \zf@enc\luatexko@math@hangul@family\mddefault\updefault + \ifcsname\zf@enc/\luatexko@math@hangul@family/\bfdefault/\updefault\endcsname + \SetSymbolFont{mathhangul}{bold}% + \zf@enc\luatexko@math@hangul@family\bfdefault\updefault \fi - \endgroup - \DeclareSymbolFont{mathhangul}\zf@enc\luatexko@math@hangul@family\mddefault\updefault - \ifcsname\zf@enc/\luatexko@math@hangul@family/\bfdefault/\updefault\endcsname - \SetSymbolFont{mathhangul}{bold}\zf@enc\luatexko@math@hangul@family\bfdefault\updefault - \fi - \setmathhangulblock{AC00}{D7A3} -} + \setmathhangulblock{AC00}{D7A3} + } +\fi \RequirePackage{kolabels-utf} \if@hangul |