From 72cab7bce1d68c5d53ee82a50de80e3aa10950fb Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Mon, 20 Jan 2014 23:18:34 +0000 Subject: luatexko (20jan14) git-svn-id: svn://tug.org/texlive/trunk@32740 c570f23f-e606-0410-a88d-b1316a301751 --- .../tex/luatex/luatexko/luatexko-core.sty | 19 +- Master/texmf-dist/tex/luatex/luatexko/luatexko.lua | 455 ++++++++++++--------- Master/texmf-dist/tex/luatex/luatexko/luatexko.sty | 33 +- 3 files changed, 289 insertions(+), 218 deletions(-) (limited to 'Master/texmf-dist/tex/luatex/luatexko') diff --git a/Master/texmf-dist/tex/luatex/luatexko/luatexko-core.sty b/Master/texmf-dist/tex/luatex/luatexko/luatexko-core.sty index 871a4a29cab..22cf34ffdfa 100644 --- a/Master/texmf-dist/tex/luatex/luatexko/luatexko-core.sty +++ b/Master/texmf-dist/tex/luatex/luatexko/luatexko-core.sty @@ -14,7 +14,7 @@ \input luaotfload.sty \catcode`@ = 11 \else - \ProvidesPackage{luatexko-core}[2013/12/06 v1.3 Typesetting Korean with LuaTeX] + \ProvidesPackage{luatexko-core}[2014/01/04 v1.4 Typesetting Korean with LuaTeX] \RequirePackage{luaotfload}[2013/05/23] \fi @@ -33,12 +33,9 @@ \RequireLuaModule{luatexko} %% japanese/chinese/pre-modern -\protected\def\japanese{\frenchspacing\cjtypesetattr\@ne - \luatexkolatinspaceskip\parindent1em } -\protected\def\Schinese{\frenchspacing\cjtypesetattr\tw@ - \luatexkolatinspaceskip\parindent2em } -\protected\def\Tchinese{\frenchspacing\cjtypesetattr\thr@@ - \luatexkolatinspaceskip\parindent2em } +\protected\def\japanese{\frenchspacing\cjtypesetattr\@ne \parindent1em } +\protected\def\Schinese{\frenchspacing\cjtypesetattr\tw@ \parindent2em } +\protected\def\Tchinese{\frenchspacing\cjtypesetattr\thr@@\parindent2em } \let\chinese\Schinese % korean in japanese/chinese env. \protected\def\korean{\unsetluatexattribute\cjtypesetattr} @@ -46,9 +43,6 @@ % inhibitglue \protected\def\inhibitglue{{\unsetluatexattribute\cjtypesetattr\hskip\z@skip}} -\def\luatexkolatinspaceskip{\spaceskip\fontdimen\tw@\the\font - plus \fontdimen\thr@@\the\font minus \fontdimen4\the\font} - %% auto josa \def\josaignoreparens{\afterassignment\josa@ignore@parens\count@} \def\josa@ignore@parens{% @@ -245,7 +239,6 @@ \expandafter\expandafter\expandafter \endgroup \expandafter\hanjfntattr\luatexfontid\font\relax -% \ifnum\cjtypesetattr>\z@\luatexkolatinspaceskip\fi } \def\luatexko@fallback@selectfont{% \begingroup @@ -257,7 +250,6 @@ \expandafter\expandafter\expandafter \endgroup \expandafter\fallbackfntattr\luatexfontid\font\relax -% \ifnum\cjtypesetattr>\z@\luatexkolatinspaceskip\fi } \let\check@hangul@family\relax \let\check@hanja@family \relax @@ -364,9 +356,6 @@ \fi\fi } -%% frenchspacing is default -\frenchspacing - %% 말줄임표 \def\hellipsis{^^^^2026^^^^2026} diff --git a/Master/texmf-dist/tex/luatex/luatexko/luatexko.lua b/Master/texmf-dist/tex/luatex/luatexko/luatexko.lua index 3d24259379d..8ef25e1f439 100644 --- a/Master/texmf-dist/tex/luatex/luatexko/luatexko.lua +++ b/Master/texmf-dist/tex/luatex/luatexko/luatexko.lua @@ -12,8 +12,8 @@ local err,warn,info,log = luatexbase.provides_module({ name = 'luatexko', - date = '2013/12/06', - version = 1.3, + date = '2014/01/06', + version = 1.4, description = 'Korean linebreaking and font-switching', author = 'Dohyun Kim', license = 'LPPL v1.3+', @@ -528,6 +528,11 @@ local function is_jungjongsong (c) or c == 0x302E or c == 0x302F -- tone marks end +local function is_unicode_vs (c) + return (c >= 0xFE00 and c <= 0xFE0F ) + or (c >= 0xE0100 and c <= 0xE01EF) +end + local function get_cjk_class (ch, cjtype) if ch then if is_hangul(ch) then return 7 end -- hangul = 7 @@ -890,60 +895,63 @@ end ---------------------------------- local function compress_fullwidth_punctuations (head) for curr in traverse_id(glyphnode,head) do - local uni = get_unicode_char(curr) - local class = uni and get_cjk_class(uni, has_attribute(curr, cjtypesetattr)) - local chr = get_font_char(curr.font, curr.char) - if chr and class and class >= 1 and class <= 4 then - local width = curr.width or 655360 - emsize = get_font_emsize(curr.font) - local ensize = emsize/2 - local oneoften = emsize/10 - local bbox = get_char_boundingbox(curr.font, curr.char) - if not bbox then return head end -- - if class == 2 or class == 4 then - local wd - if get_font_feature(curr.font,'vertical') then - wd = ensize= 1 and class <= 4 then + local width = curr.width or 655360 + emsize = get_font_emsize(curr.font) + local ensize = emsize/2 + local oneoften = emsize/10 + local bbox = get_char_boundingbox(curr.font, curr.char) + if not bbox then return head end -- + if class == 2 or class == 4 then + local wd + if get_font_feature(curr.font,'vertical') then + wd = ensize 0 and vh or nil - local vd = dsc and dsc.boundingbox and dsc.boundingbox[1] - vd = vd and factor and vd * factor - vd = vd and quad/2 - vd or quad/2 - vd = vd - halfxht - vd = vd > 0 and vd or nil - local bb4 = dsc and dsc.boundingbox and dsc.boundingbox[4] - bb4 = bb4 and factor and bb4*factor - local asc = bb4 and tsb and bb4 + tsb - asc = asc or ascender - v.commands = { - {'right', asc}, -- bbox4 + top_side_bearing! But, tsb not available! - {'down', halfxht}, - {'special', 'pdf: q 0 1 -1 0 0 0 cm'}, - {'push'}, - {'char', i}, - {'pop'}, - {'special', 'pdf: Q'}, - } - v.width = vw - v.height = vh - v.depth = vd - end - return vf -end - -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 - add_to_callback("luaotfload.patch_font", - cjk_vertical_font, - "luatexko.vertical_virtual_font") - end -end - -local otffeatures = fonts.constructors.newfeatures("otf") -otffeatures.register { - name = "vertical", - description = "vertical typesetting", - initializers = { - node = activate_vertical_virtual, - } -} ---no vwidth in luaotfload v2]] - +----------------------------- +-- reorder hangul tone marks +----------------------------- local function reorderTM (head) for curr in traverse_id(glyphnode, head) do if curr.width > 0 then -- old hangul vertical typesetting is broken? @@ -1579,6 +1460,29 @@ local function reorderTM (head) return head end +----------------------------- +-- ideographic variation selector +----------------------------- +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 + if prev and prev.id == glyphnode then + local f = get_font_table(prev.font) + local ivs = f and f.resources and f.resources.variants + ivs = ivs and ivs[cc] and ivs[cc][prev.char] + -- !!! ARRRG! the font table doesn't have variants for non-BMP chars. + if ivs then + prev.char = ivs + head = remove_node(head,curr) + end + end + end + end + return head +end + ---------------------------------- -- add to callback : pre-linebreak ---------------------------------- @@ -1587,6 +1491,7 @@ add_to_callback('hpack_filter', function(head) korean_autojosa(head) remove_cj_spaceskip(head) font_substitute(head) + head = hanja_vs_support(head) return head end, 'luatexko.hpack_filter_first',1) @@ -1605,6 +1510,7 @@ add_to_callback('pre_linebreak_filter', function(head) korean_autojosa(head) remove_cj_spaceskip(head) font_substitute(head) + head = hanja_vs_support(head) return head end, 'luatexko.pre_linebreak_filter_first',1) @@ -1669,7 +1575,7 @@ local function after_linebreak_ruby (head) after_linebreak_ruby(curr.head) -- hlist may be nested!!! local attr = has_attribute(curr,luakorubyattr) if attr then - local ruby = rubynode[attr][1] + local ruby = rubynode[attr] and rubynode[attr][1] if ruby then if ruby.width < curr.width then local rubyhead = ruby.head @@ -1759,3 +1665,176 @@ add_to_callback("post_linebreak_filter", function(head) return head end, 'luatexko.post_linebreak_filter') + +------------------------------------ +-- vertical typesetting: EXPERIMENTAL -- don't use this +------------------------------------ +---[[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] + 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 + end + end + file:close() + tsbtable[filename] = tsbtb + return tsbtb +end + +local function cjk_vertical_font (vf) + if not vf.shared then return end + if not vf.shared.features then return end + 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 + --]] + + 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 + local descriptions = vf.shared and vf.shared.rawdata and vf.shared.rawdata.descriptions + 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 + 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 + --]] + 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 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 + v.commands = { + {'right', asc}, -- bbox4 + top_side_bearing! But, tsb not available! + {'down', offset}, + {'special', 'pdf: q 0 1 -1 0 0 0 cm'}, + {'push'}, + {'char', i}, + {'pop'}, + {'special', 'pdf: Q'}, + } + v.width = vw + v.height = vh + v.depth = vh + end + --- vertical gpos + local res = vf.resources or {} + if res.verticalgposhack then + return vf -- avoid multiple running + end + local vposkeys = {} + local seq = res.sequences or {} + for _,v in ipairs(seq) do + if v.type == "gpos_single" and v.subtables then -- todo: gpos_pair... + local feature = v.features or {} + if feature.vhal or feature.vkrn or feature.valt or feature.vpal then + for _,vv in ipairs(v.subtables) do + vposkeys[#vposkeys+1] = vv + end + end + end + end + local lookups = res.lookuphash or {} + for _,v in ipairs(vposkeys) do + local vp = lookups[v] + if vp then + for i,vv in pairs(vp) do + if #vv == 4 then + vp[i] = { -vv[2], vv[1], vv[4], vv[3] } + end + end + end + end + res.verticalgposhack = true + return vf +end + +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 + add_to_callback("luaotfload.patch_font", + cjk_vertical_font, + "luatexko.vertical_virtual_font") + end +end + +local otffeatures = fonts.constructors.newfeatures("otf") +otffeatures.register { + name = "vertical", + description = "vertical typesetting", + initializers = { + node = activate_vertical_virtual, + } +} +--no vwidth in luaotfload v2]] + +------------------------------------ +-- italic correction for fake-slant font +------------------------------------ +local function fakeslant_itlc (tfmdata) + local slfactor = tfmdata.parameters.slantfactor + if slfactor and slfactor > 0 then else return end + tfmdata.parameters.slant = slfactor * 65536 + local factor = tfmdata.parameters.factor or 655.36 + local itlcoff = (tfmdata.shared.rawdata.metadata.uwidth or 40)/2 * factor + local chrs = tfmdata.characters + for i,v in pairs(chrs) do + local italic = v.height * slfactor - itlcoff + if italic > 0 then + chrs[i].italic = italic + end + end +end + +add_to_callback("luaotfload.patch_font", + fakeslant_itlc, + "luatexko.fakeslant_itlc") + diff --git a/Master/texmf-dist/tex/luatex/luatexko/luatexko.sty b/Master/texmf-dist/tex/luatex/luatexko/luatexko.sty index 454fd857e1c..5d6d6d69fa8 100644 --- a/Master/texmf-dist/tex/luatex/luatexko/luatexko.sty +++ b/Master/texmf-dist/tex/luatex/luatexko/luatexko.sty @@ -22,7 +22,7 @@ \expandafter\endinput \fi -\ProvidesPackage{luatexko}[2013/11/22 v1.3 Typesetting Korean with LuaLaTeX] +\ProvidesPackage{luatexko}[2014/01/15 v1.4 Typesetting Korean with LuaLaTeX] \RequirePackage{fontspec} \RequirePackage{luatexko-core} @@ -131,29 +131,29 @@ \protected\def\addhangulfontfeature#1{% \begingroup \check@hangul@family - \ifdefined\hangul@font\hangul@font\fi\addfontfeature{#1}\global - \let\luatexko@fontspec@temp\f@family + \ifdefined\hangul@font\hangul@font\fi\addfontfeature{#1}% + \global\let\luatexko@fontspec@temp\f@family \endgroup - \def\hangul@font{\fontfamily\luatexko@fontspec@temp - \luatexko@orig@selectfont}\luatexko@hangul@selectfont \ignorespaces} + \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 + \ifdefined\hanja@font\hanja@font\fi\addfontfeature{#1}% + \global\let\luatexko@fontspec@temp\f@family \endgroup - \def\hanja@font{\fontfamily\luatexko@fontspec@temp - \luatexko@orig@selectfont}\luatexko@hanja@selectfont \ignorespaces} + \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 + \ifdefined\fallback@font\fallback@font\fi\addfontfeature{#1}% + \global\let\luatexko@fontspec@temp\f@family \endgroup - \def\fallback@font{\fontfamily\luatexko@fontspec@temp - \luatexko@orig@selectfont}\luatexko@fallback@selectfont \ignorespaces} + \def\fallback@font{\fontfamily\luatexko@fontspec@temp\selectfont}% + \luatexko@fallback@selectfont \ignorespaces} \let\addfallbackfontfeatures\addfallbackfontfeature % check hangul/hanja family @@ -179,8 +179,8 @@ \fi\fi\fi } -\let\luatexko@orig@selectfont\selectfont -\protected\def\selectfont{\luatexko@orig@selectfont +\RequirePackage{everysel} +\EverySelectfont{% \luatexko@hangul@selectfont \luatexko@hanja@selectfont \luatexko@fallback@selectfont @@ -245,6 +245,8 @@ \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 % for hyperref \@ifpackageloaded{hyperref}{\pdfstringdefDisableCommands{% \let\dotemph\@firstofone @@ -297,6 +299,7 @@ \footnotesep=1.3888\footnotesep \skip\footins=1.3888\skip\footins plus6pt minus3pt \hangulpunctuations=1 + \frenchspacing \fi \endinput -- cgit v1.2.3