summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/generic/babel-french/frenchb.lua
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/tex/generic/babel-french/frenchb.lua')
-rw-r--r--Master/texmf-dist/tex/generic/babel-french/frenchb.lua324
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