diff options
| author | Khaled Hosny <khaledhosny@eglug.org> | 2010-02-22 14:26:34 +0200 | 
|---|---|---|
| committer | Khaled Hosny <khaledhosny@eglug.org> | 2010-02-23 01:44:03 +0200 | 
| commit | e064aa2dc70fb819cfdb6b3c0bdf1d081859584f (patch) | |
| tree | b429356162be25b812b6e75e85cccae61f893ad4 | |
| parent | e0931232fb05665da0e809cb3d7be0d3d6c8e820 (diff) | |
| download | luaotfload-e064aa2dc70fb819cfdb6b3c0bdf1d081859584f.tar.gz | |
Updating to latest ConTeXt beta (2010.02.23)
Now many of our fixes are incorporated upstream or fixed in a different
way.
| -rw-r--r-- | luaotfload.dtx | 2 | ||||
| -rw-r--r-- | otfl-font-dum.lua | 5 | ||||
| -rw-r--r-- | otfl-font-map.lua | 161 | ||||
| -rw-r--r-- | otfl-font-otf.lua | 164 | ||||
| -rw-r--r-- | otfl-font-tfm.lua | 5 | ||||
| -rw-r--r-- | otfl-font-xtx.lua | 16 | ||||
| -rw-r--r-- | otfl-luat-dum.lua | 5 | 
7 files changed, 184 insertions, 174 deletions
diff --git a/luaotfload.dtx b/luaotfload.dtx index d481938..f543fd0 100644 --- a/luaotfload.dtx +++ b/luaotfload.dtx @@ -477,6 +477,7 @@ luaotfload.loadmodule('node-dum.lua')  luaotfload.loadmodule('font-ini.lua')  luaotfload.loadmodule('font-tfm.lua')  luaotfload.loadmodule('font-cid.lua') +luaotfload.loadmodule('font-map.lua')  luaotfload.loadmodule('font-ott.lua')  luaotfload.loadmodule('font-otf.lua')  luaotfload.loadmodule('font-otd.lua') @@ -487,7 +488,6 @@ luaotfload.loadmodule('font-ota.lua')  luaotfload.loadmodule('font-otc.lua')  luaotfload.loadmodule('font-def.lua')  luaotfload.loadmodule('font-xtx.lua') -luaotfload.loadmodule('font-map.lua')  luaotfload.loadmodule('font-dum.lua')  luaotfload.loadmodule('font-clr.lua') diff --git a/otfl-font-dum.lua b/otfl-font-dum.lua index 94dc676..5b83b3b 100644 --- a/otfl-font-dum.lua +++ b/otfl-font-dum.lua @@ -10,8 +10,9 @@ fonts = fonts or { }  -- general -fonts.otf.pack       = false -fonts.tfm.resolve_vf = false -- no sure about this +fonts.otf.pack          = false +fonts.tfm.resolve_vf    = false -- no sure about this +fonts.tfm.fontname_mode = "specification" -- somehow latex needs this  -- readers diff --git a/otfl-font-map.lua b/otfl-font-map.lua index 9e85516..9dd2bd0 100644 --- a/otfl-font-map.lua +++ b/otfl-font-map.lua @@ -6,10 +6,13 @@ if not modules then modules = { } end modules ['font-map'] = {      license   = "see context related readme files"  } -local match, format, find, concat, gsub = string.match, string.format, string.find, table.concat, string.gsub +local utf = unicode.utf8 +local match, format, find, concat, gsub, lower = string.match, string.format, string.find, table.concat, string.gsub, string.lower  local lpegmatch = lpeg.match +local utfbyte = utf.byte -local trace_loading = false  trackers.register("otf.loading", function(v) trace_loading = v end) +local trace_loading    = false  trackers.register("otf.loading",    function(v) trace_loading    = v end) +local trace_unimapping = false  trackers.register("otf.unimapping", function(v) trace_unimapping = v end)  local ctxcatcodes = tex and tex.ctxcatcodes @@ -128,7 +131,7 @@ function fonts.map.load_file(filename, entries, encodings)      return entries, encodings  end -function fonts.map.load_lum_table(filename) +local function load_lum_table(filename)      local lumname = file.replacesuffix(file.basename(filename),"lum")      local lumfile = resolvers.find_file(lumname,"map") or ""      if lumfile ~= "" and lfs.isfile(lumfile) then @@ -154,7 +157,7 @@ local parser  = unicode + ucode + index  local parsers = { } -function fonts.map.make_name_parser(str) +local function make_name_parser(str)      if not str or str == "" then          return parser      else @@ -181,7 +184,7 @@ end  --~ test("index1234")  --~ test("Japan1.123") -function fonts.map.tounicode16(unicode) +local function tounicode16(unicode)      if unicode < 0x10000 then          return format("%04X",unicode)      else @@ -189,7 +192,7 @@ function fonts.map.tounicode16(unicode)      end  end -function fonts.map.tounicode16sequence(unicodes) +local function tounicode16sequence(unicodes)      local t = { }      for l=1,#unicodes do          local unicode = unicodes[l] @@ -222,3 +225,149 @@ end  --~     return s  --~ end +fonts.map.load_lum_table      = load_lum_table +fonts.map.make_name_parser    = make_name_parser +fonts.map.tounicode16         = tounicode16 +fonts.map.tounicode16sequence = tounicode16sequence + +local separator   = lpeg.S("_.") +local other       = lpeg.C((1 - separator)^1) +local ligsplitter = lpeg.Ct(other * (separator * other)^0) + +--~ print(table.serialize(lpegmatch(ligsplitter,"this"))) +--~ print(table.serialize(lpegmatch(ligsplitter,"this.that"))) +--~ print(table.serialize(lpegmatch(ligsplitter,"japan1.123"))) +--~ print(table.serialize(lpegmatch(ligsplitter,"such_so_more"))) +--~ print(table.serialize(lpegmatch(ligsplitter,"such_so_more.that"))) + +fonts.map.add_to_unicode = function(data,filename) +    local unicodes = data.luatex and data.luatex.unicodes +    if not unicodes then +        return +    end +    -- we need to move this code +    unicodes['space']  = unicodes['space']  or 32 +    unicodes['hyphen'] = unicodes['hyphen'] or 45 +    unicodes['zwj']    = unicodes['zwj']    or 0x200D +    unicodes['zwnj']   = unicodes['zwnj']   or 0x200C +    -- the tounicode mapping is sparse and only needed for alternatives +    local tounicode, originals, ns, nl, private, unknown = { }, { }, 0, 0, fonts.private, format("%04X",utfbyte("?")) +    data.luatex.tounicode, data.luatex.originals = tounicode, originals +    local lumunic, uparser, oparser +    if false then -- will become an option +        lumunic = load_lum_table(filename) +        lumunic = lumunic and lumunic.tounicode +    end +    local cidinfo, cidnames, cidcodes = data.cidinfo +    local usedmap = cidinfo and cidinfo.usedname +    usedmap = usedmap and lower(usedmap) +    usedmap = usedmap and fonts.cid.map[usedmap] +    if usedmap then +        oparser = usedmap and make_name_parser(cidinfo.ordering) +        cidnames = usedmap.names +        cidcodes = usedmap.unicodes +    end +    uparser = make_name_parser() +    local aglmap = fonts.map and fonts.map.agl_to_unicode +    for index, glyph in next, data.glyphs do +        local name, unic = glyph.name, glyph.unicode or -1 -- play safe +        if unic == -1 or unic >= private or (unic >= 0xE000 and unic <= 0xF8FF) or unic == 0xFFFE or unic == 0xFFFF then +            local unicode = (lumunic and lumunic[name]) or (aglmap and aglmap[name]) +            if unicode then +                originals[index], tounicode[index], ns = unicode, tounicode16(unicode), ns + 1 +            end +            -- cidmap heuristics, beware, there is no guarantee for a match unless +            -- the chain resolves +            if (not unicode) and usedmap then +                local foundindex = lpegmatch(oparser,name) +                if foundindex then +                    unicode = cidcodes[foundindex] -- name to number +                    if unicode then +                        originals[index], tounicode[index], ns = unicode, tounicode16(unicode), ns + 1 +                    else +                        local reference = cidnames[foundindex] -- number to name +                        if reference then +                            local foundindex = lpegmatch(oparser,reference) +                            if foundindex then +                                unicode = cidcodes[foundindex] +                                if unicode then +                                    originals[index], tounicode[index], ns = unicode, tounicode16(unicode), ns + 1 +                                end +                            end +                            if not unicode then +                                local foundcodes, multiple = lpegmatch(uparser,reference) +                                if foundcodes then +                                    if multiple then +                                        originals[index], tounicode[index], nl, unicode = foundcodes, tounicode16sequence(foundcodes), nl + 1, true +                                    else +                                        originals[index], tounicode[index], ns, unicode = foundcodes, tounicode16(foundcodes), ns + 1, foundcodes +                                    end +                                end +                            end +                        end +                    end +                end +            end +            -- a.whatever or a_b_c.whatever or a_b_c (no numbers) +            if not unicode then +                local split = lpegmatch(ligsplitter,name) +                local nplit = (split and #split) or 0 +                if nplit == 0 then +                    -- skip +                elseif nplit == 1 then +                    local base = split[1] +                    unicode = unicodes[base] or (aglmap and aglmap[base]) +                    if unicode then +                        if type(unicode) == "table" then +                            unicode = unicode[1] +                        end +                        originals[index], tounicode[index], ns = unicode, tounicode16(unicode), ns + 1 +                    end +                else +                    local t = { } +                    for l=1,nplit do +                        local base = split[l] +                        local u = unicodes[base] or (aglmap and aglmap[base]) +                        if not u then +                            break +                        elseif type(u) == "table" then +                            t[#t+1] = u[1] +                        else +                            t[#t+1] = u +                        end +                    end +                    if #t > 0 then -- done then +                        originals[index], tounicode[index], nl, unicode = t, tounicode16sequence(t), nl + 1, true +                    end +                end +            end +            -- last resort +            if not unicode then +                local foundcodes, multiple = lpegmatch(uparser,name) +                if foundcodes then +                    if multiple then +                        originals[index], tounicode[index], nl, unicode = foundcodes, tounicode16sequence(foundcodes), nl + 1, true +                    else +                        originals[index], tounicode[index], ns, unicode = foundcodes, tounicode16(foundcodes), ns + 1, foundcodes +                    end +                end +            end +            if not unicode then +                originals[index], tounicode[index] = 0xFFFD, "FFFD" +            end +        end +    end +    if trace_unimapping then +        for index, glyph in table.sortedpairs(data.glyphs) do +            local toun, name, unic = tounicode[index], glyph.name, glyph.unicode or -1 -- play safe +            if toun then +                logs.report("load otf","internal: 0x%05X, name: %s, unicode: 0x%05X, tounicode: %s",index,name,unic,toun) +            else +                logs.report("load otf","internal: 0x%05X, name: %s, unicode: 0x%05X",index,name,unic) +            end +        end +    end +    if trace_loading and (ns > 0 or nl > 0) then +        logs.report("load otf","enhance: %s tounicode entries added (%s ligatures)",nl+ns, ns) +    end +end diff --git a/otfl-font-otf.lua b/otfl-font-otf.lua index efe1319..94f5dcf 100644 --- a/otfl-font-otf.lua +++ b/otfl-font-otf.lua @@ -19,14 +19,10 @@ local trace_features   = false  trackers.register("otf.features",     function(v  local trace_dynamics   = false  trackers.register("otf.dynamics",     function(v) trace_dynamics     = v end)  local trace_sequences  = false  trackers.register("otf.sequences",    function(v) trace_sequences    = v end)  local trace_math       = false  trackers.register("otf.math",         function(v) trace_math         = v end) -local trace_unimapping = false  trackers.register("otf.unimapping",   function(v) trace_unimapping   = v end)  local trace_defining   = false  trackers.register("fonts.defining",   function(v) trace_defining     = v end)  --~ trackers.enable("otf.loading") -local zwnj = 0x200C -local zwj  = 0x200D -  --[[ldx--  <p>The fontforge table has organized lookups in a certain way. A first implementation  of this code was organized featurewise: information related to features was @@ -84,7 +80,7 @@ otf.features.default = otf.features.default or { }  otf.enhancers        = otf.enhancers        or { }  otf.glists           = { "gsub", "gpos" } -otf.version          = 2.643 -- beware: also sync font-mis.lua +otf.version          = 2.645 -- beware: also sync font-mis.lua  otf.pack             = true  -- beware: also sync font-mis.lua  otf.syncspace        = true  otf.notdef           = false @@ -179,7 +175,7 @@ otf.tables.valid_fields = {  local function load_featurefile(ff,featurefile)      if featurefile then -        featurefile = resolvers.find_file(file.addsuffix(featurefile,'fea')) -- "FONTFEATURES" +        featurefile = resolvers.find_file(file.addsuffix(featurefile,'fea'),'fea')          if featurefile and featurefile ~= "" then              if trace_loading then                  logs.report("load otf", "featurefile: %s", featurefile) @@ -502,145 +498,7 @@ otf.enhancers["analyse marks"] = function(data,filename)      end  end -local separator   = lpeg.S("_.") -local other       = lpeg.C((1 - separator)^1) -local ligsplitter = lpeg.Ct(other * (separator * other)^0) - ---~ print(table.serialize(lpegmatch(ligsplitter,"this"))) ---~ print(table.serialize(lpegmatch(ligsplitter,"this.that"))) ---~ print(table.serialize(lpegmatch(ligsplitter,"japan1.123"))) ---~ print(table.serialize(lpegmatch(ligsplitter,"such_so_more"))) ---~ print(table.serialize(lpegmatch(ligsplitter,"such_so_more.that"))) - -otf.enhancers["analyse unicodes"] = function(data,filename) -    local tounicode16, tounicode16sequence = fonts.map.tounicode16, fonts.map.tounicode16sequence -    local unicodes = data.luatex.unicodes -    -- we need to move this code -    unicodes['space']  = unicodes['space']  or 32   -- handly later on -    unicodes['hyphen'] = unicodes['hyphen'] or 45   -- handly later on -    unicodes['zwj']    = unicodes['zwj']    or zwj  -- handly later on -    unicodes['zwnj']   = unicodes['zwnj']   or zwnj -- handly later on -    -- the tounicode mapping is sparse and only needed for alternatives -    local tounicode, originals, ns, nl, private, unknown = { }, { }, 0, 0, fonts.private, format("%04X",utfbyte("?")) -    data.luatex.tounicode, data.luatex.originals = tounicode, originals -    local lumunic, uparser, oparser -    if false then -- will become an option -        lumunic = fonts.map.load_lum_table(filename) -        lumunic = lumunic and lumunic.tounicode -    end -    local cidinfo, cidnames, cidcodes = data.cidinfo -    local usedmap = cidinfo and cidinfo.usedname -    usedmap = usedmap and lower(usedmap) -    usedmap = usedmap and fonts.cid.map[usedmap] -    if usedmap then -        oparser = usedmap and fonts.map.make_name_parser(cidinfo.ordering) -        cidnames = usedmap.names -        cidcodes = usedmap.unicodes -    end -    uparser = fonts.map.make_name_parser() -    local aglmap = fonts.map and fonts.map.agl_to_unicode -    for index, glyph in next, data.glyphs do -        local name, unic = glyph.name, glyph.unicode or -1 -- play safe -        if unic == -1 or unic >= private or (unic >= 0xE000 and unic <= 0xF8FF) or unic == 0xFFFE or unic == 0xFFFF then -            local unicode = lumunic and lumunic[name] -            if unicode then -                originals[index], tounicode[index], ns = unicode, tounicode16(unicode), ns + 1 -            end -            -- cidmap heuristics, beware, there is no guarantee for a match unless -            -- the chain resolves -            if (not unicode) and usedmap then -                local foundindex = lpegmatch(oparser,name) -                if foundindex then -                    unicode = cidcodes[foundindex] -- name to number -                    if unicode then -                        originals[index], tounicode[index], ns = unicode, tounicode16(unicode), ns + 1 -                    else -                        local reference = cidnames[foundindex] -- number to name -                        if reference then -                            local foundindex = lpegmatch(oparser,reference) -                            if foundindex then -                                unicode = cidcodes[foundindex] -                                if unicode then -                                    originals[index], tounicode[index], ns = unicode, tounicode16(unicode), ns + 1 -                                end -                            end -                            if not unicode then -                                local foundcodes, multiple = lpegmatch(uparser,reference) -                                if foundcodes then -                                    if multiple then -                                        originals[index], tounicode[index], nl, unicode = foundcodes, tounicode16sequence(foundcodes), nl + 1, true -                                    else -                                        originals[index], tounicode[index], ns, unicode = foundcodes, tounicode16(foundcodes), ns + 1, foundcodes -                                    end -                                end -                            end -                        end -                    end -                end -            end -            -- a.whatever or a_b_c.whatever or a_b_c (no numbers) -            if not unicode then -                local split = lpegmatch(ligsplitter,name) -                local nplit = (split and #split) or 0 -                if nplit == 0 then -                    -- skip -                elseif nplit == 1 then -                    local base = split[1] -                    unicode = unicodes[base] or (agl and agl[base]) -                    if unicode then -                        if type(unicode) == "table" then -                            unicode = unicode[1] -                        end -                        originals[index], tounicode[index], ns = unicode, tounicode16(unicode), ns + 1 -                    end -                else -                    local t = { } -                    for l=1,nplit do -                        local base = split[l] -                        local u = unicodes[base] or (agl and agl[base]) -                        if not u then -                            break -                        elseif type(u) == "table" then -                            t[#t+1] = u[1] -                        else -                            t[#t+1] = u -                        end -                    end -                    if #t > 0 then -- done then -                        originals[index], tounicode[index], nl, unicode = t, tounicode16sequence(t), nl + 1, true -                    end -                end -            end -            -- last resort -            if not unicode then -                local foundcodes, multiple = lpegmatch(uparser,name) -                if foundcodes then -                    if multiple then -                        originals[index], tounicode[index], nl, unicode = foundcodes, tounicode16sequence(foundcodes), nl + 1, true -                    else -                        originals[index], tounicode[index], ns, unicode = foundcodes, tounicode16(foundcodes), ns + 1, foundcodes -                    end -                end -            end -            if not unicode then -                originals[index], tounicode[index] = 0xFFFD, "FFFD" -            end -        end -    end -    if trace_unimapping then -        for index, glyph in table.sortedpairs(data.glyphs) do -            local toun, name, unic = tounicode[index], glyph.name, glyph.unicode or -1 -- play safe -            if toun then -                logs.report("load otf","internal: 0x%05X, name: %s, unicode: 0x%05X, tounicode: %s",index,name,unic,toun) -            else -                logs.report("load otf","internal: 0x%05X, name: %s, unicode: 0x%05X",index,name,unic) -            end -        end -    end -    if trace_loading and (ns > 0 or nl > 0) then -        logs.report("load otf","enhance: %s tounicode entries added (%s ligatures)",nl+ns, ns) -    end -end +otf.enhancers["analyse unicodes"] = fonts.map.add_to_unicode  otf.enhancers["analyse subtables"] = function(data,filename)      data.luatex = data.luatex or { } @@ -1785,8 +1643,7 @@ function tfm.read_from_open_type(specification)      local tfmtable = otf.otf_to_tfm(specification)      if tfmtable then          local otfdata = tfmtable.shared.otfdata ---KH    tfmtable.name = specification.name -        tfmtable.name = specification.specification -- see mpg/luaotfload#3 +        tfmtable.name = specification.name          tfmtable.sub = specification.sub          local s = specification.size          local m = otfdata.metadata.math @@ -1837,8 +1694,17 @@ function tfm.read_from_open_type(specification)              else                  tfmtable.format = specification.format              end ---KH        tfmtable.name = tfmtable.filename or tfmtable.fullname or tfmtable.fontname -            tfmtable.name = tfmtable.name or tfmtable.filename or tfmtable.fullname or tfmtable.fontname -- see mpg/luaotfload#3 +            tfmtable.name = tfmtable.filename or tfmtable.fullname or tfmtable.fontname +            if tfm.fontname_mode == "specification" then +                -- not to be used in context ! +                local specname = specification.specification +                if specname then +                    tfmtable.name = specname +                    if trace_defining then +                        logs.report("define font","overloaded fontname: '%s'",specname) +                    end +                end +            end          end          fonts.logger.save(tfmtable,file.extname(specification.filename),specification)      end diff --git a/otfl-font-tfm.lua b/otfl-font-tfm.lua index 2f96de4..fd3d8b4 100644 --- a/otfl-font-tfm.lua +++ b/otfl-font-tfm.lua @@ -47,6 +47,7 @@ supplied by <l n='luatex'/>.</p>  tfm.resolve_vf       = true  -- false  tfm.share_base_kerns = false -- true (.5 sec slower on mk but brings down mem from 410M to 310M, beware: then script/lang share too)  tfm.mathactions      = { } +tfm.fontname_mode    = "fullpath"  function tfm.enhance(tfmdata,specification)      local name, size = specification.name, specification.size @@ -874,7 +875,5 @@ fonts.initializers.node.tfm.remap = tfm.remap  -- status info  statistics.register("fonts load time", function() -    if statistics.elapsedindeed(fonts) then -        return format("%s seconds",statistics.elapsedtime(fonts)) -    end +    return statistics.elapsedseconds(fonts)  end) diff --git a/otfl-font-xtx.lua b/otfl-font-xtx.lua index e7137c5..fd0a474 100644 --- a/otfl-font-xtx.lua +++ b/otfl-font-xtx.lua @@ -162,8 +162,6 @@ local function isfile ()    list.lookup = 'file' end  local function isname ()    list.lookup = 'name' end  local function thename(s)   list.name   = s end  local function issub  (v)   list.sub    = v end -local function istrue (s)   list[s]     = 'yes' end -local function isfalse(s)   list[s]     = nil end -- was no, see mpg/luaotfload#4 --KH  local function iskey  (k,v)      if k == "script" then          parse_script(v) @@ -171,6 +169,9 @@ local function iskey  (k,v)      list[k] = v  end +local function istrue (s)   list[s]     = true end +local function isfalse(s)   list[s]     = false end +  local spaces     = lpeg.P(" ")^0  -- ER: now accepting names like C:/program files/texlive/2009/...  local namespec   = (lpeg.R("az", "AZ") * lpeg.P(":"))^-1 * (1-lpeg.S("/:("))^1 -- was: (1-lpeg.S("/: ("))^0 @@ -178,11 +179,10 @@ local crapspec   = spaces * lpeg.P("/") * (((1-lpeg.P(":"))^0)/isstyle) * spaces  -- ER: can't understand why the 'file:' thing doesn't work with fontnames starting by c:...  local filename   = (lpeg.P("file:")/isfile * (namespec/thename)) + (lpeg.P("[") * lpeg.P(true)/isname * (((1-lpeg.P("]"))^0)/thename) * lpeg.P("]"))  local fontname   = (lpeg.P("name:")/isname * (namespec/thename)) + lpeg.P(true)/issome * (namespec/thename) -local sometext   = (lpeg.R("az") + lpeg.R("AZ") + lpeg.R("09"))^1 +local sometext   = (lpeg.R("az","AZ","09") + lpeg.S("+-."))^1  local truevalue  = lpeg.P("+") * spaces * (sometext/istrue)  local falsevalue = lpeg.P("-") * spaces * (sometext/isfalse) -local someval    = (lpeg.S("+-.") + sometext)^1 -local keyvalue   = (lpeg.C(sometext) * spaces * lpeg.P("=") * spaces * lpeg.C(someval))/iskey +local keyvalue   = (lpeg.C(sometext) * spaces * lpeg.P("=") * spaces * lpeg.C(sometext))/iskey  local somevalue  = sometext/istrue  local subvalue   = lpeg.P("(") * (lpeg.C(lpeg.P(1-lpeg.S("()"))^1)/issub) * lpeg.P(")") -- for Kim  local option     = spaces * (keyvalue + falsevalue + truevalue + somevalue) * spaces @@ -192,12 +192,6 @@ local pattern    = (filename + fontname) * subvalue^0 * crapspec^0 * options^0  function fonts.define.specify.colonized(specification) -- xetex mode      list = { }      lpegmatch(pattern,specification.specification) -    for k, v in next, list do -        list[k] = v:is_boolean() -        if type(list[a]) == "nil" then -            list[k] = v -        end -    end      if list.style then          specification.style = list.style          list.style = nil diff --git a/otfl-luat-dum.lua b/otfl-luat-dum.lua index a81131d..34dd9ed 100644 --- a/otfl-luat-dum.lua +++ b/otfl-luat-dum.lua @@ -57,12 +57,13 @@ local remapper = {      ttf   = "truetype fonts",      ttc   = "truetype fonts",      dfont = "truetype dictionary", -    cid   = "other text files", -- will become "cid files" +    cid   = "cid maps", +    fea   = "font feature files",  }  function resolvers.find_file(name,kind)      name = string.gsub(name,"\\","\/") -    kind = kind and string.lower(kind) +    kind = string.lower(kind)      return kpse.find_file(name,(kind and kind ~= "" and (remapper[kind] or kind)) or "tex")  end  | 
