diff options
Diffstat (limited to 'Master/texmf-dist/tex/generic/babel-french/frenchb.lua')
-rw-r--r-- | Master/texmf-dist/tex/generic/babel-french/frenchb.lua | 324 |
1 files changed, 169 insertions, 155 deletions
diff --git a/Master/texmf-dist/tex/generic/babel-french/frenchb.lua b/Master/texmf-dist/tex/generic/babel-french/frenchb.lua index 371399bc9e8..25178e932f8 100644 --- a/Master/texmf-dist/tex/generic/babel-french/frenchb.lua +++ b/Master/texmf-dist/tex/generic/babel-french/frenchb.lua @@ -1,7 +1,7 @@ --[[ File `frenchb.lua’ generated from frenchb.dtx - [2020/01/30 v3.5g French support from the babel system] - Copyright © 2014-2019 Daniel Flipo + [2020/04/18 v3.5h French support from the babel system] + Copyright © 2014-2020 Daniel Flipo <daniel (dot) flipo (at) free (dot) fr> License LPPL: see french.ldf. --]] @@ -42,6 +42,7 @@ local GLYPH = node_id("glyph") local PENALTY = node_id("penalty") local nobreak = new_node(PENALTY) nobreak.penalty = 10000 +local nbspace = new_node(GLYPH) local insert_node_before = node.insert_before local insert_node_after = node.insert_after local remove_node = node.remove @@ -115,176 +116,189 @@ local addGUILspace = luatexbase.attributes['FB@addGUILspace'] local FBucsNBSP = luatexbase.attributes['FB@ucsNBSP'] local FBdialect = luatexbase.attributes['FB@dialect'] local has_attribute = node.has_attribute +-- Main function (to be added to the kerning callback). local function french_punctuation (head) node.kerning(head) for item in node.traverse_id(GLYPH, head) do local lang = item.lang local char = item.char - local fid = item.font - local FRspacing = has_attribute(item, FBspacing) - FRspacing = FRspacing and FRspacing > 0 - local FRucsNBSP = has_attribute(item, FBucsNBSP) - FRucsNBSP = FRucsNBSP and FRucsNBSP > 0 - local FRdialect = has_attribute(item, FBdialect) - FRdialect = FRdialect and FRdialect > 0 - local SIG = has_attribute(item, addGUILspace) - SIG = SIG and SIG >0 - if lang ~= FR_fr and lang ~= FR_ca then - FRspacing = nil - end - local nbspace = new_node("glyph") - if FRspacing and FB_punct_left[char] and fid > 0 then - local prev = item.prev - local prev_id, prev_subtype, prev_char - if prev then - prev_id = prev.id - prev_subtype = prev.subtype - if prev_id == GLYPH then - prev_char = prev.char - end - end - local is_glue = prev_id == GLUE - local glue_wd - if is_glue then - glue_wd = prev.width - end - local realglue = is_glue and glue_wd > 1 - if FB_punct_thin[char] or FB_punct_thick[char] then - local SBDP = has_attribute(item, addDPspace) - local auto = SBDP and SBDP > 0 - if FB_punct_thick[char] and auto then + if (lang == FR_fr or lang == FR_ca) and + (FB_punct_left[char] or FB_punct_right[char]) then + local fid = item.font + local attr = item.attr + local FRspacing = has_attribute(item, FBspacing) + FRspacing = FRspacing and FRspacing > 0 + local FRucsNBSP = has_attribute(item, FBucsNBSP) + FRucsNBSP = FRucsNBSP and FRucsNBSP > 0 + local FRdialect = has_attribute(item, FBdialect) + FRdialect = FRdialect and FRdialect > 0 + local SIG = has_attribute(item, addGUILspace) + SIG = SIG and SIG >0 + if FRspacing and fid > 0 then + if FB_punct_left[char] then + local prev = item.prev + local prev_id, prev_subtype, prev_char + if prev then + prev_id = prev.id + prev_subtype = prev.subtype + if prev_id == GLYPH then + prev_char = prev.char + end + end + local is_glue = prev_id == GLUE + local glue_wd + if is_glue then + glue_wd = prev.width + end + local realglue = is_glue and glue_wd > 1 + if FB_punct_thin[char] or FB_punct_thick[char] then + local SBDP = has_attribute(item, addDPspace) + local auto = SBDP and SBDP > 0 + if FB_punct_thick[char] and auto then + local next = item.next + local next_id + if next then + next_id = next.id + end + if next_id and next_id == GLYPH then + auto = false + end + end + if auto then + if (prev_char and FB_punct_null[prev_char]) or + (is_glue and glue_wd <= 1) or + (prev_id == HLIST and prev_subtype == 3) or + (prev_id == TEMP) then + auto = false + end + end + local fbglue + local t + if FB_punct_thick[char] then + if FRdialect then + t = FBsp.colon.gl.ac + nbspace.char = FBsp.colon.ch.ac + else + t = FBsp.colon.gl.fr + nbspace.char = FBsp.colon.ch.fr + end + else + if FRdialect then + t = FBsp.thin.gl.ac + nbspace.char = FBsp.thin.ch.ac + else + t = FBsp.thin.gl.fr + nbspace.char = FBsp.thin.ch.fr + end + end + fbglue = new_glue_scaled(fid, t) + if (realglue or auto) and fbglue then + if realglue then + head = remove_node(head,prev,true) + end + if (FRucsNBSP) then + nbspace.font = fid + nbspace.attr = attr + insert_node_before(head,item,copy_node(nbspace)) + else + nobreak.attr = attr + fbglue.attr = attr + insert_node_before(head,item,copy_node(nobreak)) + insert_node_before(head,item,copy_node(fbglue)) + end + end + elseif SIG then + local addgl = (prev_char and + not FB_guil_null[prev_char]) + or + (not prev_char and + prev_id ~= TEMP and + not (prev_id == HLIST and + prev_subtype == 3) + ) + if is_glue and glue_wd <= 1 then + addgl = false + end + local t = FBsp.guill.gl.fr + nbspace.char = FBsp.guill.ch.fr + if FRdialect then + t = FBsp.guill.gl.ac + nbspace.char = FBsp.guill.ch.ac + end + local fbglue = new_glue_scaled(fid, t) + if addgl and fbglue then + if is_glue then + head = remove_node(head,prev,true) + end + if (FRucsNBSP) then + nbspace.font = fid + nbspace.attr = attr + insert_node_before(head,item,copy_node(nbspace)) + else + nobreak.attr = attr + fbglue.attr = attr + insert_node_before(head,item,copy_node(nobreak)) + insert_node_before(head,item,copy_node(fbglue)) + end + end + end + elseif SIG then local next = item.next - local next_id + local next_id, next_subtype, next_char, nextnext, kern_wd if next then next_id = next.id + next_subtype = next.subtype + if next_id == GLYPH then + next_char = next.char + elseif next_id == KERN then + kern_wd = next.kern + if kern_wd == 0 then + nextnext = next.next + if nextnext then + next = nextnext + next_id = nextnext.id + next_subtype = nextnext.subtype + if next_id == GLYPH then + next_char = nextnext.char + end + end + end + end end - if next_id and next_id == GLYPH then - auto = false - end - end - if auto then - if (prev_char and FB_punct_null[prev_char]) or - (is_glue and glue_wd <= 1) or - (prev_id == HLIST and prev_subtype == 3) or - (prev_id == TEMP) then - auto = false + local is_glue = next_id == GLUE + if is_glue then + glue_wd = next.width end - end - local fbglue - local t - if FB_punct_thick[char] then - if FRdialect then - t = FBsp.colon.gl.ac - nbspace.char = FBsp.colon.ch.ac - else - t = FBsp.colon.gl.fr - nbspace.char = FBsp.colon.ch.fr + local addgl = (next_char and not FB_guil_null[next_char]) + or (next and not next_char) + if is_glue and glue_wd == 0 then + addgl = false end - else + local fid = item.font + local t = FBsp.guill.gl.fr + nbspace.char = FBsp.guill.ch.fr if FRdialect then - t = FBsp.thin.gl.ac - nbspace.char = FBsp.thin.ch.ac - else - t = FBsp.thin.gl.fr - nbspace.char = FBsp.thin.ch.fr - end - end - fbglue = new_glue_scaled(fid, t) - if (realglue or auto) and fbglue then - if realglue then - head = remove_node(head,prev,true) - end - if (FRucsNBSP) then - nbspace.font = fid - insert_node_before(head, item, copy_node(nbspace)) - else - insert_node_before(head, item, copy_node(nobreak)) - insert_node_before(head, item, copy_node(fbglue)) - end - end - elseif SIG then - local addgl = (prev_char and not FB_guil_null[prev_char]) or - (not prev_char and - prev_id ~= TEMP and - not (prev_id == HLIST and prev_subtype == 3) - ) - if is_glue and glue_wd <= 1 then - addgl = false - end - local t = FBsp.guill.gl.fr - nbspace.char = FBsp.guill.ch.fr - if FRdialect then - t = FBsp.guill.gl.ac - nbspace.char = FBsp.guill.ch.ac - end - local fbglue = new_glue_scaled(fid, t) - if addgl and fbglue then - if is_glue then - head = remove_node(head,prev,true) - end - if (FRucsNBSP) then - nbspace.font = fid - insert_node_before(head, item, copy_node(nbspace)) - else - insert_node_before(head, item, copy_node(nobreak)) - insert_node_before(head, item, copy_node(fbglue)) + t = FBsp.guill.gl.ac + nbspace.char = FBsp.guill.ch.ac end - end - end - end - if FRspacing and FB_punct_right[char] - and fid > 0 and SIG then - local next = item.next - local next_id, next_subtype, next_char, nextnext, kern_wd - if next then - next_id = next.id - next_subtype = next.subtype - if next_id == GLYPH then - next_char = next.char - elseif next_id == KERN then - kern_wd = next.kern - if kern_wd == 0 then - nextnext = next.next - if nextnext then - next = nextnext - next_id = nextnext.id - next_subtype = nextnext.subtype - if next_id == GLYPH then - next_char = nextnext.char - end + local fbglue = new_glue_scaled(fid, t) + if addgl and fbglue then + if is_glue then + head = remove_node(head,next,true) + end + if (FRucsNBSP) then + nbspace.font = fid + nbspace.attr = attr + insert_node_after(head, item, copy_node(nbspace)) + else + nobreak.attr = attr + fbglue.attr = attr + insert_node_after(head, item, copy_node(fbglue)) + insert_node_after(head, item, copy_node(nobreak)) end end end end - local is_glue = next_id == GLUE - if is_glue then - glue_wd = next.width - end - local addgl = (next_char and not FB_guil_null[next_char]) or - (next and not next_char) - if is_glue and glue_wd == 0 then - addgl = false - end - local fid = item.font - local t = FBsp.guill.gl.fr - nbspace.char = FBsp.guill.ch.fr - if FRdialect then - t = FBsp.guill.gl.ac - nbspace.char = FBsp.guill.ch.ac - end - local fbglue = new_glue_scaled(fid, t) - if addgl and fbglue then - if is_glue then - head = remove_node(head,next,true) - end - if (FRucsNBSP) then - nbspace.font = fid - insert_node_after(head, item, copy_node(nbspace)) - else - insert_node_after(head, item, copy_node(fbglue)) - insert_node_after(head, item, copy_node(nobreak)) - end - end end end return head |