On 2/11/2016 6:00 PM, Ulrike Fischer wrote:
Am Thu, 11 Feb 2016 14:53:11 +0100 schrieb Hans Hagen:

Is there in context code which offers something similar to
\XeTeXinterchartoks? That means can one declare (unicode)
blocks/classes of characters and tokens (e.g. font switches,
language switches etc) which should be inserted between character of
different blocks?

If yes, where is it?

No, because it's not the way context does things (or at least I never
needed it so I never bothered to look into writing it). I would probably
look into it when there was demand for some feature not supported yet.
Even then I'd probably not rely interpreting unicode characters but on
proper tagging because one never knows what the intended use/rendering
of some character at some point it.

Proper tagging is naturally always more reliable. But I can
understand that people who write e.g. a mix of chinese with some
english/ascii and need to switch fonts don't want to tag all the
time. That can get a bit tiring, also it is error prone.

(context users are advised to quit reading here)

well, as the latin mixed in chinese text often looks quite horrible i assume basemode will do so you can make a file

  crapfont.lua

containing this

return function(specification)
    local t = { }
    for k, v in pairs(specification.features.normal) do
        local n = tonumber(k)
        if n then
            t[n] = v
        end
    end
    for k, v in ipairs(t) do
        local name, rest = string.match(v,"^(.-):(.*)$")
        if rest then
            t[k] = { name = name, list = { } }
            for s in string.gmatch(rest,"([^%+]+)") do
                local b, e = string.match(s,"^(.-)%-(.*)$")
                if b and e then
                    b = tonumber(b)
                    e = tonumber(e)
                else
                    b = tonumber(s)
                    e = b
                end
                if b and e then
                    table.insert(t[k].list,{ b = b, e = e })
                end
            end
        else
            t[k] = { name = v }
        end
    end
    local ids = { }
    for k, v in ipairs(t) do
        local f, id
        if tonumber(v.name) then
            id = tonumber(v.name)
            f = fonts.hashes.identifiers[id]
        else
f, id = fonts.constructors.readanddefine(v.name,specification.size)
        end
        v.f = f
        ids[k] = { id = id }
    end
    local one = t[1].f
    if one then
        one.properties.name = specification.name
        one.properties.virtualized = true
        one.fonts = ids
        local chr = one.characters
        for n, v in ipairs(t) do
            if n == 1 then
                -- use font 1 as base
            elseif v.list and #v.list > 0 then
                local chrs = v.f.characters
                for k, v in ipairs(v.list) do
                    for u=v.b,v.e do
                        local c = chrs[u]
                        if c then
                            c.commands = {
                                { 'slot', n, u },
                            }
                            chr[u] = c
                        end
                    end
                end
            else
                for u, c in ipairs(v.f.characters) do
                    c.commands = {
                        { 'slot', n, u },
                    }
                    chr[u] = c
                end
            end
        end
    end
    return one
end

after which you can do something

  \font\crapa=lmroman10-regular:mode=base;liga=yes; at 12pt
    \font\crapb=lmsans10-regular:mode=base;liga=yes;  at 30pt
% \font\mine=file:crapfont.lua:1=lmroman10-regular;2=lmsans10-regular:0x41-0x5A+0x30-0x39+0x21; at 12pt

\font\mine=file:crapfont.lua:1=\fontid\crapa;2=\fontid\crapb:0x41-0x5A+0x30-0x39+0x21; at 12pt

    \mine Zomaar een eindje fiets! En dan weer terug.

or worse (but let's assume some proper interfacing)

The second case where \XeTeXinterchartoks is used is for spacing at
punctuation, e.g. in french. This can be done with attributes
(frenchb.ldf in latex uses it). The main difference is to the xetex
method is that almost every normal user can unterstand
\XeTeXinterchartoks and set it up, while the lua method needs more
knowledge.

that is a matter of interfacing, just add some tex wrapper code; and when one chooses for an engine one also chooses for its methods (so of a user likes \XeTeXinterchartoks more that that user should use xetex as it fits the mindset best)

(the xetex method probably also has its confusions like where/when applied/expanded and such just as a luatex method has its characteristics)

Hans


-----------------------------------------------------------------
                                          Hans Hagen | PRAGMA ADE
              Ridderstraat 27 | 8061 GH Hasselt | The Netherlands
      tel: 038 477 53 69 | www.pragma-ade.com | www.pragma-pod.nl
-----------------------------------------------------------------

Reply via email to