summaryrefslogtreecommitdiff
path: root/tex/context/base/mkiv/typo-itc.lua
diff options
context:
space:
mode:
Diffstat (limited to 'tex/context/base/mkiv/typo-itc.lua')
-rw-r--r--tex/context/base/mkiv/typo-itc.lua64
1 files changed, 47 insertions, 17 deletions
diff --git a/tex/context/base/mkiv/typo-itc.lua b/tex/context/base/mkiv/typo-itc.lua
index ea8103aad..312832d5b 100644
--- a/tex/context/base/mkiv/typo-itc.lua
+++ b/tex/context/base/mkiv/typo-itc.lua
@@ -6,9 +6,9 @@ if not modules then modules = { } end modules ['typo-itc'] = {
license = "see context related readme files"
}
-local utfchar = utf.char
local trace_italics = false trackers.register("typesetters.italics", function(v) trace_italics = v end)
+
local report_italics = logs.reporter("nodes","italics")
local threshold = 0.5 trackers.register("typesetters.threshold", function(v) threshold = v == true and 0.5 or tonumber(v) end)
@@ -23,7 +23,7 @@ local glue_code = nodecodes.glue
local disc_code = nodecodes.disc
local math_code = nodecodes.math
-local tasks = nodes.tasks
+local enableaction = nodes.tasks.enableaction
local nuts = nodes.nuts
local nodepool = nuts.pool
@@ -40,14 +40,18 @@ local getchar = nuts.getchar
local getdisc = nuts.getdisc
local getattr = nuts.getattr
local setattr = nuts.setattr
+local getattrlist = nuts.getattrlist
+local setattrlist = nuts.setattrlist
local setfield = nuts.setfield
local setdisc = nuts.setdisc
local isglyph = nuts.isglyph
+local setkern = nuts.setkern
+local getkern = nuts.getkern
+local getheight = nuts.getheight
local insert_node_after = nuts.insert_after
local delete_node = nuts.delete
local end_of_math = nuts.end_of_math
-local find_tail = nuts.tail
local texgetattribute = tex.getattribute
local texsetattribute = tex.setattribute
@@ -63,6 +67,7 @@ local fonthashes = fonts.hashes
local fontdata = fonthashes.identifiers
local italicsdata = fonthashes.italics
local exheights = fonthashes.exheights
+local chardata = fonthashes.characters
local is_punctuation = characters.is_punctuation
@@ -117,14 +122,14 @@ end
-- todo: clear attribute
local function okay(data,current,font,prevchar,previtalic,char,what)
- if not data then
+ if data then
if trace_italics then
report_italics("ignoring %p between %s italic %C and italic %C",previtalic,what,prevchar,char)
end
return false
end
if threshold then
- local ht = getfield(current,"height")
+ local ht = getheight(current)
local ex = exheights[font]
local th = threshold * ex
if ht <= th then
@@ -149,9 +154,9 @@ end
local function correction_kern(kern,n)
local k = new_correction_kern(kern)
if n then
- local a = getfield(n,"attr")
+ local a = getattrlist(n)
if a then -- maybe not
- setfield(k,"attr",a) -- can be a marked content (border case)
+ setattrlist(k,a) -- can be a marked content (border case)
end
end
return k
@@ -160,9 +165,9 @@ end
local function correction_glue(glue,n)
local g = new_correction_glue(glue)
if n then
- local a = getfield(n,"attr")
+ local a = getattrlist(n)
if a then -- maybe not
- setfield(g,"attr",a) -- can be a marked content (border case)
+ setattrlist(g,a) -- can be a marked content (border case)
end
end
return g
@@ -195,12 +200,37 @@ local function domath(head,current, done)
else
a = a + 100
end
- if getfield(next,"height") < 1.25*ex then
- if trace_italics then
- report_italics("removing italic between math %C and punctuation %C",getchar(glyph),char)
+ local i = getkern(kern)
+ local f = getfont(glyph)
+ local c = getchar(glyph)
+ if getheight(next) < 1.25*exheights[f] then
+ if i == 0 then
+ if trace_italics then
+ report_italics("%s italic %p between math %C and punctuation %C","ignoring",i,c,char)
+ end
+ else
+ if trace_italics then
+ report_italics("%s italic between math %C and punctuation %C","removing",i,c,char)
+ end
+ setkern(kern,0) -- or maybe a small value or half the ic
+ done = true
+ end
+ elseif i == 0 then
+ local d = chardata[f][c]
+ local i = d.italic
+ if i == 0 then
+ if trace_italics then
+ report_italics("%s italic %p between math %C and punctuation %C","ignoring",i,c,char)
+ end
+ else
+ setkern(kern,i)
+ if trace_italics then
+ report_italics("%s italic %p between math %C and punctuation %C","setting",i,c,char)
+ end
+ done = true
end
- setfield(kern,"kern",0) -- or maybe a small value or half the ic
- done = true
+ elseif trace_italics then
+ report_italics("%s italic %p between math %C and punctuation %C","keeping",k,c,char)
end
end
end
@@ -253,7 +283,7 @@ local function texthandler(head)
local previnserted = nil
local pre = nil
- local pretail = nil
+ local pretail = nil
local post = nil
local posttail = nil
@@ -568,7 +598,7 @@ function italics.handler(head)
end
enabletext = function()
- tasks.enableaction("processors","typesetters.italics.handler")
+ enableaction("processors","typesetters.italics.handler")
if trace_italics then
report_italics("enabling text/text italics")
end
@@ -577,7 +607,7 @@ enabletext = function()
end
enablemath = function()
- tasks.enableaction("processors","typesetters.italics.handler")
+ enableaction("processors","typesetters.italics.handler")
if trace_italics then
report_italics("enabling math/text italics")
end