[luatex] callbacks in luatex 0.89

Hans Hagen pragma at wxs.nl
Thu Feb 11 20:04:52 CET 2016


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
-----------------------------------------------------------------


More information about the luatex mailing list